Shopifyの商品・在庫連携では、商品、バリエーション、在庫ロケーション、メタフィールドを一つの「商品データ」として扱うと、更新通知を受けるたびにカタログ全体を取り直す設計になりがちです。しかし、通知の受信、対象の特定、最新状態の取得、外部システムへの反映、整合性の確認は別の処理です。一つのジョブにまとめないことが、停止しにくい連携の出発点になります。
Shopifyの公式ドキュメントでは、GraphQL Admin APIはクエリコストによるレート制限があり、単一クエリは1,000ポイントを超えられないとされています。大量の読み取りにはBulk Operationsを使うよう案内されています。商品数やバリエーション数が増えたからといって、通常のページネーション取得を並列化して解決しようとする前に、取得目的を分けてください。仕様確認日:2026年9月25日。
分ける対象は、少なくとも次の4種類です。
ここでいう「差分」は、Webhookペイロードだけで変更フィールドを完全に特定することではありません。通知をきっかけに、処理すべき対象をキューへ記録し、必要な最小単位で再読込することです。Shopify Developer CommunityやStack Overflowには、商品更新通知だけでは変更項目を絞れず、全商品または全バリエーションとの比較に至るという個別の相談があります。これらは発生率を示す資料ではありませんが、通知内容への過度な依存を避ける設計上の確認材料にはなります。
実装より先に、データ項目ごとの正本を決めます。「Shopifyが正本」「PIMが正本」とシステム単位で一括りにすると、例外が増えたときに競合を説明できません。SKU、商品ID、バリエーションID、在庫ロケーションIDを混同しないことも重要です。
設計台帳には、少なくとも以下を記録します。
| 項目群 | 正本の候補 | Shopifyへの方向 | 外部への方向 | 競合時の扱い |
|---|---|---|---|---|
| 商品名・説明・メディア | PIMまたはShopify | 一方向または承認付き | 一方向 | 正本以外の更新を検知して保留 |
| 公開状態・販売チャネル | Shopifyまたは運用管理システム | 項目ごとに定義 | 項目ごとに定義 | 公開変更を在庫更新で上書きしない |
| SKU | PIM・基幹など | 明示的に定義 | 明示的に定義 | 重複時は自動マージしない |
| 価格 | 価格管理システムまたはShopify | 明示的に定義 | 明示的に定義 | 商品情報更新と別の反映単位にする |
| 在庫数量 | WMS・基幹・Shopifyのいずれか | ロケーション単位で定義 | ロケーション単位で定義 | 合算値だけで照合しない |
| メタフィールド | 用途別に定義 | 名前空間・キー単位で定義 | 同左 | 所有者と更新権限を台帳化 |
商品IDとバリエーションIDはShopify内の対象を示すために使い、SKUは業務上の商品照合に使われることがあります。ただし、SKUを一意な結合キーとして利用できるかは、組織内の採番・重複許容・変更ルール次第です。連携設計で勝手に同一視せず、「どのキーでどのシステムと突合するか」を台帳に記載してください。
在庫は特に、商品またはSKUだけで完結させないほうが安全です。同じ販売対象でも、ロケーションごとに管理・引当・出荷の判断が分かれる場合があります。照合単位を決める際は、少なくともバリエーションとロケーションの組み合わせを扱う必要があるかを、WMS・基幹側の在庫定義と照らして確認します。
「どちらが最新か」をタイムスタンプだけで決める前に、項目ごとの更新権限を決めてください。時刻が新しい更新でも、正本でないシステムの更新なら自動反映しない、というルールを明文化すると競合処理を実装できます。
WebhookのHTTPリクエスト内で外部API呼び出しや重いデータ取得まで完了させる設計は、配信失敗と重複処理の原因を切り分けにくくします。受信処理の役割は、検証、記録、キュー投入までに絞ります。
ShopifyはWebhookについて、ネットワークタイムアウトや再試行により重複到達する可能性があるため、冪等な処理を行い、必要に応じてX-Shopify-Webhook-Idで重複を検出するよう案内しています。また、配信失敗時は4時間以内に最大8回再試行され、失敗が継続すると購読が削除されます。仕様確認日:2026年9月25日。したがって「Webhookを受信した」という記録だけで、同期完了とは判断できません。
キューまたは受信ログには、後から再処理と説明ができる項目を残します。
X-Shopify-Webhook-Idワーカー側では、同じWebhook IDを再度処理しないようにします。ただし、同一対象に別のWebhook IDが短時間に到着することはあり得ます。その場合にイベント順だけで外部データを上書きすると、古い読み取り結果が新しい状態を戻すおそれがあります。
対策は、対象ID単位で処理をまとめることです。たとえば商品ID単位のキューに集約し、一定時間内の複数通知を1件の「再取得要求」として扱います。反映時には、取得したShopifyデータの更新時刻や取得基準時刻、外部側が最後に反映したバージョンを比較します。どの比較値を採用するかは、正本と項目別の競合ルールに合わせて決めます。
重要なのは、Webhookを「変更後の完全な正解」とみなさないことです。Webhookは再取得や照合を開始する根拠であり、外部側へ反映した結果まで追跡して初めて同期記録になります。
GraphQL Admin APIのproductsクエリはページネーションをサポートし、商品、バリエーション、価格、在庫、メディア、メタデータなどを取得できます。通常処理で一度にどこまでネストして取得するかは、クエリコストと必要な反映単位を見ながら決めます。実際のコストとスロットル状態はAPI応答で確認できます。仕様確認日:2026年9月25日。
Webhookを受信した後は、対象の商品またはバリエーションをIDで再取得し、連携先に必要なフィールドだけを取得します。ここで全商品の一覧取得へ戻らないことがポイントです。
ただし、通知の対象IDだけで反映範囲が確定しないことがあります。たとえば商品共通の情報変更が複数バリエーションの出力データに影響するなら、商品単位で再構成します。逆に、在庫の反映先がバリエーションとロケーションで分かれるなら、その粒度でキューと出力を設計します。必要な再取得単位は、Webhookの種類ではなく、連携先へ渡すデータモデルから逆算してください。
Bulk Operationsは、大量データの読み取りに使う手段です。通常の差分キューの代替として常時実行するのではなく、次の用途を明確に分けます。
再同期ジョブには、開始時刻、対象範囲、クエリ定義、出力の取得完了時刻、反映完了時刻を残します。Bulk Operationsの出力を取り込み中に新しいWebhookが到着するため、単に「Bulkの結果で上書き」してはいけません。
実装では、再同期開始時刻を基準時刻として記録し、開始後に受信したイベントを別途キューに保持します。Bulkの基準データを反映した後、その基準時刻以後のイベントを対象IDごとに再取得・反映します。この順序により、再同期の途中で起きた更新を古いスナップショットで戻すリスクを下げられます。
連携障害の調査では、最終成功時刻だけでは足りません。「何を、いつの状態として取得し、どの結果を外部システムへ反映し、どの範囲をまだ照合していないか」を追える必要があります。そこで、設計書と運用ログで共有する同期設計台帳を用意します。
| 区分 | 記録する内容 | 確認に使う場面 |
|---|---|---|
| 同期対象 | 商品ID、バリエーションID、SKU、ロケーションID、メタフィールドの名前空間・キー | 影響範囲の特定 |
| 契機 | Webhook ID、トピック、受信時刻、または再同期ジョブID | 重複・未処理の調査 |
| 取得 | 取得開始・完了時刻、クエリ種別、API応答のコスト・スロットル情報 | 遅延と取得負荷の確認 |
| 基準時刻 | Bulk開始時刻、差分再生の対象期間 | 再同期中の競合回避 |
| 反映 | 連携先のレコードID、反映結果、失敗理由、再試行回数 | 反映漏れの復旧 |
| 照合 | 照合日時、照合件数、不一致件数、不一致の分類、解消日時 | 鮮度と整合性の説明 |
監視項目も、APIエラー数だけにしません。運用担当者が判断に使えるよう、少なくとも次を可視化します。
数値のしきい値は、商品の更新許容時間、在庫をどの業務判断に使うか、外部システムの受付時間によって異なります。たとえば在庫を出荷可否に使う場合と、BIの集計に使う場合では、同じ遅延でも対応優先度は変わります。固定値を一般論で置くのではなく、用途別の許容遅延と、超過時の連絡先・復旧手順を台帳に結び付けてください。
差分設計は、平常時に更新できるだけでは不十分です。重複配信、取得失敗、外部反映失敗、再同期中の新規更新を含めて検証します。テスト用ストアや検証可能なデータ範囲を使い、本番のカタログへ影響しない形で実施してください。
Shopify Eventsには、商品・バリエーション・メタフィールドの特定フィールドをトリガーにし、取得フィールドをカスタムクエリへ含められる機能があります。公式ドキュメント上、この機能は開発者プレビューとして扱われています。仕様確認日:2026年9月25日。
そのため、フィールド単位のトリガーが要件に合う場合でも、従来Webhookと同じ可用性・対象範囲・運用手順を前提に即時移行するのは避けるべきです。対象トピック、プレビュー機能を利用できる条件、未対応の更新をどう再同期で補うか、既存キューとの二重処理をどう防ぐかを検証します。対応外のデータ種別や障害復旧のために、WebhookとBulk Operationsを含む再同期経路は残しておく判断が必要です。
既存連携を置き換える場合、いきなり全件処理を止めると、旧処理が担っていた暗黙の補正まで失う可能性があります。次の順序なら、差分処理と照合の差を確認しながら移行できます。
この設計の目的は、全件取得を完全に禁止することではありません。全件に近い取得が必要な初回移行、障害復旧、定期照合にはBulk Operationsを使い、通常更新をその代替にしないことです。Webhook、対象単位の再取得、再同期、照合を別々に記録すれば、商品表示・在庫・出荷判断に使うデータがどの時点まで整合しているかを、運用と開発の両方で確認しやすくなります。
記事では答えきれない個別の状況にもお応えします。