この記事でわかること
この記事の目次Contents閉じる開く
「カートに入れておいたのに、決済しようとしたら売り切れになった」というクレームは、Shopifyストアではバグではありません。仕様です。
Shopifyヘルプセンターの「Understanding inventory states」には在庫ステートが5つ定義されています。On hand、Available、Committed、Unavailable、Incoming。この5つの中に、「カートに入っている」という状態は存在しません。
では在庫はいつ確保されるのか。Shopifyのエンジニアリングブログが2026年5月12日に公開した記事に、はっきり書かれています。確保が始まるのは決済処理が始まったときで、そのホールドは数分程度です。
この記事では、Shopifyが在庫をいつ・どれだけの時間確保するのかを一次情報で確認したうえで、売り越しを防ぐためにShopify標準でできること、アプリが必要になる境界線、そして実在する購入制限アプリと在庫同期アプリを整理します。調査日は2026年9月1日です。
先に結論
在庫が1点しかない商品を扱っていて、複数の顧客が同時に買いにくるなら、カートに入れた順ではなく決済した順に売れます。これは設定で変えられません。カート保持機能を謳うアプリを探しても、Shopify側に「カート段階で在庫を押さえる」仕組みがないため、根本的には解決しません。
限定販売やセールで一時的に注文が集中するなら、Shopify公式が案内している標準の手段が先にあります。在庫を日次上限に設定する、カートに入れるボタンを外す、配送ゾーンから配送料を削除する。いずれもアプリなしで実行できます。
1人あたりの購入数を制限したいなら、購入制限アプリが有効です。ただし選ぶ基準は「テーマのJavaScriptで止めるのか、Shopify Functionsで止めるのか」です。前者はチェックアウトで破られます。
複数チャネルや外部倉庫と在庫がずれて売り越しているなら、これは在庫確保の話ではなく在庫同期の話です。syncX: Stock Sync & Inventory のような同期アプリの領域になります。
Shopifyの在庫ステートに「カート」はない
ヘルプセンターの在庫ステート定義表を、そのまま整理します。
| ステート | 定義 |
|---|---|
| On hand | ロケーションにある全在庫。Committed + Unavailable + Available の合計 |
| Available | 販売可能な在庫。Committed でも Unavailable でもなく、Incoming も含まない |
| Committed | 取り置かれて販売できない数量。未発送の注文、下書き注文で予約されたもの、出荷準備完了の移動 |
| Unavailable | アプリが取り置いた、または破損・品質管理・安全在庫などの理由で確保されたもの |
| Incoming | 移動・発注書・アプリによって入庫予定の在庫。受領されるまで販売できない |
Committed の定義を読むと、何が「取り置き」として認められているかがわかります。未発送の注文、下書き注文での予約、出荷準備完了の移動。この3つです。カートは入っていません。
つまり、100人が最後の1点をカートに入れても、Availableは1のままです。管理画面のどこにも「99人がカートに入れている」という情報は現れません。
唯一、注文が成立する前に在庫を押さえられる標準機能が下書き注文です。ヘルプセンターは、下書き注文で在庫を予約するとその数量がCommittedになると明記しています。電話やメールでの受注、B2Bの見積対応で在庫を確保したい場合、標準機能で成立するのはこの経路だけです。
確保が始まるのは「決済が始まった瞬間」
ここから先は、ヘルプセンターではなくShopifyのエンジニアリングブログが情報源になります。2026年5月12日公開の「We replaced Redis with MySQL for inventory reservations—and it scaled」という記事です。
冒頭にこう書かれています。「購入者がチェックアウトで『購入を完了する』をクリックしたとき、購入しようとしている商品がまだ在庫にあることを保証する必要がある」。そして、この保証を担っている仕組みを oversell protection(売り越し防止) と呼び、その動作を2つの操作として説明しています。
- Reserve: 決済が開始されたとき、商品を予約済みとしてマークする。数分程度の短いホールド
- Claim: 決済が成功したとき、在庫元帳から数量を恒久的に減算する
読み替えると、こうなります。
商品ページを見ているとき、在庫は確保されていません。カートに入れたときも、確保されていません。チェックアウト画面を開いて住所を入力しているあいだも、確保されていません。確保が始まるのは、決済に進んで処理が走り出した瞬間です。そしてその確保も数分で切れます。
同記事は技術的な内容も公開しており、実務上おさえておく価値がある数字がいくつかあります。予約は1商品×1ロケーションの組み合わせごとに最大1,000行のプールで管理されており、フラッシュセールなどでプールが枯渇した場合は、その場で補充処理が走ります。この補充が走っているあいだ、同じ商品への他の予約処理は待機します。記事は「その予約のレイテンシは増えるが、正しさは保たれる。実際に在庫がある購入者が追い返されることはない」と説明しています。
背景として、2025年のブラックフライデーにShopify上のマーチャントがピーク時に毎分510万ドルを記録したことにも触れられています。この規模で「二人が同じ最後の1点を買えてしまう」ことを防ぐために、決済処理中の短時間ホールドという設計が選ばれている、という文脈です。
この設計から導かれること
売り越しを防ぐ責任は、カートより手前にあります。決済処理中のホールドはShopifyが面倒を見てくれますが、そこに至るまでの数十分から数日は、誰も在庫を押さえていません。
したがって、対策の方向は2つしかありません。ひとつは、そもそも過剰にカートへ入らないようにすること。もうひとつは、売り越しが起きたときに事故にせず在庫が戻ってくる運用にすることです。
Shopify標準でできること
Shopifyヘルプセンターの「Managing increased sales」ページは、注文が集中したときの対処法を4つ挙げています。すべてアプリなしで実行できます。
在庫を日次上限に設定する。 1日にさばける数量を毎朝設定し直す方法です。あわせて「Continue selling when out of stock(在庫切れでも販売を続ける)」のチェックを外す必要があります。ヘルプセンターは一括編集での外し方まで手順を示しています。商品数が多い場合はCSVで一括更新できますが、ここでも例の50件の壁が現れます。50商品までならブラウザにダウンロード、51商品以上はメール送信です。
在庫を0にする。 受注上限に達したら在庫を全部0にする、という荒い方法です。ヘルプセンターはここに警告を添えています。在庫切れ商品を非表示にするテーマ設定・コレクション条件・アプリが入っている状態で在庫を0にすると、サイト上から商品が1つも見えなくなります。 元に戻すためのCSVを先にコピーしておくことも手順として書かれています。
カートに入れるボタンを外す。 Shopifyがサポートするテーマなら手順が用意されています。サードパーティ製テーマの場合は開発者に問い合わせるよう案内されています。
配送ゾーンから配送料を削除する。 配送料を選べなければ注文は成立しない、という仕組みを使う方法です。ただしヘルプセンターは、一部のアプリや販売チャネルが特定の配送設定を必要とするため、料金を削除するとその接続が壊れないか事前に確認するよう注意しています。
そして5つ目として、ヘルプセンターはカート上限アプリの導入を挙げ、App Storeの検索結果へ直接リンクしています。標準機能で完結しない領域があることを、Shopify自身が認めている箇所です。
購入制限アプリ
選定基準は「どこで止めるか」
購入数量の制限を謳うアプリは多数ありますが、実装は大きく2つに分かれます。テーマのJavaScriptでカートページの操作を制御するタイプと、Shopify FunctionsのCart and Checkout Validation APIを使ってチェックアウト側で検証するタイプです。
Shopify.devのCart and Checkout Validation Function APIのページは、この点をはっきり書いています。「カートとチェックアウトの検証は、顧客が購入へ進む前に注文が特定の条件を満たしているかを確認する。これにはShop Pay、PayPal、Google Pay、Apple Payといったエクスプレスチェックアウトも含まれる」。そして「カートとチェックアウトをサーバーサイドで検証するには、Cart and Checkout Validation Function APIしか使えない」とも明記されています。
つまり、商品ページから直接チェックアウトへ飛ぶ決済導線でも制限を効かせたいなら、この方式のアプリを選ぶ以外にありません。テーマのJavaScriptで止めるタイプは、この導線で素通りします。
同ページにはもうひとつ、運用上おさえておくべき上限があります。1ストアで有効化できる検証機能は最大25個です。実際にRuffRuff 注文制限のように、Basic・Grow・Advancedの各プラン向けに料金を分けているアプリが存在することからも、Plus限定の仕組みではないことがうかがえます。
RuffRuff 注文制限|あらゆる購入制限をアプリ1つで!(Tsun Inc.)
Built for Shopifyバッジ付き、評価5.0、レビュー20件、日本語対応。掲載ページには「Cart and Checkout Validation APIで堅牢な購入制限を実現」と明記されており、テーマを書き換えないためアンインストール後のコード残留が起きない設計だと説明されています。
個数制限のほか、金額制限、重量制限、同梱制限、顧客制限(顧客タグやメタフィールドによるVIP限定販売など)、決済制限、閲覧制限、配送制限に対応するとされています。個数制限では最小・最大に加えて「3の倍数のみ購入可能」といった倍数指定や数量ピッカーの制御も可能です。
料金体系が独特で、Shopifyのプランに合わせた3段階になっています。Basicプラン向けが月9.90 USD、Growプラン向けが月13.90 USD、Advancedプラン向けが月19.90 USD。いずれも年額契約で17%引きになります。無料体験は3日間、1ストア1回までです。機能内容は3プランとも同一で、商品数もルール作成数も無制限とされています。
Madgic Order Limits Quantity(Madgic)
Built for Shopifyバッジ付き、評価4.9、レビュー156件(星5が148件)、公開は2024年8月9日。開発元はベトナム・ハノイ拠点で、掲載ページには**「このアプリは日本語に翻訳されていません」**と表示され、あわせて「この開発者は日本語での直接的なサポートを提供していません」と明記されています。
商品・バリエーション・コレクション・タグ・カート単位で最小注文数量や最大数量を設定できます。この記事のテーマとの関係で目を引く機能がひとつあり、在庫が少ない場合に最大数量を自動調整するというものです。残1点の商品に対して「1人1点まで」を自動で適用する、といった使い方が想定されます。
料金は2段階です。無料プランはルール数に制限があるものの、購入制限のターゲット指定はすべて使え、全ページでの購入ブロックとメッセージのカスタマイズが含まれます。スタンダードプランは月4.99 USD(年額49.99 USDで17%引き)でルール数が無制限になり、7日間の無料体験が付きます。
レビューには2026年7月8日、8月11日、8月26日といった直近のものが並び、いずれもサポート担当者名を挙げた対応の速さへの言及が中心です。ただし英語でのやりとりが前提になります。
そのほかの選択肢
同じカテゴリーには、Avada 注文制限(評価5.0、レビュー268件)、Melon Minimum Order Quantity(評価5.0、レビュー358件)、OC Quantity Breaks Order Limit(評価4.9、レビュー436件)、Minmaxify Order Limits(評価4.9、レビュー159件)などが並びます。レビュー数の規模で選ぶならこの層ですが、日本語UIと日本語サポートの有無は個別に確認が必要です。
在庫同期アプリ
売り越しの原因がShopify内部ではなく、外部の在庫マスタや他チャネルとのずれにある場合、購入制限アプリでは解決しません。
syncX: Stock Sync & Inventory(SyncX)
Built for Shopifyバッジ付き、評価4.7、レビュー813件。対応言語は英語、日本語、中国語と記載されています。
WooCommerce、BigCommerce、Square、CSV/XLSXからの商品インポート、Google Sheets・FTPフィード・Dropbox・API・カスタムURLからの在庫自動同期に対応し、複数ストアやチャネル間の在庫をリアルタイムに同期して売り越しを防ぐと説明されています。在庫切れ商品をコレクション下部へ移動する並び替え機能もあります。
料金は無料プランを含む段階制です。無料プランは商品数上限2,000点、更新フィード1件、手動更新のみという構成で、重複SKUの同期と在庫低下アラートが含まれます。スターターは月7 USDで商品数500〜2,500点、フィード1〜5件、スケジュール更新は1日1回(最短24時間間隔)。エキスパートは月10 USDで商品数5,000〜50,000点、フィード1〜30件、1日12回(最短2時間間隔)のスケジュール更新に対応します。追加フィードや追加商品数はオプション課金です。
レビュー内訳は星5が729件、星1が36件です。件数が多いため傾向として読めますが、初期設定の難しさに触れつつサポート対応を評価するレビューが直近にも確認できます。
無料プランが「手動更新のみ」である点は、この記事の文脈では重要です。自動同期されないなら、売り越しの防止には使えません。検証用と割り切るべき枠です。
よくある誤解
「カートに入れた分は取り置かれている」 — されていません。在庫ステートにその状態が存在しません。
「カウントダウンタイマーを出せば在庫が確保される」 — 確保されません。カート内に残り時間を表示するタイプの演出は、購入を急がせるUIであって、Shopify側の在庫予約とは無関係です。表示が0になっても在庫は動きませんし、表示が残っていても他の人が先に決済すれば売り切れます。
「Plusにすれば在庫を長く確保できる」 — Shopifyのエンジニアリングブログが説明しているのはプラットフォーム全体の売り越し防止機構で、プラン別の差は記載されていません。確保時間を延ばす設定は公開情報上、確認できません。
「下書き注文なら在庫を押さえられる」 — これは正しいです。下書き注文で予約した数量はCommittedになります。ただし2025年4月1日以降に作成された下書き注文は、1年間操作がないと自動削除されます。編集すればタイマーはリセットされます。
導入前チェックリスト
- 売り越しの原因が「同時アクセス」なのか「他チャネルとの在庫ずれ」なのかを切り分けたか
- 「Continue selling when out of stock」の設定を、意図した商品だけに絞れているか
- 購入制限アプリを検討するとき、Cart and Checkout Validation APIを使っているかを確認したか
- Shop PayやApple Payなど、商品ページから直接チェックアウトへ飛ぶ導線でも制限が効くかテストしたか
- すでに有効な検証機能が25個の上限に近づいていないか
- 在庫を0にする運用を採る場合、在庫切れ商品を隠す設定やアプリが同時に動いていないか
- 日本語サポートが必要かどうかを、日本語UIの有無と分けて判断したか
- アンインストール時にテーマへコードが残る実装かどうかを確認したか
まとめ
Shopifyの在庫確保について、2026年9月1日時点で確認できたことは4点です。
第一に、Shopifyの在庫ステートは5種類あり、そこに「カートに入っている」という状態は存在しません。取り置きとして認められるのは未発送の注文、下書き注文での予約、出荷準備完了の移動だけです。
第二に、在庫の確保が始まるのは決済処理が開始された瞬間で、ホールドは数分程度です。これはShopifyのエンジニアリングブログが2026年5月12日に公開した記事に、Reserve と Claim という2つの操作として明記されています。
第三に、注文集中への対処としてShopifyが公式に案内しているのは、在庫の日次上限設定、在庫0、カートに入れるボタンの非表示、配送料の削除、そしてカート上限アプリの5つです。標準機能で完結しない領域があることをShopify自身が認めています。
第四に、購入制限アプリの実効性は実装方式で決まります。サーバーサイドでカートとチェックアウトを検証できるのはCart and Checkout Validation Function APIだけで、エクスプレスチェックアウトも対象に含まれます。有効化できる上限は1ストアあたり25個です。
次にやることは、直近で売り越しが起きた注文を1件開いて、原因が同時決済なのか在庫データのずれなのかを確認することです。前者なら購入制限、後者なら在庫同期。ここを取り違えると、月額を払っても症状は消えません。
料金と仕様は変更される可能性があります。本記事は2026年9月1日時点のShopifyヘルプセンター、Shopifyエンジニアリングブログ、Shopify.dev、Shopify App Storeの記載に基づいています。導入前に最新情報をご確認ください。
Shopifyの管理画面側の住所検証は、全プランで常時有効、無料で、米国に対応している。チェックアウト時の検証もトグル1つで有効にできる。そのうえで公式ドキュメントは、サードパーティの住所検証アプリを同時に使うと提案が競合してチェックアウトのコンバージョンを下げうるため、どちらか一方にせよと明記している。ここでカテゴリの見え方が変わる。アプリは配送可能性の判定を二重化するためのものではなく、Shopifyの検証がやらない「私書箱の拒否」「部屋番号の必須化」といったポリシー強制のためのものだ。2026-09-02時点で米国App Storeの実在アプリ4本を確認した。月額4.99ドルの定額、1注文あたり0.04ドル、そしてShopifyの請求とは別に契約が必要なものまで幅がある。