Skip to content

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.

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.

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, and CheckoutSubjectType are gone.
  • Rename orderPlaceErrors, orderReviseErrors, and orderCancelErrors to orderErrors in your documents.
  • commercetools: remove customTypes from the CheckoutModule options. The PaymentModuleConfig type is gone from commercetools and SFCC.
  • Medusa: paymentCreate pays the cart named in target, not the session’s active cart. It refuses an ORDER target with TARGET_NOT_PAYABLE, and a payment session only the browser can confirm, such as Stripe’s, with TRANSACTION_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 UserNotificationClient must add the method.
  • Code that switches over UserNotification["type"] must handle associate-invited. Without a template for it, the invitation is not delivered.

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.

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.

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.site is removed, with Site, MenuItem, and MenuLinkTarget. Use Query.siteLayout and its navigation field.
  • NavigationMenuItemType, InfoPages, Socials, Usps, and ContentTable are removed.
  • RichText is no longer in union Block. Move a ... on RichText selection inside ... on OneColumnBlock { column1 { … } }.
  • The Contentful site_config and menu_item content types, and the Storyblok menu_item, menu_category_link, and menu_page_link components, are no longer provisioned. Their entry types are gone from the packages: TypeSite_config, TypeMenu_item, TypeMenuCategoryLink, TypeMenuPageLink, StoryblokMenuItem, StoryblokMenuCategoryLink, and StoryblokMenuPageLink. 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.

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.