# Import and export WMS data by CSV
URL: https://support.starshipit.com/articles/14700000000041-import-and-export-wms-data-by-csv
Canonical: https://support.starshipit.com/articles/14700000000041-import-and-export-wms-data-by-csv
Markdown: https://support.starshipit.com/articles/14700000000041-import-and-export-wms-data-by-csv.md
Updated: 2026-07-20

> For the complete documentation index, see [llms.txt](https://support.starshipit.com/llms.txt).

> Use the current Starshipit WMS CSV templates to import products, locations, purchase orders, adjustments, and stocktakes, or export inventory and reports.

Starshipit WMS uses different CSV rules for different workflows. This reference lists the current column order, limits, processing behaviour, and safest way to correct an import.

Always download a fresh template or export from the page where you will import it. Keep the header row unchanged, save the file as CSV, and test a small file before importing a large change.

Import actions accept `.csv` files. A file renamed from another spreadsheet format is not a valid CSV.

## Choose the correct CSV workflow

| Workflow | Import effect | Processing | Current limit |
|---|---|---|---|
| Products | Creates new SKUs and updates matching SKUs | Background | 5 MB and 15,000 data rows |
| Locations | Creates new names and updates matching names | Background | 5 MB; no separate row limit is shown |
| Purchase orders | Creates new purchase orders only | Background | 5 MB; no separate row limit is shown |
| Manual stock adjustments | Adds valid rows to the adjustment batch for review | In the page | 5 MB; no separate row limit is shown |
| Stocktake | Posts the valid counted quantities | In the page | No separate file or row limit is shown |
| Inventory and stock movements | Export only | In the page | Stock movements: 10,000 rows; inventory has no separate row limit shown |
| Operational reports | Export only | In the page | Some stock reports are limited to 5,000 rows |

:::caution
A stocktake CSV is posted when it is imported. It does not create a reviewable draft. Verify the file before importing it.
:::

## Product CSV

Go to **Products** and select **Export CSV** to download the safest starting file. The export includes instruction rows beginning with `#`; WMS ignores those rows when you import the file.

The canonical header order is:

```text
sku,name,client,supplier,image,price,unitCost,parentProductSku,conversionQuantity,uomLabel,leadTimeDays,stockWarningLevel,idealStockLevel,barcode,length,width,height,weight,colour,size,materials,countryOfOrigin,manufacturerId,brandName,make,model,usage,dangerousGoods,description,hsCodes,trackingType,allocationRule,productType,bundleExplosionMode,bundleComponentSkus,bundleComponentQuantities
```

### Required product values and relationships

| Column | Rule |
|---|---|
| `sku` | Required and unique. A matching SKU updates the existing product; a new SKU creates a product. |
| `name` | Required. |
| `client` | For a 3PL account, enter an existing client name. A blank value removes the product's client assignment. Product import is not available to client-scoped users. |
| `supplier` | Enter one existing, unambiguous supplier name. A blank value removes the supplier assignment. Product import does not create suppliers. |
| `parentProductSku` | The parent can already exist or appear elsewhere in the same file. Parent and child products must belong to the same client. A blank value removes the parent relationship. |
| `conversionQuantity` | Optional. Use a whole number of at least `1`; blank defaults to `1`. |
| `uomLabel` | Optional. Use the unit-of-measure label, for example `EACH`, `CARTON`, or `PALLET`; blank defaults to `EACH`. |
| `trackingType` | Optional. Use `NONE`, `BATCH`, or `SERIAL`; blank defaults to `NONE`. |
| `allocationRule` | Optional. Use `FIFO`, `LIFO`, `SPECIFIC`, `FEFO`, or `LEFO`; blank uses the account default. |
| `productType` | Optional. Use `STANDARD` or `BUNDLE`; blank defaults to `STANDARD`. |
| `bundleExplosionMode` | Optional for bundles. Use `EXPLODE` or `REQUIRE_STOCK`. |
| `bundleComponentSkus` | For bundles, enter component SKUs as a comma-separated list inside one quoted CSV cell. Components can appear in the same file and must belong to the same client as the bundle. |
| `bundleComponentQuantities` | Enter quantities in the same order as `bundleComponentSkus`, also inside one quoted CSV cell. |

Other important formats are:

* `countryOfOrigin` uses a two-letter country code.
* `hsCodes` uses comma-separated `COUNTRY:CODE` values, or `GLOBAL:CODE` for a global code.
* `stockWarningLevel` and `idealStockLevel` cannot be negative. The ideal level cannot be lower than the warning level.
* Prices and dimensions use plain numbers without currency symbols or unit text.

Product imports run in the background in groups of rows. The progress notification shows processed, created, updated, and failed rows. You can minimise it and continue working. If you cancel, rows already processed remain created or updated.

Only one product import can be active for an account at a time. If one is already running, WMS reconnects you to that import instead of starting a second run.

## Location CSV

Go to **Locations** and select **Export CSV**. The exported file includes the current locations and instruction rows beginning with `#`.

The canonical header order is:

```text
name,parentLocationName,barcode,type,zoneCode,zoneName,sequence,minCapacity,maxCapacity,defaultStocktake,allowMixedClientStock,allowedSkus
```

| Column | Rule |
|---|---|
| `name` | Required and unique. A matching name updates the existing location; a new name creates a location. |
| `parentLocationName` | The parent can already exist or appear elsewhere in the same file. Missing parents and circular relationships fail validation. |
| `type` | Use `PICK_FACE`, `BULK_STORAGE`, `STAGING_DOCK`, `PACKING_BENCH`, `EQUIPMENT`, `QUALITY_CONTROL`, `RETURNS_DAMAGED`, `SHIPPING_DOCK`, `CROSS_DOCK`, `QUARANTINE`, `OVERFLOW`, `TOTE`, or `CONTAINER`. |
| `zoneCode` and `zoneName` | Refer to an existing active zone. If both are supplied, they must identify the same zone. The import does not create zones. |
| `sequence` | Use a whole number of `0` or greater. |
| `minCapacity` and `maxCapacity` | Use whole numbers of `0` or greater. Minimum capacity cannot exceed maximum capacity. |
| `defaultStocktake` | Use `true` or `false`. |
| `allowMixedClientStock` | Use `true` to allow products for different 3PL clients in the location, or `false` to prevent mixing clients. |
| `allowedSkus` | Enter existing SKUs separated by semicolons, for example `SKU-1;SKU-2`. |

Location imports run in the background. WMS resolves parent locations before their children, even when the parent is later in the file. The progress notification shows created, updated, and failed rows. If you cancel, locations already processed remain changed.

For updates, start from a fresh export and change only the intended cells. Do not assume that clearing an optional cell removes its existing value.

## Purchase order CSV

Go to **Purchase Orders** and select **CSV Template**. When importing, choose whether WMS should create the purchase orders as **Draft** or **Created**.

The canonical header order is:

```text
poNumber,supplierName,productSku,quantity,price
```

All five values are required on every row.

| Column | Rule |
|---|---|
| `poNumber` | Groups rows into one purchase order. The number must not already exist in WMS. |
| `supplierName` | All rows for one purchase order must use the same supplier. WMS uses an existing case-insensitive name match, or creates the supplier when no match exists. |
| `productSku` | Must match an existing product SKU. Products are not created by this import. |
| `quantity` | Use a positive whole number. |
| `price` | Use a number of `0` or greater, without a currency symbol. |

The purchase-order import is create-only: it never updates an existing purchase order. Each row is a line item, and repeated `poNumber` values are combined into one purchase order. If any line for a purchase order is invalid, that purchase order is skipped; other valid purchase orders in the file can still be created.

The import runs in the background and reports progress by purchase order. If you cancel, purchase orders already created remain in WMS.

:::info
Use **Draft** when the imported purchase orders need review. Use **Created** when they are ready for receiving.
:::

## Manual stock adjustment CSV

Go to **Stock Adjustments** and build an adjustment batch. Select **Export CSV** to export the current batch, then use that file as the import template.

The canonical header order is:

```text
sku,productName,trackingType,quantityChange,reason,locationName,fromLocationName,toLocationName,batchNumber,expiryDate,serialNumber,reference
```

| Column | Rule |
|---|---|
| `sku` | Required. Must match an existing product. |
| `quantityChange` | Required. Use a non-zero whole number. A positive value adds stock; a negative value removes stock. |
| `reason` | Required. Must match a configured adjustment reason. |
| `locationName` | Required. Must match an existing location. This is the location where stock is added or removed. |
| `fromLocationName` | Optional for a positive adjustment when recording where the stock came from. |
| `toLocationName` | Optional for a negative adjustment when recording where the stock is going. |
| `batchNumber` | Required for a batch-tracked product. |
| `expiryDate` | Optional for a batch-tracked product. Use `DD-MM-YYYY`. |
| `serialNumber` | Required for a serial-tracked product. A serial adjustment must be `1` or `-1`. |

WMS validates the file in the page and adds valid rows to the current adjustment batch. Invalid rows are skipped and shown as errors. Importing does not change inventory until you review the batch and select **Submit adjustments**.

Imported rows are added to any rows already in the batch. Clear duplicate drafts before importing, and do not import the same correction twice. When submitting a batch, successful rows are removed and failed rows remain for correction.

## Stocktake CSV

On a product stocktake, select the products and then select **Export CSV**. Keep the identifying columns from that export and enter the physical counts in `countedQuantity`.

The canonical header order is:

```text
sku,name,trackingType,locationName,batchNumber,serialNumber,expiryDate,countedQuantity
```

The file can include instruction rows beginning with `#`; WMS ignores those rows on import.

| Product tracking | How to enter the count |
|---|---|
| Standard | Use one row for the product. `countedQuantity` is the total physically counted. |
| Batch | Use one row for each location and batch number. Keep the exported expiry date in `YYYY-MM-DD` format when applicable. |
| Serial | Use one row for each serial number. Set `countedQuantity` to `1` when the serial exists, or remove the row when it does not. |

`countedQuantity` is required and cannot be negative. Keep location names exactly as exported so WMS can match them. Tracked products require their batch or serial detail.

The import is processed in the page and then posted directly. Rows with unknown SKUs, invalid values, or unmatched locations can appear as warnings. Valid rows can still be posted. If WMS cannot match a location, it can use the configured default stocktake location as a fallback, so investigate every location warning before preparing a correction.

To correct a stocktake, create a new stocktake export from the current inventory and prepare a corrected count. Do not reuse an old file after stock has changed. For a known one-off correction, use a [manual stock adjustment](/articles/14700000000020-stock-integrity-and-adjustments) instead.

**Count as you go** has a separate raw CSV export with these columns:

```text
sku,name,trackingType,locationName,batchNumber,serialNumber,expiryDate,countedQuantity,notes,groupedPreviousQuantity,groupedCountedQuantity,groupedVariance
```

That file is an export of the count session; there is no matching Count as you go CSV import action.

:::info
Starting-stock setup is a separate go-live workflow for seeding opening balances. It is not covered by these routine CSV imports. See [How to set up Starshipit WMS](/articles/14700000000002-how-to-set-up-starshipit-wms).
:::

## Inventory exports

Go to **Inventory** and select **Export inventory**. The export uses the current inventory view and filters. It is a point-in-time snapshot and cannot be imported back into WMS.

The product view exports:

```text
Product SKU,Product Name,Tracking,Quantity On Hand,Quantity Committed,Quantity Allocated,Quantity Available,Quantity Incoming,Avg Unit Cost,Stock Value,UOM
```

The location-detail view exports:

```text
Product SKU,Product Name,Tracking,Location,Location Type,Batch Number,Serial Number,Expiry Date,Quantity On Hand,Unit Cost,On Hand Value,Country of Origin,UOM,Last Updated
```

## Stock movement exports

Go to the stock movement log, apply the required product, location, reason, tracking, date, or search filters, then export the filtered view.

The canonical header order is:

```text
SKU,Product,Reason,Reference,Location,From Location,Batch Number,Serial Number,Expiry Date,Change,Timestamp
```

An export is limited to 10,000 rows. If more rows match, narrow the filters and export again. Stock movement CSVs are audit exports and cannot be imported.

## Operational report exports

Operational reports export the report's current date range and filters. They are read-only snapshots and cannot be imported into WMS.

| Report | Canonical data columns | Export limit |
|---|---|---|
| Fulfilment Reporting | `Date`, `Order Number`, `Reference`, `Completed By`, `Shipping Cost`, `Total Units`, `Total Packages`, `Package Types`, `Items` | No separate row limit shown |
| Packing Bench Reporting | `Completed Date`, `Packing Bench`, `Pack Job`, `Orders`, `References`, `Assigned User ID`, `Duration`, `Order Count`, `Unit Count` | No separate row limit shown |
| PO Receipt Reporting | `Received Date`, `PO Number`, `Supplier`, `Status`, `Lines`, `Items`, `Cartons`, `Received Value`, `Avg Unit Cost` | No separate row limit shown |
| Expiring Stock | `SKU`, `Product`, `Client`, `Location Type`, `Location`, `Batch`, `Serial`, `Expiry Date`, `Days Until Expiry`, `Quantity On Hand` | 5,000 rows |
| Slow-Moving Stock | `SKU`, `Product`, `Client`, `Location Type`, `Location`, `Quantity On Hand`, `First Received Date`, `Last Received Date`, `Last Dispatched Date`, `Last Movement Date`, `Stock Age Days`, `Days Since Last Dispatch`, `Days Since Last Movement` | 5,000 rows |
| Pick Face Replenishment | `SKU`, `Product`, `Client`, `Zone`, `Pick Face`, `Minimum`, `Target`, `Pick Face Quantity`, `Pick Face Allocated`, `Pick Face Available`, `Shortfall To Minimum`, `Suggested Replenishment`, `Bulk Available`, `Fulfillable From Bulk`, `Open Replenishment Jobs`, `Open Replenishment Quantity` | 5,000 rows |
| Replenishment Jobs | `Job ID`, `Job Name`, `Status`, `Priority`, `Assigned User`, `SKU`, `Product`, `Client`, `Destination`, `Zone`, `Replenishment Quantity`, `Allocated Quantity`, `Picked Quantity`, `Source Locations`, `Created At`, `Started At`, `Completed At` | 5,000 rows |

Some report CSVs add summary sections after the data rows. Keep those sections out of any separate system import unless that system explicitly supports them.

Product Traceability currently provides Excel and PDF exports rather than a customer-facing CSV action.

## Fix validation errors and retry safely

Background product, location, and purchase-order imports can finish with a mixture of successful and failed records. A file-level or header validation failure stops the import before row processing starts. Once row processing starts, successful records remain changed even when other records fail.

Open the completed import notification, review the error list, and keep a copy before closing it. The stored message list for these background imports is capped at 50 messages, so fix the repeated cause before retrying.

Use the retry approach for the workflow:

* **Products:** fix failed rows and import them again. Matching SKUs update, so a retry is safe when the corrected file contains only the intended products.
* **Locations:** fix failed rows and import them again. Matching location names update. Use a current export so you do not overwrite another change.
* **Purchase orders:** remove every purchase order that succeeded, then retry only failed `poNumber` groups. Re-importing the full file fails for the purchase orders already created.
* **Manual adjustments:** correct only the drafts that remain after submission. Do not recreate successful adjustments because adjustments are additive.
* **Stocktakes:** start from a new export of current inventory, then import the corrected physical counts. Use a manual adjustment for a small, known correction.

Common errors include a changed or missing header, duplicate identifiers, unknown product SKUs, missing parent records, invalid client relationships, unknown locations or zones, invalid tracked-stock detail, and numbers outside the allowed range.

## Keep CSV files safe in spreadsheets

* Save as **CSV UTF-8**. Do not save as an Excel workbook and rename the extension.
* Keep leading zeroes in SKUs, barcodes, batch numbers, serial numbers, and references by formatting those columns as text before editing.
* Turn off automatic date conversion for identifiers and use the date format required by the template.
* Do not add title rows, merged cells, formulas, totals, hidden headings, or a second header row.
* If a value contains a comma, quote, or line break, let the spreadsheet application quote the CSV cell. Do not split a bundle list into extra columns.
* Treat a text or identifier cell beginning with `=`, `+`, `-`, or `@` as untrusted spreadsheet content. WMS protects text in several exports, but you should still avoid enabling formulas or external links in files from another party. Negative numbers in quantity columns are different and can be valid where the template allows them.
* Reopen the saved CSV in a text editor or import preview and confirm that the header and column count are unchanged.

## Related guides

* [Starshipit WMS products and inventory configuration](/articles/14700000000006-starshipit-wms-products-and-inventory-configuration)
* [Starshipit WMS locations and warehouse setup](/articles/14700000000033-starshipit-wms-locations-and-warehouse-setup)
* [Suppliers and purchase orders](/articles/14700000000007-suppliers-and-purchase-orders)
* [Stocktakes and cycle counts](/articles/14700000000015-stocktakes-and-cycle-counts)
* [Inventory dashboard and stock visibility](/articles/14700000000014-inventory-dashboard-and-stock-visibility)
* [Reporting and insights](/articles/14700000000021-reporting-and-insights)
