Inventory
The Inventory module manages your product catalog — products, variants (SKUs), warehouses, categories, attributes, and distribution channels. It supports multi-warehouse stock, translations, and channel-specific pricing.
Product
Products are items in your catalog. Each product can have multiple variants, belong to categories, and carry attributes.
| Field | Type | Description |
|---|
| id / uuid | ID! | Unique identifiers |
| name | String! | Product name |
| slug | String! | URL-friendly name |
| description | String | Plain text description |
| html_description | String | Rich HTML description |
| is_published | Boolean | Whether the product is live |
| weight | Float | Product weight |
| status | Status | Product status |
| productsTypes | ProductType | Product type classification |
| total_variants | Int | Number of variants |
| variants | [Variant!] | Product variants (paginated) |
| categories | [Category!] | Assigned categories |
| attributes | [Attribute!] | Product attributes |
| warehouses | [Warehouse!] | Warehouses stocking this product |
| files | [Filesystem!] | Images and documents |
| tags | [Tag!] | Tags |
| custom_fields | [CustomField!] | Custom key-value data |
# List products
query {
products(first: 20, orderBy: [{ column: CREATED_AT, order: DESC }]) {
data {
id name slug description is_published
status { name }
total_variants
categories { name }
variants(first: 50) {
data { id name sku is_published warehouses { name warehousePrice { price quantity } } }
}
files { url name }
}
paginatorInfo { total hasMorePages }
}
}
# Create a product
mutation {
createProduct(input: {
name: "Premium Widget"
slug: "premium-widget"
description: "A high-quality widget"
productsTypes: { id: 1 }
}) {
id uuid name slug
}
}
# Duplicate a product
mutation {
duplicateProduct(id: 1) { id name slug }
}
Variant
Variants are specific SKUs of a product — a particular size, color, or configuration. Each variant tracks its own stock per warehouse and pricing per channel.
| Field | Type | Description |
|---|
| id / uuid | ID! | Unique identifiers |
| name | String! | Variant name |
| sku | String | Stock Keeping Unit |
| ean | String | European Article Number |
| barcode | String | Barcode |
| description | String | Variant description |
| is_published | Boolean | Whether the variant is live |
| weight | Float | Variant weight |
| product | Product | Parent product |
| warehouses | [Warehouse!] | Stock locations with price and quantity |
| channels | [VariantChannel!] | Channel-specific pricing |
| attributes | [Attribute!] | Variant attributes |
| files | [Filesystem!] | Variant images |
# Create a variant with stock
mutation {
createVariant(input: {
products_id: 1
name: "Premium Widget - Large / Blue"
sku: "PW-LG-BLU"
description: "Large size, blue"
warehouse: [{ warehouse_id: 1, price: 29.99, quantity: 100 }]
}) {
id uuid name sku
}
}
# Update stock levels
mutation {
updateVariant(id: 1, input: {
warehouse: [{ warehouse_id: 1, price: 34.99, quantity: 75 }]
}) {
id sku warehouses { warehousePrice { price quantity } }
}
}
# Add variant to a sales channel
mutation {
addVariantToChannel(input: {
variants_id: 1
channels_id: 1
price: 34.99
is_published: true
}) {
id channels { name price is_published }
}
}
Warehouse
| Field | Type | Description |
|---|
| id / uuid | ID! | Unique identifiers |
| name | String! | Warehouse name |
| location | String | Physical location |
| is_default | Boolean | Default warehouse |
| is_published | Boolean | Whether it's active |
| total_products | Int | Products stocked |
| regions | Region | Region the warehouse serves |
# Create a warehouse
mutation {
createWarehouse(input: { name: "Main Warehouse", location: "New York, NY", is_default: true, regions_id: 1 }) {
id uuid name
}
}
Category
| Field | Type | Description |
|---|
| id / uuid | ID! | Unique identifiers |
| name | String! | Category name |
| slug | String! | URL-friendly name |
| position | Int | Sort order |
| is_published | Boolean | Whether it's visible |
| total_products | Int | Products in this category |
| children | [Category!] | Subcategories |
Attributes
# Create an attribute (e.g. Color)
mutation {
createAttribute(input: {
name: "Color"
values: [{ value: "Red" }, { value: "Blue" }, { value: "Black" }]
}) {
id name values { id value }
}
}
# Add attribute to a product
mutation {
addAttribute(product_id: 1, attributes_id: 1) {
id name attributes { name values { value } }
}
}