【Shopify GraphQL API徹底解説】在庫とストアのAPI連携を可能にする3つのオブジェクト
この記事の所要時間: 6分
Graph APIは最初から全てを理解することが困難なので、範囲を決めて少しずつ理解していく必要があります。
【Shopify GraphQL API徹底解説】シリーズでは、Shopify GraphQL APIの仕様から、主要なオブジェクトを少しずつ読み解いていきます。
説明は記事内で完結しているので、シリーズの他の記事を参照しなくても理解できるようにしています。
今回解説するのはInventoryItemとLocationとInventoryLevelです。
商品の在庫管理は、ストア運営において、最も煩雑な業務のひとつと言えるでしょう。
返品に対応することや、正確な在庫数を保持することなどが求められます。
特定の業界に限った商慣習なども考慮する必要があります。
在庫管理にまつわるアプリは切実に求められています。
今回の内容を理解すれば、マーチャントに喜ばれるアプリのアイデアが浮かんでくるかもしれません。
まずは、在庫管理で登場する3つのオブジェクトに商品バリエーション(ProductVariation)を含めた関係性を見ていきましょう。
InventoryItemとInventryLevelとLocationの関係性
InventoryItemは商品バリエーション(ProductVariant)の在庫管理に関するメタ情報です。
具体的には、商品バリエーション(ProductVariant)の在庫を識別するコードや、在庫が管理される場所の数などの情報を持っています。
Locationは在庫がストックされる場所に関する情報です。
住所や郵便番号、電話番号などが含まれます。
“場所”を”倉庫”と読み替えても差し支えありません。
InventoryLevelは特定のLocationにストックされた在庫数を表します。
そして、InventoryItemとLocationを結びつける役割を果たしています。
では、それぞれのオブジェクトの詳細を見ていきましょう。
InventoryItem
InventoryItemは特定の商品バリエーション(ProductVariant)の在庫に関するメタ情報です。
IntentoryItemは特定の商品バリエーション(ProductVariant)と1対1でひも付いています。
複数の場所に、どれだけの商品数がストックされているのか、という情報は、InventoryLevelとのConnectionを介して取得できます。
InventoryItemの主要なフィールド
variant | ProductVariant! | 在庫管理される特定の商品バリエーション |
tracked | Boolean! | 在庫管理される商品バリエーション数を追跡するかどうか |
sku | String | 在庫を追跡するための独自コード |
unitCost | MoneyV2 | 商品バリエーションの単価 |
inventoryLevel (locationIdという引数をとる。) | InventoryLevel | locationId(Int)で指定された特定の場所に、どれだけ在庫があるかを表すInventoryLevelを返す。 |
locationsCount | Int! | 在庫が管理される場所の数。inventoryLevelの数と一致する。 |
requireShipping | Boolean! | 在庫管理される商品バリエーションが発送を必要とするかどうか |
requireShippingフィールド
requireShippingフィールドは、在庫管理される商品バリエーションが発送を必要とするかを表しますが、発送が必要ではない商品バリエーションとは何でしょうか?
これは、映画や音楽、動画といったデジタルデータです。
サービスのサブスクリプション契約なども含まれます。
これらの商品バリエーションは、例えば、ファイルをダウンロードするURLを顧客にメール送信すれば済みます。
trackedフィールドとskuフィールド
このInventoryItemのtrackedフィールドをtrueにすると、在庫数の変動が追跡され、データとして保存されます。
在庫数が減るということは、商品バリエーションが顧客に発送されたことになるので、販売数も追跡できます。
在庫数の変動はskuの値を元に追跡されます。
Shopifyにおいて、SKUは、在庫を追跡して販売をレポートするために社内で使用できるコードです。
そのコードが、InventoryItemオブジェクトのskuフィールドで取得できます。
skuはString型なので、マーチャントが独自にフォーマットを定めることができます。
例えば「cookie_chocolate_kanagawa」のように複数の情報をアンダーライン区切りで埋め込むことで、どの味のどの商品がどれだけ売れて、どの倉庫から発送されたか、という情報を追えます。
trackedをtrueにして、マーチャントが定めたフォーマットに基づいてskuフィールドを設定しておくと、過去のデータを販売レポートとして出力できます。
Location
InventoryItemは商品バリエーションの在庫情報ですが、同一の商品バリエーションが複数の場所にバラバラにストックされていることがあります。
会社であれば、自社倉庫に100個、レンタル倉庫に100個、オフィスに10個のストックがあるかもしれません。
在庫が保管・管理される場所を表すのがLocationです。
倉庫と読み替えても問題ありません。
Locationの主要なフィールド
address | LocationAddress! | 住所や郵便番号、電話番号 |
name | String! | 場所の名称 |
isActive | Boolean! | 稼働しているかどうか |
fulfillmentService | FulfillmentService | 発送を行うサービス業者の情報 |
hasUnfulfilledOrders | Boolean! | 未発送の注文があるかどうか |
inventoryLevel (inventoryItemIdを引数に取る) | InventoryLevel | この場所にストックされている商品に関する情報 |
InventoryLevel
InventoryItemが商品バリエーションの在庫情報で、Locationが倉庫でした。
この2つを結びつけるのが、InventoryLevelです。
図を再掲します。
InventoryLevelは、特定の商品バリエーションが、特定の倉庫にどれだけストックされているかを表現します。
InventoryItemは、InventoryLevelConnectionを持っており、複数のInventoryLevelオブジェクトと結ばれています。
InventoryLevelの主要なフィールド
location | Location! | 場所。住所や電話番号といった情報が含まれる。 |
available | Int! | この場所にストックされている商品バリエーションの個数 |
item | InventoryItem! | このInventoryLevelと結びついたInventoryItem |
incoming | Int! | この場所へ配送中の商品バリエーションの数 |
InventoryLevelの役割
InventoryItemは、商品バリエーションの在庫管理に関するメタ情報なので値の更新頻度は多くありません。
Locationは場所なので、さらに少ないでしょう。
一方のInventoryLevelは、在庫数をフィールドとしてもっているので、更新頻度は高いです。
InventoryLevelは、更新の可能性を吸収して、InventoryItemとLocationを扱いやすくしているとも考えられます。
在庫数を更新するときに、InventoryLevelが持つ少数のフィールドにのみ配慮すれば良いというのは、安心です。
最後に
今回は、在庫とストアをAPI連携するための3つのオブジェクトを紹介しました。
この3つのオブジェクトやWebhookなどを活用することで、在庫とストアを連携するアプリを開発できます。
是非、アプリ開発に役立ててください!
【Shopify GraphQL API徹底解説】シリーズでは、今回のように密接に関係するオブジェクトをまとめて紹介していきます。
シリーズを通して、主要なオブジェクトと、その関係性を理解すれば、Shopify GraphQL APIの強力さを体感できるはずです。