POS UI EXTENSIONS

POS UIエクステンション 2026-10
カートmutationの破壊的変更

未確認の書き込みがrejectに変わる——try/catchなしでは止まらない

2026-07 以前書き込み失敗でもresolve ✓API 2026-10 へ2026-10 以降未確認の書き込みはreject ✗

POS UIエクステンションのAPIバージョン2026-10から、Shopify POSがカートの変更を確認できなかった場合にカートmutationがrejectされるようになります。影響を受けるのはapi_version = "2026-10"を宣言したエクステンションのみで、2026-07以前は影響なしです。各呼び出し箇所でのエラーハンドリング追加が必須となります。

1Before / After 図解

カートmutation 挙動の変化BEFORE(2026-07以前)applyCartDiscount( ... ) を呼び出しPOS内部で書き込み失敗 (silent)resolve → UIは「適用済」表示 ⚠AFTER(2026-10以降)applyCartDiscount( ... ) を呼び出しPOS内部で書き込み失敗reject → catch でエラー処理 ✓

2対象となるmutation一覧

mutation名 2026-10での扱い 備考
bulkCartUpdate reject対象 未確認時にreject
removeLineItem reject対象 未確認時にreject
applyCartDiscount reject対象 未確認時にreject
addCartCodeDiscount reject対象 未確認時にreject
removeAllDiscounts reject対象 未確認時にreject
setCustomer / removeCustomer reject対象 未確認時にreject
addLineItemProperties 他3件 reject対象 bulkAdd/removeも同様
setLineItemDiscount 他2件 reject対象 bulk/removeも同様
addLineItemSellingPlan / remove… reject対象 未確認時にreject
updateLineItemQuantity 2026-10新規追加 初回リリースからreject

3エラーメッセージの種類

パターン①:POS が拒否「POS refused the cart update.The cart was not changed.」→ POS が書き込みを拒否(例:会計フローに移行済みなど)カート編集が再度可能になればリトライで成功することがあるパターン②:確認不能「POS could not confirm thecart update. The outcome isunknown and a partial writeis possible.」リトライ前にカートを読み直す(部分書き込みの可能性あり)

4業務ユースケース

課題
決済画面へ移行後にエクステンションからカート割引を適用しようとすると、従来は失敗しても成功表示されたままになっていた
打ち手
2026-10へ移行しtry/catchを追加。catchブロック内でトースト通知「カートを更新できませんでした。再度お試しください」を表示
効果
スタッフが割引未適用のまま決済を進めるミスを防止。POSの状態とUIの表示が常に一致する
技術メモ
エラーメッセージ①(refused)はリトライ可能。決済フローを抜けた後に再試行するロジックを実装することで回復できる
課題
カート行アイテムのプロパティ追加(addLineItemProperties)が失敗しても従来は検知できず、注文データに必要な情報が欠落することがあった
打ち手
mutation呼び出しをawaitで待機し、reject時はエラーパターン②を確認。カートを読み直してプロパティの有無を確認してからリトライ
効果
部分書き込みの状態を検出でき、注文データの不整合を防止。サポート対応コストを削減
技術メモ
エラーメッセージ②(could not confirm)では部分書き込みが起きている可能性があるため、リトライ前に必ずCartを読み取ること
課題
セリングプランの追加(addLineItemSellingPlan)失敗時にローディングスピナーが消えず、レジ端末がフリーズしたように見える問題があった
打ち手
catchブロックにローディング解除(setLoading(false))と確認UIの非表示処理を追加。エラー時のクリーンアップを必ず実施
効果
rejectが捕捉されずハンドラが途中で止まる問題を解消。スタッフ体験の向上と業務停止リスクを低減
技術メモ
公式の注意点として「rejectを捕捉しないとローディング状態のクリアや確認ステップのスキップが起きる」と明記されている

5技術者向けポイント

破壊的変更の範囲

変更はストア単位ではなくエクステンション単位。同一アプリでもエクステンションが宣言するapi_versionごとに挙動が異なる。2026-07以前を使い続けるエクステンションは影響を受けない。

移行の猶予期間

2026-07はAPIバージョニングのサポート終了まで引き続き利用可能。すぐに移行できない場合はapi_versionを2026-07以前のままにしておき、ハンドリング実装後に2026-10へ切り替える。

コード変更の最小単位

全カートmutationの呼び出し箇所にtry/catchまたは.catch()を追加する。既にcatchが付いている場合はそちらが発火するだけで追加対応は軽微。

updateLineItemQuantityは新規

このmutationは2026-10で新たに追加されたAPI。初回リリースからreject動作が前提のため、既存コードへの影響はないが、新規実装時は必ずtry/catchを付ける。

メッセージ文字列のマッチング

2種類のエラーメッセージは未確認書き込みの場合のみ。割引値不正・顧客情報不備などの別原因でもrejectは発生する。2種を区別が必要な場合のみmessageプロパティでマッチする実装推奨。

POS UIエクステンションを2026-10へアップグレードする前に、全カートmutationへのtry/catchを必ず実装することで、サイレントな書き込み失敗を確実なエラーハンドリングに転換できます。

Source: https://shopify.dev/changelog/cart-mutations-reject-unconfirmed-writes-in-pos-ui-extensions-2026-10 | 公開日: 2026年10月7日