ekPOS
User Guide
User Guide / Import and export

Import products from a spreadsheet

Import / Export → Import/Update Products adds many products at once, or updates existing ones, from a CSV file. You can prepare the file in Excel or Google Sheets.

Import products
Import / Export → Import/Update Products

How matching works

Each row is matched on SKU:

  • A SKU that already exists updates that product.
  • A new SKU creates a product.

A variant row (one with a Parent SKU) is matched on the variant's own SKU in the same way.

Step by step

  1. Click Download template to get a CSV with every column and example rows: a single product, then a variable product with two variants. To update your existing products instead, click Export CSV to download them all.

  2. Fill in one row per product, and one row per variant under a variable product (see below). In Excel, save with File → Save As → CSV UTF-8 (Comma delimited). Only .csv (or .txt) files are accepted, up to 10 MB. Large files are fine: the preview checks 5,000 rows in a few seconds, and the import is sent in batches of 250 rows with a running count, so it never runs into the server's time limit. If a batch fails, the message says how many rows were already saved; importing the file again matches those by SKU instead of duplicating them.

  3. Back on the page, choose the file and click Upload & Preview.

  4. Check the preview. Every row is marked Valid or Invalid with the reason, for example Alert Quantity must be a number. Invalid rows are unticked and will be skipped; untick any valid row you also want to skip.

    A row is invalid when a price, Alert Quantity, weight or dimension is negative, when it names a tax that does not exist, when its barcode already belongs to another product or variant, or when its SKU or barcode already appeared on an earlier row of the same file. Only the repeat is refused; the first row is kept. Variant rows have their own checks, listed under Variable products.

  5. Click Import (n).

Preview with one invalid row
Preview

The result shows how many products were Added, Updated and Skipped. Click Import another file to start again.

Import result
Import complete

Nothing is saved until you click Import. Fix invalid rows in your file and upload it again, or import the valid rows now and the rest later.

Columns

Column Required Notes
SKU Yes The match key. Stored in capitals. On a variant row, the variant's own SKU.
Name Yes Optional on a variant row: it defaults to the attribute values, such as Black / L.
Type single, variable or combo, or variant on a variant row. Blank = single, or variant when the row has a Parent SKU. Combo components are not imported; set them up on the product.
Parent SKU Variant rows only. See Variable products.
Attributes Variant rows only. See Variable products.
Category Matched by name. A subcategory name puts the product in that subcategory. Created if it doesn't exist.
Brand Matched by name; created if it doesn't exist.
Unit Matched by name; created if it doesn't exist.
Barcode Blank on a new product = the SKU; a new variant without one has none. Blank on an update keeps the current barcode. Must not belong to another product or variant.
Cost Price, Selling Price Numbers.
Purchase Taxes, Selling Taxes Tax names exactly as on Tax Settings, separated by | — for example VAT 14% | Table Tax. Capitals don't matter. None removes every tax. Blank on an update keeps the current taxes; blank on a new product means none. A rate unticked for products (an invoice-level tax such as withholding) is refused, unless the product already has it.
Purchase Tax Type, Selling Tax Type inclusive or exclusive. Blank = exclusive.
Manage Stock Yes / No. Blank = Yes. Always No for combos.
Alert Quantity The low-stock level.
Has Serial, Not For Selling, Is Service, Active Yes / No. Active blank = Yes.
Weight, Weight Unit A number, and kg or lb (blank on a new product = kg). Files exported before Weight Unit existed head the column Weight (kg); that is still read.
Length, Width, Height, Dimension Unit Numbers, and cm or in (blank on a new product = cm).
Description
Custom: label One column for each active product custom field. A number field takes a number, a date field a date written YYYY-MM-DD, and a dropdown or radio field one of its options. A checkbox field takes any of its options separated by commas. A required field must be filled in for a new product.

Taxes are matched by name because two rates can share a percentage, and a product can carry several. That is why every tax rate's name is unique.

WarningAn update overwrites most columns. A blank cell on an update row clears that field — a blank Category, Brand or Unit is removed, and a blank price becomes 0. To change a few prices, start from Export CSV so every column is filled in, edit the prices, and import the whole file back.

These columns are the exception: Barcode, Purchase Taxes, Selling Taxes, Weight, Weight Unit, Length, Width, Height, Dimension Unit and the custom fields keep the product's value when left blank. A file made before these columns existed therefore changes none of them.

Images and attachments are not part of the file; manage them on the product.

Variable products

A variable product takes one row of its own, with Type variable, and then one row per variant. A variant row has:

  • SKU — the variant's own SKU. It must not belong to a product or to another product's variant.
  • Parent SKU — the variable product's SKU. The product can be an existing one, or a row in the same file.
  • Attributes — what makes the variant different, as Name: Value pairs separated by |: for example Color: Black | Size: L. Each attribute name may appear once.

A variant row uses only Name, Barcode, Cost Price, Selling Price, Purchase Taxes, Selling Taxes, the two tax types and Active. Category, brand, stock settings and the rest come from the product's own row, and are ignored on a variant row.

SKU Name Type Parent SKU Attributes Selling Price
POLO Polo Shirt variable
POLO-BLK-L variant POLO Color: Black | Size: L 249
POLO-BLK-XL variant POLO Color: Black | Size: XL 259

A variant row is refused when:

  • its Parent SKU names no product, or a product that is not variable;
  • its Attributes are missing or not written as Name: Value pairs;
  • the product already has a variant with the same attributes under another SKU, or the same variant appears twice in the file.

Importing a variable product never deletes its variants: a variant left out of the file stays as it is. To remove one, edit the product. Export CSV lists each variant under its product, so exporting, editing and importing the file back updates the variants in place.

Opening stock for imported products

Imported products and variants start with no stock. Add it with Import opening stock, a purchase, or the product's Opening Stock action.

Who can do this

Importing needs Data → Import; Export CSV needs Data → Export.

© 2026 ekPOS