Set and maintain prices

Import prices in bulk

Move a price list in from your ERP or a spreadsheet — the column rules, the re-run behaviour, and the checks that stop a bad file reaching buyers.

Typing prices one at a time stops working somewhere around fifty articles. Every real price book arrives as a file, and most of the work is in the file rather than the upload.

Before you start: the target price list must exist, with the right currency and a stated net/gross basis. See Design your price lists. The file is imported into one list, so one file per list.

What a price row consists of

Every row is one entry: one item, at one quantity rung, in one list.

ColumnRequiredNotes
skuone of the twoThe SKU as your catalogue and ERP know it
product_idone of the twoThe catalogue product id, if you have it
price_typenostandard (default) or on_request
quantity_minnoThe tier. Defaults to 1
unit_priceyesNet or gross per the list's basis, not per row
unitnoPCE, M, KG — match your ERP

A scale price is several rows, not one row with several columns. An article with rungs at 1, 10 and 50 is three rows that differ only in quantity_min. This is the single most common surprise when converting an ERP export, where scales usually sit in columns.

Prepare the file

Most of the guidance in Prepare your import file applies unchanged: UTF-8, leading zeros in SKUs, decimal separators. Price files add four of their own:

The decimal separator. 19,90 read as a thousands separator becomes 1990. This is the error that puts a hundredfold price in front of a buyer, and it is common enough that you should check it every time.

No currency symbols and no thousands separators. 19.90, not € 19,90 and not 1.234,50.

No mixed net and gross. The basis belongs to the list. If your source file has both, split it into two files for two lists before you import anything.

Do not export prices of zero. ERP exports frequently emit 0.00 for articles with no maintained price. Imported, those become orderable prices of nothing. Filter them out at source, or convert them to on_request.

Check the file against known articles before you upload. Take five articles whose price you know by heart and find them in the file. If 4711-A reads 1990.00 or 0.199, stop. That is a separator or unit problem, and it affects every row.

Import into a list

  1. Go to Order Management › Prices › Price lists and open the target list.
  2. Choose Import entries.
  3. Supply the rows.
  4. Choose how existing rows are handled:
    • Update matching tiers: the default. A row naming a rung the list already has (same SKU or product and the same quantity_min) updates it.
    • Always insert: every row is added as a new entry.
  5. Import.

Use "Update matching tiers". It is what makes a corrected file safe to re-run: the second import updates the same rungs instead of doubling them. "Always insert" is for the rare case where you know the list is empty and you want raw speed.

An import removes nothing from the list. A price that disappeared from your ERP export stays in the list until somebody deletes it. See Price list hygiene.

Scale. The import dialog is built for a chunk of a price book. Tens of thousands of rows belong in a scheduled interface from your ERP rather than in a dialog; see Connect a system.

Test with ten rows

Always. Build a ten-row file containing:

  • two ordinary articles whose price you know,
  • one full scale ladder (three rows, same SKU),
  • one article with a four-decimal price, if you sell per 1,000,
  • one on_request row,
  • one article that already exists in the list, so you can see the update path work.

Import those, then open the list and read them. Only then run the full file.

What to check afterwards

  • Open the list and sort the entries by unit price, ascending and descending. The extremes are where separator errors and stray zeros show up.
  • Filter Order Management › Prices › Price entries by a SKU that has a ladder and confirm the rungs are separate rows with descending prices.
  • Spot-check five articles against the source file.
  • Re-run the same file once, deliberately. With Update matching tiers, the entry count must not change. If it doubles, the mode was wrong.
  • Look at one imported article in the storefront as a logged-in test buyer.

When rows do not land

SymptomUsual cause
Rows imported but the buyer sees the old priceThe rows went into a different list than the one that resolves for that buyer
Prices are 100× too high or too lowDecimal separator, or a price-per-1,000 imported as price-per-piece
The ladder has doubledThe import ran in Always insert mode
An article has no price at allThe SKU does not match the catalogue — check leading zeros
Everything is priced but nothing shows in the shopThe list is inactive, out of its validity window, in the wrong currency, or in no market you sell in

For anything that survives that table, see Common pricing problems.

Next