# 2025

{% updates format="full" %}
{% update date="2025-12-19" tags="rules-engine" %}

## The Rules Engine is out of beta and now available as an add-on

After a successful field testing phase shaped by extensive feedback from early adopters, the [Rules Engine](https://docs.commercelayer.io/rules-engine/) is officially **out of beta** and generally available as an add-on directly from the Commerce Layer [Dashboard](https://dashboard.commercelayer.io/). If you want to start experimenting with advanced promotion logic, you can request a free trial directly from your Dashboard in the Promotions app and access an user-friendly **Promotion Builder** UI that makes it easy to create your rules. Our team will help you get started with the Rules Engine and tailor it to your specific business needs.

<details>

<summary><strong>Your promotions, your rules: a deep dive into Commerce Layer's Rules Engine.</strong></summary>

Build powerful, custom promotions with Commerce Layer's Rules Engine and model even the most complex discount logic with full flexibility.

<a href="https://commercelayer.io/blog/rules-engine-flex-promotion-examples" class="button primary" data-icon="book">Read more on our blog</a> <a href="https://commercelayer.fillout.com/t/n7qbQBzH63us?product=flex" class="button secondary" data-icon="user-headset">Contact sales</a>

</details>

<figure><img src="/files/TD7M7FEJWYYMvVcEwgG0" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
We'll continue to expand its capabilities and improve usability for both technical and business users, building on real-world use cases and ongoing customer feedback.
{% endhint %}
{% endupdate %}

{% update date="2025-11-06" tags="core-api" %}

## Event stream hub now available upon activation only

Commerce Layer [event stream hub](/core/event-stream-hub.md) is available only to our **enterprise** customers who [enable](/core/event-stream-hub.md#how-to-enable-the-stream-hub) it, meaning that only the changes to resources belonging to enterprise organizations with this feature enabled are pushed to the event stream. You can activate it from your organization settings page of the [Dashboard](/core/event-stream-hub.md#stream-settings) or [via API](/core/event-stream-hub.md#organization-config) using the [organizations](/provisioning/api-reference/organizations.md) endpoint of the Provisioning API.

On top of that, both the [real-time stream](/core/event-stream-hub.md#connecting-to-the-event-stream) and the [replay stream](/core/event-stream-hub.md#event-recovery-and-replay-by-resource) now show only the events related to the environment (*test* or *live*) associated with the integration token used to authenticate the API call.
{% endupdate %}

{% update date="2025-11-05" tags="rules-engine" %}

## Enabled the option to set item quantity for percentage, fixed amount, and fixed price actions

We've introduced a new optional key (available for [percentage](/rules-engine/actions/types/percentage.md#quantity), [fixed amount](/rules-engine/actions/types/fixed-amount.md#quantity), and [fixed price](/rules-engine/actions/types/fixed-price.md#quantity) actions only) that allows you to limit the number of items on which a promotional discount is applied, regardless of the actual quantity in the cart. When specified, the action applies to the minimum between the specified value and the actual resource quantity. This enables you to create powerful promotional mechanics, such as tiered discounts, sample products, and particularly [free gift campaigns](/rules-engine/actions/types/fixed-price.md#example-1) where you want to offer one (or more) free items while charging full price for additional units.
{% endupdate %}

{% update date="2025-11-04" tags="metrics-api" %}

## New queryable fields for carts and orders

We exposed some new attributes on carts and orders that you can leverage to perform any type of [queries](/metrics/getting-started/queries.md) on our [Metrics API](https://docs.commercelayer.io/metrics-api-reference/) and make your life easier when you need analytics, aggregations, or reports over your historical data. Specifically:

* [Orders](/metrics-api-reference/resources/orders.md) — you can now base your analysis on the type, reference, and reference origin of the customer associated with the order (see `customer_type` on the [order](/metrics-api-reference/resources/orders.md#order-field) field and `reference` and `reference_origin` on the [customer](/metrics-api-reference/resources/orders.md#customer-field) field). You can also use the associated shipments cost, items, and item count, plus some useful information about when they were delivered and how long the fulfillment process took (see `cost_amount`, `items`, `items_count`, `delivered_at`, `seconds_in_shipped`, and `fulfillment_time` on the [shipments](/metrics-api-reference/resources/orders.md#shipments-field) field).
* [Carts](/metrics-api-reference/resources/carts.md) — you can now base your analysis on the type, reference, and reference origin of the customer associated with the cart (see `customer_type` on the [order](/metrics-api-reference/resources/carts.md#order-field) field and `reference` and `reference_origin` on the [customer](/metrics-api-reference/resources/carts.md#customer-field) field).
  {% endupdate %}

{% update date="2025-11-03" tags="core-api" %}

## Added ability to filter promotion by total usage, and more

We exposed a new attribute on all [promotion](/core-api-reference/promotions.md) types that you can leverage to target and filter your promo based on the fact that they've reached their total usage limit or not (i.e. they have been applied the total number of allowed times). On top of that, in the past few days, we released the following minor (but still relevant) updates:

* [Line items](/core-api-reference/line_items/object.md) — we added a new trigger attribute you can send (using integration API credentials) if you want to reset the quantity restocked by a return or by an order/shipment cancel. This will allow for multiple returns, albeit you need to adjust the stock manually.\* [Customer password resets](/core-api-reference/customer_password_resets.md) — sales channels are now allowed to update the resource so that a customer will be able to reset their password as guest from a front end (right after a backend has generated the new customer password reset).
* [Orders](/core-api-reference/orders/object.md) — we now expose the type of the associated customer. Can be one of *new* (i.e. *prospect* customers) or *returning* (i.e. *acquired* or *repeat* customers).
  {% endupdate %}

{% update date="2025-10-20" tags="js-sdk" %}

## Enabled modular imports and better tree-shaking in `v7.x`

Core API [JS SDK](https://github.com/commercelayer/commercelayer-sdk) `v7` is out! This version introduces a more flexible and modular architecture that lets developers [import](https://github.com/commercelayer/commercelayer-sdk?tab=readme-ov-file#import) only the resources they actually use. This improves bundle efficiency, enabling better tree-shaking and significantly reducing the final package size. The result is faster builds, lighter applications, and a smoother developer experience when integrating Commerce Layer in modern frontend frameworks.

{% hint style="info" %}
If you're upgrading from `v6` and you want to leverage this new feature, note that resources are no longer imported automatically. You'll need to explicitly import only the resources your application uses. This change improves performance but may require minor adjustments to your import statements. Otherwise, the old import style still works, but it will include all resources and result in a larger package size.
{% endhint %}
{% endupdate %}

{% update date="2025-10-01" tags="core-api" %}

## New key about application confidentiality exposed in all the issued access tokens

All the tokens issued when [authenticating to our Core API](/core/authentication.md) now expose an additional `application.confidential` boolean key (e.g. true for integration or [JWT bearer sales channels with secret](/core/authentication/jwt-bearer.md#examples), false for simple sales channels without secret, etc.).
{% endupdate %}

{% update date="2025-09-30" tags="js-auth" %}

## New API credentials based approach and helpers on `v7.0.0`

Starting from `v7.0.0` we've introduced a new approach based on [API credentials](https://github.com/commercelayer/commercelayer-js-auth?tab=readme-ov-file#api-credentials) on our JS Auth library, as an alternative to the traditional `authenticate` method (which is still available and working as before in case you need to leverage it). The library now provides a [robust token caching system](https://github.com/commercelayer/commercelayer-js-auth?tab=readme-ov-file#storage-strategy) out of the box to help you avoid hitting the rate limits set on the authentication endpoints. This update also comes with additional helper methods to make your life easier in handling some common use cases and give you more flexibility and efficiency when working with our APIs, such as:

* Built-in token caching system with pluggable storage support.
* Composite storage (e.g. memory + Redis) to reduce load.
* Dedicated customer token management.

Check the [open-source repository](https://github.com/commercelayer/commercelayer-js-auth)'s `README` for any additional details and examples.
{% endupdate %}

{% update date="2025-09-18" tags="checkout" %}

## Timed checkout is now available

Thanks to the recently released feature on the Core API, [timed sessions](https://github.com/commercelayer/mfe-checkout?tab=readme-ov-file#timed-checkout) for orders are now enabled for our Checkout MFE, allowing you to set an expiration for the checkout process. This feature — available from `v6.2.0` — is useful for scenarios where you want to reserve items for a short period of time or enforce a strict purchase window (e.g. ticketing, limited inventory, flash sale, etc.). On top of that, we added Croatian and Slovenian language support to expand international reach.
{% endupdate %}

{% update date="2025-09-17" tags="rules-engine" %}

## Enabled the option to round percentage discounts

You can now leverage a new key (available for [percentage discount actions](/rules-engine/actions/types/percentage.md) only) to ensure the discount amount will be [rounded](/rules-engine/actions/types/percentage.md#round) off to the nearest integer value. This can come in handy when you want to avoid displaying or dealing with decimal values in discounts or final prices (e.g. to simplify the shopping experience and/or make offers appear cleaner and more user-friendly).
{% endupdate %}

{% update date="2025-09-11" tags="dashboard" %}

## New rule builder for price lists

As well as [we did](#new-rule-builder-for-flex-promotions-and-more) for the **Promotions** app, now also the **Price lists** app within the *Settings* section features the new rule builder that will make your life easier in terms of creating your rules JSON payload starting from the desired conditions, actions, matchers, and operators. Of course, you'll always be free to write down the JSON code directly in the provided editor, if you prefer. [Sign up](https://dashboard.commercelayer.io/sign_up) or [log in](https://dashboard.commercelayer.io/sign_in) to see for yourself and feel free to share your feedback!
{% endupdate %}

{% update date="2025-09-03" tags="core-api" %}

## Introducing our new event Stream Hub

We're excited to announce the release of our [Change Data Capture (CDC) system](/core/event-stream-hub.md), a foundational upgrade to how we track and expose resource changes across the Commerce Layer API. For enterprise organizations, we now offer real-time event streaming through a new service called Stream Hub. Using *Server-Sent Events (SSE)*, clients can [subscribe to an event stream](/core/event-stream-hub.md#connecting-to-the-event-stream) and consume updates as they happen — no polling required. Every time a resource is created or updated, we generate a corresponding event. These events include information about what changed, who made the change, and more.

The Stream Hub also supports a [replay endpoint](/core/event-stream-hub.md#event-recovery-and-replay-by-resource) that lets you query historical events and filter them by resource type and resource ID (or just retrieve all events for your organization).

On top of that, each resource now exposes a new relationship called [event stores](/core-api-reference/event_stores.md) that gives you direct access to the change events related to a specific resource, complete with [pagination](/core-api-reference/event_stores.md#pagination).

{% hint style="danger" %}
Event stores will replace [versions](broken://spaces/RWJeylueWkzLadK710XZ/pages/ye4r6T7uwvvYUILr1Qbx) that are no longer stored as of August 2025. Older versions are still fetchable, but please note that this endpoint will be deprecated and removed soon. Start using event stores to get the same information you got from versions, and more.
{% endhint %}

[Check the docs](/core/event-stream-hub.md) and read [this article](https://commercelayer.io/blog/introducing-our-new-event-stream-hub) on our blog to learn more and share your feedback!

{% embed url="<https://commercelayer.io/blog/introducing-our-new-event-stream-hub>" %}
{% endupdate %}

{% update date="2025-09-02" tags="core-api" %}

## Order timed placement option

We just released a small (but extremely powerful) feature on our orders API. You can now set an expiration timestamp after which the order placement attempt will fail. Along with that, you can also add a JSON object filled with any key/value pair you need (e.g. the expiration reasons or any other information you want to provide). [This option](/core-api-reference/orders.md#timed-placement) can be particularly useful in common use cases such as ticketing processes, time-limited inventory, flash sales, and more.
{% endupdate %}

{% update date="2025-07-24" tags="dashboard" %}

## New rule builder for flex promotions, and more

Big news, Dashboard-side, for those enterprise users who are using our [Rules Engine](https://docs.commercelayer.io/rules-engine/) for their promotion strategy. Now the **Promotions** app features a shiny new rule builder that will make your life easier in terms of creating your rules JSON payload starting from the desired conditions, actions, matchers, and operators. Of course, you'll always be free to write down the JSON code directly in the provided editor, if you prefer. On top of that, we released a bunch of small (but relevant) updates to some other Dashboard apps. In detail:

* **Resources** — we enabled search (by name, code, number and/or ID when available).
* **Taxes** — we improved the UI of the *Settings* section about tax categories and tax rules, and added Stripe Tax to the list of tax calculators manageable via Dashboard.
* **Markets** — You can now choose (or see if already set) a default shipping method and/or a default payment method for a market.
* **Exports** — we fixed the list of includes for some resources and optmized the order and coupons export process, adding additional filters (e.g. by payment status, fulfillments status, tags for orders, by promotions for coupons, etc.).
* **Gift cards** — in addition to some UI fixes, we added a timeline where you can add notes.

[Sign up](https://dashboard.commercelayer.io/sign_up) or [log in](https://dashboard.commercelayer.io/sign_in) to see for yourself and feel free to share your feedback!
{% endupdate %}

{% update date="2025-06-19" tags="checkout" %}

## New payment integrations, and other improvements

We've released a relevant chunk of updates regarding our Checkout MFE. The highlights include the expansion of the [set of available payment solutions](https://github.com/commercelayer/mfe-checkout?tab=readme-ov-file#payment-step). In detail:

* **Stripe** — We now support [Link](https://stripe.com/en-it/payments/link), [Klarna](https://stripe.com/en-it/payments/klarna), and [Affirm](https://stripe.com/en-it/payments/affirm), offering more flexible payment options.
* **Adyen** — We upgraded our integration to the [Drop-in v6.x](https://docs.adyen.com/online-payments/build-your-integration/sessions-flow) for a more modern and stable experience.
* **Checkout.com** — We updated our integration to the latest Drop-in version.

On top of that, we shipped a bunch of minor (but still relevant) enhancements concerning:

* **Localization and configuration** — We added Portuguese language support to expand international reach and enabled [optional billing info](https://github.com/commercelayer/mfe-checkout?tab=readme-ov-file#optional-billing-info) display based on the[ organization configuration](/provisioning/api-reference/organizations.md#micro-frontends-configuration).
* **Thank you page** — We now show approved orders [when a customer token is present](https://github.com/commercelayer/mfe-checkout?tab=readme-ov-file#logged-customers-1), ensuring a consistent and personalized post-purchase experience.

We also improved the **UI/UX**:

* Now the "Place order" button is hidden on mobile devices until the customers reach the payment step.
* After placing the order now we scroll to the top of the Thank you page.
* The [custom Thank you page](https://github.com/commercelayer/mfe-checkout?tab=readme-ov-file#custom-thank-you-page-url) loading has been boosted for a faster and smoother experience.
* We added a loader on the payment step to clearly indicate the processing status.
  {% endupdate %}

{% update date="2025-06-18" tags="core-api" %}

## Shared secret for external shipping costs, rules outcomes on line items, and more

To avoid issues when a shipping method is [shared across markets](/core-api-reference/shipping_methods.md#default-shipping-method), the shared secret you need to use to sign the [external shipping costs](/core/external-resources/external-shipping-costs.md#security) request payload is now exposed at the shipping method level. Review your integration because this could be a potential <mark style="color:red;">**breaking change**</mark>**.** <mark style="color:red;">⚠️</mark> On top of that, in the past few days we released the following minor (but still relevant) updates:

* [Line items](/core-api-reference/line_items/object.md) — if you're an Enterprise customer leveraging our [Rules Engine](https://docs.commercelayer.io/rules-engine/) you can now check the rules that generated a discount on a specific line item also at the line item level by inspecting the `rule_outcomes` object.\* [Payment methods](/core-api-reference/payment_methods/object.md) — we no longer support the deprecated `credit_card` payment source type. Credit card payments are managed as usual via the related gateway payment source type. This could be a potential <mark style="color:red;">**breaking change**</mark>**.** <mark style="color:red;">⚠️</mark>
* [Adyen payments](/core-api-reference/adyen_payments/object.md) — we now provide the \_balance trigger that you can leverage to fetch the associated (proprietary — e.g. [Givex](https://www.adyen.com/partners/givex)) gift card balance.
  {% endupdate %}

{% update date="2025-06-11" tags="dashboard" %}

## New generic app kind, asynchronous captures, and more

We've introduced a new kind of [application](/provisioning/getting-started/applications.md) that you can choose when creating a [custom app](/provisioning/getting-started/applications.md#custom-apps). [Generic apps](/provisioning/getting-started/applications.md) can have *Full access* (read and write) or *Read-only* permissions on all the [Commerce Layer Core resources](https://docs.commercelayer.io/core-api-reference/), thus enabling you to create the most flexible custom Dashboard applications tailored to your needs. On top of that, we've released a relevant chunk of updates and added some interesting new functionalities to our Dashboard, including:

* **Orders** — we've enabled asynchronous payment capture management.
* **Customers** — now you can remove customer payment sources from a customer's wallet.
* **Returns** — we've enabled returns management also for orders partially delivered. You can now also view the list of refunded returns.
* **SKU lists** — now you can select from the UI multiple items for SKU list manually managed.

[Sign up](https://dashboard.commercelayer.io/sign_up) or [log in](https://dashboard.commercelayer.io/sign_in) to see for yourself and feel free to share your feedback!
{% endupdate %}

{% update date="2025-05-28" tags="dashboard" %}

## New roles and test mode access for team members

Leveraging the new [membership profiles](#new-membership-profiles-endpoint) feature recently released for the [Provisioning API](https://docs.commercelayer.io/provisioning/), we've released two important updates regarding our Dashboard:

* **Roles** — you can now associate a set of applications directly at the role level, eliminating the need to configure them individually for each user. This simplifies access management and helps reduce configuration errors.
* **Test mode access** — admins can now grant test mode access to Dashboard applications, either at the individual user level or at the role level. This allows team members to explore and get familiar with how the applications work, without affecting production data.

{% hint style="info" %}
Custom API roles are no longer assigned directly to users. They are now assigned as part of the role when linking a web application to a team member.
{% endhint %}

[Sign up](https://dashboard.commercelayer.io/sign_up) or [log in](https://dashboard.commercelayer.io/sign_in) to see for yourself and feel free to share your feedback!
{% endupdate %}

{% update date="2025-05-22" tags="provisioning-api" %}

## New membership profiles endpoint

We just added a new entry to the roster of our Provisioning API endpoints. You can now leverage [membership profiles](/provisioning/api-reference/membership_profiles.md) to define a group of [application memberships](/provisioning/api-reference/application_memberships.md) to be associated with a [membership](/provisioning/api-reference/memberships.md) so that each member of the profile is allowed to see and/or manage the related subset of [Dashboard apps](/provisioning/getting-started/applications.md). This makes it super easy to reuse a set of application memberships and assign the same profile to multiple.

On top of that:

* We've also added the option — both at the single [membership](/provisioning/api-reference/memberships.md#granting-access-to-the-test-environment) and at the [membership profile](/provisioning/api-reference/membership_profiles.md#granting-access-to-the-test-environment) level — to enable specific members to try the Dashboard apps with test data by accessing the test environment based on their permissions.
  {% endupdate %}

{% update date="2025-05-20" tags="core-api" %}

## Order refresh optimizations, and more

We focused (with excellent results) on optimizing the whole [order](/core-api-reference/orders.md) refresh process (including shipments rebuild and limiting the number of tax updates), thus making our commerce API even faster. On top of that, in the past few days we released the following minor (but still relevant) updates:

* [Gift cards](/core-api-reference/gift_cards.md)— now if you decide not to [distribute the discount](/core-api-reference/gift_cards.md#discount-calculation-and-distribution) related to gift cards used to pay for an order on all the taxable items and the price list associated with the market where you're placing the order does not include taxes, the discount will be applied to the whole order amount plus taxes. This could be a potential <mark style="color:red;">**breaking change**</mark>**.** <mark style="color:red;">⚠️</mark>
* [Adjustments](/core-api-reference/adjustments.md) — now negative adjustment amounts are applied before any kind of promotion and/or gift card used to pay for the associated order. This could be a potential <mark style="color:red;">**breaking change**</mark>**.** <mark style="color:red;">⚠️</mark>
* [Webhooks](/core/real-time-webhooks.md) — we added three new events to our [real-time webhooks list](/core/real-time-webhooks.md#supported-events) so that you can get notified about when a return is refunded and cancelled, and when a successful transaction is refused by the payment gateway.
* [External tax calculators](/core/external-resources/external-tax-calculators.md) — we added the customer associated with the order as a relationship included within the [request](/core/external-resources/external-tax-calculators.md#request) body we send to your external tax calculator URL.
* [Stripe gateways](/core-api-reference/stripe_gateways/object.md) — now the force payment option is the default behavior (set the related attribute to `false` if you want to disable it). This could be a potential <mark style="color:red;">**breaking change**</mark>**.** <mark style="color:red;">⚠️</mark>
  {% endupdate %}

{% update date="2025-05-19" tags="cli" %}

## New Metrics plugin

`v1.0.1` of our [Metrics CLI plugin](https://github.com/commercelayer/commercelayer-cli-plugin-metrics) is out! Now you can use Commerce Layer Metrics API (performing all the available queries, using filters, and more) directly from the command line. To learn more about the plugin commands and options, please refer to the open-source GitHub repo [README](https://github.com/commercelayer/commercelayer-cli-plugin-metrics/blob/main/README.md).
{% endupdate %}

{% update date="2025-03-31" tags="metrics-api" %}

## Data queries, search, and stats available for order and cart errors

We've exposed a new field on [orders](/metrics-api-reference/resources/orders.md#resource_errors-field) and [carts](/metrics-api-reference/resources/carts.md#resource_errors-field) that enables you to perform the available [breakdown](/metrics/getting-started/queries/breakdown.md), [date breakdown](/metrics/getting-started/queries/date-breakdown.md), [stats](/metrics/getting-started/queries/stats.md), and [search](/metrics/getting-started/queries/search.md) queries and check for any related error codes, messages, and more. Check the [Use cases](/metrics/getting-started/use-cases/orders-by-resource-error-code-and-message.md) section for some examples and the public [Postman collection](https://www.postman.com/commercelayer/workspace/commerce-layer-public-workspace/documentation/19711194-37a2d863-72f6-4b8f-8146-2f61d405fd3c) to see it in action!

On top of that:

* We've also enabled full-text search on [return](/metrics-api-reference/resources/returns.md#return-field)'s aggregated details (previously available for [orders](/metrics-api-reference/resources/orders.md#order-field) and [carts](/metrics-api-reference/resources/carts.md#order-field) only) so that you can now perform a [full-text search](/metrics/getting-started/filters.md#aggregated-details) using the dedicated `query` operator.
  {% endupdate %}

{% update date="2025-03-19" tags="rules-engine" %}

## Introducing our new Rules Engine

Commerce Layer has always had built-in promotions that cover a large set of the most common use cases. If your promotional strategy requires a more flexible, custom, tailor-made logic, now you can leverage our new [Rules Engine](https://docs.commercelayer.io/rules-engine/), one of the most powerful promotions engines in the market today. The Commerce Layer Rules Engine is a powerful tool designed to define and manage [rules](/rules-engine/rules.md), from simple to complex, multi-conditional logic. It evaluates specific payloads to ensure [conditions](/rules-engine/conditions.md) are met, triggering corresponding [actions](/rules-engine/actions.md). It is currently integrated with our Core API via [flex promotions](/rules-engine/resources/promotions.md) and/or [price lists](/rules-engine/resources/price-lists.md) to let you create almost any kind or [order](/rules-engine/core-api-integration/order-rules.md) and [price](/rules-engine/core-api-integration/price-rules.md) rules.

Check the [documentation](https://docs.commercelayer.io/rules-engine/), browse the [use cases](https://docs.commercelayer.io/rules-engine/use-cases/) examples, and try it out! Any feedback is appreciated.

{% embed url="<https://docs.commercelayer.io/rules-engine>" %}

You can also read more about it [on our blog](https://commercelayer.io/blog/the-new-promotion-rule-engine-changes-the-game-for-how-to-do-promotions).

{% embed url="<https://commercelayer.io/blog/the-new-promotion-rule-engine-changes-the-game-for-how-to-do-promotions>" %}

{% hint style="info" %}
The Rules Engine integration is still in **beta** and available only to our enterprise customers. If you're one of them and want to test and leverage its functionalities reach out to us and request to be part of the beta program.
{% endhint %}
{% endupdate %}

{% update date="2025-03-18" tags="core-api" %}

## Old Admin Area and Auth endpoints removal

In the spirit of good spring cleaning 🌱 🌼 as previously announced well in advance, we kindly remind you that both the old Amin Area and the old authentication endpoints are officially sunsetted and no longer available, being replaced by:

* [Dashboard](https://dashboard.commercelayer.io/) — The new Dashboard includes a wide set of dedicated back-office apps that cover all the functionalities of the old one. Plus, it comes with an improved user experience and a lot of new features.
* [Authentication](/core/authentication.md) — We've migrated the whole authentication process to our new Authentication API, as detailed in the related section of the documentation. You should already have updated your integration (by the way, the [migration](/core/authentication/how-to-migrate.md) is super easy and can be achieved in very few steps).
  {% endupdate %}

{% update date="2025-03-17" tags="core-api" %}

## New triggers for taggable resources, and more

Now you can [change the list of the tags](/core/tagging-resources.md#updating-the-list-of-tags) currently associated with a resource by adding or removing tags without the need to [specify the new tags list as a whole](/core/tagging-resources.md#example). To do that, you can patch taggable resources and send the new `_add_tags` and/or `_remove_tags` trigger attributes by passing the comma-separated list of tags you want to add/remove. On top of that, in the past few days we released the following minor (but still relevant) updates to our APIs:

* [Parcels](/core-api-reference/parcels/object.md) — we change the type of the `tracking_details` attribute from object to array. This could be a potential <mark style="color:red;">**breaking change**</mark>**.** <mark style="color:red;">⚠️</mark>
* [Order subscriptions](/core-api-reference/order_subscriptions.md) — we added the new `running` status to track the time-window when the related order copy process is ongoing.
* [Stripe gateways](/core-api-reference/stripe_gateways/object.md) — we added the option to force the payment source related to the associated order event and ignore any other created payment sources (if any), upon receiving a successful event from Stripe.
  {% endupdate %}

{% update date="2025-03-06" tags="core-api" %}

## Default shipping and payment methods

You can now set a default [shipping method](/core-api-reference/markets.md#default-shipping-method) and a [default payment method](/core-api-reference/markets.md#default-payment-method) for one or more [markets](/core-api-reference/markets.md). This way, the default methods will be used for all the market's [orders](/core-api-reference/orders.md#default-payment-method) not already associated with a payment method and all the [shipments](/core-api-reference/shipments.md) that belong to the market's orders and that are not already associated with a shipping method. If an existing association of an order with a payment method or a shipment with a shipping method is removed, the association with the default ones will be automatically set. Remember that to be eligible for being set as default a [payment method](/core-api-reference/payment_methods.md) must not be already associated with any market and a [shipping method](/core-api-reference/shipping_methods.md) must not be already associated with any market, stock location, shipping category, and shipping zone.
{% endupdate %}

{% update date="2025-02-25" tags="core-api" %}

## New pickups endpoint

We've just added a new entry to the roster of our commerce API endpoints. You can leverage the [pickups](/core-api-reference/pickups.md) API to schedule a pickup from a carrier at your customer's residence or place of business and define a dedicated pickup time window. At the moment [EasyPost pickups](/core-api-reference/easypost_pickups.md) are available (more to come), thanks to our out-of-the-box integration with EasyPost, a shipping operations suite that features 100+ industry-leading carriers.
{% endupdate %}

{% update date="2025-02-18" tags="core-api" %}

## New sales channels abilities for tags, and more

Now sales channels [can read](/core-api-reference/tags.md#sales-channel-abilities) the tags associated with a specific subset of [taggable resources](/core-api-reference/tags.md#taggable-resources) (at the moment: [bundles](/core-api-reference/bundles.md), [SKUs](/core-api-reference/skus.md), [SKU options](/core-api-reference/sku_options.md), and all [promotion](/core-api-reference/promotions.md) types). On top of that, in the past few days we released the following minor (but still relevant) updates to our APIs:

* [Orders](/core-api-reference/orders/object.md) — we've enhanced the `_fulfill` trigger attribute operation. Now it can be sent not only if the associated shipments are cancelled, shipped, or delivered, but also if the order is just approved.
* [Stock line items](/core-api-reference/stock_line_items/object.md) — we now expose the name and image URL of the associated line items.
  {% endupdate %}

{% update date="2025-02-17" tags="dashboard" %}

## New navigation menu and Apps grouping

We've released a relevant chunk of updates regarding our Dashboard. As you may have noticed, the biggest one involves the UI, specifically the navigation menu. Now the old *Apps* section has been replaced by multiple dropdowns that group the apps by area/functionality:

* **Fulfillment** — including Orders, Shipments, Customers, Returns, Stock transfers, and Subscriptions apps.
* **Products** — including SKUs, SKU lists, Prices, and Inventory apps.
* **Marketing** — including Promotions, Bundles, and Gift cards apps.
* **Data** — including Imports, Exports, and Tags apps.
* **Developers** — including the Webhooks app alongside the *API credentials*, *Resources*, and *Custom apps* sections.

This grouping is replicated also in the application membership section where you can choose to which app a member have access.

[Sign up](https://dashboard.commercelayer.io/sign_up) or [log in](https://dashboard.commercelayer.io/sign_in) to see for yourself and feel free to share your feedback!

{% hint style="warning" %}
As previously announced the old Admin Area has been definitively sunset and is no longer accessible from the [Dashboard](https://dashboard.commercelayer.io/test/spineless).
{% endhint %}
{% endupdate %}

{% update date="2025-01-29" tags="core-api" %}

## Updates to exports, and more

Resource attributes computed dynamically are now exported with their original name, instead of using the delegated method's one (e.g. `item_type` instead of `item_resource_type`). This could introduce a potential <mark style="color:red;">**breaking change**</mark> in case you're relying on a logic dependent on the old (wrong) exported attribute names. Speaking about [exports](/core-api-reference/exports.md), we also made them [versionable](broken://spaces/RWJeylueWkzLadK710XZ/pages/ye4r6T7uwvvYUILr1Qbx). On top of that, in the past few days we released the following minor (but still relevant) updates to our APIs:

* [Shipping methods](/core-api-reference/shipping_methods.md) — we added the `tax_code` attribute that you can leverage to define a custom tax code for your shipment tax calculation (currently supported by [Avalara](/core-api-reference/avalara_accounts.md) only).
* [Stripe payments](/core-api-reference/stripe_payments/object.md) — we added the `on_behalf_of` and `transfer_group` attributes, which are also available in the associated order `payment_source_details`.
  {% endupdate %}

{% update date="2025-01-21" tags="core-api" %}

## Out-of-the-box integrations with Stripe Tax and Vertex, and more

[Stripe Tax](https://stripe.com/tax) and [Vertex](https://www.vertexinc.com/solutions/products/vertex-indirect-tax-o-series) have just come in addition to the list of [tax calculators](/core-api-reference/tax_calculators.md) we support out-of-the-box. You can now leverage the new [Stripe Tax accounts](/core-api-reference/stripe_tax_accounts.md) and [Vertex accounts](/core-api-reference/vertex_accounts.md) endpoints to manage tax calculations for your markets seamlessly.

{% hint style="info" %}
As a first release, the two new tax calculators are available via API only. The [Dashboard](https://dashboard.commercelayer.io/) *Settings* section will be updated soon — stay tuned!
{% endhint %}

On top of that, we released the following minor (but still relevant) tax-related updates to our APIs:

* [Events](/core-api-reference/events.md) — we exposed the events relationships on all the types of tax calculators.
* [Customers](/core-api-reference/customers.md) — we added a new `tax_exemption_code` attribute to identify the reason for a specific customer's tax exemption.
  {% endupdate %}

{% update date="2025-01-15" tags="core-api" %}

## Notifications and new optional headers for external resources, and more

We've extended [notifications](/core/external-resources.md#notifications) to all the [external resources](/core/external-resources.md) (with the only exception of [external order validation](/core/external-resources/external-order-validation.md)). Now, as a result of a successful response, you can ensure that external resources automatically add [notifications](/core-api-reference/notifications.md) to the resource they are called for, specifically:

* [External prices](/core/external-resources/external-prices.md) can add notifications on the patched line item.
* [External shipping costs](/core/external-resources/external-shipping-costs.md) can add notifications on the patched shipping method.
* Each [external payment gateway](/core/external-resources/external-payment-gateways.md)'s transaction (except for [customer token](/core/external-resources/external-payment-gateways.md#customer-token)) can add notifications to the associated order.
* [External promotions](/core/external-resources/external-promotions.md) can add notifications to the order on which they are performing the discount computation.
* [External tax calculators](/core/external-resources/external-tax-calculators.md) can add notifications to the order on which they are performing the tax computation.

Still talking about external resources, we also added the option to pass two Trace Context [headers](/core/external-resources.md#request-headers) so that you can easily trace the calls to your external endpoints on your APM. On top of that, we released the following minor (but still relevant) updates to our APIs:

* [Shipping methods](/core-api-reference/shipping_methods/object.md) — to enable the above, we added the relationship with the associated [notifications](/core-api-reference/notifications.md).
* [Prices](/core-api-reference/prices/object.md) — we added a new timestamp that traces the time at which the resource was processed by the API.
  {% endupdate %}
  {% endupdates %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.commercelayer.io/changelog/2025.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
