Appearance
Bulk Import
The Import and Export actions on the Products page move your catalogue as a single CSV. On import, each row without a Product Id creates a new product; each row with a Product Id updates that product. Use it to stand up a catalogue, or to make row-by-row edits (different prices, attributes or images per product) in a spreadsheet and push them all back at once.
For applying one identical change to a group of products, use Bulk update instead.
What You Can Do With It
Import a new catalogue
Fill the template with one row per product, leaving Product Id blank, and drop the file on Products → Import.
Config: every new row needs Brand, Title, Description, Category, Sub-Category, Retail Price and Cost Price. The category and sub-category must already exist and belong to your brand — the importer does not create them. Attributes are matched by name within that sub-category; a name it doesn't recognise is created as a new text attribute. Repeat the numbered column groups (Attribute 1 …, Assets 1 …) to add more than one attribute or image. A slug is generated from the title if you don't supply one.
Start from the sample file: https://batch-system-public.s3.us-west-1.amazonaws.com/site/product-import.csv
Edit many products from a spreadsheet
Use Products → Export with "keep primary keys" checked. This adds Product Id, Assets N Id, Attribute N Id and Additional Attribute N Id columns. Edit the cells you want to change, delete rows you don't, and re-import.
Config: keep Product Id on every row you want treated as an update — only the columns you change are written, blank cells are left alone. Keep the … Id columns on attributes, assets and additional-info you're editing so they update in place. An attribute row that has an Attribute N Id but a blank value is deleted from the product.
Always export with primary keys before editing
A row whose attribute or asset columns have no … Id is treated as a brand-new attribute or asset and inserted. Re-importing an export taken without "keep primary keys" duplicates every attribute and image on every product.
Check the file before committing
Dropping a file first runs a validation pass. If any row fails you get an Invalid Products table and nothing is imported; fix the file and try again. When every row passes, confirm the prompt to run the real import.
The pre-check is shallow
For existing rows it only confirms the Product Id exists. For new rows it skips category and attribute resolution — so a bad Category on a new product passes validation and then shows up in the per-row errors of the actual import. Rows that succeed are saved even if others fail.
Reference
Common column headers
Headers are case-insensitive and a leading * (used in the template to mark required columns) is ignored. Both the labels below and their raw field names (title, brandName, retailPrice, …) are accepted.
| Column | Sets | Notes |
|---|---|---|
Product Id | — | Present → update, absent → create |
Title / Product | title | Required for new products |
Brand | brandName | Required for new products; must match a brand you own |
Category | category | Required for new products; must already exist |
Sub-Category | subCategory | Required for new products; must already exist |
Description | description | Required for new products; also fills plain_description (HTML stripped) |
Plain Description | plain_description | Optional; overrides the stripped value |
Retail Price | retailPrice | Required for new products |
Cost Price | costPrice | Required for new products |
Wholesale Price | wholesaleprice | Optional |
SEO Tags | tags | Comma-separated string |
Show Price | showPrice | TRUE / FALSE |
Available | available | TRUE / FALSE |
IsArchived | isArchived | TRUE / FALSE |
Launch Date | launch_date | Date |
Recommended | isRecommendation | TRUE / FALSE |
Cost Point Value | cost_point_value | Loyalty; points earned on purchase |
Redeem Point Value | redeem_point_value | Loyalty; points to redeem |
Repeating column groups
Number each group from 1. The importer splits the header on spaces, so the attribute or field name is whatever follows the number.
| Pattern | Example header | Builds |
|---|---|---|
Attribute N <name> | Attribute 1 THC | An attribute named THC with the cell value |
Attribute N UOM | Attribute 1 UOM | Unit suffix for attribute N (e.g. %) |
Attribute N Id | Attribute 1 Id | Target an existing attribute for update/delete |
Assets N Url | Assets 1 Url | Image/asset link (type inferred from the extension) |
Assets N Type / Assets N View / Assets N Order | Asset metadata | |
Assets N Id | Assets 1 Id | Target an existing asset for update |
Additional Attribute N <name> | Additional Attribute 1 UID | An additional-info field |
Additional Attribute N type | Additional-info type (inferred from a link) | |
Additional Attribute N Id | Target an existing additional-info row |
Behaviour
- Per-row, not atomic. Each row commits on its own. A failing row is reported in the response; the rest still import.
- Booleans. Only the literal strings
TRUE/FALSEare read as booleans. - Slugs. Auto-generated from the title when omitted; a collision gets an
add-product-idprefix. - Hub admins. A hub-account export produces hub columns (
Sale Price,Quantity,Room Id, thresholds…). Bulk stock and hub pricing changes belong to Inventory management.
Related pages
- Bulk update — apply one change to a group of products
- Creating a product — the fields, one product at a time
- Categories — categories, sub-categories and attributes must exist before import
- Inventory management — hub stock and pricing