Every sourcing round starts the same way: eleven suppliers, eleven spreadsheets, and no two of them agreeing on what a column is called.

Before anything gets compared, we normalise. Not because the naming is wrong, but because "FOB Price" and "Unit Price (FOB Ningbo)" and "Price/PC EXW" are three different commercial offers wearing the same shirt.

The table

Canonical field Aliases seen in the wild Type Rule
unit_price FOB price, EXW price, unit cost, quotation decimal must carry a currency and an incoterm, else reject
incoterm trade term, delivery term, shipping term enum FOB / EXW / CIF / DDP / DDU
moq_qty MOQ, min order, starting qty integer pieces, not cartons
carton_qty packing, pcs/ctn, QTY/CTN integer pieces per carton
carton_measure cbm, carton size, volume decimal×3 cm, L×W×H, outer dimensions
gross_weight G.W., gross wt, weight/ctn decimal kg per carton, not per piece
lead_time_days production time, delivery, ETD integer from deposit received
tooling_cost mould fee, setup, sample charge decimal one-off, not amortised

Eight fields. That is the whole comparison surface.

The three that cause the most damage

moq_qty in cartons. A supplier quoting "MOQ 50" almost never means 50 pieces. If carton_qty is 240, the real MOQ is 12,000 pieces and your product page just lied to you.

gross_weight per piece. Plush and squishy toys are the worst offenders because the carton weight is dominated by packaging, not product. A per-piece reading understates freight by roughly the carton-to-product ratio, which for a 60-piece carton is close to an order of magnitude.

lead_time_days from the wrong event. "30 days" measured from PO date and "30 days" measured from deposit are frequently three weeks apart once the deposit clears through a different banking day.

Why not just fix the template

You can send a template. Half will fill it in, a third will reformat it, and one will send a PDF photo of a printed sheet. Normalisation on ingest is cheaper than enforcement on submission, and it survives the supplier who changes country manager halfway through the round.

We keep the alias table in a single YAML file next to the parser. Adding an alias is a one-line change; arguing with a supplier about column names is a two-week change.

The channel question underneath — whether you are collecting these sheets through a marketplace or through a sourcing desk — changes which aliases you see most, and we wrote about that trade-off in marketplace listings versus a sourcing desk. The upstream view of the whole cycle is in our guide to sourcing squishy toys from China.

The one rule that matters

If a field cannot be typed, it does not enter the table. A supplier reputation note is useful context; it is not a column. Keeping the comparison surface small is what makes the eleventh spreadsheet cost the same as the second.