Shopify Catalog Management
Before writing code
Fetch live docs:
- Web-search
site:shopify.dev graphql admin api product for product queries and mutations
- Web-search
site:shopify.dev metafields metaobjects for custom data APIs
- Web-search
site:shopify.dev inventory management api for inventory operations
- Fetch
https://shopify.dev/docs/api/admin-graphql and search for productCreate, metafieldsSet, bulkOperationRunQuery for current input schemas
- Web-search
site:shopify.dev product variant options 2025 for latest variant limits and option changes
Product Model
Hierarchy
Product
├── Title, description, vendor, type, tags
├── Status: ACTIVE, DRAFT, ARCHIVED
├── Options (up to 3): Size, Color, Material
├── Variants (combinations of options)
│ ├── Price, compare-at price
│ ├── SKU, barcode
│ ├── Inventory (per location)
│ └── Weight, dimensions
├── Media (images, video, 3D models)
├── Metafields (custom data)
└── Collections (many-to-many)
Options vs Variants
- Options define the axes of variation (e.g., Size, Color) — max 3 per product
- Variants are specific combinations of option values (e.g., Small/Red, Medium/Blue)
- A product with 3 sizes and 4 colors = 12 variants
- Each variant has its own price, SKU, inventory, and barcode
- Maximum 2,000 variants per product (increased from 100 in 2024 — verify current limit in live docs)
Key Mutations
| Operation |
Mutation |
Notes |
| Create product |
productCreate |
Returns product ID + userErrors |
| Update product |
productUpdate |
Partial updates supported |
| Delete product |
productDelete |
Removes all variants and media |
| Create variant |
productVariantCreate |
Specify options + price + inventory |
| Bulk update variants |
productVariantsBulkUpdate |
Up to 100 variants per call |
| Manage media |
productCreateMedia |
Images, video, 3D models |
| Set metafield |
metafieldsSet |
Works on any resource |
Fetch live docs for exact mutation input types and required fields — these evolve with each quarterly API version.
Minimal Query Pattern
# Pattern: paginated product query with cursor
# Fetch live docs for current available fields
query Products($first: Int!, $after: String) {
products(first: $first, after: $after) {
edges {
node {
id
title
handle
status
variants(first: 10) {
edges { node { id sku price } }
}
}
}
pageInfo { hasNextPage endCursor }
}
}
Collections
Two types:
- Manual collections — merchant adds products individually
- Smart collections — rule-based automatic membership (tags, price, vendor, type, etc.)
Smart collection rules support: tag, title, type, vendor, variant_price, variant_compare_at_price, variant_weight, variant_inventory, variant_title.
Metafields
Typed key-value pairs on any resource:
- Namespace + key = unique identifier (e.g.,
custom.care_instructions)
- Accessible from Liquid:
{{ product.metafields.custom.care_instructions.value }}
- Configurable for Storefront API access via metafield definition
Metafield Types
| Type |
Example Value |
Use Case |
single_line_text |
"Organic cotton" |
Short text |
multi_line_text |
"Line 1\nLine 2" |
Descriptions |
number_integer |
42 |
Counts, quantities |
number_decimal |
3.14 |
Measurements |
boolean |
true |
Flags |
date |
"2025-01-15" |
Dates |
json |
{"key": "value"} |
Structured data |
url |
"https://..." |
Links |
color |
"#FF0000" |
Colors |
file_reference |
GID |
Images, files |
product_reference |
GID |
Related products |
list.single_line_text |
["a", "b"] |
Multi-value |
Fetch live docs for the full list of metafield types — new types are added periodically (e.g., money, rating, dimension).
Metafield Pattern
# Pattern: set metafields on any resource
mutation MetafieldsSet($metafields: [MetafieldsSetInput!]!) {
metafieldsSet(metafields: $metafields) {
metafields { id namespace key value }
userErrors { field message }
}
}
# Fetch live docs for MetafieldsSetInput fields — ownerId, namespace, key, type, value
Metaobjects
Standalone custom content types:
- Define schema with fields and types (similar to metafield types)
- Create entries (instances) via
metaobjectCreate
- Usable in themes via section settings (dynamic sources)
- Queryable via Admin and Storefront APIs
- Use cases: size charts, FAQs, team members, custom lookbooks
Fetch live docs: Web-search site:shopify.dev metaobject definition create for schema creation and entry management.
Inventory
Multi-location inventory tracking:
inventoryAdjustQuantities — adjust stock by delta (+/-)
inventorySetQuantities — set absolute quantity
- Inventory items linked to variants (one-to-one)
- Fulfillment service integration for third-party warehouses
- Reason codes:
received, correction, shrinkage, promotion, etc.
Fetch live docs for InventoryAdjustQuantitiesInput fields — the input shape and available reason codes evolve.
Product Taxonomy
Shopify's standard product taxonomy:
- Structured category hierarchy (e.g., Apparel > Shirts > T-Shirts)
- Used for: tax calculations, product feeds, Shop app categorization
- Set via
productCategory field on products
- Recommended for all products for accurate tax and discoverability
Bulk Operations
For large catalog operations (> 250 items):
Export Pattern
bulkOperationRunQuery — submit a GraphQL query for bulk export
- Poll with
currentBulkOperation query until status is COMPLETED
- Download JSONL result from the
url field
- Each line is a JSON object (parent-child relationships via
__parentId)
Import Pattern
stagedUploadsCreate — get a presigned URL
- Upload JSONL file with product data
bulkOperationRunMutation — process the staged upload
- Poll for completion
Fetch live docs: Web-search site:shopify.dev bulk operations for current input format, JSONL structure, and polling patterns.
Best Practices
- Use GraphQL mutations (not REST) for all catalog operations
- Set metafield types explicitly — untyped metafields are deprecated
- Use bulk operations for imports/exports over 250 items
- Use smart collections for dynamic grouping
- Optimize images before upload — Shopify CDN serves them but original size affects processing
- Use product taxonomy for accurate categorization
- Store custom product data in metafields, not tags (tags are untyped strings)
- Always check
userErrors in mutation responses — 200 status does not mean success
- Use cursor pagination for product listing (not offset-based)
Fetch the Shopify product and metafield API documentation for exact mutation inputs, metafield types, and bulk operation patterns before implementing.
1---2name: shopify-catalog3description: Manage Shopify catalog — Product, Variant, and Option models, collections, metafields and metaobjects, inventory management, product taxonomy, bulk operations, and media. Use when working with Shopify product data.4---56# Shopify Catalog Management78## Before writing code910**Fetch live docs**:111. Web-search `site:shopify.dev graphql admin api product` for product queries and mutations122. Web-search `site:shopify.dev metafields metaobjects` for custom data APIs133. Web-search `site:shopify.dev inventory management api` for inventory operations144. Fetch `https://shopify.dev/docs/api/admin-graphql` and search for `productCreate`, `metafieldsSet`, `bulkOperationRunQuery` for current input schemas155. Web-search `site:shopify.dev product variant options 2025` for latest variant limits and option changes1617## Product Model1819### Hierarchy2021```22Product23├── Title, description, vendor, type, tags24├── Status: ACTIVE, DRAFT, ARCHIVED25├── Options (up to 3): Size, Color, Material26├── Variants (combinations of options)27│ ├── Price, compare-at price28│ ├── SKU, barcode29│ ├── Inventory (per location)30│ └── Weight, dimensions31├── Media (images, video, 3D models)32├── Metafields (custom data)33└── Collections (many-to-many)34```3536### Options vs Variants3738- **Options** define the axes of variation (e.g., Size, Color) — max 3 per product39- **Variants** are specific combinations of option values (e.g., Small/Red, Medium/Blue)40- A product with 3 sizes and 4 colors = 12 variants41- Each variant has its own price, SKU, inventory, and barcode42- Maximum 2,000 variants per product (increased from 100 in 2024 — verify current limit in live docs)4344### Key Mutations4546| Operation | Mutation | Notes |47|-----------|----------|-------|48| Create product | `productCreate` | Returns product ID + userErrors |49| Update product | `productUpdate` | Partial updates supported |50| Delete product | `productDelete` | Removes all variants and media |51| Create variant | `productVariantCreate` | Specify options + price + inventory |52| Bulk update variants | `productVariantsBulkUpdate` | Up to 100 variants per call |53| Manage media | `productCreateMedia` | Images, video, 3D models |54| Set metafield | `metafieldsSet` | Works on any resource |5556> **Fetch live docs** for exact mutation input types and required fields — these evolve with each quarterly API version.5758### Minimal Query Pattern5960```graphql61# Pattern: paginated product query with cursor62# Fetch live docs for current available fields63query Products($first: Int!, $after: String) {64 products(first: $first, after: $after) {65 edges {66 node {67 id68 title69 handle70 status71 variants(first: 10) {72 edges { node { id sku price } }73 }74 }75 }76 pageInfo { hasNextPage endCursor }77 }78}79```8081## Collections8283Two types:84- **Manual collections** — merchant adds products individually85- **Smart collections** — rule-based automatic membership (tags, price, vendor, type, etc.)8687Smart collection rules support: `tag`, `title`, `type`, `vendor`, `variant_price`, `variant_compare_at_price`, `variant_weight`, `variant_inventory`, `variant_title`.8889## Metafields9091Typed key-value pairs on any resource:92- Namespace + key = unique identifier (e.g., `custom.care_instructions`)93- Accessible from Liquid: `{{ product.metafields.custom.care_instructions.value }}`94- Configurable for Storefront API access via metafield definition9596### Metafield Types9798| Type | Example Value | Use Case |99|------|--------------|----------|100| `single_line_text` | `"Organic cotton"` | Short text |101| `multi_line_text` | `"Line 1\nLine 2"` | Descriptions |102| `number_integer` | `42` | Counts, quantities |103| `number_decimal` | `3.14` | Measurements |104| `boolean` | `true` | Flags |105| `date` | `"2025-01-15"` | Dates |106| `json` | `{"key": "value"}` | Structured data |107| `url` | `"https://..."` | Links |108| `color` | `"#FF0000"` | Colors |109| `file_reference` | GID | Images, files |110| `product_reference` | GID | Related products |111| `list.single_line_text` | `["a", "b"]` | Multi-value |112113> **Fetch live docs** for the full list of metafield types — new types are added periodically (e.g., `money`, `rating`, `dimension`).114115### Metafield Pattern116117```graphql118# Pattern: set metafields on any resource119mutation MetafieldsSet($metafields: [MetafieldsSetInput!]!) {120 metafieldsSet(metafields: $metafields) {121 metafields { id namespace key value }122 userErrors { field message }123 }124}125# Fetch live docs for MetafieldsSetInput fields — ownerId, namespace, key, type, value126```127128## Metaobjects129130Standalone custom content types:131- Define schema with fields and types (similar to metafield types)132- Create entries (instances) via `metaobjectCreate`133- Usable in themes via section settings (dynamic sources)134- Queryable via Admin and Storefront APIs135- Use cases: size charts, FAQs, team members, custom lookbooks136137> **Fetch live docs**: Web-search `site:shopify.dev metaobject definition create` for schema creation and entry management.138139## Inventory140141Multi-location inventory tracking:142- `inventoryAdjustQuantities` — adjust stock by delta (+/-)143- `inventorySetQuantities` — set absolute quantity144- Inventory items linked to variants (one-to-one)145- Fulfillment service integration for third-party warehouses146- Reason codes: `received`, `correction`, `shrinkage`, `promotion`, etc.147148> **Fetch live docs** for `InventoryAdjustQuantitiesInput` fields — the input shape and available reason codes evolve.149150## Product Taxonomy151152Shopify's standard product taxonomy:153- Structured category hierarchy (e.g., Apparel > Shirts > T-Shirts)154- Used for: tax calculations, product feeds, Shop app categorization155- Set via `productCategory` field on products156- Recommended for all products for accurate tax and discoverability157158## Bulk Operations159160For large catalog operations (> 250 items):161162### Export Pattern1631641. `bulkOperationRunQuery` — submit a GraphQL query for bulk export1652. Poll with `currentBulkOperation` query until status is `COMPLETED`1663. Download JSONL result from the `url` field1674. Each line is a JSON object (parent-child relationships via `__parentId`)168169### Import Pattern1701711. `stagedUploadsCreate` — get a presigned URL1722. Upload JSONL file with product data1733. `bulkOperationRunMutation` — process the staged upload1744. Poll for completion175176> **Fetch live docs**: Web-search `site:shopify.dev bulk operations` for current input format, JSONL structure, and polling patterns.177178## Best Practices179180- Use GraphQL mutations (not REST) for all catalog operations181- Set metafield types explicitly — untyped metafields are deprecated182- Use bulk operations for imports/exports over 250 items183- Use smart collections for dynamic grouping184- Optimize images before upload — Shopify CDN serves them but original size affects processing185- Use product taxonomy for accurate categorization186- Store custom product data in metafields, not tags (tags are untyped strings)187- Always check `userErrors` in mutation responses — 200 status does not mean success188- Use cursor pagination for product listing (not offset-based)189190Fetch the Shopify product and metafield API documentation for exact mutation inputs, metafield types, and bulk operation patterns before implementing.