Product
A purchasable article tracked in the catalog.
type Product implements Node {
id: ID!
availableStock: Int
description: String
gtin: String
lastSupplierOrderAt: DateTime
manufacturerNumber: String
name: String
openSupplierOrderQuantity: Int!
parentId: ID
physicalStock: Int
price: [Price!]!
productNumber: String!
purchasePrices: [Price!]
reorderPoint: Int
reservedStock: Int
shopifyVariants: JSON!
stockNotAvailableForSale: Int
targetMaximumQuantity: Int
canonicalProduct: Product
children(
first: Int = 10
after: String
filter: ProductFilterInput
): ProductConnection
orderLineItems(
first: Int = 10
after: String
filter: OrderLineItemFilterInput
): OrderLineItemConnection
parent: Product
stockLocationConfigurations(
first: Int = 10
after: String
): ProductStockLocationConfigurationConnection
tags(
first: Int = 10
after: String
filter: TagFilterInput
): TagConnection
warehouseConfigurations(
first: Int = 10
after: String
): ProductWarehouseConfigurationConnection
}
Fields
Product.id ● ID! non-null scalar
Global identifier for this entity.
Product.availableStock ● Int scalar
Stock available for sale — physical stock minus open orders that have not yet been shipped. See physicalStock / reservedStock for the breakdown.
Product.description ● String scalar
Long description.
Product.gtin ● String scalar
Global Trade Item Number (GTIN).
Product.lastSupplierOrderAt ● DateTime scalar
Timestamp of the most recent supplier order containing this product (any state).
Product.manufacturerNumber ● String scalar
Manufacturer's part number (MPN), as printed on the article or in supplier catalogs.
Product.name ● String scalar
Display name.
Product.openSupplierOrderQuantity ● Int! non-null scalar
Units that are on open supplier orders but have not yet been received against any goods receipt. Reflects expected incoming stock.
Product.parentId ● ID scalar
ID of the parent product when this row is a variant.
Product.physicalStock ● Int scalar
Total units actually counted in all warehouses, regardless of allocation. Updated by goods receipts, stockings and stock corrections.
Product.price ● [Price!]! non-null object
Sales price of one unit, one entry per currency the price is maintained in. Tiered prices and customer-group-specific prices are not part of this field.
Product.productNumber ● String! non-null scalar
Public SKU. Unique across the catalog. Used in URLs, exports and POS workflows.
Product.purchasePrices ● [Price!] list object
Cost price of one unit, one entry per currency the price is maintained in. Kept in sync both ways with the default supplier's ProductSupplierConfiguration.purchasePrices while that supplier's currency is the system default currency. For a default supplier in another currency it is only copied from the supplier's price, converted into the system default currency at the exchange rate of that moment, and a price written here is not carried over to the supplier. A price agreed with any other supplier only exists on that configuration row.
Product.reorderPoint ● Int scalar
Stock level at or below which the product is considered to need reordering. Applies across all warehouses; per-warehouse thresholds are configured separately on the product-warehouse configuration.
Product.reservedStock ● Int scalar
Units already promised to open orders or other outbound processes. Subtracted from physicalStock to derive what is still sellable.
Product.shopifyVariants ● JSON! non-null scalar
Shopify product variants the product is synced with, one per connected Shopify store: a list of objects with the keys productId (GID of the Shopify product, e.g. gid://shopify/Product/8123) and variantId (GID of the Shopify product variant, e.g. gid://shopify/ProductVariant/9123, or null when the product is not synced as a variant). Empty for a product that is not synced with Shopify.
Product.stockNotAvailableForSale ● Int scalar
Units excluded from the availability calculation (e.g. stored in warehouses flagged as not selling). Always smaller than or equal to physicalStock.
Product.targetMaximumQuantity ● Int scalar
Target maximum stock quantity used as the replenish-to level for the product, or null when none is set.
Product.canonicalProduct ● Product object
Product.children ● ProductConnection object
Product.children.first ● Int scalar
Product.children.after ● String scalar
Product.children.filter ● ProductFilterInput input
Product.orderLineItems ● OrderLineItemConnection object
Product.orderLineItems.first ● Int scalar
Product.orderLineItems.after ● String scalar
Product.orderLineItems.filter ● OrderLineItemFilterInput input
Product.parent ● Product object
Product.stockLocationConfigurations ● ProductStockLocationConfigurationConnection object
Product.stockLocationConfigurations.first ● Int scalar
Product.stockLocationConfigurations.after ● String scalar
Product.tags ● TagConnection object
Product.tags.first ● Int scalar
Product.tags.after ● String scalar
Product.tags.filter ● TagFilterInput input
Product.warehouseConfigurations ● ProductWarehouseConfigurationConnection object
Product.warehouseConfigurations.first ● Int scalar
Product.warehouseConfigurations.after ● String scalar
Interfaces
Node interface
Any entity that can be loaded by its global id through the node(id: ID!) query.
Returned By
product query ● setProductReorderConfiguration mutation
Member Of
Batch object ● FulfillmentLineItem object ● FulfillmentOrderLineItem object ● GoodsReceiptLineItem object ● OrderLineItem object ● Product object ● ProductEdge object ● ProductSupplierConfiguration object ● ProductWarehouseConfiguration object ● QuoteLineItem object ● Stock object ● StockMovement object ● SupplierOrderLineItem object ● WarehouseStock object
Webhook topics
| Topic | Required scope | Fires when |
|---|---|---|
product/out-of-available-stock | products:read | The available stock of a product — what customers can still buy — drops from positive to zero or below. A product whose warehouses are empty fires product/out-of-stock as well. A product that is restocked and runs out again fires again. |
product/out-of-stock | products:read | The physical stock of a product — the units actually counted in the warehouses — drops from positive to zero. A product that is restocked and runs out again fires again. Stock that is still in the warehouse but no longer sellable is product/out-of-available-stock instead. |
The webhooks guide explains how to subscribe to a topic and verify the notifications it sends.