BigCommerce Catalog Management
Before writing code
Fetch live docs:
- Fetch
https://developer.bigcommerce.com/docs/rest-catalog for Catalog API reference
- Web-search
site:developer.bigcommerce.com catalog products variants options for product data model
- Web-search
bigcommerce product options vs modifiers for variant architecture
Product Data Model
Product Hierarchy
Product
├── Options (define variant axes — e.g., Color, Size)
│ └── Option Values (Red, Blue, Small, Large)
├── Variants (specific combinations — Red/Small, Blue/Large)
│ ├── SKU, Price, Weight, Image
│ └── Inventory per variant
├── Modifiers (non-variant options — e.g., Engraving Text)
│ └── Modifier Values
├── Images (gallery images)
├── Videos
├── Custom Fields (key-value pairs shown on product page)
├── Metafields (hidden structured data for integrations)
└── Reviews
Products
Core fields:
name, type, sku, description
price, sale_price, retail_price, cost_price
weight, width, height, depth
is_visible, availability, condition
categories — array of category IDs
brand_id — associated brand
Product types: physical, digital
Options vs Modifiers
| Feature |
Options |
Modifiers |
| Creates variants |
Yes |
No |
| Affects SKU |
Yes |
No |
| Affects inventory |
Yes |
No |
| Example |
Color, Size |
Gift wrapping, Engraving text |
| API path |
/products/{id}/options |
/products/{id}/modifiers |
Variants
Each unique combination of option values creates a variant:
- Own
sku, price, weight, image_url
- Own
inventory_level and inventory_warning_level
- Identified by
id and array of option_values
- Up to 600 variants per product (3 options × ~200 values)
Categories
Hierarchy
Categories are tree-structured:
parent_id — 0 for top-level, otherwise parent category ID
sort_order — display order
is_visible — visibility on storefront
- Can nest multiple levels deep
Category Assignment
Products belong to one or more categories:
- Set via
categories array on product
- A product can be in multiple categories
- Channel assignments can further control visibility per storefront
Brands
Simple flat taxonomy:
name, page_title, meta_keywords, meta_description
image_url — brand logo
- Assigned to products via
brand_id
Metafields
What They Are
Key-value data storage for products, categories, brands, customers, and orders:
- Not visible on the storefront by default (unlike custom fields)
- Used for integration data (external IDs, sync timestamps, etc.)
- Namespaced:
app_id + namespace + key = unique
- Permissions:
app_only, read, write, read_and_sf_access
API
POST /v3/catalog/products/{id}/metafields
- Fields:
key, value, namespace, permission_set, description
- Use
read_and_sf_access permission to expose in GraphQL Storefront API
Images
Product Images
POST /v3/catalog/products/{id}/images — upload or reference by URL
- Fields:
image_url or image_file, is_thumbnail, sort_order, description
- Multiple images per product (gallery)
- One designated as thumbnail
Variant Images
Each variant can have its own image via image_url field on the variant.
Custom Fields
Visible key-value pairs displayed on the product page:
name — field label
value — field value
- Displayed in the "Additional Information" section
- Managed via
/v3/catalog/products/{id}/custom-fields
Bulk Operations
Batch Create/Update Products
POST /v3/catalog/products
[
{ "name": "Product 1", "type": "physical", "price": 29.99, ... },
{ "name": "Product 2", "type": "physical", "price": 39.99, ... }
]
Batch Update
PUT /v3/catalog/products
[
{ "id": 123, "price": 34.99 },
{ "id": 456, "price": 44.99 }
]
Batch Delete
DELETE /v3/catalog/products?id:in=123,456,789
Querying Products
Filtering
id:in=1,2,3 — by IDs
name:like=Widget — name search
sku=ABC-123 — exact SKU match
categories:in=10,20 — by category
brand_id=5 — by brand
price:min=10&price:max=100 — price range
availability=available — availability filter
is_visible=true — visibility filter
include=images,variants,custom_fields — include sub-resources
Pagination
?page=1&limit=50 — default 50, max 250 per page.
Best Practices
- Use options for variant-defining attributes (color, size) and modifiers for everything else
- Use metafields for integration data — don't pollute custom fields
- Use
include=images,variants to fetch sub-resources in one request
- Use batch endpoints for bulk imports/updates
- Respect rate limits — batch operations count as one request per batch
- Use webhooks (
store/product/updated, store/product/inventory/updated) for real-time sync
- Set appropriate
permission_set on metafields based on who needs access
Fetch the BigCommerce Catalog API reference for exact endpoint paths, request schemas, and filter options before implementing.
1---2name: bc-catalog3description: Work with BigCommerce catalog — products, variants, options, modifiers, categories, brands, metafields, images, and bulk operations. Use when managing product data programmatically or building catalog integrations.4---5
6# BigCommerce Catalog Management
7
8## Before writing code
9
10**Fetch live docs**:
111. Fetch `https://developer.bigcommerce.com/docs/rest-catalog` for Catalog API reference
122. Web-search `site:developer.bigcommerce.com catalog products variants options` for product data model
133. Web-search `bigcommerce product options vs modifiers` for variant architecture
14
15## Product Data Model
16
17### Product Hierarchy
18
19```
20Product
21├── Options (define variant axes — e.g., Color, Size)
22│ └── Option Values (Red, Blue, Small, Large)
23├── Variants (specific combinations — Red/Small, Blue/Large)
24│ ├── SKU, Price, Weight, Image
25│ └── Inventory per variant
26├── Modifiers (non-variant options — e.g., Engraving Text)
27│ └── Modifier Values
28├── Images (gallery images)
29├── Videos
30├── Custom Fields (key-value pairs shown on product page)
31├── Metafields (hidden structured data for integrations)
32└── Reviews
33```
34
35### Products
36
37Core fields:
38- `name`, `type`, `sku`, `description`
39- `price`, `sale_price`, `retail_price`, `cost_price`
40- `weight`, `width`, `height`, `depth`
41- `is_visible`, `availability`, `condition`
42- `categories` — array of category IDs
43- `brand_id` — associated brand
44
45Product types: `physical`, `digital`
46
47### Options vs Modifiers
48
49| Feature | Options | Modifiers |
50|---------|---------|-----------|
51| Creates variants | Yes | No |
52| Affects SKU | Yes | No |
53| Affects inventory | Yes | No |
54| Example | Color, Size | Gift wrapping, Engraving text |
55| API path | `/products/{id}/options` | `/products/{id}/modifiers` |
56
57### Variants
58
59Each unique combination of option values creates a variant:
60- Own `sku`, `price`, `weight`, `image_url`
61- Own `inventory_level` and `inventory_warning_level`
62- Identified by `id` and array of `option_values`
63- Up to 600 variants per product (3 options × ~200 values)
64
65## Categories
66
67### Hierarchy
68
69Categories are tree-structured:
70- `parent_id` — 0 for top-level, otherwise parent category ID
71- `sort_order` — display order
72- `is_visible` — visibility on storefront
73- Can nest multiple levels deep
74
75### Category Assignment
76
77Products belong to one or more categories:
78- Set via `categories` array on product
79- A product can be in multiple categories
80- Channel assignments can further control visibility per storefront
81
82## Brands
83
84Simple flat taxonomy:
85- `name`, `page_title`, `meta_keywords`, `meta_description`
86- `image_url` — brand logo
87- Assigned to products via `brand_id`
88
89## Metafields
90
91### What They Are
92
93Key-value data storage for products, categories, brands, customers, and orders:
94- **Not visible** on the storefront by default (unlike custom fields)
95- Used for integration data (external IDs, sync timestamps, etc.)
96- Namespaced: `app_id` + `namespace` + `key` = unique
97- Permissions: `app_only`, `read`, `write`, `read_and_sf_access`
98
99### API
100
101- `POST /v3/catalog/products/{id}/metafields`
102- Fields: `key`, `value`, `namespace`, `permission_set`, `description`
103- Use `read_and_sf_access` permission to expose in GraphQL Storefront API
104
105## Images
106
107### Product Images
108
109- `POST /v3/catalog/products/{id}/images` — upload or reference by URL
110- Fields: `image_url` or `image_file`, `is_thumbnail`, `sort_order`, `description`
111- Multiple images per product (gallery)
112- One designated as thumbnail
113
114### Variant Images
115
116Each variant can have its own image via `image_url` field on the variant.
117
118## Custom Fields
119
120Visible key-value pairs displayed on the product page:
121- `name` — field label
122- `value` — field value
123- Displayed in the "Additional Information" section
124- Managed via `/v3/catalog/products/{id}/custom-fields`
125
126## Bulk Operations
127
128### Batch Create/Update Products
129
130```
131POST /v3/catalog/products
132[
133 { "name": "Product 1", "type": "physical", "price": 29.99, ... },
134 { "name": "Product 2", "type": "physical", "price": 39.99, ... }
135]
136```
137
138### Batch Update
139
140```
141PUT /v3/catalog/products
142[
143 { "id": 123, "price": 34.99 },
144 { "id": 456, "price": 44.99 }
145]
146```
147
148### Batch Delete
149
150`DELETE /v3/catalog/products?id:in=123,456,789`
151
152## Querying Products
153
154### Filtering
155
156- `id:in=1,2,3` — by IDs
157- `name:like=Widget` — name search
158- `sku=ABC-123` — exact SKU match
159- `categories:in=10,20` — by category
160- `brand_id=5` — by brand
161- `price:min=10&price:max=100` — price range
162- `availability=available` — availability filter
163- `is_visible=true` — visibility filter
164- `include=images,variants,custom_fields` — include sub-resources
165
166### Pagination
167
168`?page=1&limit=50` — default 50, max 250 per page.
169
170## Best Practices
171
172- Use options for variant-defining attributes (color, size) and modifiers for everything else
173- Use metafields for integration data — don't pollute custom fields
174- Use `include=images,variants` to fetch sub-resources in one request
175- Use batch endpoints for bulk imports/updates
176- Respect rate limits — batch operations count as one request per batch
177- Use webhooks (`store/product/updated`, `store/product/inventory/updated`) for real-time sync
178- Set appropriate `permission_set` on metafields based on who needs access
179
180Fetch the BigCommerce Catalog API reference for exact endpoint paths, request schemas, and filter options before implementing.