An ERP export or a plain price list
Non-Latin headers, a European decimal comma, and identifiers a spreadsheet has already turned into numbers.
How you recognise it
- Headers in a language your importer has never seen, sometimes with a sheet name to match.
- Prices written as
1.234,56, and only some columns using a separator at all. - A catalogue number column that is right-aligned, which is a spreadsheet saying it thinks those are numbers.
What goes wrong
Worst first, and the worst one is nearly always the one that reports nothing.
- A decimal comma read as a thousands separator inserts a thousandfold pricing error into a live store. It is the one place this product prefers to stop and ask.
- An identifier stored as a number loses its leading zeros, and past sixteen digits it loses its ending too. One supplier catalogue in the corpus has 856 catalogue-number cells stored that way.
- A column of bare integers has no convention to read at all. Reporting it as ambiguous spends the one deliberate stop on nothing — a defect that produced 1,069 of 1,083 confirmations across the corpus before it was fixed.
What we do about it
- Decimal convention is decided per column, shown with a worked example, and confirmed by you when it is genuinely ambiguous. A column with no separator anywhere returns unknown rather than ambiguous.
- Identifier-shaped columns are never coerced to numbers, and corruption that already happened upstream is reported rather than guessed at. A destroyed check digit is not recoverable by inference.
- Encoding is detected and transcoded once, at the boundary, so a non-UTF-8 byte never reaches an export or a model.
Where this came from
Each of these is a real file in our test corpus, run through the engine on every change. We publish the shape and what it proved, never a cell — these are catalogues with real buying prices in them.
- steelite_tableware_catalogue.xlsx
- 2,365 rows · 20 columns. 856 catalogue-number cells stored as numbers — the corpus’s clearest live identifier hazard.
- russian_erp_import.xlsx
- 40 rows · 50 columns. Cyrillic headers and a Cyrillic sheet name, read without transliteration.
- retail_base_prices.xlsx
- 890 rows · 5 columns. A five-column price list whose declared dimension runs past where the content stops.
What we did not measure. We can tell you an identifier column is AT RISK, and we can tell you when a value no longer matches its own check digit. We cannot tell you what a leading zero was before a spreadsheet removed it, and we will not invent one.
Other shapes
- A Shopify export, going back into Shopify — The shape people assume is safe. Two products whose titles slugify to one handle merge into one, and the import reports success.
- A WooCommerce export, going into Shopify — Two grammars that disagree about what a variant is. Woo points a child row at a parent SKU; Shopify groups by a handle that repeats.
All export shapes · Import errors, measured · The Shopify product CSV grammar
Run the file you have.
Whatever shape it arrived in, the Pre-Flight Report names every blocker in it before you upload anywhere. Free, no account.
Check a file free