Commerce now in beta

Commerce makes it easy to sell online exactly the way you want. Extend functionality with our Payment Methods and Modules or build your own.

This page contains a list of released versions. Looking for our development plans instead? Check the roadmap to v1.0 here

Recent Releases

Commerce 0.11.5-pl

Released on 2018-11-28

  • [tvs] Fix issue saving/loading products in the products TV introduced in 0.11.4 [S18661]

Commerce 0.11.4-pl

Released on 2018-11-22

  • [coupons] Fix coupons being removed when the discount puts the order total below the minimum order total for the coupon [#182]
  • [customers] Fix customer total of orders not showing up MySQL strict (only_full_group_by) mode [S18536]
  • [dashboard] SelectField now has a new emptyOption to prefix optionsClass results with a "(none)" option
  • [products] Fix Resource Product type casting, leading to MySQL validation issues preventing objects from being saved, seemingly introduced in 0.11.3 [S18576]
  • [reports] Daily Sales and TopProducts report now always groups on currency; resolves issue with MySQL strict (only_full_group_by) mode [#281]
  • [reports] BaseReport now has a applyFromUntilFilter method to easily apply from/until filtering
  • [reports] Fix incorrect headings in Transactions report
  • [reports] Orders report now formats timestamps (DATE_ATOM instead of Unix timestamps)
  • [reports] Orders report now has a new column for guest checkout, guest_checkout is removed from properties
  • [reports] Orders report now has a Status filter [#288]
  • [reports] Orders, Top Products and Daily Sales reports now have a from/until date selector
  • [reports] Allow Top Products report to be grouped by country [S18536]
  • [snippets] The get_product snippet will now use the first valid product when provided a list of product IDs
  • [tvs] Fix Products TV not loading all the appropriate assets/configuration through the Generator [#304]

Commerce 0.11.3-pl

Released on 2018-11-07

  • [cart] Fix potentially incorrect shipping method being shown in the cart on first view after adding a product.
  • [core] Allow NULL values on comProduct fields description, stock, weight, weight_unit, image, tax_group, delivery_type and target to prevent "Attempt to set NOT NULL field to NULL" errors
  • [core] Create tables as InnoDB by default
  • [gateways] Pass order placeholder into the Braintree template to allow further customisation [#289]
  • [templates] Fix incorrect for attribute on the label for the VAT registration in billing-address-fields.twig

Commerce 0.11.2-pl

Released on 2018-08-23

  • [addresses] Fix country details not being loaded into comAddress->toArray properly
  • [addresses] Fix comAddress->getTextSummary not being locale (country) aware in what fields it shows
  • [core] The current context and resource (if available) can now be accessed via $commerce->wctx, should also fix any context-specific overrides.
  • [dashboard] Add support for opening order action buttons in a new window
  • [dashboard] Fix NumberField not showing current value if they contain a decimal and the server uses certain locales
  • [dashboard] Prevent tables from overflowing from long uninterrupted content cells
  • [dashboard] Show nested iterable transaction properties as a table instead of unstyled list
  • [lexicons] Add missing lexicons for redirectMethod and redirectData transaction properties
  • [payments] Support pending transactions when customer is redirected back to the checkout with the transaction parameter
  • [payments] Fix incorrect lexicon being used when a transaction's gateway returns inconclusive results

Commerce 0.11.1-pl

Released on 2018-07-17

  • [checkout] Fix missing "commerce.gateway.cc_form_loading" lexicon, used by Braintree gateway
  • [checkout] Don't show field errors at the top of the form when address validation isn't satisfied [S17148]
  • [checkout] Fix locale-specific issue with Manual tax rates with decimals that would cause duplicate tax records [S17170]
  • [coupons] Fix coupons only applying once to an order when it should be applied to each item
  • [dashboard] Fix "Top 5 Products" widget on dashboard with ONLY_FULL_GROUP_BY mysql mode
  • [dashboard] Add new LengthUnitField form field (Thanks Tony Klapatch!)
  • [dashboard] Fix E_WARN for count expects first parameter to be array, caused by FormWidget [#290]
  • [dashboard] Fix not using the full height of the manager in MODX3
  • [package] Fix installation in MODX3
  • [modules] Fix AutoFillGeoIp module not setting the country properly even if it has results (since v0.10.4) [S16900]
  • [modules] Add new AcceptTerms module that requires a user to accept terms and conditions on the payment step
  • [snippets] Add &loadShipments to the get_order and get_orders snippet that will load the shipments and associated shipping method [S17183]

Commerce 0.11.0-pl

Released on 2018-05-28

  • [checkout] Fix shipping total excl taxes being sent to payment gateways, potentially preventing payments from being captured if shipping is taxed [S16939]
  • [checkout] Fix shipping not being included in total if the delivery type's tax group does not return a valid rate provider [#273]
  • [dashboard] Log message to the MODX error log if a record can't be handled by a FormWidget because it is the wrong type
  • [dashboard] Make sure barcode field is a number, otherwise might cause SQL errors on strict mode
  • [dashboard] Respect Section::$priority for ordering of sections when generating pages
  • [dashboard] Sections without a set priority now get one set automatically when calling addSection, in multiples of 5
  • [dashboard] Add commerce-ignore-jsnav class to add to links or nav items to make them bypass the javascript navigation [#277]
  • [core] Fix "comOrderShipment: Attempt to set NOT NULL field order to NULL" getting logged [#276]
  • [core] Fix issue getting total number of sold products from the database with only_full_group_by MySQL mode [#275]

Commerce 0.11.0-rc2

Released on 2018-05-02 (Pre-releases Channel)

  • [cart] New cart_header_single lexicon to allow proper linguistics in the cart when 1 item is in the cart [S16659]
  • [core] Add missing index on comOrderItem->delivery_type
  • [core] comOrderItem now has a tax_group field, automatically set from the product, and getTaxGroup() method to load the instance. Non-product-items can now also have a tax group and taxes applied to it.
  • [checkout] Make completed transaction information available in the checkout [S16678]
  • [dashboard] New media settings to configure the media source and directory the media browser opens in when selecting a product image [#269]
  • [dashboard] Fix "call to getAttribute on null" error on invalid click targets
  • [dashboard] Update Payment Methods form to use the new tabs and lexicons
  • [dashboard Image field now has a delete button to remove the image [S16660]
  • [dashboard] Finish refactoring action definitions (started in rc1) from arrays to Action util classes (payment methods, status workflow, tax groups, tax rules, coupons, order items, transactions, messages, orders, products) [#248]
  • [emails] Make completed transaction information available in email messages [S16666]
  • [events] Make sure \Commerce::EVENT_ORDER_PAYMENT_RECEIVED is fired before the status workflow executes [S16052]
  • [orders] Fix "PHP warning: count(): Parameter must be an array or an object that implements Countable" in comOrder line 632
  • [payments] You can now limit payment methods based on the chosen shipping methods (e.g. make a "Pay in store" payment method only available when "Pickup" was selected)
  • [products] Fix "PHP warning: count(): Parameter must be an array or an object that implements Countable" in comProductBundle line 38
  • [products] Add $product->getBarcode method to products to allow extended products to load it from elsewhere [#271]
  • [products] Add barcode field support to resource products

Commerce 0.11.0-rc1

Released on 2018-04-18 (Pre-releases Channel)

New features:

  • [cart] Commerce now automatically selects the first available shipping method, as soon as the cart is shown [#195]
  • [cart] New ItemData module allows arbitrary data submitted to the cart to be stored (and shown) with the order item
  • [cart] New \Commerce::EVENT_ITEM_ADDED_TO_CART to allow modules to intercept cart additions (with submitted options)
  • [cart] Shipping costs are now taxed according to a tax group set on the delivery type [#13]
  • [checkout] Delivery types now determine if the shipping step should be shown in the checkout [#244]
  • [checkout] Address validation now provides structured errors with field name and message for use in AJAX
  • [coupons] Used coupon code is now available in order messages as {{ coupon.code }} [S13477]
  • [coupons] Coupons can now be limited to specific products [#236]
  • [dashboard] New \Commerce::EVENT_DASHBOARD_ORDER_ITEM_DETAIL events for displaying additional information in the dashboard
  • [dashboard] Email order messages now have a checkbox to immediately send the email (on by default)
  • [dashboard] Add order shipments to the order overview with ability to add tracking code and change shipping method
  • [dashboard] Now supports JavaScript modules that can hook into the dashboard rendering
  • [dashboard] Dashboard now supports dynamically-generated tabs in forms, the products form has been updated to use this new feature.
  • [emails] New email_header_url and email_footer_text settings let you configure a 500x120px image and footer text for order emails [#260]
  • [gateways] Now storing additional information per transaction (e.g. credit card/bank ref) for:, Braintree, Mollie, MultiSafePay, Paymill
  • [generator] Modules can now register JavaScript, CSS and HTML fragments to the dashboard in the \Commerce::EVENT_DASHBOARD_INIT_GENERATOR event
  • [modules] New Commerce::EVENT_DASHBOARD_ORDERSHIPMENT_ACTIONS event to add actions to a shipment from a module
  • [products] Add a primary image to a product to show it in the cart/checkout, supports the core media browser and inserting by URL
  • [products] Ability to duplicate a product from the products grid action dropdown [#205]
  • [products] New barcode field added to standard products
  • [products] comProduct derivatives can now define a getOrderDetailRow method to add information to the dashboard order view
  • [productstv] Products TV now has a product type input property allowing you to set the default product type for new products
  • [shipments] Custom order shipments, defined by delivery type, are now supported. UserGroupShipment available separately.
  • [snippets] The get_cart and get_products snippets now have a new &separator property to define the separator between each result
  • [messages] Modules can now listen to the \Commerce::EVENT_ORDER_MESSAGE_PLACEHOLDERS event to add additional placeholders to order messages (emails)
  • [modules] The Payment event class now provides the OmniPay response object via getResponse()


  • [checkout] Automatically select the first payment or shipping method when none were previously selected [#254]
  • [dashboard] Simplify the way addresses are displayed on an order
  • [dashboard] You can now set the default tax group from Configuration > Tax Groups [#226]
  • [dashboard] Refactor grid actions from being defined as arrays (backwards compatible) to instances of modmore\Commerce\Admin\Util\Action
  • [dashboard] Setting default currency/tax group now returns nicely formatted response
  • [dashboard] Added delivery type filter to Products grid if you have more than one delivery type
  • [dashboard] Customer info on order view now has additional classes/IDs for modules like the Dymo Address Label to use
  • [emails] Tweak default order-received.twig template to include discount and shipments
  • [payments] Braintree gateway now shows a loading text until the gateway widget has been instantiated [#232]
  • [shipping] Refactored comShippingMethod/+ByWeight to check if they are available by order shipment (see 0.8.0)
  • [shipping] Refactored comShippingMethod/+ByWeight/+ByCountry to determine price per shipment (see 0.8.0)

Bug fixes:

  • [cart] Make sure that item-specific links are used in the cart, instead of product-specific
  • [checklist] Fix missing URL in HTTPS check when receiving a status code error
  • [dashboard] Fix link in bundle product detail row, on order page, not opening in modal window
  • [dashboard] Fix links with target="_blank" being hijacked by the ajax navigation [#249]
  • [dashboard] Fix incorrect tax total shown on the order view when using inclusive tax mode
  • [dashboard] Fix transaction property with a boolean false value being shown as "yes"
  • [dashboard] Some slight javascript and template cleanups
  • [dashboard] Fix [esc] not closing open modals due to scope issue
  • [dashboard] Make sure changes in fields (including new image and multiselect) resizes the modal to fix overflowing [#261]
  • [gateways] Remove stray console.log in braintree form
  • [gateways] Tighten generation of the notifyUrl for background payment confirmations (e.g. Mollie) in subfolders [#258]
  • [gateways] Allow continuing a pending transaction that requires a POST redirect (e.g. Adyen) [#257]
  • [products] Make sure comProduct->getDeliveryType is called when adding a product to the cart
  • [taxes] Fix empty field on tax rule conditions (e.g. "always") causing the condition to not get executed
  • [taxes] Fix lowercased country in the EU VAT rate provider not working

Possibly breaking changes:

  • We've adjusted and added new requirement classes to the Checkout process and steps to better control the flow. If you

have a custom process class or custom steps, make sure the checkout still works as expected, and especially compare the

loadRequirement methods of custom step classes with the standard ones. These changes have limited impact on templates.

  • Some slight changes were made to the frontend/checkout/cart/items.twig template to show the primary image.
  • BaseGateway->markTransactionSuccessful signature changed to expect the ResponseInterface instead of AbstractResponse


  • modmore\Commerce\Frontend\Checkout\Process->completeOrder() has been replaced with comOrder->triggerPaidStatusChange()

Some template changes are included in this release that you may want to apply to your own templates as well. Please see for detailed changes.

Commerce 0.10.8-pl

Released on 2018-02-26

  • [core] Fix comOrderShipment->getDeliveryType incorrectly loading delivery type (affecting shipment[n].delivery_type variable in checkout)
  • [coupons] Fix coupon discount not being removed when removing the coupon [#241]
  • [coupons] Fix hardcoded English strings in frontend/checkout/cart/aside.twig (related to applied coupons) [#230]
  • [customers] Fix customers grids not filtering by mode [S16283]
  • [dashboard] Fix "enabled in test" always being checked when editing payment/shipping methods [S16260]
  • [dashboard] On orders grid, shipping method would show the ID of the shipment instead of the shipping method if the method wasn't found
  • [stock] Refactored EnforceStock module. Now also monitors for stock changes while customer moves through checkout.

Commerce 0.10.7-pl

Released on 2018-01-30

  • [checkout] Fix redirect URLs being used as relative, causing doubling up of alias paths [S15990]
  • [dashboard] Fix "The requested item could not be found" message when editing a valid shipping method [S16101]

Commerce 0.10.5-pl

Released on 2018-01-29

  • [dashboard] Fix immediate save after creating a new item showing a not found error (in most admin interfaces)
  • [emails] Make sure MODX tags are parsed in order email messages [#239]
  • [gateways] Add support for POST redirect payment gateways
  • [checkout] Restrict data passed to the checkout process to GET and POST

Potential breaking changes:

  • The AdapterInterface defines a new parseMODXTags method that needs to be implemented in custom adapters.

Commerce 0.10.6-pl

Released on 2018-01-29

  • [gateways] Fix potential E_FATAL when POST redirect data is not an array [S16052]
  • [dashboard] Simplify the way gateway classes are displayed under Configuration > Payment methods

Commerce 0.10.4-pl

Released on 2018-01-23

  • [checkout] Prevent products with zero quantity from being added to the cart
  • [checkout] Fix incorrect placeholder used in the frontend/checkout/partial/summary.twig template [S16008]
  • [checkout] Fix MODX tags not being parsed when requesting the cart or checkout with AJAX requests
  • [coupons] Refactor coupon handling to recalculate after each order change and have cleaner logic [#223,#183]
  • [coupons] Prevent Coupon Usage links pointing to unavailable (other mode) orders [S13477]
  • [dashboard] Fix ctrl/cmd+click not opening links in new windows
  • [modules] Fix E_FATAL preventing editing the Default Address module
  • [modules] AutoFillGeoIP module now only sets (overwrites) the expected address if it has a proper result
  • [order items] Improve comOrderItem idx handling; cart is now sorted by it and simplified logic for determining next one
  • [order items] comOrderItem.addPriceAdjustment() and comOrderItem.removePriceAdjustment() have a new $recalculate parameter
  • [productstv] Fix missing dependency in Products TV causing select fields to not get enhanced
  • [snippets] Fix missing lexicon in commerce.get_order snippet [S15845]
  • [statuses] Fix hardcoded email subject in Shipping Email to Customer action, now uses lexicon instead [#227]
  • [statuses] Prevent exceptions in status changes from breaking checkout/manager flow; exceptions now get logged to the order and MODX log [#221]

Commerce 0.10.3-pl

Released on 2018-01-09


  • Prevent potential information disclosure. Full disclosure to follow on February 12th.

Commerce 0.10.2-pl

Released on 2018-01-01

  • [checkout] Fix issue loading previously used addresses on MySQL 5.7 with only_full_group_by mode [S13477]
  • [core] Add missing Order and Address relations to comOrderAddress
  • [templates] Fix address step in checkout showing previous shipping instead of billing addresses under Billing Address [S13577]

Commerce 0.10.1-pl

Released on 2017-12-28

  • [dashboard] "comOrderMessage" is no longer an option as message type when creating a new order message [#213]
  • [dashboard] "comStatusChangeAction" is no longer an option for creating a status change action
  • [dashboard] Make sure changing the order status uses formatted return messages and lexicons
  • [dashboard] Make sure manually sending a draft order message uses formatted messages and lexicons
  • [dashboard] Prevent AJAX navigation on links that are not in the Commerce namespace
  • [dashboard] Order messages grid no longer triggers an E_NOTICE on non-existent index "name"
  • [dashboard] Order messages grid now shows the username of the person that triggered a message instead of their user ID
  • [shipments] Fix the shipment weight not being stored correctly, affecting (custom) shipping methods

Commerce 0.10.0-pl

Released on 2017-12-22

  • [core] Add missing relations and indices to comOrderShipment
  • [checkout] Make shipment[].delivery_type available in the entire checkout
  • [products] Prevent uncaught exception listing products when a resource product has no weight/unit [S15690]
  • [emails] Make order shipments available to order messages [S15782]

Commerce 0.10.0-rc2

Released on 2017-11-29

New features:

  • [checkout] Automatically load translated country names in the address step [#196]
  • [dashboard] Add ability to add, edit, and remove items on an order in the dashboard [#169]
  • [emails] Add new order-to-merchant.twig template with a nicer email notification [#210]
  • [emails] Add support for BCC addresses [#206]
  • [emails] Recipient and BCC addresses now support multiple email addresses by separating them with a comma [#206]
  • [reports] Add 3 new export formats: Excel 2007 (xlsx), Excel 5 (xls) and HTML
  • [reports] "Products" report now has an option to optionally include deleted products
  • [templates] New `format_address` twig filter to automatically format addresses properly per country, courtesy of CommerceGuys\Addressing


  • [core] Move comOrder->getCurrency to comSimpleObject->getCurrency so it's available on any object
  • [core] Replace deprecated phine/country dependency with CommerceGuys\Intl
  • [dashboard] Making changes to the items on an order also updates the stock for the relevant products
  • [emails] The order-received.twig template now includes customer address information [#208]
  • [reports] For the "customers that bought a product" report, the product field is now a searchable dropdown
  • [reports] "Customers that bought a product" report now includes processing and completed order states
  • [reports] Use lexicons for order and product type report options
  • [snippets] The commerce.get_cart snippet now calculates the order totals again to make sure it's accurate [S15653]
  • [templates] Changed the checkout/partial/summary.twig to show autoformatted addresses
  • [templates] Changed the checkout/partial/previous-address.twig to show autoformatted addresses, without the vcard

Bug fixes:

  • [core] Fix incorrect (too strict) validation on ProductField
  • [core] Fix percentage formatter and tax rule condition float comparisons in non-EN locales
  • [core] Reduce amount of "Attempt to set NOT NULL field to NULL" errors sent to the log
  • [checkout] Prevent empty orders being created after completing the checkout and viewing the cart [S15680]
  • [checkout] Fix "Encountered empty NOT IN condition with key id" in error log when viewing an empty cart
  • [checkout] Fix 3 more instances of "shipping" and "billing" not being translated [S15684]
  • [dashboard] Fix false property values being shown as "yes" on order addresses
  • [dashboard] Fix status change link not using AJAX navigation
  • [emails] The merchant email notification now has a valid link to the order in the manager [#197]
  • [settings] Fix show_beta_warning and shipping_total_field settings getting a double commerce. prefix [S15653]
  • [snippets] Fix commerce.get_orders snippets not showing users' orders [S13477]

Commerce 0.10.0-rc1

Released on 2017-11-24

New features:

  • [checkout] Logged-in customers can now choose to remember addresses, which are offered during checkout [#167]
  • [dashboard] The dashboard is now progressively enhanced to use AJAX for navigation [#104]
  • [dashboard] New CountryField input type which is filled with a country list
  • [dashboard] New commerce.show_beta_warning setting that allows you to hide the beta warning [#204]
  • [dashboard] Enhance select fields with Choices.js to allow searching through options
  • [emails] New commerce.email_reply_to and commerce.email_from settings to control the outgoing addresses [#198]
  • [modules] New Default Address module to specify a standard state and country to use
  • [payments] It's now possible to register custom payment methods [#177]
  • [shipping] The shipping cost threshold (min/max) order field can now be configured with the shipping_total_field setting [#200]


  • [checkout] Country field now defaults to an empty value instead of Afghanistan if no country is known
  • [core] comOrderItem now has a delivery_type field.
  • [core] Added additional indices to comAddress
  • [dashboard] Fix action buttons breaking out of modal after save or fields being enhanced
  • [dashboard] Automatically scroll to the top of the modal when opened/submitted instead of lurking in the middle
  • [modules] Basic Address Validation module now properly uses lexicons for the billing/shipping address name when presenting an error [S14678]
  • [orders] Default address modules no longer (have to) set placeholders for the address to be picked up in the checkout
  • [orders] New method comOrder->getCurrency() added as more fault-tolerant way to access the current currency, and set it if missing (primarily in tests or custom code)
  • [products] Accept shorter product SKUs (1 character) and name (2 characters) [S13309]

Bug fixes:

  • [addresses] The comAddress->Order relation was incorrect, and has been replaced with a correct comAddress->Orders relation.
  • [checkout] Fix default CSS being loaded even if the register_checkout_css setting is disabled
  • [checkout] Fix potential E_FATAL when calculating taxes on an order without any (or an invalid) expected address [S15585]
  • [dashboard] Fix validation feedback being missing when submitting forms [#174]
  • [dashboard] Fix hardcoded "Actions" label
  • [dashboard] Update warning in dashboard from alpha to beta
  • [dashboard] Fix inability to empty out text fields [#209]
  • [dashboard] Show the name of the tax group when editing tax rules
  • [products] Fix weight unit always defaulting to kg for new products [#175]
  • [products] Add missing resourceproduct.delivery_type_field setting and implementation to specify delivery type on resource products [#188]
  • [products] Fix "PHP warning: min(): Array must contain at least one element" in product bundles
  • [products] Fix bundle products incorrectly attempting to set the weight value, causing it to never store the weight [#199]
  • [products] Make sure resource products fall back to the default_tax_group setting if its value isn't set in a TV [#202]
  • [snippets] Fix "commerce.no_orders_yet" message not having access to the right lexicon topic [S13113]
  • [snippets] Fix get_cart snippet not loading most recent items
  • [shipping] Fix weight shipping methods not being available when maximum weight was set to 0

Template / Design changes:

  • For the new previous address feature, the frontend/checkout/address.twig template has changed a fair bit. Please double check your implementation if you use the default templates with custom CSS.
  • The same address.twig template has also been broken up into more partials, to allow more selective template overrides. This includes billing-address-fields.twig and shipping-address-fields.twig templates.
  • Input elements in the address step now have a height and display: block; set in the default CSS and no more margin. The fieldset was changed into a div, legends were replaced with a heading.

Deprecations / Internal Changes:

  • Two methods of modmore\Commerce\Frontend\Steps\Shipping have been moved to comOrder. These are getShipments() and getItemsByDeliveryType(). A deprecated method that passes it through to the comOrder has been added on the Shipping class, which will be removed before 1.0. If you have a custom Shipping step class that calls these methods, please update those.
  • The Address class was changed a fair bit, as did its default template. If you use a custom child class, please double check your implementation.

Commerce 0.9.0-pl

Released on 2017-07-27 (Commerce Channel)

  • [dashboard] Fix incorrect check in checklist template causing wrong options to be shown
  • [dashboard] Make HTTPS check required for switching on live mode
  • [templates] Use lexicons for previously hardcoded text in emails, checkout summary, account and shipping method steps [S12251]
  • [templates] Simplify frontend/account/orders.twig template to a table linking to a separate order detail page
  • [snippets] Add commerce.get_order snippet to retrieve a single order, based on &order query parameter

Commerce 0.9.0-rc1

Released on 2017-07-25 (Commerce Channel)

Deprecations / Breaking Changes:

  • All EVENT_ related constants have been moved from model and other classes, onto the main Commerce service. The old constants are deprecated and planned to be removed in 1.0. Check your modules to make sure all event listeners are applied to \Commerce:EVENT_ classes.

New features:

  • [dashboard] Add ability to sort grids by clicking on column headers, and an icon in the top right to switch direction [#159]
  • [dashboard] Add convenience returnError/returnSuccess methods to Page class
  • [dashboard] Add buttons to set the mode to test/live/disabled to the config checklist [#2]
  • [gateways] Implement SagePay payment gateway (Server/redirect integration) [#37]
  • [reports] Add new "Customers that bought a Product" report that exports a list of customers/order items for a product [#166]
  • [snippets] Add new commerce.get_orders snippet to list orders places by a logged in user. [#119]


  • [dashboard] Show name of rate provider instead of class name in Tax Groups > Rules
  • [dashboard] Add order creation date to orders grid
  • [dashboard] Make active item in top navigation bold and blue
  • [dashboard] Use nicely formatted error message on error pages
  • [dashboard] Add ability for form widgets to not submit in a modal and to change csrf key
  • [internal] Add Commerce->isDisabled() method and change Commerce->isTestMode() to check specificially for test/unit_test mode
  • [taxes] EU VAT RateProvider slight refactor in getRates and useReverseCharge methods with improved tests

Bug fixes:

  • [dashboard] Fix clicking on pagination icons loading a different page instead of updating the grid via AJAX
  • [snippets] Make sure all snippets halt execution if commerce.mode is set to disabled.

Commerce 0.8.3-pl

Released on 2017-07-17 (Commerce Channel)

  • [checkout] Fix confusing placeholder usage in cart/items.twig in tax_exclusive block: use {{ item.total_ex_tax_formatted }} instead of {{ item.total_formatted }} [#135]
  • [checkout] Fix inability to progress in checkout when checkout_show_account_step is off [S12251]
  • [dashboard] Fix submitting the limit field on grids sending the user to the MODX dashboard [#160]
  • [dashboard] Fix currency fields storing a wrong value when a comma or period is added [#158]
  • [productstv] Fix "Select Product" button only responding to click on the text [#161]
  • [productstv] Fix Product TVs outputting ",123" when adding a first product [#162]

Commerce 0.8.2-pl

Released on 2017-07-04 (Commerce Channel)

  • [dashboard] Fix creating/editing a shipping method with only 1 delivery type available causing the delivery type to be set to 0 [S12251]
  • [modules] Fix incorrect error handling in AutoFillGeoIp causing a fatal error if it could not connect
  • [gateways] Make sure the OmniPay Card is filled with as much data as possible, including correct email value
  • [shipments] Fix shipping methods not being available on orders while they should be, due to bug in Order Shipments getting the incorrect order

Commerce 0.8.1-pl

Released on 2017-06-27 (Commerce Channel)

  • Fix Address step missing in Standard checkout process, causing infinite redirects [S12225]
  • Check if comProduct->getWeight returns a PhpUnitsOfMeasure\PhysicalQuantity\Mass instance [S12225]

Commerce 0.8.0-pl

Released on 2017-06-26 (Commerce Channel)

New features:

  • [checkout] New checkout_requires_account and checkout_show_account_step settings to give easier control over the account step [#134]
  • [checkout] If only one shipping method is available for a shipment, it is automatically selected, allowing the shipping step to be skipped
  • [checkout] New checkout_class system setting to change the used checkout process class (advanced) [#134]
  • [coupons] Add ability to (soft) delete coupons [S11328]
  • [reports] Add transactions report to export transactions during a timeframe
  • [shipping] Add min and max weight options to the weight-based shipping method [#121]
  • [shipping] Orders are now split up into shipments, based on new delivery types. See:
  • [products] Add new Products TV to easily manage products linked to a resource. See: [#68]


  • [dashboard] Use lexicons for the HTTPS check
  • [products] Fix 1 cent inaccuracy in resource product prices managed as decimals
  • [products] Add weight_formatted placeholder on products

Bug fixes:

  • [dashboard] Fix broken products, customers, and tax rates tabs on certain environments [S12034]
  • [dashboard] Fix MultiSafePay gateway selection not showing properly when editing the payment method [S12060]

Breaking changes in this release:

  • The templates for the checkout has seen various changes that will need to be updated in your own themes. Most importantly the shipping step (frontend/checkout/shipping-method.twig) is very different due to the introduction of Delivery Types and Shipments (see, and the sidebar summary (frontend/checkout/partial/summary.twig) has also seen similar changes.
  • Shipping method classes should start implementing getPriceForShipment/isAvailableForShipment methods instead of getPrice/isAvailableForOrder. There's some level of backwards compatibility for now, but the previous getPrice/isAvailableForOrder methods will be removed before v1.0.
  • The 0.7 approach to setting a checkoutClass on the checkout snippet has been replaced with a setting.
  • Various Checkout classes (NoAccount, RequiresAccount, OnePage) have been marked as deprecated and will be removed before v1.0. Use the settings to control the Standard process instead.

Commerce 0.7.0-pl

Released on 2017-05-30 (Commerce Channel)

  • [checkout] Prevent "Your order is free" message right after paying an order [#145]
  • [checkout] Fix incorrect total estimate on shipping methods when going back to shipping step after selecting a method before [#146]
  • [checkout] Fix incorrect shipping calculation when sending cart info to payment provider
  • [checkout] Fix incorrect classes on buttons in Pending Transactions view [#144]
  • [checkout] Add support for continuing an off-site transaction from the pending transactions view
  • [dashboard] Slightly change statuses grid to have buttons in the actions menu
  • [dashboard] Add ability to (soft) delete payment methods, shipping methods, currencies, statuses (incl. changes and actions), tax groups (incl. rules), products ...
  • [dashboard] Ensure missing weight_units would not cause fatal errors in the dashboard
  • [dashboard] Add new transaction view, accessible via an order's list of transactions, to expose more information and error messages
  • [dashboard] Add event to add checks to the configuration checklist [#79]
  • [dashboard] Coupons module now adds a check to the configuration checklist to make sure active coupons are available
  • [payments] Improve transaction handling of webhook-based gateways (e.g. Mollie), with more solid cancelled/failed checking, proper response on webhook, and improved messages in log and checkout [#143]
  • [payments] Prevent double slash in webhook url
  • [products] Include price in resource product sync [#147]
  • [products] Add setting (resourceproduct.price_field_decimals) to allow resource product price TVs to be defined with decimals [#131]
  • [settings] All settings now have lexicons and descriptions to explain their purpose. [#98]
  • [snippets] Add commerce.get_cart snippet to list cart information outside the actual cart/checkout [#126]
  • [snippets] Add (temporary!) checkoutClass property to checkout snippet to allow specifying checkout class
  • [statuses] Make comStatus and comProduct objects use soft delete instead of hard delete

Breaking changes in this release:

  • Price TVs for resource products are now assumed to be specified as numbers with decimals. This can be disabled with

the resourceproduct.price_field_decimals system setting to restore the old behaviour of expecting a number in cents.

Commerce 0.6.2-pl

Released on 2017-05-17 (Commerce Channel)

  • [checkout] Fix RequiresAccount checkout process not moving to account step
  • [gateways] Fix Paymill gateway javascript error

Commerce 0.6.1-pl

Released on 2017-05-10 (Commerce Channel)

  • [checkout] Fix coupons form showing even a coupon is already selected
  • [checkout] Fix emails getting sent multiple times when more than one send per php request
  • [checkout] Remove logs from order properties when they're moved into the dedicated table
  • [checkout] Make sure address errors in one address type are shown if the other address is valid [#142]
  • [dashboard] Restrict Top Products widget on dashboard and Sales and Top Products reports to processing/completed orders in the current mode
  • [dashboard] Restrict total sold count on products tab only to processing/completed orders in the current mode
  • [dashboard] Improve "orders with product" listing on product page
  • [dashboard] Fix inability to uncheck checkboxes introduced in 0.6.0
  • [modules] Fix AutoFillGeoIP module setting the state into the country field

Commerce 0.6.0-pl

Released on 2017-05-04 (Commerce Channel)

  • [cart] Show discounted and original price in right order in cart
  • [checkout] Make sure the thank you page requires an address
  • [checkout] Persist messages and errors to the sessions before a redirect
  • [checkout] Fire additional event after the step is processed
  • [checkout] When the order total_due is 0, send the customer forward to complete the order
  • [checkout] Replace hard-coded "Cart Totals" header with lexicon
  • [checkout] Make it possible to use lexicons in shipping and payment method name and description [S11848]
  • [coupons] Allow coupons to be removed from the cart [#132]
  • [dashboard] Fix live licenses being treated as development licenses in checklist
  • [modules] Add MinOrderAmount module to force a minimum order total in the checkout
  • [modules] Update UpdateStock and Coupons module to use new state-specific events instead of payment event [#125]
  • [modules] Add EnforceStock module to prevent customers buying more than is available
  • [orders] Fire new state-specific events (eg Cart->Processing) that fire regardless of a payment or other reason for an order being changed [#126]
  • [orders] New updateItemQuantity method and new comOrder::EVENT_ITEM_UPDATED and comOrder::EVENT_ITEM_REMOVED event
  • [orders] Make order available via $event->getOrder() on comOrder::EVENT_ITEM_* events

Commerce 0.5.1-pl

Released on 2017-05-01 (Commerce Channel)

  • [snippets] Fix issue with get_product snippet not setting placeholders
  • [checkout] Put a few hard-coded cart/checkout strings into the lexicon
  • [checkout] Set button type to submit to fix remove item button in cart
  • [checkout] Move to top to ensure submitting the form uses the update cart button
  • [checkout] Only handle cart update or remove item from cart per POST.
  • [checkout] Ignore product add to cart where quantity is less than 1
  • [gateways] Make sure notify/webhook URLs are generated as a full URL
  • [dashboard] Fix save after create causing duplicate records [#76]

Commerce 0.5.0-pl

Released on 2017-03-17 (Commerce Channel)

  • [dashboard] Fix product and order links on the dashboard
  • [dashboard] Prevent issue loading modules from breaking the backend
  • [dashboard] Fix issue in Firefox where prices could not be edited [#130]
  • [dashboard] Add license status to the configuration checklist [#106]
  • [checkout] Fix enter in the cart quantity field submitting with the remove item button
  • [checkout] Fix cart/checkout when friendly urls are off, and the xhtml_urls setting is on [#128]
  • [gateways] Rewrite client-side payment handling
  • [gateways] Add gateway, using the Accept.js integration (on-site JavaScript AIM)
  • [gateways] Add MultiSafePay gateway
  • [orders] Fix PHP notice: Undefined index: total
  • [setup] Use PHP 5.3 array style in setup options to make sure install doesn't break before the requirements validator
  • [emails] Add new email templates for order confirmation and shipping notifications
  • [modules] Log an error when a module class can't be loaded
  • [snippets] Fix get_product and get_products snippet not being installed
  • [snippets] Fix get_products snippet not loading all products when separated by a comma

Commerce 0.4.0-pl

Released on 2017-02-13 (Commerce Channel)

New features:

  • [taxes] Completely rebuilt taxes system based on Tax Groups, Tax Rules and Rate Providers. See documentation.
  • [taxes] New "Manual" rate provider (alongside EU VAT and TaxJar) for manually defined tax rates
  • [taxes] When address info is available (e.g. UserProfileAddress or AutoFillGeoIP module), expected taxes are calculated right away
  • [checkout] Allow alternative field structure for the add to cart form, to easier support variations
  • [checkout] Add UserProfileAddress module that prefills the customer address from a user profile, and can update profile as well.
  • [frontend] Add get_product and get_products snippet to easily access product information in MODX
  • [products] Add Bundle Products which get their weight and stock from the bundled products [#120]
  • [dashboard] Add the products within a bundle to the order item grid
  • [payments] Add support for Paymill payment provider
  • [reports] Add new Collected Taxes report that exports all tax records assigned to order items
  • [reports] Add new Coupon Codes export to get coupons created in a certain period


  • [checkout] Make sure all forms set the action to {{ current_url }}
  • [dashboard] Add footer rows to order item grid with various order totals/calculations

Bug fixes:

  • [cart] Fix bug where invalid product IDs might get added to the cart anyway
  • [adapter] Fix resource url generation not using the link_tag_scheme setting [S10959]
  • [coupons] Make sure created coupons have a created_on and created_by set
  • [coupons] Make sure comCoupon.last_used is updated when an order with coupon is processed
  • [dashboard] Fix "enabled in test" checkbox being ticked when module is disabled

Breaking changes in this release:

  • Taxes have been completely refactored; you will need to reconfigure them.

Commerce 0.3.2-pl

Released on 2017-01-31 (Commerce Channel)

  • [checkout] Remove placeholder text in the cart form
  • [checkout] Don't show coupon form if the coupon module isn't enabled
  • [checkout] Replace coupon form with a link that shows the form

Commerce 0.3.1-pl

Released on 2017-01-23 (Commerce Channel)

  • [statuses] Fix processing > completed state change not running
  • [reports] Fix period selector not working on Daily Sales chart
  • [reports] Add stock and weight to product and top products reports
  • [checkout] Add sort order to payment and shipping methods
  • [dashboard] Load frontend lexicon in the manager as well to fix some missing shared lexicon entries
  • [dashboard] Fix filtering on customer/address in orders grid
  • [dashboard] Increase connect timeout on HTTPS check to make sure it has enough time to fully run
  • [dashboard] Make modal close button work [#96]
  • [dashboard] Fix missing error messages on textarea fields
  • [dashboard] Fix creating email status change action [#115] / bug where properties aren't available in getModelFields on new objects
  • [i18n] Fix missing pricing lexicon on product form
  • [i18n] First translations included thanks to community help: NL, FR and DE (

Commerce 0.3.0-pl

Released on 2017-01-18 (Commerce Channel)

  • Add shipping method restriction by country
  • Add weight + weight unit support for products, and shipping method by weight to accompany it
  • Make all product information available via {{ item.product. }} in cart/checkout templates
  • Organise lexicons somewhat and enable translations via CrowdIn

Merchant dashboard tweaks:

  • Add better editing UI for shipping method by country
  • Progressively enhance currency/price fields with currency formatting
  • Improve hover and focus styles [#89]
  • Improve configuration checklist styling [#75]
  • Improved modal styling [#55] + close button [#96]
  • Fix alignment of toolbar buttons [#82]
  • Some quick tweaks towards a more responsive manager

Breaking changes in this release:

  • comProduct received a new method: getWeight which returns a PhpUnitsOfMeasure\PhysicalQuantity\Mass instance.

Commerce 0.2.1-pl

Released on 2017-01-14 (Commerce Channel)

  • Fix requirements validator having the check backwards

Commerce 0.2.0-pl

Released on 2017-01-13 (Commerce Channel)

New features:

  • [security] Implement CSRF tokens in the merchant dashboard
  • [taxes] TaxJar integration added via module for automatic US Sales Tax calculation
  • [taxes] Internal (module-managed) tax rates are now exposed under Configuration > Tax Rates
  • [taxes] Add configurable rate and reverse charge mechanism (w/ EU VAT Validator module) added to EU VAT module
  • [checkout] Add tracking of order log entries before the order is persisted to the database
  • [checkout] New module EU VAT Validator which checks for a vat_registration address field and validates it against the VIES web service
  • [dashboard] Add ability to set default currency from the merchant dashboard
  • [reports] Add support for composite headers (e.g. combining product name and currency into name) to reports
  • [reports] Add support for multiple datasets in report charts
  • [reports] Add pie chart type and 2 pie charts on the top products report
  • [products] comProduct->getPrice now returns a Price object that is linked with the currency (for potential multi currency support)
  • [products] Add comProduct.stock field and getStock/updateStock methods, also added to the standard comProduct fields and grid
  • [products] New Update Stock module to automatically reduce the stock when an order is paid in full


  • [taxes] Clean up no longer correct tax records in EU VAT module (e.g. after changing billing country)
  • [checkout] Don't count shipping/transaction price in determining if a shipping/payment method is available for an order
  • [dashboard] Handle exceptions triggered by invalid CSRF token or other errors more cleanly
  • [reports] Implement real revenue data, period and group by currency option on TopProducts report
  • [reports] Add multiple datasets to TopProducts and Sales report charts
  • [reports] Divide financial amounts in reports/charts by 100
  • [reports] Change Bar chart type to be a Bar instead of horizontalBar


  • Disable PaymentSense gateway, not yet implemented
  • Make sure exports are filtered on the current mode where appropriate
  • Fix missing placeholders for the response-messages.twig causing response errors and messages to not appear

Breaking changes in this release:

  • comProduct received 2 new methods: getStock, updateStock.
  • comProduct->getPrice now returns modmore\Commerce\Products\Price object which includes currency info
  • Minimum PHP version increased from 5.4.4 to 5.5.0

Commerce 0.1.1-pl

Released on 2017-01-10 (Commerce Channel)

  • Include polyfills and tweaks to the js to ensure IE10+ and Safari browser support

Commerce 0.1.2-pl

Released on 2017-01-10 (Commerce Channel)

  • Slight markup simplification in merchant dashboard for better experience on older browsers
  • Fix incorrect validation when editing a status that prevented creating a status with "draft" state
  • Add missing name field to currency form
  • Fix missing CSS scoping class causing conflicts in the manager
  • Add more currencies to setup (USD, EUR, GBP, RUB, BYN, CHF, CAD, AUD), and a default currency selector [#97]
  • Add setup options to create a cart and checkout resource automatically [#100]
  • Only show setup options if there are options available (so it isn't shown on upgrade, basically) [#95]
  • Add proper date + time field to editing coupon date fields [#92]
  • Rename Commerce->CommerceGrid and CommerceJS to Commerce
  • Fix filtering of grids
  • Add no results message to grids when there are no results [#88]

Commerce 0.1.0-pl

Released on 2017-01-09 (Commerce Channel)

  • Fix fatal error when viewing statuses
  • Remove unused "Find Available Modules" button
  • Fix incorrect description on customers module
  • Add note that the shop is in test mode
  • Make radio buttons for shipping/payment method selection visible in default frontend theme
  • Add "Manual" gateway that just creates a successful transaction for demo purposes

Commerce 0.1.0-rc1

Released on 2017-01-08 (Commerce Channel)

  • First packaged release of Commerce.

Open Issues

Below you will see a subset of known issues in Commerce. If you have any bug reports or feature requests, let us know.


Make the customers section actually useful

Created on 2018-06-01 • Last updated on 2018-09-17 • v1.0 (stable release)


Incorrect order totals when changing address leads to a different shipment fee

Created on 2018-05-31 • Last updated on 2018-11-06


Chart on the dashboard only shows when using regular navigation; ajax navigation does not show it

Created on 2018-05-29 • Last updated on 2018-05-29


Charts do not use right colors on Firefox

Created on 2018-05-29 • Last updated on 2018-05-29


Generating invoices from orders

Created on 2018-04-12 • Last updated on 2018-04-12 • v0.12


Upgrade Braintree to use JS SDK v3

Created on 2018-03-20 • Last updated on 2018-11-06


Add delivery date/options to shipments

Created on 2018-02-20 • Last updated on 2018-05-29


Status change action to trigger conditional status changes (or instantly move an order through the workflow)

Created on 2018-01-28 • Last updated on 2018-08-22 • v0.12


Limit field disappears when setting a limit/paging

Created on 2018-01-17 • Last updated on 2018-05-29


User setting `commerce.mode` does not affect store

Created on 2018-01-09 • Last updated on 2018-05-29


Add option to not send user to unauthorized page in get_order snippet

Created on 2017-12-28 • Last updated on 2018-05-29


Add address book functionality for "My Addresses" section

Created on 2017-12-28 • Last updated on 2018-05-29


Add ability to expose/add more fields to products without a custom product type

Created on 2017-10-09 • Last updated on 2018-05-29 • v0.12


Lexicons in the dashboard show raw HTML due to automatic twig encoding

Created on 2017-10-02 • Last updated on 2018-05-29


When country limitation module is on, don't show non-allowed countries in address form

Created on 2017-09-26 • Last updated on 2018-05-29


Add ability to wipe the entire cart

Created on 2017-09-21 • Last updated on 2018-05-29


Ability to load product resource TVs in cart/checkout

Created on 2017-09-20 • Last updated on 2018-05-29 • v0.12


Better check validity of modules

Created on 2017-09-19 • Last updated on 2018-05-29


Submit cart changes to the cart, instead of checkout, if on the separate cart page

Created on 2017-09-15 • Last updated on 2018-05-29


Update Stripe gateway to use Stripe Elements

Created on 2017-07-17 • Last updated on 2018-02-07


SimpleCart product type integration

Created on 2017-07-11 • Last updated on 2018-04-29 • v1.1


Add ability to change an order address from dashboard

Created on 2017-07-11 • Last updated on 2018-04-17 • v0.12


Module or docs for adding google analytics/adwords conversion tracking

Created on 2017-07-06 • Last updated on 2018-04-07


Deleting a status change should redirect back to the statuses grid

Created on 2017-05-24 • Last updated on 2017-07-17


Sync resource product when saving a resource (e.g. onDocFormSave)

Created on 2017-04-26 • Last updated on 2018-01-22


Admin notes on payment/shipping methods

Created on 2017-04-26 • Last updated on 2018-01-22


[taxes] Allow tax rule conditions to check in properties

Created on 2017-04-25 • Last updated on 2018-01-22


Product Price Strategies (Bulk/Sale pricing)

Created on 2017-04-12 • Last updated on 2018-11-19 • v0.12


Support for bulk prices on products

Created on 2017-02-09 • Last updated on 2018-01-22 • v1.1


"In all countries except" condition on weight based shipping

Created on 2017-02-05 • Last updated on 2018-01-22


Disclaimer: Viewing non-Euro pricing

You are currently viewing prices in a non-Euro currency. Please be advised that these prices are estimates, based on data by Open Exchange Rates.

While we offer this currency converter hoping our users find it convenient, all purchases are made in Euro, and the final amount charged can vary depending on payment provider, day, time of day and a number of other factors outside of modmore's control. There are no guarantees on accuracy and modmore nor Open Exchange Rates can not be held liable for errors.