arrow_backBack to Products & Catalog

Products & Catalog

Import products from a CSV

Add new products and update prices, stock and details in bulk from a CSV exported from your till, accounting or stock system. You see exactly what will change before anything is saved.

schedule7 min read

The importer reads a CSV file and creates or updates your physical products in one go. It's built for the file you export from your till or stock system every month: run the same file again and it updates what's there instead of making duplicates.

Before you start

  • A CSV file with a header row. If your file is in Excel, save it as CSV first. Comma, semicolon, tab and pipe-separated files all work.
  • A column that identifies each product: your system's product ID, a SKU or a barcode. Without one, the importer won't run.
  • Physical products switched on. The importer only handles physical products, not services, events or tours.

Not sure how to lay out your file? On the import page, click Download an example for a sample with every column the importer understands.

A file laid out like the example starts with this header row:

Item Code,Product Name,Long Description,Category,SKU,Barcode,Price,RRP,Cost Price,Quantity,Track Stock,Brand,Tags,Status,Image URL

Import your file

  1. Click Catalogue → Products in the sidebar, then Import.
  2. Click Choose a file and pick your CSV.
  3. On Match your columns, check which of your columns feeds each ShopEazy field. The importer guesses from your headers. Change any guess using the dropdown beside the field, or choose Don't import to leave a field alone.
  4. Click Check what will change. Nothing has been saved yet.
  5. Read the summary: New products, Updated, Already correct and Problems. Any skipped rows are listed with the reason.
  6. If it looks right, click Import (the button shows how many products it will touch). To fix the mapping first, click Change the mapping.
  7. When it says Import finished, click See your products.
New products from a file arrive hidden unless your Status column says they're active, so you can check them first. When you're ready, open Products and click Show all in the banner at the top to put them on your shop.

Save your mapping for next time

On Match your columns, type a name in Name this mapping and click Save for next time. Next time you upload a file with exactly the same headers, ShopEazy picks that mapping automatically. You can also click a saved mapping by name under Saved mappings.

The fields you can fill

  • Your system's product ID: the best thing to match on, because it never changes when a name or price does.
  • SKU and Barcode: also used to match.
  • Product name: required for anything new.
  • Description
  • Selling price: what the customer pays, including VAT. Required for anything new.
  • Was price: shown struck through beside the price.
  • Cost price: what you pay. Never shown to customers.
  • Quantity on hand
  • Track stock
  • Brand or supplier
  • Category: see below.
  • Tags: several tags can be separated by commas, semicolons or pipes.
  • Status
  • Image link: a public web address starting with http or https. Files on your computer can't be reached.

How updates and new products work

For every row, ShopEazy looks for an existing product in this order: your product ID first, then SKU, then barcode. Matching ignores capitals, so ABC-1 and abc-1 are the same.

  • Found a match: the product is updated with whatever the row says. If nothing is different, it counts as Already correct.
  • No match: a new product is created, as long as the row has a name and a price.
  • No product ID, SKU or barcode in the row: the row is skipped, so a re-import can't duplicate it.

A few rules keep the importer from undoing your own work:

  • Empty cells change nothing. A file with no description column won't wipe the descriptions you wrote.
  • Tags and categories are added, never removed. The file can't take away a tag or category you added yourself.
  • Images are only added to products with no images yet. Your arranged gallery stays as it is.
  • Quantity replaces the stock figure. If a row says 12, that product's stock becomes 12.

The importer doesn't handle variants. SKUs and stock on individual versions aren't matched or updated, so manage those in the product editor.

Categories

Put the category name in your Category column. Any category that doesn't exist yet is created for you, and the check step tells you which ones will be made.

  • One level of nesting: write Food > Dairy to file the product under Dairy inside Food. A deeper path like Food > Dairy > Cheese keeps the first and last parts only (Food and Cheese).
  • Several categories: separate them with a comma or a pipe, for example Dairy | Specials.

How values are read

Prices. Currency symbols and spaces are ignored, so R 1 299,00 works. When a price has both a comma and a full stop, whichever comes last is the decimal. When it has only one of them, it counts as a thousands separator if exactly three digits follow it. So 1,200 is twelve hundred, 24,99 is R24.99, and 12.500 is twelve thousand five hundred, not R12.50. A negative price or text like "POA" is reported as a problem and that row is skipped.

Quantities. Whole numbers only. 12 units is read as 12, and decimals are dropped. A negative quantity becomes 0.

Yes/no columns (like Track stock). Yes: true, yes, y, 1, on, active, enabled, ja. No: false, no, n, 0, off, inactive, disabled, nee. Anything else is ignored, so a stray word never flips a setting.

Status. On my shop: the yes words above, plus live and instock. Hidden: draft, pending, hidden, or any of the no words. Archived: archived, discontinued, deleted. Anything else leaves the status as it is.

If you map a Status column, it updates existing products too. A row saying inactive will take a live product off your storefront.

Check that it worked

Your last few imports are listed under Past imports on the import page, with how many products were new, updated, unchanged and skipped. On Products, filter by Hidden to find what you just created.

If something goes wrong

"That file has no rows we can read. Is it a CSV with a header row?" The file is empty, or it isn't a CSV. Open it in your spreadsheet app, check the first row holds the column names, and save it as CSV.

"We couldn't read that file." Save it again as CSV (UTF-8 if your app offers it) and try again.

The Check what will change button is greyed out. Match a product ID, SKU or barcode column first. The page reminds you of this in a yellow note.

"No product ID, SKU or barcode — skipped, so a re-import can't duplicate it." That row has an empty identifier. Fill in a SKU or ID for it in your file.

"New product with no name." or "New product with no price." The row didn't match an existing product, so it needs both a name and a selling price to be created.

A row says a price or quantity "isn't a number". The cell holds text or a negative number. Fix the cell in your file and import again.

"Image link isn't a web address" The image column has a file name or a path on your computer. Use a public link that starts with http or https.

"Your plan has no room for more products." You've reached your plan's product limit. Updates to existing products still go through. Starter includes 30 products, Growth 150 and Scale 1,000, counted across all your stores. To add more, open the menu under your name, choose Business, then Plan & billing.

The names came through in the wrong column. The importer guessed the wrong match. For example, a column called Description can be picked for Product name if it comes before your Name column. Check each field on Match your columns before you continue.

Related


Ready to grow your business?

Start selling to South Africa using ShopEazy.