How it works

Nine stages. Two of them are not built yet.

A supplier file goes in one end and an import file comes out the other. Here is every stage in between, what it actually does, and — for the two we have not built — exactly what is missing and why.

Where this stands today

7 of 9 stages are built and running. One is partly built — Shopify, not WooCommerce. One is not built at all, and it is the one where getting it wrong destroys a catalogue quietly, so it is blocked on evidence rather than on time.

The pipeline

Each stage consumes the one above it. Nothing skips ahead, and nothing downstream is allowed to invent what an upstream stage could not establish.

  1. Built

    Read the file as it actually is

    CSV, XLS or XLSX in whatever shape it arrived, without asking anyone to fix it first.

    Delimiter, quoting and line endings are detected rather than assumed, and so is the text encoding — a supplier file that is not UTF-8 is normal, not an error. A workbook we cannot read is reported as a file we could not read, which is a different answer from a file with no problems, and the difference is the entire product.

    packages/ingest

  2. Built

    Fingerprint the supplier

    Recognise the shape of a file you have sent us before.

    The column names, their order and their types are a signature. When it matches a Supplier Profile you have already confirmed, the mapping below is already answered and the month is one click rather than one afternoon.

    packages/map

    Read more about this stage

  3. Built

    Agree what each column means

    Their column names against the fields the platform requires — proposed by us, decided by you.

    Every proposal carries a confidence and a preview of the interpretation, including units. Two columns claiming one field is refused and both are named, rather than resolved to whichever was read last. Nothing here is a guess we keep to ourselves.

    packages/map

    Read more about this stage

  4. Not built yet

    Group flat rows into products and variants

    Turning repeated supplier rows into a product with options.

    Supplier files express variants as repeated flat rows and leave the grouping implicit. Getting it wrong is the worst failure in this whole pipeline and the least visible: two products merged silently deletes one, one product split silently doubles it, and neither changes a row count or raises an error.

    What is missing. Grouping from flat rows is not built, and it is not a scheduling problem. Our acceptance bar requires a genuinely ambiguous real file to be surfaced for review rather than merged, and no file in the corpus has one. A fixture cannot be honestly invented for it, because inventing the case means inventing its answer. What IS built is the protection of groups that already exist: rows are classified, and an export never splits a handle group.

    Read more about this stage

  5. Built

    Check it against the target grammar

    Nineteen deterministic rules, run before anything is uploaded anywhere.

    The Shopify product CSV is a cross-row grammar, not a table — meaning is carried between rows, and most of the ways it breaks a catalogue produce no error message at all. Every rule names the rows it fired on. A rule that could not run is reported as not run, never as a pass.

    packages/validate

    Read more about this stage

  6. Built

    Fill the gaps, from the file only

    Descriptions and fields written from what the file supplied, and nothing else.

    This stage is a component, not the identity of the product. It runs only on cells deterministic processing could not resolve, it is not allowed to introduce a material, a gemstone, a fibre or an origin the file never carried, and that restriction is enforced in code rather than requested in a prompt — because it was requested in a prompt first, and the model did it anyway.

    packages/llm

    Read more about this stage

  7. Built

    Record where every value came from

    Supplied, inferred, or abstained — per field, not per file.

    A field that could not be resolved is left blank with a reason rather than filled with a plausible guess, and anything generated is marked inferred all the way through to the export. This is the question almost nothing else in the category can answer: where did this value come from?

    packages/llm

    Read more about this stage

  8. Built

    Show you every change before it counts

    A row-by-row diff of the original against the result, on catalogues of ten thousand rows and up.

    Filter to errors only, or to inferred values only, accept in bulk, edit in place, and re-run just the rows that failed. An answered cell is not paid for twice. Nothing reaches an export that you have not had the chance to look at.

    packages/preflight

  9. Partly built

    Write the import file, with the receipts

    A platform-shaped file, chunked on size with handle groups intact, plus an optional audit CSV.

    The export is run back through our own validator before you get it, and the audit CSV alongside it states the origin of every value in the file. Chunking splits between handle groups and never inside one, because a split group is the same silent data loss the grouping stage above is careful about.

    What is missing. Shopify is built and round-trips through our own validator with zero blockers. WooCommerce is not built, and is deliberately blocked on a real WooCommerce install — we will not write a target grammar from documentation again. We did that twice, and the documentation was wrong both times.

    packages/export

    Read more about this stage

Where the model runs, and what it may not do

One stage of nine. It is asked a narrow question about cells the deterministic stages could not resolve, and it is not trusted with the answer.

It only sees what it needs

Enrichment runs on the specific cells that could not be resolved deterministically — measured at 22.9% of products across the corpus — not on your file. Thirteen of the twenty-one files in the test corpus needed nothing at all and cost exactly nothing to process.

It may not name what the file did not carry

Materials, gemstones, fibres, woods and origin claims are checked against the source before an answer is accepted. An answer that names one the file never supplied is refused, and the field is abstained from with that word in the reason.

Every answer is checked against its contract

A response that does not have the shape it promised is discarded rather than parsed optimistically. On the acceptance run — 19,885 rows end to end — zero of 142 requests broke their contract, and no fabrication reached an output.

Why this is a mechanism and not a promise

We tried asking. The instruction was in the prompt, in as many words, quoting the exact case we wanted avoided. Measured over 129 real generations, 4.6% of raw answers still named a value the file never supplied — given a title and nothing else, 1/2 CTTW came back as “featuring 1/2 CTTW diamonds”.

A prompt instruction is not a control. The rule is now code: a curated list of materials and origin claims, checked against what the file actually contained, and an answer that fails it is abstained from rather than repaired. The list names what it does not yet cover, because a floor you can see is worth more than a ceiling you are asked to assume.

Is this another tool you have to learn?

For the part that matters, no. The Pre-Flight Report is a file drop and a page of results — no account, no setup, no integration, nothing installed in your store. If all you ever do is check files before you import them, that is the whole of it and it costs nothing.

The paid pipeline asks you one set of questions per supplier — what their columns mean — and then remembers the answers as a Supplier Profile. The second file from the same supplier is one click. That is the only thing here that requires learning, and it replaces the spreadsheet where you were tracking the same answers by hand.

Nothing connects to your store. There is no app to install and no permission to grant; the output is a file you upload yourself, when you are ready, having seen every change first.

What you keep

The file
Yours. The upload is deleted in the same request that reads it.
The mapping
Column names and the field each was mapped to — never a cell of your data.
The output
A platform-shaped file plus an optional audit CSV naming the origin of every value.

What happens to your file, in full

Run your worst supplier file through it.

Free, no account, and the file is deleted in the same request that reads it. If the report is not useful, you have lost a minute.

Check a file free