September 2026
The changes in the September 2026 releases that ask something of your project, newest first. See the September 2026 highlights for everything else that changed. Each one names the first version of each package that has it: you need the change only when you move from below that version to it or above. Where a later change replaced part of an earlier one, the earlier one says so: do what the later one asks.
Order.currency is removed
Section titled “Order.currency is removed”In: commercetools 0.18.0, medusa 0.7.0, schemas 0.16.0, sfcc 0.11.0
Every amount on an order carries its own currency. Stop selecting currency
on an order, and read the currency of the amount you show, such as
total.gross.currency. A query that still selects Order.currency fails
validation, so change your storefront queries before you deploy the services.
checkoutComplete is removed
Section titled “checkoutComplete is removed”In: commercetools 0.14.0, medusa 0.6.0, schemas 0.13.0, sfcc 0.10.0
Place an order with orderPlace and pay with paymentCreate. The order of
the two depends on the engine:
| Engine | Order of calls |
|---|---|
| commercetools | orderPlace, then paymentCreate for the order. With the after-payment order creation strategy: paymentCreate for the cart, and the order is created once the payment succeeds. |
| Medusa | paymentCreate for the cart, then orderPlace. Medusa completes only a cart with an authorized payment. |
| Salesforce Commerce Cloud | orderPlace, then paymentCreate for the order. paymentCreate for the basket first works too. |
Also in this release:
CheckoutCompleteResponse,CheckoutCompleteError,CheckoutError,CheckoutErrorCodeType,CheckoutOrder, andCheckoutSubjectTypeare gone.- Rename
orderPlaceErrors,orderReviseErrors, andorderCancelErrorstoorderErrorsin your documents. - commercetools: remove
customTypesfrom theCheckoutModuleoptions. ThePaymentModuleConfigtype is gone from commercetools and SFCC. - Medusa:
paymentCreatepays the cart named intarget, not the session’s active cart. It refuses anORDERtarget withTARGET_NOT_PAYABLE, and a payment session only the browser can confirm, such as Stripe’s, withTRANSACTION_START_FAILED.
The simulator commands move under simulate
Section titled “The simulator commands move under simulate”In: commercetools 0.13.0
The back-office simulator refuses to run unless SIMULATION_ENABLED=true is
set. Set it only in environments where the simulator may write, and rename
your commands:
| Before | After |
|---|---|
invoice-raise |
simulate invoice raise |
invoice-pay |
simulate invoice pay |
invoice-credit |
simulate invoice credit |
order-confirm |
simulate order confirm |
order-shipment-state |
simulate order shipment-state |
order-deliver |
simulate order deliver |
For example: evolve -p @evolve-framework/commercetools simulate order deliver --order ORD-1.
The flags are unchanged.
BusinessUnitCapabilityType gains MANAGE_COMPANY_DETAILS
Section titled “BusinessUnitCapabilityType gains MANAGE_COMPANY_DETAILS”In: commercetools 0.12.0, schemas 0.12.0
Code that switches over every capability must handle the new value. A role
with the commercetools permission UpdateBusinessUnitDetails now reports it.
UserNotificationClient gains associateInvited
Section titled “UserNotificationClient gains associateInvited”In: commercetools 0.12.0, schemas 0.12.0, user-notifications 0.4.0
Inviting someone to a business unit now sends an associate-invited
notification.
- A class that implements
UserNotificationClientmust add the method. - Code that switches over
UserNotification["type"]must handleassociate-invited. Without a template for it, the invitation is not delivered.
Client span names change
Section titled “Client span names change”In: commercetools 0.12.0, core 1.3.0, storyblok 0.6.0
The framework’s own client spans are named {vendor} {method} {Resource},
such as commercetools GET Order. The commercetools and HTTP client spans use
the current HTTP semantic conventions: http.request.method, url.path, and
http.response.status_code. Update saved queries and dashboards that match on
a span name, or on http.method, http.url, http.status_code, or
http.response_content_length.
Outgoing HTTP spans are named after the host
Section titled “Outgoing HTTP spans are named after the host”In: core 1.3.0
A client span from node:http is named {method} {host}. Update saved
queries and dashboards that match a client span named GET or POST.
A failed publish rejects
Section titled “A failed publish rejects”In: cloud-adapter-aws 0.3.0, cloud-adapter-azure 0.4.0, core 1.3.0
MessagePublisher.publish() now rejects when the message was not sent. The
AWS SQS, AWS EventBridge, and Azure Event Grid publishers used to log the
failure and resolve. Where losing a message is acceptable to you, catch the
error yourself.
One content contract for every CMS
Section titled “One content contract for every CMS”In: contentful 0.7.0, payload 0.4.0, schemas 0.12.0, storyblok 0.6.0
The content schema now lives in @evolve-framework/schemas, the same for
every CMS:
Query.siteis removed, withSite,MenuItem, andMenuLinkTarget. UseQuery.siteLayoutand itsnavigationfield.NavigationMenuItemType,InfoPages,Socials,Usps, andContentTableare removed.RichTextis no longer inunion Block. Move a... on RichTextselection inside... on OneColumnBlock { column1 { … } }.- The Contentful
site_configandmenu_itemcontent types, and the Storyblokmenu_item,menu_category_link, andmenu_page_linkcomponents, are no longer provisioned. Their entry types are gone from the packages:TypeSite_config,TypeMenu_item,TypeMenuCategoryLink,TypeMenuPageLink,StoryblokMenuItem,StoryblokMenuCategoryLink, andStoryblokMenuPageLink. If you still read those entries, declare the types in your own project.
Your own content blocks keep working as before.
Medusa and SFCC stop publishing their graphql/* and mappers subpaths
Section titled “Medusa and SFCC stop publishing their graphql/* and mappers subpaths”In: medusa 0.5.0, sfcc 0.9.0
Import the context types from the package root instead:
import type { ContextValue } from "@evolve-framework/medusa/graphql/context";import type { ContextValue } from "@evolve-framework/medusa";A service composes the engine through ./modules. The SFCC package no longer
exports an assembled resolvers map.
The CommerceCloud type namespace is gone
Section titled “The CommerceCloud type namespace is gone”In: sfcc 0.9.0
Replace CommerceCloud.X with CommerceCloudX: CommerceCloudProduct,
CommerceCloudVariant, CommerceCloudOrder, CommerceCloudOrderProductItem,
CommerceCloudBasket, CommerceCloudBasketProductItem,
CommerceCloudCategory, and CommerceCloudCustomer. The types are unchanged.
initObservability moves out of the observability barrel
Section titled “initObservability moves out of the observability barrel”In: core 1.3.0
@evolve-framework/core/observability no longer exports initObservability.
Load observability from the process entry point instead:
import "@evolve-framework/core/observability/register";A container that already passes
--import @evolve-framework/core/observability/register to Node needs no
change. Code that has to call it imports initObservability and
configureSentry from @evolve-framework/core/observability/configure. Errors
now reach Sentry only in a process with SENTRY_DSN set. See
Observability.
The Storyblok types come from @labdigital/storyblok-js-client
Section titled “The Storyblok types come from @labdigital/storyblok-js-client”In: storyblok 0.6.0
The package dropped @storyblok/js. If your code annotates values with its
types, such as ISbStoryData, import them from
@labdigital/storyblok-js-client instead.
The AWS Lambda entry points move to cloud-adapter-aws
Section titled “The AWS Lambda entry points move to cloud-adapter-aws”In: cloud-adapter-aws 0.3.0, core 1.3.0
import { createHttpLambdaHandler } from "@evolve-framework/core/service/http";import { lambdaHandlerFactory, withSentryHandler,} from "@evolve-framework/core/observability/lambda";import { createHttpLambdaHandler, lambdaHandlerFactory, withSentryHandler,} from "@evolve-framework/cloud-adapter-aws";@evolve-framework/core/service/http keeps only startHttpServer,
fastifyLogger, and HttpServer. createHttpLambdaHandler takes an optional
second argument: pass binaryMimeTypes for uncompressed binary responses, and
albMultiValueHeaders when your load balancer target group uses multi-value
headers.

