Stand With Ukraine. Stop Putin. Stop War.


Commerce is a powerful e-commerce solution for MODX, allowing you to sell online exactly the way you want. Install even more functionality with 35+ plug & play extensions, or build your own.

Version 1.2.7-pl

V2 & V3

MODX Compatibility Hover for details

Downloads 1387

Rating 4.5/5

Price € 239 per site

Developer modmore

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

Recent Releases

Commerce 1.2.7-pl

Released on 2022-09-05

Released on 2022-09-05

  • [checkout] Fix order adjustments going missing when transitioning between a session and persisted order [#867/996]
  • [dashboard] Add permission checks for free products and coupon discount tabs, and improve user/usergroup discount permission checks. [#978]
  • [dashboard] Fix modal rendering bug caused by select fields positioned at the bottom. [#966]
  • [dashboard] Fix sort icon in MODX3 [#979]
  • [invoices] Add order item adjustments to the invoice data

Commerce 1.3.0-dev4

Released on 2022-09-05 (Pre-releases Channel)

Released on 2022-07-08

Important: Commerce 1.3+ requires PHP 7.2 or up!

New features:

  • Commerce is now multilingual! Add translations to your products, shipping methods, payment methods, and more. Learn more in the documentation. [#751]
  • Commerce now has a built-in Scheduler! This allows processing tasks (such as sending emails, running nightly imports, or other intensive tasks) from a single background cron job. Learn more: [#78]
  • The order detail page now allows editing all information on an order item (unlinking it from the product), as well as adding arbitrary items [#697]
  • Allow &products=`all` on the commerce.get_products snippet to render all (non-removed) products; use &where to filter further if needed [#778]
  • Add comOrderShipment::getFieldsForShippingMethod method so a custom shipment type can provide extra fields when editing a relevant shipping method [#733]
  • Add \Commerce::EVENT_ORDER_PLACEHOLDERS event that can be used to add additional information to the commerce.get_order(s) snippets [#781]
  • Ability to reset the cart (remove all items)
  • Allow validating address properties in the Basic Address Validation module, by prefixing keys with properties.
  • Add `\Commerce::EVENT_SEND_MAIL` event that allows changing an email before it is sent (including recipient, content, attachments)
  • Add the ability to create new orders from the dashboard (phase 1)
  • Add new snippet renderer (commerce.collections_view) for displaying product information in Collections! [#844]
  • Mollie gateway now supports on-page credit cards [#870]
  • Batch status changes are now available. Select orders, choose status change, and watch them all process at once. [#292]


  • [dashboard] Forms can now reload dynamically when selecting a type of shipping or payment method, and configuring status changes [#890]
  • [dashboard] Field descriptions will now render as HTML, while using HTMLPurifier to still avoid XSS
  • Replace PHPExcel with PHPSpreadsheet for exports
  • Implement custom date picker to date and datetime admin widgets for more control and cross-browser compatibility
  • Regular order item prices (e.g. from a sale price type) are now available in item.regular_price/regular_price_formatted to show before/after per-item prices
  • [Gateways] Omnipay, and Omnipay-backed gateways (Braintree, MultiSafePay, PayPal, SagePay, and, have been upgraded to Omnipay v3 which adds support for PHP8 and removes a very old guzzle/guzzle dependency [#947]
  • [dashboard] When adding a product to an empty order, a shipment is now automatically created for you [#1012]

Bug fixes:

  • Make grid top toolbar items (inputs, buttons, selects) have a uniform height


  • symfony/polyfill-mbstring updated from v1.25.0 to v1.26.0
  • symfony/polyfill-ctype updated from v1.25.0 to v1.26.0
  • webmozart/assert updated from 1.10.0 to 1.11.0
  • composer/ca-bundle updated from 1.3.1 to 1.3.2
  • mollie/mollie-api-php updated from v2.42.1 to v2.44.1
  • commerceguys/addressing updated from v1.1.1 to v1.2.1
  • commerceguys/intl updated from v1.0.8 to v1.1.0
  • doctrine/collections updated from v1.5.0 to 1.6.8
  • dragonmantank/cron-expression updated from v3.0.2 to v3.1.0
  • twig/twig updated from v1.42.5 to v1.43.1
  • webmozart/assert added v1.10.0
  • Removed guzzlehttp/guzzle (6.5.5), upgraded to standalone guzzle7 package

Breaking changes:

  • Guzzle 6 is no longer provided by Commerce, and has been replaced with the standalone Guzzle7 package to avoid increasingly common Guzzle conflicts with different extras. The guzzle7 package is automatically installed with Commerce, but if you're currently using guzzle6-specific code in an extension that may break.
  • Guzzle 3 was previously included as part of Omnipay 2. That has been upgraded to Omnipay 3, which now uses Guzzle7.
  • The Omnipay2Gateway class has been renamed to OmnipayGateway and now uses v3 gateways. A class alias has been added to aid backwards compatibility; this will be removed in Commerce 1.6.
  • Removed the Paymill gateway as Paymill no longer exists.

Commerce 1.3.0-dev3

Released on 2022-08-28 (Pre-releases Channel)

Released on 2022-07-08

Important: Commerce 1.3+ requires PHP 7.2 or up!

New features:

  • Commerce is now multilingual! Add translations to your products, shipping methods, payment methods, and more. Learn more in the documentation. [#751]
  • Commerce now has a built-in Scheduler! This allows processing tasks (such as sending emails, running nightly imports, or other intensive tasks) from a single background cron job. Learn more: [#78]
  • The order detail page now allows editing all information on an order item (unlinking it from the product), as well as adding arbitrary items [#697]
  • Allow &products=`all` on the commerce.get_products snippet to render all (non-removed) products; use &where to filter further if needed [#778]
  • Add comOrderShipment::getFieldsForShippingMethod method so a custom shipment type can provide extra fields when editing a relevant shipping method [#733]
  • Add \Commerce::EVENT_ORDER_PLACEHOLDERS event that can be used to add additional information to the commerce.get_order(s) snippets [#781]
  • Ability to reset the cart (remove all items)
  • Allow validating address properties in the Basic Address Validation module, by prefixing keys with properties.
  • Add `\Commerce::EVENT_SEND_MAIL` event that allows changing an email before it is sent (including recipient, content, attachments)
  • Add the ability to create new orders from the dashboard (phase 1)
  • Add new snippet renderer (commerce.collections_view) for displaying product information in Collections! [#844]
  • Mollie gateway now supports on-page credit cards [#870]
  • Batch status changes are now available. Select orders, choose status change, and watch them all process at once. [#292]


  • [dashboard] Forms can now reload dynamically when selecting a type of shipping or payment method, and configuring status changes [#890]
  • [dashboard] Field descriptions will now render as HTML, while using HTMLPurifier to still avoid XSS
  • Replace PHPExcel with PHPSpreadsheet for exports
  • Implement custom date picker to date and datetime admin widgets for more control and cross-browser compatibility
  • Regular order item prices (e.g. from a sale price type) are now available in item.regular_price/regular_price_formatted to show before/after per-item prices
  • [Gateways] Omnipay, and Omnipay-backed gateways (Braintree, MultiSafePay, PayPal, SagePay, and, have been upgraded to Omnipay v3 which adds support for PHP8 and removes a very old guzzle/guzzle dependency [#947]
  • [dashboard] When adding a product to an empty order, a shipment is now automatically created for you [#1012]

Bug fixes:

  • Make grid top toolbar items (inputs, buttons, selects) have a uniform height


  • symfony/polyfill-mbstring updated from v1.25.0 to v1.26.0
  • symfony/polyfill-ctype updated from v1.25.0 to v1.26.0
  • webmozart/assert updated from 1.10.0 to 1.11.0
  • composer/ca-bundle updated from 1.3.1 to 1.3.2
  • mollie/mollie-api-php updated from v2.42.1 to v2.44.1
  • commerceguys/addressing updated from v1.1.1 to v1.2.1
  • commerceguys/intl updated from v1.0.8 to v1.1.0
  • doctrine/collections updated from v1.5.0 to 1.6.8
  • dragonmantank/cron-expression updated from v3.0.2 to v3.1.0
  • twig/twig updated from v1.42.5 to v1.43.1
  • webmozart/assert added v1.10.0
  • Removed guzzlehttp/guzzle (6.5.5), upgraded to standalone guzzle7 package

Breaking changes:

  • Guzzle 6 is no longer provided by Commerce, and has been replaced with the standalone Guzzle7 package to avoid increasingly common Guzzle conflicts with different extras. The guzzle7 package is automatically installed with Commerce, but if you're currently using guzzle6-specific code in an extension that may break.
  • Guzzle 3 was previously included as part of Omnipay 2. That has been upgraded to Omnipay 3, which now uses Guzzle7.
  • The Omnipay2Gateway class has been renamed to OmnipayGateway and now uses v3 gateways. A class alias has been added to aid backwards compatibility; this will be removed in Commerce 1.6.
  • Removed the Paymill gateway as Paymill no longer exists.

Commerce 1.3.0-dev2

Released on 2022-07-08 (Pre-releases Channel)

Released on 2022-07-08

Important: Commerce 1.3+ requires PHP 7.2 or up!

New features:

  • Commerce is now multilingual! Add translations to your products, shipping methods, payment methods, and more. Learn more in the documentation. [#751]
  • Commerce now has a built-in Scheduler! This allows processing tasks (such as sending emails, running nightly imports, or other intensive tasks) from a single background cron job. Learn more: [#78]
  • The order detail page now allows editing all information on an order item (unlinking it from the product), as well as adding arbitrary items [#697]
  • Allow &products=`all` on the commerce.get_products snippet to render all (non-removed) products; use &where to filter further if needed [#778]
  • Add comOrderShipment::getFieldsForShippingMethod method so a custom shipment type can provide extra fields when editing a relevant shipping method [#733]
  • Add \Commerce::EVENT_ORDER_PLACEHOLDERS event that can be used to add additional information to the commerce.get_order(s) snippets [#781]
  • Ability to reset the cart (remove all items)
  • Allow validating address properties in the Basic Address Validation module, by prefixing keys with properties.
  • Add `\Commerce::EVENT_SEND_MAIL` event that allows changing an email before it is sent (including recipient, content, attachments)
  • Add the ability to create new orders from the dashboard (phase 1)
  • Add new snippet renderer (commerce.collections_view) for displaying product information in Collections! [#844]
  • Mollie gateway now supports on-page credit cards [#870]
  • Batch status changes are now available. Select orders, choose status change, and watch them all process at once. [#292]


  • [dashboard] Forms can now reload dynamically when selecting a type of shipping or payment method, and configuring status changes [#890]
  • [dashboard] Field descriptions will now render as HTML, while using HTMLPurifier to still avoid XSS
  • Replace PHPExcel with PHPSpreadsheet for exports
  • Implement custom date picker to date and datetime admin widgets for more control and cross-browser compatibility
  • Regular order item prices (e.g. from a sale price type) are now available in item.regular_price/regular_price_formatted to show before/after per-item prices

Bug fixes:


  • symfony/polyfill-mbstring updated from v1.25.0 to v1.26.0
  • symfony/polyfill-ctype updated from v1.25.0 to v1.26.0
  • webmozart/assert updated from 1.10.0 to 1.11.0
  • composer/ca-bundle updated from 1.3.1 to 1.3.2
  • mollie/mollie-api-php updated from v2.42.1 to v2.44.1
  • commerceguys/addressing updated from v1.1.1 to v1.2.1
  • commerceguys/intl updated from v1.0.8 to v1.1.0
  • doctrine/collections updated from v1.5.0 to 1.6.8
  • dragonmantank/cron-expression updated from v3.0.2 to v3.1.0
  • twig/twig updated from v1.42.5 to v1.43.1
  • webmozart/assert added v1.10.0
  • Removed guzzlehttp/guzzle (6.5.5), upgraded to standalone guzzle7 package

Breaking changes:

  • Guzzle 6 is no longer provided by Commerce, and has been replaced with the standalone Guzzle7 package to avoid increasingly common Guzzle conflicts with different extras. The guzzle7 package is automatically installed with Commerce, but if you're currently using guzzle6-specific code in an extension that may break.

Commerce 1.2.6-pl

Released on 2022-04-08

Released on 2022-04-08

  • [core] Fix a bunch of MODX 3 incompatibilities, type checks, etc
  • [core] Display file and line number accurately when using adapter's log() function
  • [core] Add max length validators to description fields on forms [#940]
  • [checkout] Fix item adjustments not being copied from a session order to a persisted one when checking out
  • [dashboard] Render order item adjustments on detail page directly, without having to expand calculations
  • [dashboard] Fix missing slash being displayed in configuration admin template check [#925]
  • [dashboard] Fix wrong lexicon used for deleting tax groups
  • [dashboard] Fix inputClass not working on select and multiple select field types
  • [dashboard] Make sure dashboard and discounts tab don't display if missing related permissions [#928]
  • [dashboard] Fix incorrect container height in MODX3 [#955]
  • [discounts] Fix free products not respecting min/max quantity discount conditions [#952]
  • [emails] Fix order item adjustments missing from email messages; now available under items[n].adjustments per the cart and included in the default emails
  • [install] Fix installing default policies on MODX3
  • [gateways] Mollie: make sure the order summary uses multibyte functions when shortening product names, to avoid json encode issues
  • [gateways] Stripe: handle Customer ID changing by cancelling existing PaymentIntent, and creating a new one [#891]
  • [orders] Don't calculate tax totals if there are no items to calculate with, fixing "Encountered empty IN condition with key id" error [#898]
  • [orders] Use strict check when removing items from a session order
  • [orders] Avoid undefined array key warnings on PHP8 when a shipment has no tax rate assigned [#911]
  • [products] Allow product bundles to have infinite stock if all its products have infinite stock [#876]
  • [reports] Fix cancelled orders being included when calculating total tax [#888]
  • [reports] Fix cancelled orders being included in tax report calculations [#889]
  • [snippets] All snippet properties passed to commerce.get_product(s) are now passed through to templates with a "scriptProperties." prefix
  • [tvs] Prevent MySQL error when a product list TV has no value yet (on some environments)
  • [tvs] Prevent the product list TV modal from auto-closing when attempting to save, this is so user is aware if there was an error [#945]

Updated dependencies:

  • composer/ca-bundle (1.2.10 => 1.3.1)
  • guzzlehttp/promises (1.4.1 => 1.5.1)
  • guzzlehttp/psr7 (1.8.2 => 1.8.5)
  • mollie/mollie-api-php (v2.37.1 => v2.42.0)
  • stripe/stripe-php (v7.97.0 => v7.121.0)
  • symfony/polyfill-ctype (v1.23.0 => v1.25.0)
  • symfony/polyfill-intl-idn (v1.23.0 => v1.25.0)
  • symfony/polyfill-intl-normalizer (v1.23.0 => v1.25.0)
  • symfony/polyfill-mbstring (v1.23.1 => v1.25.0)
  • symfony/polyfill-php72 (v1.23.0 => v1.25.0)

Commerce 1.2.5-pl

Released on 2021-10-27

Released on 2021-10-27

  • Fix license checks on MODX 3.0.0-alpha3

Commerce 1.2.4-pl

Released on 2021-10-26

Released on 2021-10-27

  • Allow installation on MODX 3.0.0-alpha3

Commerce 1.2.3-pl

Released on 2021-10-25

Released on 2021-10-25

Heads up: we're updating the minimum PHP requirement to 7.2 in Commerce 1.3.

  • [core] Fix applicable tax records getting duplicated each time a cart order is loaded
  • [core] Fix several PHP8 deprecation notices [873]
  • [checkout] Fix tax_rates array being incomplete in the cart until checking out [S29807]
  • [discounts] Fix anonymous user discounts not getting removed when the user logs in [S30008]
  • [products] Fix resource product image fields lacking the media source base url

Commerce 1.2.2-pl

Released on 2021-09-24

Released on 2021-09-24

Heads up: we're updating the minimum PHP requirement to 7.2 in Commerce 1.3.

  • [core] Make sure an order that transitions into processing state always has the order reference set. This covers an edge case where an order is created in the checkout, but then manually confirmed in the dashboard. [#859]
  • [dashboard] Fix wrong documentation links in the statuses check [S29486]
  • [emails] Default outgoing emails now include the customers' email address and phone number [#841]
  • [modules] Prevent double-escaping text in the Basic Custom Fields module [#815]
  • [products] Add support for infinite products on resource products [#839]
  • [setup] Move SSL root certificates resolver to after dependencies are installed to avoid early warnings, and change wording to clarify what it's doing

Dependency updates:

  • mollie/mollie-api-php updated from v2.37.0 to v2.37.1
  • stripe/stripe-php updated from v7.92.0 to v7.97.0

Commerce 1.2.1-pl

Released on 2021-08-04

Released on 2021-08-04

Heads up: we're updating the minimum PHP requirement to 7.2 in Commerce 1.3.

  • [core] Fix issue with tax rates not getting removed when new rates are needed [#813]
  • [gateways] Mollie: limit order summary in the metadata to max 5 items to avoid failing transactions on large orders [S29060]
  • [setup] We're now installing composer dependencies dynamically during the setup; please reach out if you encounter any issues. (Note that the deprecation notices will be fixed in 1.3.)

Dependency updates:

  • mollie/mollie-api-php updated from v2.36.1 to v2.37.0
  • stripe/stripe-php updated from v7.86.0 to v7.92.0
  • symfony/polyfill-mbstring updated from v1.23.0 to v1.23.1

Commerce 1.2.0-pl

Released on 2021-07-01

Released on 2021-07-01

  • [core] Fix constant regeneration of shipment records for session orders, causing tons of orphaned shipment records
  • [core] Make sure comOrderShipment always has the order object, fixing issue with $shipment->getItems() and the shipment calculation
  • [core] Fix incorrect shipping method being applied when first adding an item to the cart that changes what shipping methods are available
  • [checkout] Ensure EnforceStock module works as expected without a redirect, so AJAX add-to-cart scripts also get the structured error and message - if you use a custom add-to-cart script, please verify it still works as expected [#755]
  • [dashboard] Fix clicking a mailto link on the order view opening in the Commerce modal and never loading [#759]
  • [dashboard] The configuration checklist will now show a warning if the admin templates have been copied to a custom theme [#771]
  • [dashboard] Change lexicon on delivery types and tax groups grids from "Allowed usage" to "Used for"
  • [dashboard] Only show processing/completed orders in dashboard list
  • [gateways] Percentage price of payment method may now be negative [S28193]
  • [gateways] Braintree: prevent double submit while javascript is processing [#676]
  • [shipping] Fix Country shipping method not using the default pricing if no country is available for the order yet
  • [statuses] Better catch errors in status change actions so the checkout isn't interrupted if one fails
  • [taxes] TaxJar rate provider will now halt early if the required state (US/CA) or zip (US) isn't provided [#762]
  • [taxes] Manual tax rate provider will now update the name on created tax rates [S28365]

Dependency updates:

  • stripe/stripe-php updated from v7.79.0 to v7.86.0
  • mollie/mollie-api-php updated from v2.31.1 to v2.36.1
  • composer/ca-bundle updated from 1.2.9 to 1.2.10
  • symfony/polyfill-mbstring updated from v1.22.1 to v1.23.0
  • symfony/polyfill-php72 updated from v1.22.1 to v1.23.0
  • symfony/polyfill-intl-normalizer updated from v1.22.1 to v1.23.0
  • symfony/polyfill-intl-idn updated from v1.22.1 to v1.23.0
  • symfony/polyfill-ctype updated from v1.22.1 to v1.23.0

Commerce 1.2.0-rc5

Released on 2021-04-07

Released on 2020-04-07

  • [dashboard] Fix invisible text on "paid" label due to regression in 1.2.0-rc4 [#748]

Commerce 1.2.0-rc4

Released on 2021-04-07

Released on 2020-04-07

  • [admin] Allow SelectField to specify a custom emptyOptionLabel [#747]
  • [core] Make sure Commerce::EVENT_ORDERITEM_REMOVED fires in the cart (session order) as well when removing an item
  • [core] Make sure comProduct does not return removed delivery types in getDeliveryType() but the default instead [S26851]
  • [core] Update encryptedVehicle to v2.1 to allow starting initial work om MODX3 compatibility
  • [dashboard] Fix legibility of test/live mode labels in the dashboard top right [#725]
  • [dashboard] Prevent a 302 response on the checkout from flagging a HTTPS issue on the checklist [#722]
  • [dashboard] Fix missing icon for "Tax Groups" in the configuration section [#731]
  • [discounts] Fix FreeProducts module not removing free items for no longer meeting the requirements, when the order total changes to 0 after removing products [#726]
  • [discounts] Change FreeProducts module to run after, rather than before, order calculation. This allows the free product to be added one calculation sooner which in some edge cases is necessary to show up immediately [#746]
  • [discounts] Ignore fixed price coupons when calculating the quantity of order items [#679]
  • [gateways] Avoid double order processing for Stripe payments, by slowing down the webhook if it does not yet have the checkout-provided transaction ID [#729]
  • [modules] Add new required_address_fields placeholder in the Basic Address Validation module, allowing the address templates to show what fields are required [#727]
  • [taxes] EU VAT Validator now no longer requires oAuth credentials to access the HMRC VAT Validation API [#741]
  • [templates] Use commerce.coupon_code lexicon in frontend/checkout/cart/aside.twig by default [S26699]
  • [templates] Add new lexicons for "{tax percent} of/over {total taxed}" text in frontend/checkout/partial/summary.twig [#361, S26699]
  • [checkout] EnforceStock: Error messages now persist and correctly display after a redirect [#742]

Commerce 1.2.0-rc3

Released on 2021-02-25 (Pre-releases Channel)

Released on 2020-02-25

New features:

  • [dashboard] The dashboard has been revamped with new stats and an improved chart.
  • [checkout] Add steps, currentKey, and commerce_mode placeholders to the templates for individual steps. Previously these were only available in the wrapper template, but making them available in the individual steps gives additional template flexibility.
  • [checkout] Add user (id, username and profile) information to the step templates
  • [checkout] The Address step now supports a different data structure for selecting a previously used address. Provide "billing_address"/"shipping_address" with a value of "previous" (instead of the address ID), and provide the address ID in "previous_billing_address"/"previous_shipping_address" instead. This makes for easier templating. The old behavior will remain supported as well.
  • [checkout] Allow overriding the checkout process class in the cart (which was already supported in the checkout) [S26544]
  • [checkout] It's now possible for modules to add extra fees/price increases to an order item with the new comOrderItemExtraAdjustment item adjustment type. By adding the price adjustment, the subtotal is increased (before discount/tax calculation) which allows for an improved experience with custom configurators or required fees that need to be associated with an item.
  • [checkout] When selecting a shipping method, its `setShippingInformation` method is now called from the shipment, along with the associated shipment_data, to allow simpler interactive shipping method implementations without the need for adding a custom shipment as well.
  • [dashboard] Add refresh on close option to actions. This allows you to indicate clicking a button or following an action should do a full refresh of the page on completion.
  • [orders] There's now a comOrder->getUser() method which will load the user associated with the order (if any). Previously you may have used Adapter->getUser(), however that will return the manager user when viewing an order in the back-end, which may or may not be what you need.
  • [orders] Allow adding manual transactions via the dashboard. This provides the back-end users with the ability to register an externally processed refund or payment to ensure the order matches.
  • [taxes] Commerce can now validate United Kingdom (GB) VAT registration numbers against the HMRC database, built-in to the EU VAT Validator module. To use this, you need to configure the module with production credentials from the HMRC Developer Hub with "Check a UK VAT number API" enabled.
  • [statuses] Allow marking a status change action as inactive to keep the configuration, but not run it on an order
  • [core] Add last_used column to user addresses to track when an address was last used


  • [core] United Kingdom (country code UK, GB for VAT) is no longer considered part of the EU [#364]
  • [core] If the commerce mode is set to disabled, snippets that load product information will now continue to load that product information. Disabled mode will now only affects the cart, checkout, and order snippets.
  • [core] Greatly improve the performance of the cart when adding a large amount (> 10) different items [#650]
  • [checkout] Product prices are now no longer checked (and potentially updated if a sale ended) if a transaction has started to avoid orders getting stuck because the transaction total no longer matches the order total [S25214]
  • [checkout] Make sure orders are marked as completed immediately (instead of after a redirect back and forth) when a transaction is completed immediately
  • [dashboard] Dashboard UI was updated from Semantic UI 2.4 to Fomantic UI 2.8 which has caused some minor style changes. If you see any unexpected changes, please let us know.
  • [emails] Make sure default email to merchant includes shipping information [#672]
  • [checkout] Prettify redirect pages a bit; they're not typically user-visible but will now have some styling in case they do
  • [checkout] Fix potential issue with redirecting gateways and webhook notifications. In some cases when the customer returns to the checkout, they would get sent to the cart instead of the thank you step, due to the checkout processing the thank you step (= removing the session data identifying the order) before the redirect was sent. The checkout will now always redirect the customer to the current step if the requested step is no longer allowed or not specified. [S26178]
  • [gateways] Mollie: pass along customers' name and email, plus a mini-summary of the order items, in the metadata [#690]
  • [gateways] SagePay gateway updates (Thanks David!) [S24919]
  • [gateways] Gateway return URLs created by the GatewayHelper now include the step parameter to avoid an extra redirect introduced by the previous change.
  • [products] Reading the value of TVs in a Resource Products will now bypass the resource cache.
  • [reports] Update the Sales report to make it fill empty values between the last order and selected until date or today

Bug fixes:

  • [checkout] Add cache-busting string to payments.js to ensure it's loaded through sticky caches
  • [checkout] Make sure address properties are copied into order addresses
  • [checkout] Make sure the address step sets a generic error if validation fails ("Please fix your shipping address") and also reloads with the new address form open
  • [checkout] Trailing spaces are now trimmed on all address values prior to validation. Previously spaces could interfere with validation or downstream integrations (payments, shipping, taxes) where an address value with a trailing space breaks something.
  • [checkout] Prevent fatal error when a logged-in user selects a previously used address on PHP8 (MODX v2.8.2+)
  • [checkout] EnforceStock: items added by the FreeProducts module are now ignored to avoid race conditions
  • [checkout] EnforceStock: if items are removed or have their quantity changed, the checkout will now return to the cart to show the error message
  • [dashboard] Fix issue where image fields may get enhanced twice, causing double popups [S25992]
  • [discounts] Fix free products not being added to the cart if "one of products" is not filled [S25010]
  • [gateways] Fix fatal error in the Stripe webhook handling
  • [gateways] Update Stripe client from v6 to v7.75, incorporating breaking changes and improving error handling
  • [gateways] Fix potential double-submit issue with gateway [S23888]
  • [gateways] Fix decimal cut-off with MultiSafePay gateway [S25165]
  • [gateways] Stripe: trim trailing spaces of customer data to avoid issues
  • [gateways] Stripe: Fix uncaught exception if an error is encountered creating or updating customer records
  • [core] Rename global $loader to avoid conflicts
  • [core] Avoid running into PHP8 issue by sanitising lexicon parameters made through the adapter
  • [orders] Fix Order Fields not automatically getting saved in session orders (i.e. in the cart) [S24907]
  • [taxes] Fix potential fatal error when customers enter invalid characters in a VAT registration number

Commerce 1.2.0-rc2

Released on 2020-08-17 (Pre-releases Channel)

  • [core] Don't overwrite the autoloader with a wrong path in the Commerce service

Commerce 1.2.0-rc1

Released on 2020-08-05 (Pre-releases Channel)

Released on 2020-08-06

  • [checkout] Default frontend/checkout/payment-method.twig template now has an {% else %} condition to show an error when no payment options are available
  • [core] New Markdown service added for simple parsing of markdown text or inline snippets.
  • [core] Switch license check to a POST instead of GET to avoid 414 Request-URI Too Long issues
  • [core] Load commerce:messages lexicon by default in all requests
  • [core] When sending an email, it will now by default write the fully-parsed HTML content to the order message table. To disable that, for example while customising email templates, disable the new commerce.save_sent_message_content system setting.
  • [core] Alter the order message content field from text (max 64kb) to mediumtext (max 16mb) to allow storing large parsed emails with complex markup structures or inline data images
  • [core] Prevent recursive loop triggered by FreePro duct module
  • [core] Make sure context-specific lexicon (cultureKey) is loaded when processing status changes from either a payment webhook or back-end status change in different manager_language [#566]
  • [core] Support ClientConfig settings in multi-context mode when loading an order-specific context for processing from the back-end
  • [checkout] Fix retrying a pending payment not working [#592]
  • [dashboard] Support an extra level of nested transaction information when viewing transaction details
  • [dashboard] Fix z-index conflict causing modals to pop below the MODX header when used alongside Redactor 3 [#599]
  • [dashboard] Process MODX tags in the email preview in the manager [#584]
  • [dashboard] Prevent autocomplete on password fields
  • [dashboard] Fix license check in configuration checklist having poor performance and/or incorrect result
  • [gateways] New ConditionallyAvailableGatewayInterface allows gateway implementations to evaluate if an order can use a payment gateway
  • [gateways] Mollie gateway now exposes its client
  • [gateways] Prevent Stripe attempting to create negative transactions in edge-cases
  • [gateways] Make sure Stripe does not reuse a payment intent on the payment step if it already succeeded [#585]
  • [gateways] Make sure values passed to Stripe are stripped of spaces that may break validation [#593]
  • [gateways] Make sure Mollie gateway shows localised method names and descriptions [S23052]
  • [messages] Add a setting (commerce.default_message_type) to control what order message type to use by default when creating an order message
  • [messages] Add new templated order message type, use that for sending emails to customers wrapped in a professional template
  • [modules] Make it possible to add actions to transactions from a module using new event (\Commerce::EVENT_DASHBOARD_TRANSACTION_ACTIONS)
  • [products] Prevent adding product bundle to itself causing infinite loop [#618]
  • [products] Matrix now shows infinite stock products accordingly - if you have custom Twig templates for matrices in the front-end, you may need to also address this issue in your own template by checking `product.stock_infinite` [#577]
  • [products] Reduce minimum length of row/column names to 1 character instead of 3 [#576]
  • [reports] Fix Addresses export; now exports addresses used in processing/completed orders rather than addresses saved on a user profile [#632]
  • [reports] New option on the "Orders" export that lets you also export associated item information in extra rows [#626]
  • [reports] Update Products export with multi-currency prices, infinite stock, and other missing fields [#526]
  • [setup] Make sure installation is marked as failed if requirements aren't met
  • [setup] Check the database connection is still alive after unpacking files, and automatically reconnecting if not. [#600]
  • [shipments] Get weight unit from the first product rather than a hardcoded kg default
  • [taxes] Correct EUVat caching lifetime to 12 hours
  • [taxes] You can now prefix tax rule conditions with "shipping_address.", "billing_address.", and "order." to target specific objects as needed. [#137]
  • [taxes] You can now prefix tax rule conditions with "properties." to look in object properties. Can be combined with the object prefix, e.g. "" [#137]
  • [taxes] TaxJar integration has been updated: now uses shipping instead of billing address, no longer restricted exclusively to US (use tax rule conditions to limit if needed), update tax rate names from lexicon, provide email as customer_id (to manage customer exemptions in TaxJar), provide street + city for rooftop accuracy, support street + city in nexus
  • [taxes] EUVat tax rate names will now be updated when used, allowing improved localisation [#362]
  • [tvs] Prevent product pricing TV from breaking and refusing to save data if the TV had a numeric value before

Dependency updates:

  • commerceguys/addressing updated from v1.0.7 to v1.0.8
  • commerceguys/intl updated from v1.0.5 to v1.0.6
  • composer/ca-bundle updated from 1.2.5 to 1.2.7
  • guzzlehttp/guzzle updated from 6.4.1 to 6.5.5
  • mollie/mollie-api-php updated from v2.17.0 to v2.18.0
  • taxjar/taxjar-php updated from v1.9.0 to v1.10.3
  • symfony/polyfill-ctype updated from v1.13.1 to v1.17.1
  • twig/twig updated from v1.42.4 to v1.42.5
  • symfony/polyfill-php70 updated from v1.13.1 to v1.17.1
  • symfony/polyfill-mbstring updated from v1.13.1 to v1.17.1
  • symfony/http-foundation updated from v3.4.36 to v3.4.42
  • symfony/polyfill-php72 installed in version v1.17.0
  • symfony/polyfill-intl-idn installed in version v1.17.1

Commerce 1.0.4-pl

Released on 2020-04-17

Released on 2020-04-17

  • [taxes] IMPORTANT: the service previously used in the EUVat rate provider was shut down all of a sudden. We've set up a new private API with the current rates instead, and updated the EUVat rate provider to use that.
  • [core] Silence deprecation warnings for core modules - those have all been updated.

Commerce 1.1.4-pl

Released on 2020-04-16

Released on 2020-04-17

  • [taxes] IMPORTANT: the service previously used in the EUVat rate provider was shut down all of a sudden. We've set up a new private API with the current rates instead, and updated the EUVat rate provider to use that.
  • [invoices] Fix incorrect placeholder causing VAT registration numbers to be missing from the invoices [S22494]
  • [invoices] Make sure invoice generation organises by year based on the created date, not the current date
  • [invoices] Provide a utility to regenerate all invoices from SSH
  • [emails] Add nl2br filter to the payment/shipping method email note in the default order-received template

Commerce 1.1.3-pl

Released on 2020-03-30

Released on 2020-03-30

This release is a hotfix to correct issues with the and other payment gateways, resulting from out-of-date TLS certificate bundles. For more information, please see the announcement:

  • [core] During package installation automatically update root certificates for legacy implementations of guzzle/guzzle, including gateway and possibly other implementations of the pre-1.1 BaseGateway [S22401]

Commerce 1.1.2-pl

Released on 2020-03-22

Released on 2020-03-23

  • [core] Relax minimum PHP requirements back down to v7.1+
  • [core] Increase the size of and fields [#571]
  • [countries] Fix isInEuropeanUnion check (countries availability, taxes) using incorrect "UK" and "EL" country codes, that should have been (and now is) "GB" and "GR" [#542]
  • [modules] Basic Custom Fields: spaces around the field name are now ignored [F1981]
  • [payments] Expired Mollie transactions are now recognised as having failed
  • [payments] Improve Stripe webhook logic to be able of identifying transaction records for already completed transactions [#551]
  • [invoices] Render MODX tags in invoices [S22302]
  • [settings] Fix reference to time_format instead of commerce.time_format for the time formatter
  • [taxes] Rewrote most of the EU VAT Validator to better account for UK/GB and EL/GR country codes and improve automated tests


  • commerceguys/addressing updated from v1.0.6 to v1.0.7
  • mollie/mollie-api-php updated from v2.12.1 to v2.17.0

Commerce 1.1.1-pl

Released on 2019-12-13

Released on 2019-12-13


  • Downgrade guzzlehttp/guzzle from v6.5.0 to v6.4.1 to workaround guzzle/guzzle#2458, affecting users on MODX Cloud
  • composer/ca-bundle updated from 1.2.4 to 1.2.5

Commerce 1.1.0-pl

Released on 2019-12-11

Released on 2019-12-11

  • [core] Move SoftDelete trait to comDiscount instead of derivative classes
  • [core] Send package data (see configuration > data sharing) as base64 to prevent license request timeouts
  • [coupons] Prevent max uses resetting to 1 when it was previously left empty for unlimited uses
  • [coupons] Fix fixed price coupon not being removed from the order when the requirements are no longer met [#425]
  • [checkout] Fix order totals not updating right away when changing the chosen shipping method [S21436]
  • [dashboard] Rework the statuses grid: now lists actions for easier discovery and quicker edits [#509]
  • [dashboard] Fix markup shown in "Orders with this product" grid for the order number
  • [dashboard] Show coupon time availability a bit differently in the grid
  • [dashboard] Allow changing the source status on a status change [S21408]
  • [dashboard] Fix HTTPS check when using a protocol relative site url [#485]
  • [dashboard] Show payment method in order grid [#518]
  • [dashboard] Check for an invalid target status for the payment received status change in the configuration checklist
  • [developer] Allow easier extending of the recipient in comStatusChangeActionEmail with new getRecipient method [F1952]
  • [developer] New ContextsField available for the dashboard
  • [discounts] Add minimum and maximum order item quantity restrictions to coupons, user(group) discounts, and free products [S21387]
  • [discounts] Fix the active checkbox always been checked, even when a discount was previously deactivated [S20833]
  • [gateways] PayPal: Silence IPN-related errors, IPN is not currently supported [#462]
  • [modules] ItemData: when a link (resource id) is provided, generate a full rather than relative link [S21095]
  • [products] Fix duplicating a product causing you to edit the original instead of the duplicate [S21489]
  • [payments] Make sure webhook payment confirmations trigger the paid status change [#494]
  • [payments] Catch additional exceptions trying to load payment intents from Stripe [#463]
  • [payments] Catch exceptions in legacy gateways and rethrow as TransactionException to allow handling
  • [payments] Add context restrictions and min/max order item quantity restrictions to payment methods
  • [shipping] Add context restrictions and min/max order item quantity restrictions to shipping methods


  • commerceguys/addressing updated from v1.0.5 to v1.0.6
  • commerceguys/intl updated from v1.0.4 to v1.0.5
  • guzzlehttp/guzzle updated from 6.3.3 to 6.5.0
  • mollie/mollie-api-php updated from v2.12.0 to v2.12.1
  • symfony/event-dispatcher updated from v2.8.50 to v2.8.52
  • symfony/polyfill-ctype updated from v1.12.0 to v1.13.1
  • twig/twig updated from v1.42.3 to v1.42.4
  • symfony/polyfill-php70 updated from v1.12.0 to v1.13.1
  • symfony/polyfill-mbstring updated from v1.12.0 to v1.13.1
  • symfony/http-foundation updated from v3.4.32 to v3.4.36
  • mexitek/phpcolors updated

Commerce 1.1.0-rc3

Released on 2019-10-21 (Pre-releases Channel)

Released on 2019-10-22

  • [dashboard] Fix order in product list not persisting after a reload [S21095]
  • [gateways] Stripe: catch exception when loading a Customer (e.g. loading test customer in live mode) [S20779]
  • [gateways] Stripe: fix webhooks not working as expected due to timing issue [S20779]
  • [gateways] Stripe: make sure the payment intent description and meta data is updated in Stripe when confirmation is received through webhook
  • [gateways] Fix CommercePayments.onSubmit in IE11 [#457]
  • [snippets] get_cart: load the order fields when &loadOrderFields is enabled [#465]
  • [snippets] get_product: prevent error getting logged when no product is provided


  • composer/ca-bundle updated from 1.1.4 to 1.2.4
  • mollie/mollie-api-php updated from v2.10.0 to v2.12.0
  • stripe/stripe-php updated from v6.43.0 to v6.43.1
  • taxjar/taxjar-php updated from v1.8.1 to v1.9.0
  • symfony/polyfill-ctype updated from v1.11.0 to v1.12.0
  • twig/twig updated from v1.42.2 to v1.42.3
  • symfony/polyfill-php70 updated from v1.11.0 to v1.12.0
  • symfony/polyfill-mbstring updated from v1.11.0 to v1.12.0
  • symfony/http-foundation updated from v3.4.29 to v3.4.32

Commerce 1.1.0-rc2

Released on 2019-09-02 (Pre-releases Channel)

Released on 2019-09-03

  • [core] Fix incorrect setting reference in shared data (3+)
  • [core] Update comOrderEmailMessage to use the TwigView instead of Twig [#452]
  • [dashboard] Fix displaying email messages in the order view [S20788]
  • [dashboard] Fix SQL error (and missing tax collected data) on Configuration > Tax Rates with MySQL only_full_group_by mode enabled [#451]
  • [gateways] Stripe: Pass billing address, including for anonymous users without a Customer record
  • [gateways] Stripe: Fix JavaScript error, caused by quotes in translations [S20779]
  • [gateways] Braintree: transaction information is now available again in the transaction details [#450]
  • [gateways] Braintree: add properties to enable/disable 3D Secure (optionally requiring liability shift), PayPal, and Kount anti-fraud [#448]
  • [gateways] Braintree: add additional information to increase odds of using 3D Secure 2.0 [#448]
  • [modules] Fix ItemData module not remembering price due to missing is_manual_price in v1.1 [S20808]
  • [products] Fix price index not being written/updated for newly created products [S20812]
  • [templates] Prevent passing an incorrect value to the format_address filter from causing a fatal error


  • stripe/stripe-php updated from v6.43.0 to v6.43.1

Commerce 1.1.0-rc1

Released on 2019-08-14 (Pre-releases Channel)

Released on 2019-08-15

Commerce now requires at least PHP 7.1 or higher. See:

This release also implements data sharing that allows us to analyse how Commerce is implemented. This can be configured to only share the data you are comfortable sharing, and defaults to only technical information. For detailed information, see Configuration > Data Sharing in the dashboard.

There are also a lot of code cleanups and some minor breaking changes in this release. See for details.

New features:

  • [checkout] New Basic Order Fields module to make it easier to accept custom data (without writing a module)
  • [checkout] Custom order fields are now available as {{ order_fields.KEY }} in checkout templates and the ajax response
  • [pricing] [BC] PriceTypeInterface::getFields() signature change to include passing the Commerce instance
  • [pricing] Price types can now provide a `select` field with `options => [value => label]`
  • [products] Products can now have infinite stock, simply check the new checkbox when editing a product
  • [products] Added new User and User Group price types for product pricing [F1669]
  • [payments] Stripe gateway updated using Payment Intents, Elements and Customers for SCA/3DS compatible payments
  • [payments] Mollie gateway updated based on v2 API, supporting multi-currency, new "show" payment option to show all options on-site, issuers shown for all options with issuers with image
  • [payments] Braintree gateway updated to Drop-in UI v3, supporting customers (= vaulted payment methods), Vault Manager, 3DS (SCA), and PayPal
  • [payments] New comTransaction-related events for created, cancelled, processing, failed and completed events.
  • [payments] New CommercePayments.onSubmit utility to ease payment form submit-based callbacks
  • [shipping] New comShippingMethod->getShippingForm method to let you render a form for a shipping method
  • [shipping] [BC] comOrderShipment->setShippingMethod method now has an extra argument array $data, which will contain submitted values from the checkout, and accepts a string return value to indicate an error to the customer
  • [shipping] New comOrderShipment->getShipmentDetails() method to define key => value pairs of information to show in the order items grid
  • [shipping] New comOrderShipment->getTrackingURL() method to define a customer-facing Track & Trace URL, available everywhere shipments are available as tracking_url
  • [shipping] You can now exclude countries in shipping methods by prefixing them with a dash (-) [#122]
  • [shipping] You can now add "EU" or "-EU" to country conditions to target the entire EU at once
  • [snippets] get_matrix now has access to {{ resource.FIELD or TV }} placeholders [S20375]
  • [snippets] get_products now supports &offset and pagination with getPage/pdoPage
  • [snippets] get_products has a new &wrapperTpl property to set a chunk [F1855]
  • [templates] New strftime Twig filter for locale-dependant date formatting
  • [dashboard] New Number($min, $max) validation for admin fields
  • [dashboard] Allow paid extensions (from the modmore provider) to re-use the license check in the checklist


  • [core] A new ViewInterface (+ TwigView implementation) replaces core and module interaction with Twig.
  • [core] comOrderItem::getOrder will now return the session order if no persisted order is set yet
  • [core] Formatted dates now take into account the MODX server_offset_time system setting [#413]
  • [dashboard] When clicking a link/button that opens in a modal, the modal is now immediately opened showing a loading spinner, to indicate something is happening
  • [dashboard] The dashboard will now process inline javascript when using ajax navigation and in modals
  • [dashboard] Expand checklist for shipping methods to check if shipping methods exist for each delivery type
  • [dashboard] Generic "text" type for price type subfields added
  • [dashboard] Show IDs for products, statuses, payment methods, shipping methods, delivery types, and tax groups in the dashboard
  • [dashboard] DescriptionField now uses slightly different markup so the title is in the left column, and description to the right
  • [dashboard] DescriptionField now supports `raw` - when provided the description is not escaped when added into the form
  • [dashboard] Ajax navigation now updates the browser URL without waiting for a response
  • [dashboard] Better catch fatal errors in the dashboard
  • [emails] The email note is now available for each transaction (transaction.email_note) and shipment (shipment.email_note) separately
  • [frontend] Default styles updated for Mollie payment gateway and MyParcel shipping method (separate extension)
  • [invoices] Default invoice/web.twig template now only adds the img tag when a logo url is set, falling back to the site name
  • [invoices] Fixed incorrect usage of order.created_on instead of order.received_on for the order date
  • [invoices] Invoice meta block is now aligned right
  • [modules] Changed the way modules are loaded for better error handling in the initialisation of modules. If a module causes an error or exception when initialising, that is now stored with the module record and shown in the module configuration
  • [modules] Checkout event now has the request method, so you can choose to only act on GET/POST
  • [setup] The Euro currency now defaults to a period (.) for the decimal separator and comma (,) for thousands instead of the reverse
  • [payments] Manual payment gateway has been refactored to the new GatewayInterface
  • [payments] Payment Methods can now scope their input fields as "payment_method[ID]" to only get their own values, preventing conflicts [#219]
  • [reports] Sales report will now fill up days without a date at the start of the result range
  • [snippets] Snippets now use $commerce->getChunk instead of $modx->getChunk for easier enhancements
  • [snippets] The get_product snippet now includes the resource it's called from in the log message when product information can't be found [#430]
  • [snippets] Add &where and &logSql properties to get_orders and get_products
  • [shipments] tracking_url and weight_formatted now available in emails and elsewhere shipments are loaded

Bug fixes:

  • [checkout] Only process available Payment Methods in the Payment step when the checkout is not about to redirect (e.g. payment already complete)
  • [dashboard] Make sure removed shipping methods are not considered valid in the checklist
  • [dashboard] Fix "commerce.num_rules" incorrect lexicon on Configuration > Tax Groups
  • [dashboard] Fix product price not being shown in Products List TV
  • [dashboard] Fix markup being shown in order messages grid for unsent messages
  • [dashboard] On Status Change Action grid, only include derivative types where $visibleType is true in the add menu
  • [dashboard] Fix image display in order items grid
  • [dashboard] Link product to their front-end page in order items grid if a link is set
  • [dashboard] Fix missing lexicon when editing status change actions [#438]
  • [gateways] Webhook handler now sets the working context [#441]
  • [orders] Make sure comOrder::getInvoices returns the latest invoice first by ordering on created date
  • [products] Make sure default_delivery_type and default_tax_group settings affect default selection in the create product form
  • [reports] Fix Sales report basing periods of the created, rather than received date
  • [templates] Make sure the MODX core:default lexicon topic is loaded

Potential breaking changes:

  • comOrderMessage->getPlaceholders() signature change; it is now final and defines the array return type
  • Commerce::EVENT_ORDER_PAYMENT_RECEIVED and modmore\Commerce\Events\Payment are no longer being triggered. For actions that need to fire when a transaction is completed, use the new Commerce::EVENT_TRANSACTION_COMPLETED event, or for actions that need to fire when an order is paid and moving into processing, use Commerce::EVENT_STATE_CART_TO_PROCESSING.
  • comOrderShipment->setShippingMethod method signature change; now accepts an extra parameter with submitted data.
  • PriceTypeInterface::getFields() signature change; is now passed the Commerce instance

Functionality that will be removed in the future:

  • Commerce::$twig, replaced with the new ViewInterface instance available from Commerce::view(). If you're using Twig functionality not available in the ViewInterface, you can (temporarily) retrieve the Twig\Environment via Commerce->view()->twig() but please contact support to explain your use case so we can improve the ViewInterface instead.
  • Commerce::loadTwig(), replaced with the new ViewInterface available from Commerce::view()
  • Commerce::registerServices(), was never implemented and will be removed in v1.2
  • modmore\Commerce\Pricing\Renderer\TwigRenderer now accepts either a \Twig\Environment or ViewInterface instance; support for \Twig\Environment will be removed in v1.3.
  • The BaseGateway class has been deprecated. This has been replaced with a new GatewayInterface, which no longer relies exclusively on OmniPay. A new base class, Omnipay2Gateway, can still be used for Omnipay 2 gateways, while direct implementations are now also supported.
  • \Commerce::EVENT_ORDER_PAYMENT_RECEIVED and modmore\Commerce\Events\Payment no longer triggered, will be removed in v1.3.

Removed deprecated event constants:

  • comOrderAddress::EVENT_ADDED, use Commerce::EVENT_ORDER_ADDRESS_ADDED
  • modmore\Commerce\Admin\Generator::COLLECT_PAGES_EVENT, use Commerce::EVENT_DASHBOARD_GET_PAGES
  • modmore\Commerce\Admin\Generator::COLLECT_MENU_EVENT, use Commerce::EVENT_DASHBOARD_GET_MENU
  • modmore\Commerce\Admin\Configuration\Checklist::EVENT_GET_CHECKS, use \Commerce::EVENT_DASHBOARD_CHECKLIST_GET_CHECKS
  • modmore\Commerce\Frontend\Checkout\Process::BEFORE_PROCESS_STEP, use \Commerce::EVENT_CHECKOUT_BEFORE_STEP
  • modmore\Commerce\Frontend\Checkout\Process::AFTER_PROCESS_STEP, use \Commerce::EVENT_CHECKOUT_AFTER_STEP
  • modmore\Commerce\Reports\ReportInterface::EVENT_GET_REPORTS, use \Commerce::EVENT_DASHBOARD_REPORTS_GET_REPORT
  • modmore\Commerce\Taxes\RateProvider::COLLECT_RATE_PROVIDERS = \Commerce::EVENT_DASHBOARD_GET_RATE_PROVIDERS

Removed deprecated methods/variables:

  • modmore\Commerce\Frontend\Steps\Shipping::getShipments - replaced by comOrder::getShipments
  • modmore\Commerce\Frontend\Steps\Shipping::getItemsByDeliveryType - replaced by comOrder::getShipments
  • comOrder::getItemsByDeliveryType() - replaced by comOrderShipment objects
  • comOrder::$_itemsByDeliveryType
  • comOrder::getShippingPrice() - replaced by comOrderShipment objects
  • comOrder::setShippingMethod($methodId) - replaced by a shipping method being set on the order shipment
  • comOrder::removeAddress($address) - simply remove the comOrderAddress record or use removeAddressType instead
  • comAddress::getTextSummary() - use Commerce::formatAddress
  • comOrderAddress::getAddress() - use the comOrderAddress information directly
  • comShippingMethodByWeight::getTotalOrderWeight($order) - use comOrderShipment->getWeight() instead
  • Commerce\Events\Address->getAddress() - use information from getOrderAddress() instead
  • Commerce\Events\Address->getAddressJoin() - use information from getOrderAddress() instead
  • Commerce\Events\AddressValidation::getOrder()
  • modmore\Commerce\Frontend\Checkout\Process::completeOrder - replaced by comOrder::triggerPaidStatusChange
  • modmore\Commerce\Modules\Discounts::loadPage() - replaced by initGenerator()

Removed classes:

  • modmore\Commerce\Frontend\Requirements\ShippingMethod - replaced with modmore\Commerce\Frontend\Requirements\ShipmentsWithMethod
  • modmore\Commerce\Frontend\Checkout\NoAccount, OnePage, and RequiresAccount, replaced by configuration on Standard checkout process

Other changes from cleaned up deprecated functionality:

  • Commerce\Events\AddressValidation constructor no longer accepts a comOrder
  • modmore\Commerce\Pricing\PriceType\Quantity no longer accepts [prices:[..]] instead of [..] serialised data
  • Checkout templates no longer have a shipping_method placeholder


  • commerceguys/addressing updated from v1.0.3 to v1.0.5
  • commerceguys/enum removed (installed version was v1.0)
  • doctrine/collections updated from v1.3.0 to v1.5.0
  • guzzlehttp/psr7 updated from 1.5.2 to 1.6.1
  • ircmaxell/password-compat removed (installed version was v1.0.4)
  • modmore/alpacka updated from v0.4.0 to v1.0.0-pl
  • omnipay/stripe removed (installed version was v2.4.7)
  • paragonie/random_compat removed (installed version was v2.0.18)
  • ralouphie/getallheaders updated from 2.0.5 to 3.0.3
  • stripe/stripe-php installed in version v6.43.0
  • symfony/http-foundation updated from v2.8.50 to v3.4.29
  • symfony/polyfill-php55 removed (installed version was v1.11.0)
  • symfony/polyfill-php54 removed (installed version was v1.11.0)
  • symfony/polyfill-php70 installed in version v1.11.0
  • twig/twig updated from v1.41.0 to v1.42.2

Commerce 1.0.3-pl

Released on 2019-07-26

Released on 2019-06-26

  • [core] Fix shipping method change due to cart/address changes not updating the order total until a second refresh [S20379]
  • [core] To prepare for Commerce 1.1, you'll now see log entries for modules that rely on deprecated events and usage of deprecated methods that have been cleaned up in 1.1
  • [core] Make sure comOrderAddress is loaded into memory
  • [modules] Commerce::EVENT_ORDER_PAYMENT_RECEIVED has been deprecated and will no longer work in Commerce 1.1. For modules that should fire when an order is paid, use Commerce::EVENT_STATE_CART_TO_PROCESSING instead.
  • [dashboard] Fix JS error on MODX3 [#410]


  • commerceguys/addressing updated from v1.0.3 to v1.0.4
  • twig/twig updated from v1.41.0 to v1.42.0

Commerce 1.0.2-pl

Released on 2019-05-31

Released on 2019-06-01

  • [cart] Fix incorrect shipping calculation for weight-based shipping on orders stored in session [#399]
  • [dashboard] Fix coupons with max usage set to 0 not appearing as unlimited, but as unavailable [S20074]
  • [dashboard] Fix hardcoded English strings on coupon code form [S20074]
  • [dashboard] Slightly reword the description for the class_key to indicate saving an object reloads the form [S20197]
  • [dashboard] Fix emptying a multiselect field not working (e.g. product restrictions on coupons) [#369]
  • [dashboard] Slight change in nomenclature for statuses: "Name" => "Status Label", and "State" => "Order State" for clarity [S20197]
  • [discounts] Fix "Encountered empty IN condition with key id" triggered in free product discount
  • [statuses] Refunded state is not yet implemented; remove it as option when creating a status [S20197]
  • [statuses] Fix event_name property field missing from the Event status change action [S20197]
  • [taxes] Fix error in TaxJar integration [#409]
  • [matrix] Fix prices being missing from the product matrix [S20177]

Commerce 1.0.1-pl

Released on 2019-05-27

Released on 2019-05-27

  • [dashboard] Improve performance for showing order total for registered customers grids (also working around edge case causing infinite loop)
  • [dashboard] Fix incorrect details shown on the guests customers grid
  • [dashboard Fix inability to save product due to a price type field failing validation
  • [invoices] New invoice_increment_start setting to configure the starting invoice reference
  • [orders] New order_increment_start setting to configure the starting order reference
  • [payments] If order reference is set on an order (e.g. by a module), it will now be used instead of the order ID in transaction descriptions
  • [products] Improve performance of comProduct->getTotalSaleQuantity (also working around edge case causing infinite loop)
  • [taxes] For calculating shipping tax, RateProvider now receives the comOrderShipment object.
  • [taxes] TaxJar rate provider now no longer breaks when calculating shipping taxes. [#404]


  • twig/twig updated from v1.40.1 to v1.41.0

Commerce 1.0.0-pl

Released on 2019-05-14

Released on 2019-05-14

  • [dashboard] Remove the beta warning now that we're officially stable :party:
  • [dashboard] Fix smart date formatting with UTF-8 characters
  • [products] Prevent numeric/bool TV values for the resource product pricing TV from causing errors
  • [products] Remove Pricing field from Resource Products; those should be managed on the resource now.
  • [payments] Fix payment exception being triggered when a Mollie payment is still pending when the customer returns to the checkout (e.g. bank transfers); that now redirects the user to the mollie checkout page [#302]
  • [core] comSessionCartOrderItem->getOrder() can now return a db-persisted order as well


  • twig/twig updated from v1.39.1 to v1.40.1

Commerce 1.0.0-rc4

Released on 2019-04-24 (Pre-releases Channel)

Released on 2019-04-25

  • [core] New ProductPriceIndex table has been added which contains an index of standard product prices, to ease filtering and querying against currency-specific prices
  • [checkout] Cart and checkout now respond with "application/json" content type header when returning JSON [#387]
  • [dashboard] Fix modal sizes not adjusting when selecting/removing a product image [S19891]
  • [modules] DefaultAddress and AutoFillGeoIP modules now also fire on the order calculate event, so integrations outside checkout can access expected address
  • [orders] Make sure the right context gets set [S19862]
  • [orders] Fix dates < 24 hours ago being shown as today, even if it was yesterday [#385]
  • [shipping] Fix weight getting truncated when larger than 1000 in certain locales
  • [snippets] get_matrix_price now fetches prices from the ProductPriceIndex
  • [snippets] &sortby=`price` on get_products and get_matrix_first_product now uses the ProductPriceIndex
  • [snippets] Add commerce.render_taxed_price snippet that can be used to render the real price of a product for the customer, including tax and discounts


  • symfony/event-dispatcher updated from v2.8.49 to v2.8.50
  • symfony/http-foundation updated from v2.8.49 to v2.8.50
  • twig/twig updated from v1.38.4 to v1.39.1

Commerce 1.0.0-rc3

Released on 2019-04-09 (Pre-releases Channel)

Released on 2019-04-10

  • [core] Fix recursive session order loading, causing cart to timeout with a couple of items in it (introduced in rc2)
  • [core] Slight comOrderItem taxes refactor; should make it more reliable and a bit faster
  • [checkout] Only show tax details if the total tax on the order is not zero
  • [dashboard] setFieldValue method on models now takes precedence over set() in the FormWidget
  • [products] Add new "Pricing" TV type to add price-type support to Resource Products
  • [products] Resource Products now look for a Pricing TV; Price is only used as fallback.
  • [pricing] Add PricingInterface->setRegularPrice to allow programmatically setting the normal price
  • [snippets] Add commerce.render_quantity_price snippet to render price tables for quantity discounts
  • [snippets] Update Twig error catching in commerce.get_matrix snippet

Commerce 1.0.0-rc2

Released on 2019-04-01 (Pre-releases Channel)

Released on 2018-04-02

  • [core] Add more logic in comSessionCartOrderItem to prevent errors getting logged and to allow more dynamic in-memory tax-calculation
  • [dashboard] Fix typo in column for the order logs
  • [products] Add comProduct->getPricingInstance method to allow custom products to manually build pricing instances
  • [products] Fix price_formatted missing the actual formatting [S19768]
  • [products] New/Updated price placeholders: [[+price]] now has current (regular or sale) price, [[+regular_price]] has normal price, [[+rendered_price]] contains HTML with the current and (if set) normal price, [[+price_valid_until]] contains a unix timestamp for when the sale price expires.
  • [products] New setRawPricing method to complement getRawPricing for custom products
  • [pricing] Added TimeBoundPriceTypeInterface to indicate that price types have a from/until date
  • [pricing] Added set/getValidUntil to PriceInterface; used with TimeBoundPriceTypeInterface to indicate when a price expires
  • [pricing] Allow using var_dump/print_r on any comSimpleObject and pricing-related objects (in PHP 5.6+) without running out of memory


  • commerceguys/addressing updated from v1.0.2 to v1.0.3
  • commerceguys/intl updated from v1.0.2 to v1.0.4
  • symfony/polyfill-ctype updated from v1.10.0 to v1.11.0
  • twig/twig updated from v1.38.2 to v1.38.4

Commerce 1.0.0-rc1

Released on 2019-03-28 (Pre-releases Channel)

Released on 2018-03-13

All new product pricing & currency support:

  • Instead of the old "Price", products now have powerful per-currency "Pricing" with a "Regular Price" and additional "Price Types" that enables time-based sale prices, quantity discounts, and custom price types.
  • The new pricing is supported on the Product Matrix TV, Product List TV, product bundles, and standard products.
  • The cart and checkout now check the price is still accurate each time the item is calculated, making sure the right price is always charged.
  • Enable additional currencies via Configuration > Currencies to e.
  • Enable the different price types via Configuration > Modules; search for Price.
  • If you have a Custom Product, check out the pricing developer documentation to learn more about how your custom product type can interact with these new features, and what functionality has been deprecated.
  • Anywhere products are available, you can now use `pricing_regular` and `pricing_regular_formatted` placeholders for the regular price in the current (based on context) currency. These will in most cases replace `price` and `price_formatted` respectively.
  • Products shown in the dashboard (e.g. Products tab, Matrix/List TV) will now show the regular price in the current currency, or the regular prices of each configured currency.

Other new features:

  • [core] Add a ClassUtility service to easily check if a class (by its name) implements a given interface
  • [core] Add a Countries service to get/validate/list countries
  • [discounts] You can now automatically give away free products based on order totals. Enable the Free Products module and navigate to Discounts to use it.
  • [discounts] Allow setting User Discounts for anonymous users
  • [invoices] It's now possible to create PDF invoices for orders. This requires a new PDF Writer (e.g. PDFCrowd available as extension) and some configuration. See:
  • [permissions] New "invoice" permission to control who can download invoices
  • [snippets] Add support for downloading PDF invoices


  • [core] Price objects now always return an integer default price, which may be 0 instead of the previous null
  • [dashboard] Modals are now a little wider to make more room for wider fields
  • [dashboard] Modals should now be the right size when the content height changes
  • [dashboard] New modmore\Commerce\Admin\Util\Column class to help you better define array columns; legacy array syntax is still supported
  • [security] All grid values are now automatically htmlencoded to protect against XSS vulnerabilities.
  • [statuses] Status Change actions now have a sort order allowing you to define the order they run in

Bug fixes:

  • [core] Add missing index on comOrder.reference_incr
  • [core] Catch exception when trying to format an address that does not have a country set
  • [matrix] (Re)loading of data via AJAX in the Product Matrix now preserves the working context (e.g. currency)
  • [productstv] (Re)loading of data via AJAX in the Products List TV now preserves the context (e.g. currency)


  • On comProduct: field price, method getPrice(); both replaced by pricing/getPricing
  • On comSimpleObject: protected variables $cacheOptions, $cacheExpiry; methods prepareForCache(), restoreCollectionFromCache(), restoreObjectFromCache()

Potentially breaking changes:

  • Pricing. The new pricing will require you to update templates.
  • Gateways are now expected to return \Omnipay\Common\ItemInterface instances from preparePurchaseItems()
  • Modules that used CommerceGuys\Intl\Country\CountryRepository need to change to CommerceGuys\Addressing\Country\CountryRepository
  • GridWidgets now automatically htmlencode all values shown in a grid. To prevent this, add a `'raw' => true` to your array column definition, and use `$this->encode($value)` to manually encode all user input.
  • CountryField.getCountries signature changed; no longer requires a Commerce instance

Dependencies updated:

  • braintree/braintree_php updated from 3.23.1 to 3.39.0
  • commerceguys/addressing updated from v0.8.4 to v1.0.2
  • commerceguys/intl updated from v0.7.4 to v1.0.2 - note: breaking changes. Country information was moved to commerceguys/addressing.
  • guzzlehttp/psr7 updated from 1.4.2 to 1.5.2
  • guzzlehttp/guzzle updated from 6.3.0 to 6.3.3
  • mexitek/phpcolors updated from 629eb54 to edf1342
  • omnipay/authorizenet updated from 2.5.0 to 2.6.0
  • omnipay/manual update from 2.2.1 to 3.0.0
  • omnipay/paypal updated from v2.6.3 to v2.6.4
  • omnipay/sagepay updated from 2.4.0 to 2.6.0
  • omnipay/stripe updated from v2.4.6 to V2.4.7
  • paragonie/random_compat updated from v2.0.11 to v2.0.18
  • phpoffice/phpexcel updated from 1.8.1 to 1.8.2
  • ralouphie/getallheaders installed in version 2.0.5
  • symfony/http-foundation updated from v2.8.22 to v2.8.49
  • symfony/event-dispatcher updated from v2.8.22 to v2.8.49
  • symfony/polyfill-ctype installed in version v1.10.0
  • symfony/polyfill-php55 updated from v1.4.0 to v1.10.0
  • symfony/polyfill-php54 updated from v1.4.0 to v1.10.0
  • symfony/polyfill-mbstring updated from v1.4.0 to v1.10.0
  • taxjar/taxjar-php updated from v1.5.0 to v1.8.1
  • twig/twig updated from v1.34.3 to v1.38.2

Commerce 0.12.2-pl

Released on 2019-03-13

Released on 2018-03-13

  • [dashboard] Fix currency fields being double initialised when opening a form outside modal [#334]
  • [dashboard] Fix IE compatibility and error in Firefox causing certain links to not open in a modal
  • [dashboard] Fix hidden fields taking up space in forms
  • [payments] Avoid checkout issues with PayPal when per-item pricing causes a difference in total amount [#332]

Commerce 0.12.1-pl

Released on 2019-03-04

Released on 2018-03-04

  • [core] Make sure modules lexicon is always loaded
  • [checkout] Only show addresses in the checkout with the pre-0.12 "remember" flag enabled
  • [dashboard] Fix number fields removing leading 0's, preventing use of decimals < 1 [S19168]
  • [dashboard] Fix search by customer not working in the orders tab [#328]
  • [dashboard] The internal key for order item adjustments is now available as title on the detailed item calculation
  • [dashboard] DeleteFormWidget instances can now override a deleteRecord method to affect how a record is removed
  • [dashboard] Enhanced select fields no longer sort client-side, leaving sort order to be determined by server side
  • [dashboard] Make sure that overflowing buttons break on full words [#323]
  • [discounts] Fix user(group) discounts applying based on admin user, instead of customer user, when editing order items
  • [matrix] All resource fields, and TVs configured in the commerce.matrix.load_tvs setting, are now available to SKU/name templates on a matrix [#327]
  • [matrix] Fix base weight matrix configuration using the currency input
  • [matrix] Fix the "Manage Matrix Options" button not being updated with a new link when a copied matrix was moved/duplicated or a new matrix was created
  • [orders] The order log now tracks the user that triggered an action
  • [orders] Adding/removing/changing quantity of items, and adding/modifying addresses in the dashboard now triggers the appropriate log message
  • [package] Now checking new MODX and PHP version minimum policy:
  • [payments] Fix billing information not being sent to payment gateways
  • [products] Weight unit field now uses the order following the units defined in the allowed_weight_unit setting [#326]
  • [products] Validate weight units to prevent errors, unrecognised units now fall back to kg [#325]
  • [products] Make sure a product bundle has been saved before trying to create the related product links [S19468]
  • [reports] Now setting the proper Content-Type header when downloading reports, to fix issue with .html extension added by Safari [#320]

Potential breaking changes:

  • comOrder.log() has a new parameter $actionBy. Any derivative order types that override the log method will need to update the method signature.

Commerce 0.12.0-pl

Released on 2019-02-25

  • [addresses] Make sure addresses are not stored on a user profile until they validated
  • [core] Revolution Adapter's getOption method now passes through to Commerce->getOption which is context-aware
  • [core] Prevent E_NOTICE error when providing comOrderItem->get with an array
  • [checkout] AJAX requests to cart/checkout now receive additional formatted values
  • [dashboard] Fix invalid license not being shown as such in the checklist
  • [dashboard] When viewing/managing orders, the stored context is now used to make context-specific setting available
  • [dashboard] Order overview now offers a context filter if orders from multiple contexts exist
  • [dashboard] Fix incorrect timezone used in order details
  • [dashboard] Fix the MODX header expanding to full size on Firefox
  • [dashboard] Fix incorrect icon for Add Product button [S19468]
  • [frontend] Add !default to Sass settings so you can import and change the default styles more easily [S19296]
  • [products] Make products in a matrix visible again in the products list, with links to the resource the matrix is on
  • [products] When using the matrix, it will now identify when the resource was duplicated and offer to start with an empty matrix/copy the products/move the products.
  • [snippets] Fix incorrect error message in get_product snippet [S19223]
  • [snippets] Add get_matrix_price and get_matrix_first_product snippets to help build your catalog when using the Product Matrix
  • [taxes] Fix EU VAT Rate Provider using the incorrect country code for the United Kingdom. Previously used "UK", now the proper "GB" per ISO-3166. If you relied on the incorrect behavior, you may need to tweak your tax rules.
  • [templates] Use new commerce.account.remember_me lexicon for the "rememberme" text in account.twig
  • [tvs] Fix "dom is null" error when loading a resource with a Commerce TV
  • [tvs] Fix edited/inserted products having nested markup
  • [tvs] Work around obscure issue in Firefox 65 causing the inability to save a resource after unlinking a product in a list TV

Commerce 0.12.0-rc4

Released on 2019-01-15 (Pre-releases Channel)

Please see for optional manual upgrades in 0.12.

  • [core] Fix "Attempt to set NOT NULL field to NULL" by replacing NULL values in FormWidget with the field default instead
  • [core] Fix "PHP warning: strtotime() expects parameter 1 to be string, array given" in the DateTimeField
  • [dashboard] Fix scrollable height being 55px short of the full view and not being initialised when opening a modal window
  • [dashboard] Fix tabs behaving incorrectly when hidden inputs were present
  • [dashboard] Fix products grid not opening resource product edit/view links in a new tab [S19201]
  • [dashboard] Add small modmore logo and the current Commerce version to the dashboard footer
  • [dashboard] Add new "About Commerce" section under Configuration that lists used open source libraries
  • [elements] Make the TVs use lexicons in the input options dropdown (Thanks Jako)
  • [modules] New \Commerce::EVENT_DASHBOARD_LOAD_ABOUT event allows you to add your own composer packages to Configuration > About
  • [modules] Event\AddressValidation no longer requires an order, and getOrder() is deprecated
  • [payments] BaseGateway->preparePurchaseCard now returns a CreditCard object instead of an array
  • [payments] CommercePayments.loadAsynchronously now allows callbacks to bubble (useCapture)
  • [reports] Fix "PHP notice: Array to string conversion" caused by incorrect default value

Commerce 0.12.0-rc3

Released on 2019-01-10 (Pre-releases Channel)

  • [dashboard] Make sure the actions/status changes on the order detail wrap nicely if you have lots of them
  • [dashboard] Fix taxes row being larger than other rows on the order detail
  • [dashboard] Add total excluding tax to calculation of order items with inclusive taxes
  • [dashboard] Strict code fixes: Fix "PHP notice: Undefined index: usage" on coupons grid, "PHP notice: Undefined index: code" on discount grids, and "PHP warning: call_user_func() expects parameter 1 to be a valid callback" in the UserDiscount module
  • [dashboard] Fix creating/updating/deleting coupons [S19168]
  • [discounts] Make sure User(group) Discounts are created as comOrderItemDiscountAdjustment objects, and restrict comOrderItem->getDiscount appropriately. This fixes "Instantiated a derived class comOrderItemAdjustment that is not a subclass of the requested class comOrderItemDiscountAdjustment" errors
  • [messages] Fix "Exception Twig_Error_Loader for Twig template from email_note" being logged when no email note is set
  • [installer] Made the upgrade notices a bit more verbose
  • [installer] Make sure that the automatically created order references matches the default value of the setting on first upgrade
  • [products] Make sure the default product price is returned when currencies are mixed up (e.g. system set to USD while editing an order in the backend which is EUR)

Commerce 0.12.0-rc2

Released on 2019-01-08 (Pre-releases Channel)

Please see for optional manual upgrades in 0.12.

New features:

  • [orders] New order references for incremental, templated, order numbering - see [#280]
  • [orders] New received_on date on orders, which is different from the created_on by containing the date the (concept) order was marked as processing
  • [dashboard] Add or edit order addresses from the order detail view [#168]
  • [dashboard] New smart_date twig filter to format relative dates in a human friendly way, and thumbnail filter to create a thumbnail (in the manager)
  • [templating] New format_currency, str_pad_left and str_pad_right twig filters added - see


  • [addresses] Refactored comAddress/comOrderAddress. comOrderAddress now contains a full, independent copy of the address for the order. comAddress is for the "address book" functionality.
  • [dashboard] Orders overview has been redesigned
  • [dashboard] Order detail view has been redesignedAd
  • [dashboard] Refresh the full order view when changing the status [#307]
  • [dashboard] Order log now defaults to reverse order, so latest entries are first in the list
  • [reports] Add type and properties to the address export
  • [reports] Orders report now also includes: billing and shipping address, reference, usernames (instead of IDs), received date, status name instead of ID
  • [reports] ProductCustomers report now formats dates and includes the username, first/lastname and order reference

Bug fixes:

  • [dashboard] Fix clicking an icon link/button not opening in a modal window when it should
  • [reports] Fix "PHP notice: Undefined index: completed_on" when exporting orders
  • [modules] Fix EnforceStock module unsetting order items after payment
  • [modules] Fix ItemData module showing labels for empty values in the order detail view
  • [package] Fix installation in MODX3

Breaking changes:

  • Some refactoring to addresses may lead to breaking changes in modules. Where methods like comOrder->getBillingAddress would previously return a comAddress instance, those now return a comOrderAddress instance instead. The same fields (except user and remember) are still available on the new objects, but type checking may no longer work as expected.
  • Order references have been added, which will automatically be used in various templates instead of the ID. You may need to tweak your custom templates and email configuration, as detailed at

Commerce 0.12.0-rc1

Released on 2018-12-22 (Pre-releases Channel)

New features:

  • [core] Add new comSimpleObject::$visibleType to allow derivatives to indicate they should not be shown in ClassFields. If its value is set to a hidden type, the ClassField will be hidden.
  • [core] If a comProduct has $visibleType set to false, it wont show up in the products listing
  • [checkout] Add shop_resource system setting to point to the root of the shop (defaults to site_start) [#294]
  • [checkout] Make sure the frontend/checkout/wrapper.twig template has access to the full order
  • [discounts] Add user & user group discounts module
  • [dashboard] Commerce now has a set of 24 permissions to restrict dashboard access (sponsored by DEGOYA medienkommunikation, thank you!)
  • [dashboard] Add search to Configuration > Modules [#272]
  • [emails] Payment and shipping methods now have an email note field, allowing you to set per-method specific messages to include in the customer email [#284]
  • [products] New product matrix TV lets you manage products that are a combination of two attributes [#301]
  • [reports] New Tax Summary report to quickly summarise the taxes you've charged [#165]
  • [snippets] New commerce.get_matrix snippet to help you output a Product Matrix, includes 3 sample templates (see documentation)
  • [orders] Support for custom order fields [#252]
  • [orders] Context is now tracked when an order is created in the checkout [#224]


  • [core] Adapter now has a query method to execute SQL statements
  • [core] Make sure models don't define the engine type (MyISAM/InnoDB)
  • [core] The default and frontend lexicons are now always loaded when Commerce is initialised
  • [checkout] When submitting a form on the cart, you now stay on the cart resource, and clicking Cart on the checkout also goes to the cart page
  • [dashboard] Submenus can now add classes to the nav, add sub-level-2 for nested submenus
  • [dashboard] Add tabs to the shipping methods form
  • [dashboard] New TaxGroupField for use by products
  • [lexicons] New commerce.add_to_cart lexicon to use in your own templates
  • [products] New commerce.default_product system setting to control the default product type [#291]
  • [package] The installable transport package is now secured with encryptedVehicle 2.0 and slight fixes to build order
  • [reports] Slightly reorder columns in Top Products report to make more sense
  • [reports] Allow filtering by context on Orders, Top Products, Daily Sales and Taxes Collected reports (orders from < 0.12 will all be web)
  • [reports] Taxes Collected report now always has 0 or 1 for the Tax Inclusive value
  • [reports] The order context is included in Orders and Taxes Collected reports

Bug fixes:

  • [lexicons] Add a few missing lexicons for settings
  • [coupons] Fix wrong default sort direction on Coupon Usage grid
  • [dashboard] Only show the payment gateway-specific tab if gateway-specific options are defined

Commerce 0.11.5-pl

Released on 2018-11-27

  • [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-22

  • [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-01 (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-17 (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.6-pl

Released on 2018-01-28

  • [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.5-pl

Released on 2018-01-28

  • [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.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-08


  • 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-27

  • [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-26 (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-24 (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-16 (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-03 (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-26 (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-25 (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-29 (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-16 (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-09 (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-03 (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-04-30 (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-16 (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-12 (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-30 (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-22 (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-17 (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-13 (Commerce Channel)

  • Fix requirements validator having the check backwards

Commerce 0.2.0-pl

Released on 2017-01-12 (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.2-pl

Released on 2017-01-09 (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.1-pl

Released on 2017-01-09 (Commerce Channel)

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

Commerce 0.1.0-pl

Released on 2017-01-08 (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-07 (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 2021-06-29


Charts do not use right colors on Firefox

Created on 2018-05-29 • Last updated on 2021-03-26


Add delivery date/options to shipments

Created on 2018-02-20 • Last updated on 2021-06-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 2021-08-13


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 2021-04-13


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 2021-06-29


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 2021-06-29


SimpleCart product type integration

Created on 2017-07-11 • Last updated on 2021-06-29


Module or docs for adding google analytics/adwords conversion tracking

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


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 2021-06-29


Admin notes on payment/shipping methods

Created on 2017-04-26 • Last updated on 2021-06-29


Automatically create comResourceProduct records from an OnDocFormSave plugin

Created on 2017-01-10 • Last updated on 2018-01-22


Consider reversably hashing transaction IDs so that collisions don't happen

Created on 2017-01-05 • Last updated on 2018-04-06


Module for auto-creating accounts

Created on 2016-12-12 • Last updated on 2021-06-29


Get single-page checkout process to work

Created on 2016-12-12 • Last updated on 2021-06-29


Module to validate if an address actually exists

Created on 2015-11-10 • Last updated on 2021-06-29


Create product type that integrates with miniShop2

Created on 2015-10-24 • Last updated on 2017-07-11


Implement refunds for supported gateways

Created on 2015-10-24 • Last updated on 2021-03-29


Visual status workflow editor

Created on 2015-10-20 • Last updated on 2017-05-04


Import/migrate functionality

Created on 2015-10-08 • Last updated on 2017-07-11

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.