Importing products from a CSV file
Add many products at once from a spreadsheet — which columns are required, how prices can be written, and how to check your file before anything is created.
If you're setting up your catalog for the first time, or adding a large batch of products, import them from a spreadsheet instead of creating each one by hand.
The import works in two steps. First you check the file, which reads every row and tells you what would happen, without creating anything. Then you import the rows that are ready. Rows with a problem are left out, and each one is listed with its row number so you can fix it.
Before you start: what must be in the file
Only one column must be filled in for every row:
| Column | Required? | What it means |
|---|---|---|
name | Required | The product name, e.g. Rice 5kg. Every row needs one. |
The header row must contain a column called name. Without it the file cannot be imported at all.
Two columns become required in certain workspaces, because of a setting your business controls:
| Column | When it is required | What to do |
|---|---|---|
sku | Only if auto-generated SKUs are turned off in Settings → Products | Type a unique SKU for each product. Otherwise leave it blank and the app generates one. |
| Product image | Only if require product image is on in Settings → Products | An import cannot add images. Turn that setting off first, or add these products one at a time with their images. While the setting is on, the check reports that the import is blocked and nothing is created. |
The columns
Every other column is optional. Leave it blank and the app uses a sensible default.
| Column | Optional? | What to enter |
|---|---|---|
sku | Optional | Leave blank to auto-generate. A SKU that already exists in your workspace is skipped (not overwritten), and so is a repeat of a SKU earlier in the same file. |
barcode | Optional | Leave blank to auto-generate. |
category | Optional | The category name, e.g. Antibiotics. Matched by name; a category that doesn't exist yet is created automatically. |
unit | Optional | The unit name, e.g. Piece, Carton, Kg. Matched by name; created automatically if new. |
cost_price | Optional | Money — see How to write money. |
selling_price | Optional | Money. If you fill it in, this exact price is used instead of the app's automatic margin pricing. |
reorder_level | Optional | A whole number, e.g. 10. |
brand | Optional | The brand name. |
description | Optional | Free text. |
product_type | Optional | simple, variable, service, or assembly. Leave blank for simple. Variations and components for variable or assembly products are set up afterward on the product's own page. |
is_active | Optional | 1 (or yes, true) for active. 0 or blank for inactive. |
max_stock | Optional | A whole number, e.g. 500. |
target_margin | Optional | A percentage: 30 or 30% both mean 30%. |
track_batches | Optional | 1 to turn on batch and lot tracking, so you can later set Lot Number and Expiry Date for this product through Setting your opening stock. |
Column order does not matter. Only the header names do, and they are not case-sensitive. Cost Price, cost-price, and cost_price all mean the same column.
Any column the importer doesn't use is ignored, and the check tells you which ones.
How to write money
Prices (cost_price, selling_price) accept any of these forms:
| You can write | It means |
|---|---|
500 | 500 |
₦500 | 500 |
₦1,200.50 | 1200.50 |
NGN 3000 | 3000 |
$30 | 30 |
Thousands commas and spaces are fine. Do not write prices with a dot for thousands and a comma for decimals, such as 1.200,50. The check refuses those and tells you to use a dot for decimals, so the price can't be read wrongly. Negative prices are refused too.
Whole-number columns (reorder_level, max_stock) must not have decimals. 10 is right; 10.5 is refused.
Step by step
- Go to Products → Import Products, or select Import CSV on the Products page.
- Select Download Template. You get a CSV file with the correct header row.
- Open it in Excel or Google Sheets and add one row per product. Give every row a
name. - Save the file as CSV UTF-8 (or CSV (Comma delimited)). Both work. See Saving from Excel below.
- Select Choose CSV file and pick your file.
- Select Check file. Wait a moment while every row is read. Nothing is created yet.
- Read the result:
- Ready to import — rows that will be created.
- Duplicate SKU (skipped) — rows whose SKU already exists, which are left alone.
- Need fixing — rows with a problem. Each one is listed with its row number and the reason, for example
Row 4: cost_price: "1.200,50" is not a number. - Any column that will be ignored.
- If some rows need fixing, you can import the ready ones now and leave the others out, or fix the file and check again. Once the check passes, select Import N rows.
The import runs in the background, so you can keep working. When it finishes you see how many products were created, skipped, and failed.
Saving from Excel
- Windows Excel: choose File → Save As, then pick CSV UTF-8 (Comma delimited) or CSV (Comma delimited). Both work.
- Google Sheets: File → Download → Comma-separated values (.csv).
- Empty rows at the bottom of the sheet are ignored.
- Do not save as Excel Workbook (
.xlsx). The importer reads CSV files only.
Common problems and fixes
| What you see | Why it happens | What to do |
|---|---|---|
| The first row must contain a column named name | The header is missing, misspelled, or the file starts with a different row | Make the first row the header row, and spell the column name. |
| The file is empty | No rows were found | Download the template again and add your products under its header. |
| Import is blocked for this workspace | Your workspace requires a product image | Turn off require product image in Settings → Products, or add these products one at a time. |
sku is required | Auto-generated SKUs are turned off | Type a unique SKU for that row. |
… is not a number | Text, currency code, or a dot-comma mix in a number column | Write the number in one of the forms shown in How to write money. |
product_type must be one of … | A value other than the four allowed | Use simple, variable, service, or assembly, or leave it blank. |
reorder_level or max_stock … whole number | A decimal in a whole-number column | Remove the decimal part. |
| Duplicate SKU (skipped) | A product with that SKU already exists | Nothing is wrong. Change the SKU if this is a different product. |
| Columns will be ignored | The header isn't one the importer uses | Check the spelling against the template, or ignore it. |