Import Products
Import new Stock products or update existing product photos from a CSV file.
The Stock CSV importer supports large, observable imports with row validation, duplicate detection, batched inserts, image uploads, retry handling, cancellation, and local recovery after an interrupted run.
Open the importer
- Go to Stock > Products.
- Open Import / Export.
- Select Import CSV.
The same importer is also available at /stock/products/import for direct links and recovery workflows.
Download the template
Select Download sample CSV in the importer. The template includes one hosted-image example and one local-image-folder example.
Only these columns are required:
| Column | Rules |
|---|---|
sku | Required, non-empty, maximum 120 characters, unique within the workspace |
name | Required, non-empty, maximum 255 characters |
Supported optional columns:
| Column | Expected value |
|---|---|
description | Text, maximum 5000 characters |
category | Text, maximum 120 characters |
unit | Text such as unit, maximum 20 characters |
barcode | Text, maximum 120 characters |
tracking | none, lot, or serial |
is_active | true/false, 1/0, yes/no, or active/inactive |
cost_price | Non-negative number |
sale_price | Non-negative number |
msrp | Non-negative number |
tax_rate | Number from 0 through 100 |
image_url | One hosted URL or one local filename |
image_urls | Pipe-separated hosted URLs or a JSON string array |
image_paths | Pipe-separated local filenames from an attached folder |
reference_source | Short source label or URL; URLs are reduced to a domain label |
Example:
sku,name,description,category,unit,is_active,sale_price,image_paths
LAMP-04,Brass desk lamp,Mid-century brass lamp,Lighting,unit,true,65,lamp-04.jpg|lamp-04-detail.jpgChoose an import action
Insert new products
Use this for the initial catalog load.
- New valid SKUs are inserted in batches.
- SKUs that already exist in the workspace are skipped.
- A duplicate SKU repeated inside the same CSV is reported as an error.
- Rows missing SKU or name are skipped.
- A failure in one row does not roll back successful rows from the same import.
- Imported products are not automatically published to the public storefront.
Update existing photos
Use this to attach or refresh local photos without replacing other product data.
- Rows match existing products by SKU.
- SKUs that do not exist are reported as errors.
- Rows without local image references are skipped.
- Uploaded images are merged into the product gallery and the first available image becomes the primary image when needed.
Choose product status
For Insert new products, choose one status policy after the CSV has parsed:
- Active — import every valid row as active; this is the recommended default.
- Inactive — import every valid row as hidden/archived.
- Use CSV values — read
is_activefor every row.
The importer warns when the CSV contains inactive rows but Active is selected, because the selected policy overrides those values.
Import hosted images
- Put a single public URL in
image_url. - Put multiple URLs in
image_urls, separated with|, or provide a JSON array. - You do not need to attach a local folder for hosted URLs.
Import local images
- Put the image filenames in
image_paths, separated with|. - Select or drop the CSV.
- Attach the folder containing those files when the folder picker appears.
- Confirm that the importer finds the referenced filenames.
- Start the import.
The importer indexes attached files by basename and relative path. Missing files and failed uploads appear in the row outcomes. Local images are resized to a maximum dimension of 1600px before upload.
Filenames are the safest join key. Keep them unique inside the selected folder, and use exactly the same spelling and extension in the CSV.
Monitor and recover
The status panel reports these phases:
Checking SKUs -> Uploading -> Validating -> Inserting -> Done
It also shows row outcomes, progress, retries, network health, and errors. You can cancel an active run.
After every completed batch, recovery state is stored locally in the browser. If the tab closes or refreshes:
- Reopen the importer in the same workspace and browser.
- Re-upload the same CSV.
- Choose Resume on next import.
- Already completed SKUs are skipped.
You can discard the saved run if you intend to start over.
After the import
- Review the inserted, skipped, and error totals.
- Filter Stock > Products by active/inactive state.
- Open representative products and verify descriptions, prices, and photos.
- Add opening stock through the appropriate movement workflow.
- If you use the storefront, bulk-publish only the reviewed products and then enable the storefront under Stock > Settings.
Common problems
| Problem | Resolution |
|---|---|
| Missing required column | Rename or add sku and name exactly |
| Existing SKU skipped | Use a new SKU, or choose Update existing photos when only photos should change |
| Image not found | Match the CSV filename to the attached folder, including extension |
| Invalid tracking value | Use none, lot, or serial |
| Product unexpectedly inactive | Review the selected status policy and the row's is_active value |
| Interrupted import | Re-upload the same CSV and resume the saved run |

