Import Products
Bulk create or update ShipOS products by uploading a CSV file.
CSV Columns
| Column | Description | Required |
|---|---|---|
| id | Product ID (for updating existing products) | No |
| team | Team name (for 3PL creating products for merchants) | No |
| sku | Product SKU; use a distinct value for reliable channel matching | No |
| name | Product name | Yes |
| description | Product description | No |
| barcode | Product barcode | No |
| image_url | URL to product image | No |
| cost_price | Cost price | No |
| weight | Weight for shipping calculations | No |
| weight_unit | Weight unit (uses team default if not specified) | No |
| length | Length dimension | No |
| width | Width dimension | No |
| height | Height dimension | No |
| measurement_unit | Dimension unit (uses team default if not specified) | No |
| hs_code | Harmonized System code for customs | No |
| country_of_origin | Country of manufacture | No |
| customs_description | Description for customs declarations | No |
| customs_value | Declared customs value | No |
| minimum_level | Minimum stock level for replenishment | No |
| maximum_level | Maximum stock level for replenishment | No |
| increment_level | Stock level increment for replenishment | No |
Note: Column headers must be lowercase (e.g.,
skunotSKU).
Conflict Protection
Export current records as your starting template. When an export includes _lock (Do not modify), keep its value and the existing row's id unchanged while editing other fields.
- Unchanged rows and edits already matching the saved record are skipped.
- If both the CSV and saved record changed since export, a conflicting edit is rejected. Export the latest data, review the other changes, and reapply your edit.
- A locked row without its original ID is rejected.
- For a new record, leave both the ID and lock empty.
- Omitting a lock on an existing record removes conflict protection; it does not force an otherwise invalid edit to succeed.
Adding New Entries
To add new products, add rows with both the id and _lock (Do not modify) columns left empty. The system creates new product records. Existing products with matching IDs are updated.
Bulk delete is not supported. To remove products, delete them individually through the UI or API.
Example CSV
id,team,sku,name,description,barcode,image_url,cost_price,weight,weight_unit,length,width,height,measurement_unit,hs_code,country_of_origin,customs_description,customs_value
,,SKU-001,Widget A,A small widget,123456789,,9.99,250,,,,,,,,,
,,SKU-002,Widget B,,,,19.99,500,,10,8,5,CM,8471.30,US,Electronic component,15.00
abc123,My Team,SKU-003,Widget C,Updated description,,,,300,G,12,10,6,CM,,,,Export Template
- Navigate to ShipOS → Products (opens the Cybership dashboard in a new tab)
- Click Export to download CSV template (see Export Products)
Import CSV
- Navigate to ShipOS → Products (opens the Cybership dashboard in a new tab)
- Click Import
- Upload your CSV file
- Confirm import
- Import processes asynchronously via background job queue
- Monitor job progress in real-time
- Review completion status and any errors (includes line numbers for debugging)
Wait for the job to finish and inspect created, updated, skipped, and failed rows. A row-based import can partly succeed. Correct failed rows before retrying; do not assume the whole file was rolled back or that repeating new rows is harmless.
Existing products are matched by id, not SKU. Leave the ID empty only when creating a new product.
If you want to update inventory quantities, use the Inventory Upload feature instead.