How to Fix WooCommerce CSV Import Errors (Product Importer Guide)
You exported your product list, clicked Products → All Products → Import in WooCommerce, and hit a wall: 'Invalid file type. The importer supports CSV and TXT file types.' Or the import ran but half your columns showed 'Do not import' on the mapping screen. Or it finished and told you products were skipped. The WooCommerce built-in importer is genuinely good, but it is strict about three things: the file itself, the column headers, and the values inside each column. Every import failure traces back to one of those three, and each has a fast fix.
Error: 'Invalid file type. The importer supports CSV and TXT file types.'
This is the most common blocker and it almost never means what it says. Your file probably is a CSV, but one of these is true: it's actually an Excel file (.xlsx) that someone renamed to .csv, it was saved as 'CSV UTF-16' or another exotic variant, or your WordPress install is rejecting the MIME type. A closely related WordPress-level error is 'Sorry, you are not allowed to upload this file type' or 'Sorry, this file type is not permitted for security reasons' — same family of problem.
First, confirm what the file really is. Open it in a plain text editor (Notepad, TextEdit in plain-text mode). A real CSV looks like readable comma-separated lines. If you see garbled binary characters or it starts with 'PK', it's an Excel file wearing a .csv extension — renaming the extension does not convert the format. Re-export it as genuine CSV, or run it through a converter that actually rewrites the contents.
Real CSV (opens fine):
SKU,Name,Regular price
TSHIRT-BLU-M,Blue T-Shirt Medium,24.99
Renamed .xlsx (importer rejects it):
PK\x03\x04\x14\x00\x06\x00... [binary ZIP data]If the file is a genuine CSV and WooCommerce still refuses it, the encoding is usually the culprit — covered next.
Garbled characters after import: the UTF-8 requirement
WooCommerce's documentation is explicit: product CSVs should be in UTF-8. If you export from older versions of Excel using plain 'CSV (Comma delimited)', you get a legacy Windows encoding (cp1252) instead. The import may succeed, but every accented character, curly quote, degree symbol, and em dash turns to mush in your product names and descriptions.
What you typed: Café Crème Espresso Blend – 250g
What imports: Café Crème Espresso Blend – 250gThe fix in Excel is to use File → Save As → 'CSV UTF-8 (Comma delimited)' rather than plain CSV. Google Sheets exports UTF-8 by default, so downloading via File → Download → Comma Separated Values also works. If you have already imported garbled products, fix the source file and re-import with 'Update existing products' checked — WooCommerce matches on ID or SKU and overwrites the mangled text.
Columns showing 'Do not import' on the mapping screen
After uploading, WooCommerce shows the 'Map CSV fields to products' screen. It auto-matches your headers against its schema, and anything it doesn't recognize defaults to 'Do not import'. If your price column arrived as 'price', 'unit_price', or 'Regular Price ' with a trailing space, it will not auto-map to 'Regular price', and if you click through without noticing, every product imports with an empty price.
The importer's expected headers are exact. The core ones from the official product CSV schema:
- ID, Type, SKU, Name, Published
- Regular price, Sale price, Date sale price starts, Date sale price ends
- In stock?, Stock, Backorders allowed?, Sold individually?
- Short description, Description, Categories, Tags, Images
- Weight (kg), Length (cm), Width (cm), Height (cm)
- Tax status, Tax class, Shipping class, Visibility in catalog
- Attribute 1 name, Attribute 1 value(s), Attribute 1 visible, Attribute 1 global
You can manually re-map each column on the mapping screen, but if you import this file weekly (supplier feeds, ERP exports), fix the headers in the file itself so auto-mapping works every time. Note the punctuation matters: it's 'In stock?' with a question mark and 'Weight (kg)' with parentheses — a header like 'in_stock' or 'weight' won't auto-match.
The fastest way to get a guaranteed-correct header row: export one existing product from your own store (Products → All Products → Export), and use that file's headers as your template. Whatever your store exports, it will re-import.
'Skipped' products: SKU conflicts and the update checkbox
When the import summary reports skipped products, it's almost always SKU-related. WooCommerce enforces unique SKUs, so if a row's SKU already exists on another product and you did not tick 'Update existing products' before importing, that row is skipped. The reverse also bites: you ticked the update box, but your CSV's SKUs have stray whitespace ('TSHIRT-BLU-M ' vs 'TSHIRT-BLU-M'), so WooCommerce sees them as new SKUs and either creates duplicates or fails with 'Invalid or duplicated SKU.'
Looks identical, imports as two different products:
Row 14: "TSHIRT-BLU-M",Blue T-Shirt Medium,24.99
Row 87: "TSHIRT-BLU-M ",Blue T-Shirt Medium,24.99
^ trailing spaceTrailing and leading whitespace in SKU columns is the single most common invisible cause of duplicate or skipped products. It usually enters the file when someone copy-pastes SKUs from an email or PDF into a spreadsheet. Trim every cell before importing.
Booleans, types, and prices: value-level formatting rules
Even when the file uploads and every column maps, individual values can silently import wrong. The WooCommerce CSV schema is picky here:
- Boolean columns (Published, In stock?, Is featured?, Backorders allowed?, Sold individually?) expect 1 or 0. Values like TRUE, Yes, or 'In Stock' don't behave predictably.
- Type must be lowercase: simple, variable, variation, grouped, or external. 'Simple' or 'SIMPLE' from a hand-edited sheet can break variation linking.
- Regular price and Sale price must be bare numbers with a period decimal: 24.99. Currency symbols ($24.99), thousands separators (1,299.00), or European decimals (24,99) import as blank or wrong.
- Categories use ' > ' for hierarchy and commas between multiple categories: 'Clothing > Shirts, Sale'.
- Sale price must be lower than Regular price, or the sale price is ignored.
- Images take full URLs, comma-separated; the first URL becomes the featured image.
Before (typical supplier export):
SKU,Name,Type,Regular Price,In Stock?,Published
MUG-01,Ceramic Mug ,Simple,"$1,299.00",Yes,TRUE
MUG-02, Travel Mug,SIMPLE,€24.99,In Stock,TRUE
After (import-ready):
SKU,Name,Type,Regular price,In stock?,Published
MUG-01,Ceramic Mug,simple,1299.00,1,1
MUG-02,Travel Mug,simple,24.99,1,1Timeouts and 500 errors on large files
If the progress bar stalls or you get a generic server error partway through, your hosting's PHP limits (max_execution_time, memory_limit) are choking on file size, not file format. Two practical fixes that don't require touching server config: split the CSV into chunks of 1,000–2,000 rows and import them sequentially, and strip anything the import doesn't need — empty rows at the bottom of the sheet, empty spacer columns, and columns you're not importing anyway. A supplier file with 40 columns of which you use 12 imports dramatically faster with the other 28 dropped.
Fixing your CSV manually in Excel or Google Sheets
If this is a one-off import, you can repair the file by hand:
- Headers: retype the header row to match WooCommerce's exact schema names ('Regular price', 'In stock?', 'Weight (kg)'), or export a product from your store and copy its header row.
- Whitespace: in Google Sheets, select all data and use Data → Data cleanup → Trim whitespace. In Excel, use =TRIM(A2) in a helper column, then paste values back.
- Booleans: use Find & Replace per column — TRUE→1, FALSE→0, Yes→1, No→0, 'In Stock'→1, 'Out of Stock'→0. Restrict the replace to the selected column so you don't corrupt descriptions.
- Prices: Find & Replace to strip $, €, and thousands-separator commas, then format the column as plain number with two decimals. Watch for Excel reformatting on save.
- Type column: lowercase everything with =LOWER(), or Find & Replace Simple→simple.
- Encoding: save via File → Save As → 'CSV UTF-8 (Comma delimited)' in Excel; Google Sheets downloads are already UTF-8.
- Empty rows: sort or filter to expose blank rows and delete them, so the importer doesn't create ghost products.
This works, but it's 20–30 minutes of careful cell surgery, and one missed trailing space in an SKU still means duplicates. If you re-import this file every week, manual cleanup does not scale.
Fixing it automatically with PipeSheets
PipeSheets is a browser-based CSV cleaner built for exactly this loop: upload the messy export, run a cleaning pipeline, download an import-ready file. For a WooCommerce product CSV, a pipeline looks like this:
- Trim whitespace on all columns — kills the invisible trailing spaces in SKU and Name that cause skipped and duplicate products.
- Rename columns to WooCommerce's exact headers: 'Regular Price' → 'Regular price', 'price' → 'Regular price', 'stock_status' → 'In stock?' — so the mapping screen auto-matches everything.
- Map values per column: TRUE → 1, FALSE → 0, 'In Stock' → 1, 'Out of Stock' → 0 in the boolean columns, without touching your descriptions.
- Case transform the Type column to lowercase so 'Simple' becomes 'simple'.
- Find & replace (with regex if you want) to strip currency symbols and thousands separators from price columns: '$1,299.00' → '1299.00'.
- Standardize null values so 'N/A', 'null', and '-' from the supplier feed become genuinely empty cells instead of importing as literal text.
- Remove empty rows and empty columns so the importer doesn't choke on spreadsheet padding.
- Reorder and drop columns to match your template and shrink the file for faster imports.
Output is always UTF-8, which resolves the encoding requirement without you thinking about it, and if your supplier sends XLSX, PipeSheets converts it to a real CSV — no more renamed-extension rejections. Save the pipeline once, and next week's supplier file is one upload and one click from import-ready. There's also a one-click Quick Clean preset that handles the whitespace, null, and empty row/column steps in a single pass if you just want the fast version.
A pre-import checklist
- File is a genuine CSV, saved as UTF-8 (not a renamed .xlsx).
- Header row matches WooCommerce schema names exactly, punctuation included.
- SKUs are trimmed, unique, and consistent with your store if updating.
- Booleans are 1/0; Type values are lowercase.
- Prices are bare numbers with period decimals, no symbols or separators.
- No empty rows or columns; file split into chunks if it's very large.
- 'Update existing products' is checked if you're re-importing.
Run through that list and the WooCommerce importer goes from adversary to a genuinely reliable bulk-update tool. And if the same broken file lands in your inbox every Monday, clean it with a saved PipeSheets pipeline instead of re-doing the surgery by hand.
Related tools & guides
Try the automated solution
PipeSheets can fix these issues automatically. Clean your first file free.
Clean Your CSV