Skip to content

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.

ColumnSetsNotes
Product Id—Present → update, absent → create
Title / ProducttitleRequired for new products
BrandbrandNameRequired for new products; must match a brand you own
CategorycategoryRequired for new products; must already exist
Sub-CategorysubCategoryRequired for new products; must already exist
DescriptiondescriptionRequired for new products; also fills plain_description (HTML stripped)
Plain Descriptionplain_descriptionOptional; overrides the stripped value
Retail PriceretailPriceRequired for new products
Cost PricecostPriceRequired for new products
Wholesale PricewholesalepriceOptional
SEO TagstagsComma-separated string
Show PriceshowPriceTRUE / FALSE
AvailableavailableTRUE / FALSE
IsArchivedisArchivedTRUE / FALSE
Launch Datelaunch_dateDate
RecommendedisRecommendationTRUE / FALSE
Cost Point Valuecost_point_valueLoyalty; points earned on purchase
Redeem Point Valueredeem_point_valueLoyalty; 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.

PatternExample headerBuilds
Attribute N <name>Attribute 1 THCAn attribute named THC with the cell value
Attribute N UOMAttribute 1 UOMUnit suffix for attribute N (e.g. %)
Attribute N IdAttribute 1 IdTarget an existing attribute for update/delete
Assets N UrlAssets 1 UrlImage/asset link (type inferred from the extension)
Assets N Type / Assets N View / Assets N OrderAsset metadata
Assets N IdAssets 1 IdTarget an existing asset for update
Additional Attribute N <name>Additional Attribute 1 UIDAn additional-info field
Additional Attribute N typeAdditional-info type (inferred from a link)
Additional Attribute N IdTarget 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 / FALSE are read as booleans.
  • Slugs. Auto-generated from the title when omitted; a collision gets an add-product-id prefix.
  • 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.

Batch platform, Shopify app and API documentation