WooCommerce Product CSV Validator
WooCommerce imports rarely fail loudly. Rows whose SKU already exists are skipped, columns it does not recognise are dropped, and the run still reports success. This tells you what the import will actually do — before you start it.
🔒 Your product data never leaves your browser.
Add the SKUs already in your store to get the real forecast (optional)
In WordPress admin: Products → Export, then paste the SKU column here (one per line). Numeric values are treated as product IDs. Without this the forecast has to assume every row is new.
The two ways a WooCommerce import loses data quietly
1. Rows that already exist are skipped, not updated
The importer matches on ID or SKU. With Update existing products left unticked — the default — every matching row is skipped. The summary counts them as skipped; the notice at the top still says the import finished. If you meant to update prices, nothing changed.
2. Columns it does not recognise are never imported
On the mapping screen, any column whose name does not match the importer's schema defaults to Do not import. A header typo, a supplier-specific column, or the newer GTIN field all end the same way: the import succeeds and that column's data is simply absent.
Why check barcodes here?
WooCommerce added a native GTIN/UPC/EAN/ISBN field, and it stores whatever you give it without validation. That value then flows into Google Shopping and marketplace feeds, where it gets rejected — far away from the CSV that introduced it. This validator runs the full GS1 check on that column, including check digits and spreadsheet damage.
Every check this tool runs (40 rules)
Headers & column mapping
WOO-H01 Missing the Name column
Name is the product title and the one column a new product cannot be created without. A file without it imports nothing.
Fix: Add a column named exactly "Name".
WOO-H02 No SKU and no ID column
The importer matches rows to existing products by ID or SKU. With neither column there is nothing to match on, so every future re-import creates duplicates instead of updating what is already there.
Fix: Add a SKU column (recommended — it is yours to control) or an ID column exported from the store.
WOO-H03 Column is not one the importer recognises
On the mapping screen every unrecognised column defaults to "Do not import". Nothing fails and nothing warns — the column is simply dropped, so a header typo like "Regular Price " or a supplier-specific column silently loses its data.
Fix: Rename it to the exact WooCommerce column name, or map it manually on the import screen (custom fields need the "meta:key" form).
WOO-H04 Duplicate column
The same column name appears twice. Which one wins is undefined, so one set of values is discarded without notice.
Fix: Remove or rename the duplicate column.
WOO-H05 Row has a different number of fields than the header
A row with more or fewer fields than the header means an unquoted comma or a line break inside a value. Every value after the break lands in the wrong column — prices in the stock column, descriptions in the category column.
Fix: Wrap values containing commas, quotes or line breaks in double quotes and double any inner quote.
WOO-H06 Weight and dimension headers carry the store unit
WooCommerce exports these columns as "Weight (kg)", "Length (cm)" and so on, where the unit is whatever the store is configured to use. The importer does not convert: a file exported from a kilogram store and imported into a pound store keeps the numbers and changes their meaning.
Fix: Check that the unit in the header matches the target store (WooCommerce → Settings → Products), and convert the numbers yourself if it does not.
WOO-H07 GTIN column is present but is not part of the default mapping
WooCommerce gained a native "GTIN, UPC, EAN, or ISBN" product field in 9.2, stored as the meta key global_unique_id. The default CSV export does not include it and the importer does not auto-map a column named after it, so barcodes in this file are dropped unless you map the column by hand.
Fix: On the import mapping screen, point this column at the GTIN field (or "meta:global_unique_id" on versions where the field is not offered), and verify one product afterwards.
Source: yaktool engineering note, not an official WooCommerce statement: WooCommerce 9.2 added a native "GTIN, UPC, EAN, or ISBN" product field stored as the meta key global_unique_id, but the documented default CSV columns do not include it and sellers report it missing from exports — so a barcode column needs mapping by hand. Verify against your own WooCommerce version before relying on it.
Identity: create, update or skip
WOO-I01 Duplicate SKU inside the file
WooCommerce enforces unique SKUs. Two rows carrying the same SKU cannot both import: the second is rejected, and which one survives depends on row order rather than on your intent.
Fix: Give each product its own SKU. For variations, the parent and each variation each need a distinct SKU (or none at all).
WOO-I02 Row carries an ID
IDs cannot be assigned to new products — they are WordPress post IDs the store hands out. An ID that does not exist in the target store makes the row fail, which is why an export from one store rarely imports cleanly into another.
Fix: When moving products between stores, delete the ID column and match on SKU instead.
WOO-I03 SKU already exists in the store
This is the quiet one. With "Update existing products" left unticked — the default — every row whose SKU or ID already exists is SKIPPED. The importer reports the run as complete and the products you meant to change are untouched.
Fix: Decide before you upload: tick "Update existing products" to overwrite these rows, or remove them from the file.
WOO-I04 File mixes new products with products that already exist
One import run applies one mode to every row. Mixed files therefore always lose half of what you wanted: unticked skips the updates, ticked lets the new rows through but also rewrites the existing ones.
Fix: Split the file into a "new products" file and an "updates" file, and run them as two imports.
WOO-I05 Row has neither SKU nor ID
The row can still create a product, but nothing in the file identifies it afterwards. The next import cannot update it and will create a second copy instead.
Fix: Give the row a SKU before importing — assigning one later means editing products by hand.
Product types & variations
WOO-T01 Unknown product Type
Type accepts simple, variable, variation, grouped and external. Values such as "downloadable" or "virtual" are not types — they are separate boolean columns — and an unknown type makes the importer fall back to a simple product, silently flattening variable products.
Fix: Use one of simple, variable, variation, grouped, external. Mark downloadable and virtual in their own columns.
WOO-T02 Variation row without a Parent
A variation is meaningless on its own: without a Parent it has no product to belong to, so it imports as an orphan that never appears in the store.
Fix: Fill Parent with the parent product's SKU, or with "id:123" when referring to a numeric product ID.
WOO-T03 Numeric Parent reference is missing the "id:" prefix
Parent, Grouped products, Upsells and Cross-sells accept SKUs plainly but require IDs to be written as "id:123". A bare number is read as a SKU, and a SKU that looks like a number is exactly the case where this goes wrong unnoticed.
Fix: Write "id:123" for an ID reference; leave SKUs unprefixed.
WOO-T04 Parent is not in this file
The parent product must already exist in the store or appear in the same import. If it does neither, the variation is dropped and the product ends up with fewer variations than the file describes — with no error to say so.
Fix: Include the parent row in the same file (parents before variations), or import the parents first.
WOO-T05 Variation carries several values for one attribute
A variation pins exactly one value per attribute. When several are given, the importer takes the first and discards the rest, so "Red, Blue" quietly becomes "Red".
Fix: Give each variation one value per attribute, and list the full set on the variable parent row instead.
WOO-T06 Attribute columns are incomplete
Each attribute needs its name and its value(s) together. A name without values (or values without a name) is skipped entirely — a common result of deleting one column while tidying a spreadsheet.
Fix: Keep "Attribute N name" and "Attribute N value(s)" as a pair; add visibility and global columns if you need them.
WOO-T07 Attribute default is not one of the attribute values
The default selection has to be one of the values offered, otherwise the variation dropdown opens with nothing preselected and the setting looks broken rather than absent.
Fix: Set the default to one of the listed values, or leave it empty.
WOO-T08 Variable product without any attribute values
A variable product needs at least one attribute with values to generate variations from. Without them the product imports as a shell with no options a customer can choose.
Fix: Add "Attribute 1 name" and "Attribute 1 value(s)" to the variable parent row.
Field values
WOO-F01 Unexpected Published value
Published accepts 1 (published), 0 (private), -1 (draft) and 2 (pending review). Anything else — "yes", "publish", "TRUE" — is one of the causes WooCommerce itself lists for rows that import but never appear on the site.
Fix: Use 1, 0, -1 or 2.
WOO-F02 Boolean column is not 1 or 0
The importer's boolean columns take 1 and 0. Spreadsheet exports love to write TRUE/FALSE, "yes"/"no" or localised words, all of which read as false — so featured products stop being featured and reviews get switched off.
Fix: Replace with 1 or 0. "Backorders allowed?" additionally accepts "notify".
WOO-F03 Price is not a plain number
Prices must be bare numbers: no currency symbol, no thousands separator, no comma as the decimal mark. "1,299.00" is read as 1 and "€24,99" as 0 — both import happily and both are wrong.
Fix: Write 1299.00 and 24.99. Set the currency in WooCommerce settings, not in the file.
WOO-F04 Sale price is not below the regular price
A sale price greater than or equal to the regular price does not put the product on sale. The value imports, the badge never appears, and the discrepancy usually surfaces as "the sale is not working".
Fix: Lower the sale price below the regular price, or clear it.
WOO-F05 Date is not YYYY-MM-DD
Sale start and end dates must be written YYYY-MM-DD. A spreadsheet showing 01/09/2026 exports either as day-first or month-first depending on locale, so the same file schedules two different sales on two different machines.
Fix: Format the column as text and write 2026-09-01. Leave empty for no date.
WOO-F06 Sale ends before it starts
An end date earlier than the start date means the sale is over before it begins — the price never changes and nothing reports an error.
Fix: Swap the two dates, or clear the end date to run the sale indefinitely.
WOO-F07 Stock value is not a whole number
Stock takes a number, which also switches stock management on for that product. Text, decimals or a stray unit make the value unusable; "parent" is valid only on variation rows, where it means "inherit the parent's stock settings".
Fix: Use a whole number, leave it empty to keep stock management off, or use "parent" on variation rows.
WOO-F08 In stock? contradicts the Stock number
A row that says out of stock while carrying a positive stock count (or the reverse) leaves the store showing one thing and the inventory saying another — and which one wins depends on whether stock management ends up enabled.
Fix: Make the two agree, or manage availability with the Stock column alone.
WOO-F09 Category value looks like a path but does not use the documented separators
Categories are comma separated, hierarchy is written with ">" ("Home goods > Audio"), and a comma inside a category name must be escaped with a backslash. Using "/" or "|" for hierarchy creates one flat category with a slash in its name instead of a parent and child.
Fix: Write "Parent > Child", separate multiple categories with commas, and escape literal commas as "\,".
WOO-F10 Image value is neither a full URL nor a media filename
Images are comma separated and must be either an absolute URL the server can fetch directly, or the filename of a file already in the media library. Redirects are not followed, so shortened links and Dropbox-style share URLs import as nothing.
Fix: Use direct https URLs to the image file itself, first image first — it becomes the featured image.
WOO-F11 Unknown catalog visibility
Visibility in catalog accepts visible, catalog, search and hidden. An unrecognised value falls back to visible, which is how products meant to be hidden end up on the shop page.
Fix: Use one of visible, catalog, search, hidden.
WOO-F12 Unknown tax status
Tax status accepts taxable, shipping and none. Anything else falls back to taxable — a silent tax change rather than an import error.
Fix: Use taxable, shipping or none, and leave Tax class empty for the store default.
WOO-F13 Weight or dimension carries a unit
These columns parse numbers only. "1.2 kg" imports as 1.2 in the store's configured unit if you are lucky and as nothing if you are not — the unit belongs in the header, not in the cell.
Fix: Leave only the number in the cell.
WOO-F14 External URL or Button text on a non-external product
These two columns only apply to external/affiliate products. On a simple or variable product they import and then do nothing, which usually means the Type column is wrong rather than the URL.
Fix: Set Type to "external" if the product links out, otherwise clear these columns.
WOO-F15 Barcode fails GS1 validation
WooCommerce stores whatever you put in the GTIN field without checking it. The barcode then flows into Google Shopping, Meta and marketplace feeds, and gets rejected there — far away from the file that introduced it.
Fix: Run the value through the GTIN validator: a wrong check digit, a dropped leading zero or Excel damage all show up there with the corrected value.
Source: yaktool engineering note, not an official WooCommerce statement: WooCommerce 9.2 added a native "GTIN, UPC, EAN, or ISBN" product field stored as the meta key global_unique_id, but the documented default CSV columns do not include it and sellers report it missing from exports — so a barcode column needs mapping by hand. Verify against your own WooCommerce version before relying on it.
Encoding & spreadsheet damage
WOO-E01 File is not valid UTF-8
WooCommerce requires UTF-8. A file saved as Windows-1252 or Latin-1 imports with mangled accents ("Café"), and because the text is technically valid the import reports success.
Fix: Re-save as CSV UTF-8. In Excel: File → Save As → "CSV UTF-8 (Comma delimited)".
WOO-E02 File is not comma separated
The importer defaults to a comma. Excel on a European locale exports semicolons, and the result is a single column containing the whole row — every value in the wrong place, or a mapping screen with one giant field.
Fix: Re-export with commas, or set the delimiter under "Advanced options" on the import screen.
WOO-E03 Invisible or non-breaking characters in a value
Zero-width characters and non-breaking spaces survive copy-paste from web pages and Word. They make SKUs that look identical fail to match, and turn a numeric price into text.
Fix: Strip them (the invisible character detector shows exactly where they are), then re-check the SKU column.
WOO-E04 Spreadsheet damage in an identifier column
Scientific notation (8.71E+12) and dropped leading zeros are what a spreadsheet does to long numeric codes. Both import as text that no longer identifies the product.
Fix: Format the column as Text before pasting, or open the CSV with the import wizard and mark identifier columns as Text.
WOO-E05 Large file — import in batches
WooCommerce processes the file in server requests, and its own documentation names files that are too large for one request as a cause of failed imports. Long descriptions and many variations make a modest row count heavy.
Fix: Split into batches of a few hundred rows, or raise the server limits before importing.