Commerce 1.11 pre-release available

This is a big release with some exciting new features and improvements. We recommend testing on a development or staging environment before updating production. See the upgrade notes for important details.

Products & Inventory

Products can now be activated and deactivated without removing them from your catalog. This also supports time-based activation, so you can schedule products to go live or expire automatically.

The EnforceStock module now uses the new EVENT_ITEM_BEFORE_ADD_TO_CART event (see below), which makes stock enforcement more reliable and consistent.

Checkout & Orders

You can now restrict payment and shipping methods to specific user groups, making it easy to offer options only to certain customers or to keep a test payment method around post-launch, only for admins.

A new Commerce::EVENT_ITEM_BEFORE_ADD_TO_CART event lets modules intervene before an item is added to the cart: useful for validation, access control, or custom inventory logic.

Placed orders (processing, completed, or cancelled) no longer automatically recalculate item taxes and shipping fees when changing non-financial metadata like tracking numbers. Recalculation still happens when you make changes that actually affect totals.

Payment Tokens

Commerce now has initial support for Payment Tokens, so returning customers can pay again with a saved payment method instead of re-entering card or bank details. 

Checkout supports saved methods for logged-in users, an optional “save payment method” choice for regular orders, and if a product type requires token billing, it can indicate that so only supported payment options are shown. 

Currently support is limited to Mollie, with Stripe support already in the works and others coming soon. Learn more about Payment Tokens.

Invoices

Commerce can now generate EN16931-compliant UBL 2.1 XML invoices alongside the existing PDF invoices. This is the standard format required for e-invoicing in many European contexts. See the UBL invoice documentation for setup instructions.

This is considered experimental and requires validation with different scenarios.

If you've bought any licenses in the last week or so, you'll see we've been testing this. Getting the structure right and inferring specific country rules has been a bit of a challenge, so if you set this up please let us know of any validation issues you come across. 

Emails & Attachments

The Email status change action now supports attachments. This is ideal if you want to always attach a standard terms of service PDF or return instructions. 

Invoices and any attachments added by status changes are now passed through the Mail event, so modules can inspect or modify them before the email is sent. The attach() method also gains support for custom filenames and media source-relative paths, while remaining backwards compatible.

Discounts & Coupons

Fixed price coupons now apply directly to item subtotals using the order item adjustments system, rather than adding a separate coupon line item. This fixes a long-standing issue where the displayed VAT amount could be incorrect when a fixed price coupon was applied.

What this means if you use fixed price coupons:

  • There will no longer be a separate coupon line item in the cart for fixed amount discounts
  • item.properties.is_fixed_coupon is no longer set
  • If you have custom templates or module logic that checks for or handles the coupon item, review those when updating

In most cases this is a transparent improvement, but review the upgrade notes if you have any custom coupon handling.

Status Changes

Status changes can now be deactivated without deleting them, consistent with how other parts of Commerce handle this.

Developer & API

  • New Commerce::EVENT_RESPONSE_ORDER_ITEM event lets modules add data to the sanitised AJAX order output. The ItemData and ItemOptions (requires update) modules have been updated for this new event, so any data saved through those are now automatically available in the AJAX response.
  • Payment and shipping method grids in the admin now have search.

Bug fixes

  • Fixed shipment dropdowns being empty when editing an order item
  • Fixed the HTTPS check using the checkout URL instead of the cart URL when the cart has its own resource
  • Editing an order item no longer unlinks it from its original product

Dependency updates

  • psr/http-factory removed (installed version was 1.1.0)
  • braintree/braintree_php updated from 6.31.0 to 6.33.1
  • doctrine/deprecations updated from 1.1.5 to 1.1.6
  • symfony/polyfill-mbstring updated from v1.33.0 to v1.37.0
  • erusev/parsedown updated from 1.7.4 to 1.8.0
  • symfony/polyfill-php80 updated from v1.33.0 to v1.37.0
  • composer/ca-bundle updated from 1.5.10 to 1.5.11
  • symfony/polyfill-ctype updated from v1.33.0 to v1.37.0
  • phpoffice/phpspreadsheet updated from 1.30.1 to 1.30.4
  • symfony/polyfill-php81 updated from v1.33.0 to v1.37.0

Reminder: this is a pre-release

This is one of the biggest single point releases we've put out in a while with some big changes and we strongly recommend only testing it on staging environments for the moment.