---
title: >-
  Cart mutations reject unconfirmed writes in POS UI extensions 2026-10 -
  Shopify developer changelog
description: >-
  Shopify’s developer changelog documents all changes to Shopify’s platform.
  Find the latest news and learn about new platform opportunities.
source_url:
  html: >-
    https://shopify.dev/changelog/posts/cart-mutations-reject-unconfirmed-writes-in-pos-ui-extensions-2026-10
  md: >-
    https://shopify.dev/changelog/posts/cart-mutations-reject-unconfirmed-writes-in-pos-ui-extensions-2026-10.md
metadata:
  effectiveApiVersion: 2026-10
  affectedApi:
    - displayName: POS Extensions
      handle: pos-extensions
  primaryTag:
    displayName: API
    handle: api
  secondaryTag:
    displayName: Breaking API Change
    handle: breaking-api-change
  indicatesActionRequired: true
  createdAt: '2026-10-06T19:02:59-04:00'
  postedAt: '2026-10-07T12:00:00-04:00'
  updatedAt: '2026-10-07T12:41:23-04:00'
  effectiveAt: '2026-10-07T12:00:00-04:00'
---

October 7, 2026

# Cart mutations reject unconfirmed writes in POS UI extensions 2026-10

DateOctober 7, 2026

Version[2026-10](https://shopify.dev/changelog?api_version=2026-10)

Flags[Breaking API Change](https://shopify.dev/changelog?filter=breaking-api-change)[Action required](https://shopify.dev/changelog?action_required=true)

SurfacesAPI

Affected APIs[POS Extensions](https://shopify.dev/changelog?api_type=pos-extensions)

In POS UI extensions API version `2026-10`, [Cart API](https://shopify.dev/docs/api/pos-ui-extensions/latest/target-apis/contextual-apis/cart-api) mutations reject when Shopify POS doesn't confirm that the cart changed. In earlier versions these mutations resolve whether or not POS applied the write. This is a breaking change for apps that adopt `2026-10`, and those apps need to handle a rejected promise on every cart mutation they call. Apps on `2026-07` and earlier are unaffected.

## What changed

POS reports the outcome of every cart write. Only a success result confirms that the cart changed. Earlier API versions resolve the mutation regardless of that result, so an app can't tell an applied write from a dropped one, and an app can show a fee or a discount as applied when the cart never changed.

In `2026-10`, these mutations reject unless POS confirms the write: `bulkCartUpdate`, `removeLineItem`, `applyCartDiscount`, `addCartCodeDiscount`, `removeAllDiscounts`, `setCustomer`, `removeCustomer`, `addLineItemProperties`, `bulkAddLineItemProperties`, `removeLineItemProperties`, `setLineItemDiscount`, `bulkSetLineItemDiscounts`, `removeLineItemDiscount`, `addLineItemSellingPlan`, and `removeLineItemSellingPlan`. `updateLineItemQuantity` is new in `2026-10` and rejects from its first release.

An unconfirmed write rejects with one of two messages:

* `POS refused the cart update. The cart was not changed.` POS declined the write and the cart is unchanged. This can happen when POS is no longer accepting cart changes, for example after the cashier moves to payment. Retrying can succeed once cart editing is available again.
* `POS could not confirm the cart update.` The outcome is unknown and a partial write is possible. Read the cart before you retry.

These two messages cover unconfirmed writes. A cart mutation can still reject for other reasons, such as an invalid discount value or a missing customer, so match on the message only when you need to tell the two cases apart.

## Who's affected

Apps that call any of the mutations above from a POS UI extension with `api_version = "2026-10"` or later. The change applies per extension, based on the API version the extension declares, not per store.

Apps on `2026-07` and earlier keep the current behavior with no changes. Apps that already wrap cart mutations in `try`/`catch` or attach a `.catch()` handler run that handler on an unconfirmed write instead of continuing as though the write succeeded.

## Why this matters

A dropped cart write is silent today. Rejection turns that silent data loss into an error at the call site, where an app can retry, surface a message to the staff, or roll back its own state.

## Breaking changes and migrations

***

**Caution:** Calls that previously resolved now reject. If a rejection isn\&#39;t caught, the rest of your handler doesn\&#39;t run, including any UI you render after the write and any cleanup such as clearing a loading state.

***

Handle rejection at each call site before you bump an extension to `2026-10`.

Before:

```js
await shopify.cart.applyCartDiscount('FixedAmount', 'Winter discount', '5.00');
setDiscountApplied(true);
```

After:

```js
try {
  await shopify.cart.applyCartDiscount('FixedAmount', 'Winter discount', '5.00');
  setDiscountApplied(true);
} catch (error) {
  setDiscountApplied(false);
  showToast('Could not update the cart. Try again before payment.');
}
```

If you can't migrate immediately, keep the extension on `2026-07` or earlier. Those versions aren't affected, and you can bump after the handling is in place.

## Action required

Add rejection handling to every cart mutation your extension calls, then set `api_version = "2026-10"`. Apps that bump without handling rejection will see handlers stop at the first unconfirmed write, which can leave a spinner on screen or skip a confirmation step. `2026-07` continues to work until it reaches the end of its support window under [API versioning](https://shopify.dev/docs/api/usage/versioning).

## Related docs

* [Cart API](https://shopify.dev/docs/api/pos-ui-extensions/latest/target-apis/contextual-apis/cart-api)
* [2026-10: Release notes](https://shopify.dev/release-notes/2026-10)
* [API versioning](https://shopify.dev/docs/api/usage/versioning)
