To import products into WooCommerce with a CSV, go to Products → Import, upload a UTF-8 CSV with one product per row using WooCommerce’s column names (Type, SKU, Name, Regular price, Categories, Images and attributes), map the columns, and run the import. Variable products need a parent row plus one row per variation linked through the Parent column.
I have imported catalogues of every kind, from small boutiques to large coupon and travel catalogues. Most import problems come from the CSV, not the importer. This guide is part of my automation series.
What is the WooCommerce product CSV format?
It is a comma-separated, UTF-8 file with a header row. Each row is a product or a variation. WooCommerce ships a sample CSV in its plugin folder and documents every column in its product CSV schema. Download the sample and keep its headers; the importer then maps columns automatically.
Core columns
| Column | Example | Notes |
|---|---|---|
| Type | simple | simple, variable, variation, grouped, external |
| SKU | TSHIRT-BLK-M | Unique; key for future updates |
| Name | Basic T-shirt | |
| Published | 1 | 1 published, 0 private, -1 draft |
| Short description | Soft cotton tee | HTML allowed |
| Description | Full text | HTML allowed |
| Regular price | 350 | No currency symbol |
| Sale price | 299 | Optional |
| Stock | 25 | Requires stock management |
| In stock? | 1 | |
| Categories | Clothing > T-shirts | > for hierarchy, , for multiple |
| Tags | cotton, summer | |
| Images | https://cdn.example.com/a.jpg, https://cdn.example.com/b.jpg | First image becomes featured |
Categories
Use Parent > Child for hierarchy and commas to separate multiple categories:
Clothing > T-shirts, Summer collection
Missing categories are created automatically. Check spelling carefully; “T-shirts” and “Tshirts” become two categories.
Images
- Full, public URLs; the importer downloads and attaches them.
- First URL is the featured image; others go to the gallery.
- Use readable file names and resize before upload, see image optimisation.
- If the source server is slow or rate-limits, import in smaller batches.
Variable products
This is where most imports go wrong. You need:
- A parent row with
Type = variable, the attribute name and all values. - One variation row per combination with
Type = variation,Parentset to the parent SKU, and the single attribute value.
Example:
Type,SKU,Parent,Name,Regular price,Attribute 1 name,Attribute 1 value(s),Attribute 1 visible,Attribute 1 global
variable,TSHIRT,,Basic T-shirt,,Size,"S, M, L",1,1
variation,TSHIRT-S,TSHIRT,,350,Size,S,,1
variation,TSHIRT-M,TSHIRT,,350,Size,M,,1
variation,TSHIRT-L,TSHIRT,,370,Size,L,,1
Notes:
Attribute 1 global = 1uses a global attribute (Products → Attributes), which is better for filtering.- Prices and stock live on variations, not on the parent.
- The parent row must come before its variations.
- For two attributes, add
Attribute 2 nameand so on; each variation lists one value per attribute.
Updating existing products
Tick Update existing products in the importer. WooCommerce matches by ID or SKU and updates only the columns present. That lets you run small CSVs, for example only SKU and Regular price, to update prices.
Good habits:
- Never change SKUs casually; they are your keys.
- Export first (Products → Export), edit, re-import.
- Keep a copy of each import file with the date.
Preparing the CSV
- Save as UTF-8 (especially for Arabic text; see Arabic ecommerce).
- Use a proper spreadsheet tool or script; some spreadsheet apps change number formats or strip leading zeros.
- Remove currency symbols and thousand separators from prices.
- Quote fields that contain commas.
- Check for duplicate SKUs before importing:
cut -d, -f2 products.csv | sort | uniq -d
(Simple check; use a CSV-aware tool if fields contain commas.)
Importing large catalogues
- Split into files of a few hundred rows on slow hosting.
- Import images separately, or host them on a fast source.
- Run imports off-peak.
- Disable heavy hooks temporarily if safe (for example, plugins that sync every product change to external services), or make sure your webhooks receivers can handle the burst.
- Watch PHP time limits; the importer works in batches, but timeouts still happen on weak servers.
Automating imports
For recurring supplier feeds:
- Plugins that schedule imports from a URL or FTP.
- A custom script using the WooCommerce REST API.
- WP-CLI:
wp wc product createor a custom command, see WP-CLI commands. - Scheduling with real cron instead of relying on visits, see WP-Cron.
After-import checklist
- Product count matches the file
- Categories correct, no duplicates
- Variations show correct prices and stock
- Images attached, featured image correct
- Descriptions keep their formatting
- Search and filters work
- A test order works for a simple and a variable product
Common mistakes
- Putting variation prices on the parent row.
- Variation rows before the parent.
- Different spellings of the same attribute value (“XL”, “Xl”).
- Importing without SKUs, then creating duplicates on the next update.
Have a messy catalogue to move into WooCommerce? Contact me.
Frequently asked questions
What CSV format does WooCommerce use?
A UTF-8 CSV with one product or variation per row and columns such as Type, SKU, Name, Published, Regular price, Categories, Images and attribute columns. The WooCommerce sample CSV shows the expected headers.
How do I import variable products?
Create a row for the parent with Type 'variable' and attribute values listed, then one row per variation with Type 'variation', the parent's SKU in Parent, and the specific attribute value for that variation.
Can I update existing products with a CSV?
Yes. Tick 'Update existing products' in the importer. Products are matched by ID or SKU; only columns present in the file are updated.
Why are my images not importing?
Image URLs must be publicly reachable, complete URLs. Slow or blocked image servers, redirects and very large files cause failures. Importing images in smaller batches helps.


