これまではカートが実際に変わっていなくても mutation は成功(resolve)扱いでした。2026-10 からは POS が書き込みを確認できない場合に promise が reject されるため、すべての呼び出し箇所でエラー処理が必要になります。
POS が書き込みを反映したかどうかに関係なく mutation は resolve します。そのため、反映された書き込みと取りこぼされた書き込みをアプリが区別できず、カートは変わっていないのに手数料や割引を「適用済み」と表示してしまうことがあります。
POS が書き込みを確認したときだけ resolve します。確認できなければ reject され、アプリはリトライする・スタッフにメッセージを出す・自分の state をロールバックする、といった対応をその場で取れます。
※ カテゴリ分けはこのページで読みやすくするためのもので、元記事にはありません。
2026-10 で新しく追加された mutation で、最初のリリースから「未確認なら reject」の仕様です。古い挙動のバージョンはありません。
POS が書き込みを受け付けなかったケースで、カートは変わっていません。レジ担当が支払いに進んだ後など、POS がカートの変更をもう受け付けていないときに起きます。カートを編集できる状態に戻れば、リトライで成功する可能性があります。
結果が分からず、一部だけ書き込まれている可能性もあります。リトライする前にカートを読み直す必要があります。
| ケース | カートの状態 | 推奨される対処 |
|---|---|---|
| refused | 変化なし | カートを編集できる状態に戻ってからリトライ |
| could not confirm | 不明(一部書き込みの可能性) | カートを読み直してからリトライ |
| その他の reject | 記載なし | 不正な割引値・顧客が見つからない等、原因ごとに対処 |
api_version = "2026-10" 以降の POS UI extension から、上記の mutation を 1 つでも呼んでいるアプリ。
今の挙動がそのまま続きます。2026-07 は API バージョニングのサポート期間が終わるまで使えます。
未確認の書き込みでも成功したものとして処理を続けるのではなく、既存の catch / .catch() ハンドラが実行されるようになります。
await shopify.cart.applyCartDiscount('FixedAmount', 'Winter discount', '5.00');
setDiscountApplied(true);
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.');
}
extension の中で、対象の cart mutation を呼んでいるすべての場所を確認します。
try/catch か .catch() を入れ、state を戻す・メッセージを出す処理を書きます。
api_version = "2026-10" に上げるエラー処理が入ってからバージョンを上げます。
reject が catch されないと、書き込み後の UI 描画もローディング解除も実行されません。「スピナーが消えない」「確認ステップが飛ばされる」が典型的な症状です。後片付けはエラー時にも通る場所に置く必要があります。
refused はカートが変わっていないので、編集できる状態に戻ればそのままリトライできます。could not confirm は一部だけ書き込まれた可能性があるので、まずカートを読み直してからリトライします。何も考えずにリトライすると二重適用の恐れがあります。
不正な割引値や顧客が見つからないなど、2 つのメッセージ以外の理由でも reject されます。基本はすべての reject を catch で受け、2 ケースを区別したいときだけメッセージで判定します。
影響範囲はストアではなく、各 extension の api_version で決まります。複数の extension を持つアプリでは、一つずつエラー処理を入れてから上げる段階的な移行ができます。
2026-10 で追加された updateLineItemQuantity は、最初のリリースから reject する仕様です。この mutation に乗り換える場合、「resolve したらカートが変わった」と前提にして、最初から catch を書く設計にします。
api_version = "2026-10" に上げる。setDiscountApplied(false))を戻す。ローディング解除も忘れずに。api_version を 2026-10 に上げる。まだのものは 2026-07 のままにしておく。