Skip to content
DevMarket
Odoo ModulesWordPress PluginsWordPress ThemesShopify ThemesApp TemplatesScripts & UtilitiesBlogSell on DevMarket
WordPress and WooCommerce

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.

By DevMarket EditorialPublished: 9 min read
WooCommerce Import Products CSV: Import and Export Without Duplicates
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

  1. Go to Products > All Products and click Import, next to Add new product.
  2. Click Choose File and pick a CSV or TXT file. Show advanced options adds a server path, a CSV delimiter and the character encoding.
  3. Tick Update existing products only when changing products that already exist, then click Continue.
  4. On Column mapping, check each column. Do not import skips one, as does an unrecognised name.
  5. 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.

A checklist card with ticked rows at the top and open rows below
Work down the list in order: back up, test on a copy, import a few rows, check the result, then import the rest.

The CSV columns that matter

The full schema is on the WooCommerce documentation page. These columns do most of the work.

ColumnWhat it holdsNotes
IDThe ID of an existing productEmpty for new products: you cannot choose a new product's ID
Typesimple, variable, variation, grouped, externalAlso virtual, downloadable
SKUThe stock keeping unitUsed for matching. Never generated for blank cells
Name, PublishedThe name (required). 1 published, 0 private, -1 draft2 is pending review
Regular price, Sale priceNumbers such as 24.99Sale dates have their own columns
Stock, In stock?A number turns stock management on, blank turns it offparent on a variation inherits the parent's settings
Categories, TagsComma-separated listsUse > for levels
ImagesComma-separated URLsThe first is the featured image
ParentA variation's parentA SKU, or an ID written as id:100
Attribute 1 name, Attribute 1 value(s), Attribute 1 visible, Attribute 1 global, Attribute 1 defaultOne numbered set per attributeAttribute 2 name and so on

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.

RowTypeSKUParentAttribute 1 nameAttribute 1 value(s)
ParentvariabletshirtemptySizeS, M
Variationvariationtshirt-stshirtSizeS
Variationvariationtshirt-mtshirtSizeM

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.

Run the import safely, and fix common errors

A safe workflow

  1. Back up the database and files: see how to back up WordPress.
  2. Use a staging copy, as explained in updating WordPress and WooCommerce safely.
  3. Export a few products to see the exact column names, and build your file from that.
  4. Clean the file: one spelling per attribute value, no formulas or currency symbols, UTF-8 CSV.
  5. Import a few rows, including a variable product with images and a nested category, then check the admin and the front end.
  6. Import the same rows again with Update existing products ticked and confirm there are no duplicates.
  7. 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

ProblemLikely causeWhat to do
"Sorry, this file type is not permitted for security reasons."Not a clean CSV, or the host restricts typesRe-save as CSV, or use SFTP and the server path
Variations missingDuplicate SKUs, wrong Parent, or values that differ from the parentFix and re-import the variation rows
Strange Arabic charactersThe file is not UTF-8Re-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.

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.