WooCommerce Import Products CSV: Import and Export Without Duplicates
Use the built-in WooCommerce importer and exporter safely: key CSV columns, how ID and SKU matching works, variable products, images, UTF-8 and Arabic text, large files and a backup-first workflow.
DEBy DevMarket Editorial·Published: ·9 min read
On this page
WooCommerce can import products from a CSV file with its built-in importer, and export them again for editing in a spreadsheet. Open Products > All Products, click Import, choose the file, check the column mapping and run the importer. To avoid duplicates, give every product a SKU and tick Update existing products when you are updating. Checked against the WooCommerce documentation in October 2026 (WooCommerce 11.2).
In short
The Import and Export buttons sit beside Add new product on Products > All Products.
Rows match existing products by ID or SKU, and only update them when Update existing products is ticked. A row with neither cannot match anything.
Save the file as UTF-8 CSV, which Arabic text needs, and open it to check before you import.
A variable product is one parent row plus one row per variation, with Parent set and a unique SKU.
Back up, test on staging, import a few rows first, then import them again to prove no duplicates appear.
How to import products from a CSV file in WooCommerce
Go to Products > All Products and click Import, next to Add new product.
Click Choose File and pick a CSV or TXT file. Show advanced options adds a server path, a CSV delimiter and the character encoding.
Tick Update existing products only when changing products that already exist, then click Continue.
On Column mapping, check each column. Do not import skips one, as does an unrecognised name.
Click Run the importer and keep the page open until it finishes.
The official sample files, such as sample_products.csv, are in the sample-data folder of the WooCommerce repository. A CSV exported from your own store is a better template.
Work down the list in order: back up, test on a copy, import a few rows, check the result, then import the rest.
Booleans use 1 and 0, and a value that contains a comma goes in double quotation marks. Custom fields use a meta: prefix, such as meta:product_depth.
Variable products: the parent and child rows rule
A variable product needs one parent row and one row per variation. This example comes from the documentation.
Row
Type
SKU
Parent
Attribute 1 name
Attribute 1 value(s)
Parent
variable
tshirt
empty
Size
S, M
Variation
variation
tshirt-s
tshirt
Size
S
Variation
variation
tshirt-m
tshirt
Size
M
The parent row lists every value, each variation row gives only its own, and the spelling must match. Leave ID empty on variation rows and give each a unique SKU. Set Attribute 1 global to 1 only for a global attribute that already exists. As of WooCommerce 11.1, one import can do it all if the parent row comes first, Update existing products is ticked and SKU is mapped. On earlier versions, import the parent row, then the variations. The product side is in our variable products guide.
Updating or creating: how matching works
New products: leave ID empty and give a unique SKU.
Updating: tick Update existing products. Rows match by ID or SKU, and an ID that matches nothing is skipped. From WooCommerce 11.2, a mapped GTIN, UPC, EAN, or ISBN column can match, but only when ID and SKU are both blank.
Not ticked: rows that match an existing product are not updated. The plugin's source code skips them with a message such as "A product with this SKU already exists."
The usual route to duplicates is a row with no ID and no SKU. It has nothing to match, so with the box unticked it becomes a new product every time you import the file. Names are never used for matching. Give every product a SKU, then prove it: import two rows, import them again with Update existing products ticked, and confirm the product count did not change. To change a SKU, keep the ID in that row and test one row first.
Images, categories, tags and Arabic text
Images and categories
Put image URLs in the Images column, separated by commas. WooCommerce imports each image it can download into the Media Library, but some hosts block these downloads. Then upload the images first. The core importer cannot set image alt text: see the WooCommerce SEO guide.
Categories use > between levels, and a comma inside a name is escaped with a backslash, as in Places\, People\, Cities. In the plugin's source code, missing categories and tags are created, so a misspelt category becomes a new one: compare the list afterwards.
Encoding and Arabic text
The documentation says to save the file as UTF-8, the encoding Arabic needs, and to check the saved file, because spreadsheet apps can change formatting or encoding. In Excel look for the save option named CSV UTF-8 (Comma delimited); in Google Sheets download as comma-separated values. Then open the CSV in a plain text editor and confirm the Arabic is readable.
The advanced options hold a Character encoding of the file dropdown, set to Autodetect, and a CSV Delimiter field. Some regional settings make spreadsheets save semicolons instead of commas, so check it. Keep prices and stock in digits 0 to 9 with a dot decimal, as in the documentation's examples. The importer does not manage translations: for a multilingual store read your plugin's import documentation and our Arabic WordPress website guide.
Export a few products to see the exact column names, and build your file from that.
Clean the file: one spelling per attribute value, no formulas or currency symbols, UTF-8 CSV.
Import a few rows, including a variable product with images and a nested category, then check the admin and the front end.
Import the same rows again with Update existing products ticked and confirm there are no duplicates.
Import the rest, read the failed or skipped rows report, fix them and re-import only those.
On a live store, stock numbers in a file overwrite live stock, so orders placed since your export are lost from the count.
Large files and timeouts
The documentation says large imports depend on server memory, upload limits and processing time, and advises splitting the CSV into smaller files. It gives no row count, so start small. Your host sets the Maximum size on the upload screen. In the plugin's source code the importer works in batches of 30 rows and stops a request after about 20 seconds, then resumes, so keep the page open. If WordPress rejects the file, upload it to the uploads folder over SFTP and use the server path option.
Common errors and fixes
Problem
Likely cause
What to do
"Sorry, this file type is not permitted for security reasons."
Not a clean CSV, or the host restricts types
Re-save as CSV, or use SFTP and the server path
Variations missing
Duplicate SKUs, wrong Parent, or values that differ from the parent
Fix and re-import the variation rows
Strange Arabic characters
The file is not UTF-8
Re-save as UTF-8 and set the encoding
Exporting for bulk edits and moving products between stores
Go to Products > All Products and click Export. Choose Export all columns or specific ones, pick types and categories, tick Yes, export all custom meta if needed, and click Generate CSV. To export a few products, select them and click Export X selected.
For a bulk edit, change the file in a spreadsheet, keep ID or SKU, and re-import with Update existing products ticked. Map only the columns you changed, set the rest to Do not import, and check one row first.
To move products to another store, import the export there. IDs do not carry over, so rely on SKUs, and image URLs must be reachable from the new store. Create global attributes first. The CSV carries product fields only, not orders, customers or reviews: to move a whole site, see moving a WordPress site to a new host.
Frequently asked questions
Can I import products without a SKU?
Simple products, yes, but they cannot be matched later, so importing again can create duplicates. A new variation needs a SKU or a GTIN.
How do I update only the prices?
Prepare a file with ID or SKU and the price columns, tick Update existing products, and set the other columns to Do not import.
Does the importer delete products that are not in the file?
The documentation describes only adding and updating. You remove products from the product list.
Can I schedule imports from a supplier feed?
The built-in importer is manual. Recurring feeds need an extension or custom code: check its HPOS support, as our best WooCommerce plugins guide explains.
Next steps
Prepare your product data with the variable products guide, then follow the safe workflow above. Afterwards, browse WooCommerce plugins on DevMarket for the extras you need.
Fix the WordPress critical error and white screen of death calmly: back up, read the logs, find the cause by elimination, then handle database, 500, memory, maintenance mode, 404 and login errors.
Choose a WordPress theme by testing, not by demo. Compare block and classic themes, sources, speed, accessibility, RTL support, WooCommerce, builder lock-in and licence terms on a staging copy.
Use this WordPress maintenance checklist to plan weekly, monthly and yearly tasks: updates, backups, users, plugins, security, speed, PHP, domain and SSL, plus Site Health and WooCommerce checks.
·9 min read
Find the right software for the job
Every item on DevMarket has a human-reviewed release, an instant licence key and clear update and support terms.