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.

Read locally, never uploaded.
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".

Official documentation ↗

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.

Official documentation ↗

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).

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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).

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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".

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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 "\,".

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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)".

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗

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.

Official documentation ↗