Guide
When your supplier sends part numbers instead of your SKUs
Your products carry your own SKUs. The price list carries the manufacturer's part numbers. WooCommerce import matches only by ID or SKU, so the standard answer is a spreadsheet with a VLOOKUP that breaks the moment a code or a name changes. This page shows the other way.
Short answer
Match each row in a fixed order: barcode (EAN) if both sides have one, then your SKU, then name similarity above a threshold, and whatever is left you pair by hand once. The pairing is stored for that supplier, so the next price list matches those rows instantly, even with no shared code.
Nothing is matched silently below the threshold. A row the system is not sure about is shown to you with its candidates, not guessed. Try the three cases below, and pair the third one yourself.
The row in the price list
No barcode, and the code HG/442-L is nothing like your SKU. The name is close enough: 93% similarity, above the threshold, so it matches and is flagged for a glance on the review screen.
The matching order
Barcode (EAN)
No barcode in the price list. Next.
Your SKU
Code does not equal any of your SKUs. Next.
Name similarity
93.0% similar to Soft-close hinge 110 degrees, left. Matched and flagged for a glance.
You pair it once
Only what the first three steps could not decide.
Step by step
The matching order, step by step
Strongest key first, weakest last, and the step that asks you comes only when the others could not decide.
Barcode (EAN) when both sides have one
The most reliable key there is: the manufacturer assigns it and it never changes with a rename. If your products do not carry EANs yet, adding them is the single change that improves matching most.
Your SKU, exact
Some suppliers reuse your codes, or you built your SKUs from theirs. An exact match on the SKU field in WooCommerce is taken as certain.
Name similarity, above a threshold
Names are normalised (case, spacing, punctuation, units) and compared. A match above the threshold is accepted and flagged so you see it on the review screen. Below it, nothing is assumed.
You pair the rest, with candidates shown
For each unresolved row the screen shows the closest products in your store. You pick one, or search, or mark the row as a product you do not carry.
The pairing is kept for that supplier
From then on the supplier's code maps straight to your product. A store with fifteen thousand products does the manual work once, spread over its first few price lists, not every month.
What it does not do
What the matcher refuses to do
It does not guess below the threshold
A weak name match is never applied silently. It is shown to you with candidates. The cost of a wrong match is a wrong price on a live product, and no threshold is worth that.
It does not merge or split variations
Rows are matched to existing products and variations. If the supplier lists sizes as separate rows and your product is variable, each row matches its variation, but the structure of your product is not changed.
It does not create products
Rows with no product in your store go to a separate list, with the supplier's cost and your rule's suggested retail. Creating them remains your decision.
Questions people ask before trying it
Related guides
The same price list usually raises more than one of these.
Guide
How to update WooCommerce prices from a supplier price list
The four steps from the file your supplier sent to approved prices in your store, and how each method compares.
Read the guideGuide
Getting a supplier PDF price list into WooCommerce
The five things that break copy-paste and Excel conversion, and what a reader that expects them does with each.
Read the guideGuide
How to compare an old and a new supplier price list
Increases, decreases, new and discontinued items in one table, with what each change does to your margin.
Read the guide
Try it on your own price list, not ours.
Start the 14-day trial, connect your store and upload the last file a supplier sent you. Nothing is written to WooCommerce until you approve it.
No card. Every change can be undone.