Commerce 1.4

Commerce 1.4 is now available as pre-release with a couple new features, improvements, and bug fixes. We recommend testing on a staging environment before updating production as always.

In addition to the summary of what's new below, upgrade notes are available in the documentation.

Faster checkout progress

For repeat customers (who are logged in), Commerce now automatically re-selects the last billing and shipping address they used.

This has several benefits:

  • The cart can show taxes with more accuracy. Before, it may have been an estimate because the address wasn't confirmed, but now it can actually use the full billing address as last used, also taking into account things like the VAT Reverse Charge mechanism in the EU or tax rates on the address level in the US/CA.
  • The checkout can also skip past the address step entirely for those customers. This drastically reduces the time repeat customers have to spend entering their details. 

If you do not want this behavior, it can be disabled with the commerce.checkout_autoselect_user_address and commerce.checkout_allow_skipping_steps system settings respectively. 

To see it in action, we're already running Commerce 1.4.0 on our site.

Product Matrix improvements

The product matrix has received a collection of new capabilities and improvements.

Most of these improvements were commissioned by Brainlane, thank you for the support.

  • Column and row names/descriptions are now multilingual.
  • Matrix product descriptions can now also be set automatically from a template on the matrix, just like how the product SKU and name already were before.
  • There are now matrix options available to toggle the automatic updates of the SKU, name, and description on or off. Any new products that are created will always follow the sku/name/description templates, but disabling these options will allow you to edit the individual products manually if you prefer.
  • The matrix products now also support multilingual names and descriptions. If you have automatic updates enabled from the row/column, then all languages will be filled according to the configured template. If automatic updates are disabled, you can edit the languages manually.
  • We've added some twig filters to help render matrix details in the cart, order detail pages, etc. These filters allow you to lookup things like the row/column label if you'd like to show those. See an example here.

JSON support in commerce.get_product

For use as a very simple API or for initialising client-side components, the commerce.get_product snippet now has a &toJson property that will dump the product as a JSON string.

By default, all product data is returned, but we recommend using the &jsonFields property to specify a comma-seperated list of the fields you actually use.

And more...

The full changelog for 1.4.0-rc1 is included below.


  • [checkout] Logged in users now automatically have their last used address pre-selected in checkout (disable with commerce.checkout_autoselect_user_address)
  • [checkout] The checkout will now skip to the last available step instead of going one step at a time (disable with commerce.checkout_allow_skipping_steps)
  • [dashboard] Add support for a datefield grid filter [#1194]
  • [matrix] Matrix rows/columns/products now support translations
  • [matrix] Add a description template option to the matrix options to automatically fill product descriptions
  • [matrix] Add controls to the matrix options to determine if SKU, name, and descriptions should be automatically set from row and columns, or be manually editable
  • [matrix] New twig filters matrix(fld), matrix_column(fld), and matrix_row(fld) have been added to allow looking up names
  • [snippets] commerce.get_product now supports &toJson=1 and &jsonFields=comma,list,of,fields


  • [i18n] Ignore translation language key if already set as the primary language key [#1210]
  • [snippets] Optimize query in get_matrix_first_product to better filter the results

Bug fixes:

  • [core] Fix error if the first call to Commerce::view() is a renderString() instead of render()
  • [core] Fix missing timestamp when a repeatable task fails
  • [coupons] Make sure adding a coupon creates an order log entry [#1217]
  • [emails] Prevent email_note fields returning null values and blocking emails from sending in comPaymentMethod and comShippingMethod
  • [taxjar] Fix shipping amount not being passed in the right format; did not affect calculation

Dependency updates:

  • composer/ca-bundle updated from 1.3.5 to 1.3.6
  • doctrine/deprecations updated from v1.0.0 to v1.1.1
  • dragonmantank/cron-expression updated from v3.3.2 to v3.3.3
  • omnipay/common updated from v3.2.0 to v3.2.1
  • mollie/mollie-api-php updated from v2.52.0 to v2.61.0
  • nesbot/carbon updated from 2.66.0 to 2.69.0
  • phpoffice/phpspreadsheet updated from 1.28.0 to 1.29.0
  • stripe/stripe-php updated from v10.12.0 to v10.21.0
  • php-http/discovery updated from 1.15.3 to 1.19.1
  • php-http/httplug updated from 2.3.0 to 2.4.0
  • psr/clock installed in version 1.0.0
  • psr/http-factory updated from 1.0.1 to 1.0.2
  • psr/http-message updated from 1.0.1 to 1.1
  • php-http/message-factory updated from v1.0.2 to 1.1.0
  • php-http/message updated from 1.13.0 to 1.16.0
  • symfony/http-foundation updated from v5.4.22 to v5.4.26
  • symfony/translation updated from v5.4.22 to v5.4.24
  • twig/twig updated from v3.5.1 to v3.7.0