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.
Top comments (0)