BusinessCopilot Docs

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:

ColumnRequired?What it means
nameRequiredThe 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:

ColumnWhen it is requiredWhat to do
skuOnly if auto-generated SKUs are turned off in Settings → ProductsType a unique SKU for each product. Otherwise leave it blank and the app generates one.
Product imageOnly if require product image is on in Settings → ProductsAn 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.

ColumnOptional?What to enter
skuOptionalLeave 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.
barcodeOptionalLeave blank to auto-generate.
categoryOptionalThe category name, e.g. Antibiotics. Matched by name; a category that doesn't exist yet is created automatically.
unitOptionalThe unit name, e.g. Piece, Carton, Kg. Matched by name; created automatically if new.
cost_priceOptionalMoney — see How to write money.
selling_priceOptionalMoney. If you fill it in, this exact price is used instead of the app's automatic margin pricing.
reorder_levelOptionalA whole number, e.g. 10.
brandOptionalThe brand name.
descriptionOptionalFree text.
product_typeOptionalsimple, 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_activeOptional1 (or yes, true) for active. 0 or blank for inactive.
max_stockOptionalA whole number, e.g. 500.
target_marginOptionalA percentage: 30 or 30% both mean 30%.
track_batchesOptional1 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 writeIt means
500500
₦500500
₦1,200.501200.50
NGN 30003000
$3030

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

  1. Go to Products → Import Products, or select Import CSV on the Products page.
  2. Select Download Template. You get a CSV file with the correct header row.
  3. Open it in Excel or Google Sheets and add one row per product. Give every row a name.
  4. Save the file as CSV UTF-8 (or CSV (Comma delimited)). Both work. See Saving from Excel below.
  5. Select Choose CSV file and pick your file.
  6. Select Check file. Wait a moment while every row is read. Nothing is created yet.
  7. 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.
  8. 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 seeWhy it happensWhat to do
The first row must contain a column named nameThe header is missing, misspelled, or the file starts with a different rowMake the first row the header row, and spell the column name.
The file is emptyNo rows were foundDownload the template again and add your products under its header.
Import is blocked for this workspaceYour workspace requires a product imageTurn off require product image in Settings → Products, or add these products one at a time.
sku is requiredAuto-generated SKUs are turned offType a unique SKU for that row.
… is not a numberText, currency code, or a dot-comma mix in a number columnWrite 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 allowedUse simple, variable, service, or assembly, or leave it blank.
reorder_level or max_stock … whole numberA decimal in a whole-number columnRemove the decimal part.
Duplicate SKU (skipped)A product with that SKU already existsNothing is wrong. Change the SKU if this is a different product.
Columns will be ignoredThe header isn't one the importer usesCheck the spelling against the template, or ignore it.

On this page