
When you need to import WooCommerce products in bulk, the tool you already have is better than most store owners think. WooCommerce ships with a free built-in product importer that handles simple products, variable products, categories, images, and bulk updates to your existing catalog. No plugin purchase required.
The catch is that the built-in importer is strict. It reads CSV files only, it expects your columns and product types to be structured a specific way, and it gives you very little feedback when a row fails. Get the file right and it’s fast and reliable. Get it wrong and you end up with duplicates, missing variations, or an import that stalls halfway through.
In this article, we’ll walk you through the whole process: how to run the built-in importer, how to format your CSV so it works the first time, how to handle variable products and images, and how to update your existing catalog without creating duplicates. We’ll also cover the errors that trip people up most often, and where the built-in tool genuinely runs out of road. So, let’s get started!
Table of Contents
What Are Your Options To Import WooCommerce Products?
There are three ways to import WooCommerce products into your store: the built-in CSV importer, a third-party import plugin, or a direct database import. For the large majority of stores, the built-in importer is the right answer. It’s free, it ships with WooCommerce, and it covers simple products, variable products, categories, tags, and image URLs without any extra software.
| Method | Best For | File Formats | Cost | Skill Level |
|---|---|---|---|---|
| Built-in WooCommerce importer | Most stores, one-off and recurring manual imports | CSV only | Free | Beginner |
| Third-party import plugin | Scheduled imports, supplier feeds pulled from a URL or FTP | Varies by plugin | Paid | Beginner to intermediate |
| Direct database import (SQL) | Developer-run migrations | SQL | Free | Advanced (developer only) |
Direct database imports are technically possible, but they carry real risk. One wrong query can corrupt your product data, and there’s no undo button. Only take that route with a developer running the migration and a full database backup in place.
What We’ve Seen: A pattern we see constantly in support tickets and forums is store owners deciding the built-in importer “doesn’t work” after a single failed run. In most cases the importer was fine and the CSV was the problem: a stray comma, the wrong product type value, or a file saved in the wrong encoding. Fixing the file solves it far more often than switching tools does.
How To Import WooCommerce Products With The Built-In Importer
To import WooCommerce products with the built-in importer, go to Products > All Products in your WordPress dashboard and click the Import button at the top of the page. Upload your CSV file, map your columns to WooCommerce product fields on the next screen, then run the importer. The whole flow takes four steps and no additional plugins.
Steps to run the import
- In your WordPress dashboard, go to Products > All Products.
- Click Import at the top of the page to open the product CSV importer.
- Choose your CSV file. If your file is too large to upload through the browser, open Advanced options and enter a server file path instead.
- Check Update existing products if this file should update your catalog rather than add to it.
- Review the Column Mapping screen, then click Run the importer.
On the Column Mapping screen, WooCommerce reads your header row and suggests a match for each column. Standard headers like Name, SKU, and Regular price map automatically. Anything it doesn’t recognize defaults to “Do not import,” so scan the list before you run it.
What the built-in importer handles
- Simple, variable, external, and virtual products: set the product type in the Type column and the importer builds the right structure.
- Variations: imported as their own rows and attached to a parent product.
- Categories and tags: created on the fly, including nested categories.
- Featured and gallery images: downloaded from external URLs into your Media Library.
- Bulk updates by SKU or ID: existing products are matched and updated instead of duplicated.
- Custom metadata: map any unrecognized column to a custom meta key from the mapping dropdown.
How To Format Your CSV File
Your CSV needs to be saved as UTF-8 with a header row, one product per row, and values formatted the way WooCommerce expects. This is where most failed imports actually go wrong. The importer isn’t guessing at your intent, so a column that looks fine to you can still be rejected or silently skipped.
Formatting rules that matter most
- Commas inside a value: wrap the whole field in double quotes, as defined in RFC 4180, the CSV specification. A product name like “Shirt, Blue” breaks the row without quotes.
- Quotes inside a value: double them up. A 24″ monitor is written as
"24"" monitor". - Yes/no fields: use
1and0, not “yes” and “no”. This covers Published, In stock, Featured, and Visible. - Category hierarchy: use
>to nest.Clothing > Shirts > Long sleevecreates all three levels. - Multiple values in one cell: separate with commas, then quote the field. Gallery image URLs and tags both work this way.
- Referencing an existing product: prefix the value with
id:followed by the product ID, which is how variations point at their parent.
Save it as UTF-8
Encoding problems are the quietest failure in the whole process. Your file imports, nothing errors, and then your product titles are full of question marks or mangled accented characters.
Spreadsheet apps vary in how well they preserve UTF-8 on export, and Excel in particular is known for re-encoding files on save. Google Sheets, LibreOffice, and Numbers are safer choices, and any of them will let you export a clean UTF-8 CSV.
💡 Export a handful of your existing products first and open that file. It gives you a working template with the exact column headers WooCommerce expects, which beats building one from scratch.
How To Import Variable Products In WooCommerce
Variable products import in two parts: a parent row that defines the product and its attributes, then one row per variation. The parent row uses the type variable and lists every possible attribute value. Each variation row uses the type variation and carries its own SKU, price, and stock level.
Getting this structure right is the difference between a working variable product and a pile of orphaned rows. If you’ve worked with importing variable products in WooCommerce before, the parent-then-variation pattern will look familiar.
How the CSV structure works
Here’s what the structure looks like (example data):
| Type | SKU | Name | Attribute 1 Name | Attribute 1 Values | Regular Price |
|---|---|---|---|---|---|
| variable | TSHIRT-001 | Classic T-Shirt | Color | Red, Blue, Green | |
| variation | TSHIRT-001-RED | Classic T-Shirt – Red | Color | Red | 29.99 |
| variation | TSHIRT-001-BLUE | Classic T-Shirt – Blue | Color | Blue | 29.99 |
| variation | TSHIRT-001-GREEN | Classic T-Shirt – Green | Color | Green | 29.99 |
Two details decide whether this works. The parent row’s Attribute 1 Values must list every value used by its variations, and each variation must point back at its parent, either through a shared parent SKU or an id: reference.
If your variations come through as standalone simple products, that link is what’s missing. Check the parent reference column before you assume the importer can’t handle variations.
Converting existing simple products to variable
Converting an existing simple product into a variable one takes two passes. First, run an update import that changes the product’s type to variable and adds its attributes. Then run a second import that adds the variation rows.
Trying to do both in one file is the usual reason this fails. The variations have nothing to attach to yet, because the parent isn’t a variable product at the moment they’re processed.
How To Update Existing Products Without Creating Duplicates
Tick the Update existing products checkbox on the upload screen. With it enabled, the importer matches each row against your catalog by product ID or SKU and updates the matching product instead of creating a second copy. Rows with no match are skipped rather than added.
That single checkbox is what stands between a clean price update and a catalog with every product listed twice. It’s also the setting people forget, then discover after the import has already run.
Best practices for update imports
- Always include a SKU or ID column: this is how rows are matched. Without one, nothing can be updated.
- Only include the columns you’re changing: a price update needs SKU and Regular price, nothing else.
- Test with 5 to 10 products first: confirm the result on a small batch before running the full file.
- Back up before large updates: an update import applies to your live catalog immediately, with no undo.
- Export first, then edit, then import: starting from a real export guarantees your structure matches.
That last one is worth building into your routine. Store Exporter Deluxe exports your catalog in CSV, TSV, XLS, XLSX, XML, and JSON, so you can pull your current product data, edit it in a spreadsheet, and feed a correctly structured file straight back into the importer.
How To Import Product Images
Put your image URLs in the Images column and the importer downloads each one into your Media Library during the import. The first URL becomes the featured image and every URL after it becomes a gallery image. Separate them with commas and wrap the whole field in double quotes.
The images have to be publicly reachable while the import runs. A URL behind a login, on a staging site, or on a server that blocks external requests will fail quietly and leave the product without an image.
One limitation worth planning around: the importer can’t set image alt text. If alt tags matter for your SEO, budget time to add them afterward, either by hand or with a bulk tool.
How To Fix Common Product Import Errors
Most failed attempts to import WooCommerce products come down to four causes: a server timeout, a file that’s too large to upload, a SKU or ID conflict, or a plugin conflict. Each has a straightforward fix, and none of them mean your data is wrong. Work through them in that order.
The import stalls or times out
PHP stops any script that runs too long. The PHP manual puts the default max_execution_time at 30 seconds through a web server, which a few thousand products will pass straight through.
The reliable fix is smaller batches. Split the file into chunks of 500 to 1,000 rows and run them in sequence. You can also raise the limit through your PHP configuration, though shared hosting often caps what you’re allowed to change.
The file is too large to upload
Browser uploads are capped by the upload_max_filesize and post_max_size PHP directives, which are commonly set well below what a full catalog export needs.
Skip the upload entirely instead. Move the CSV onto your server over FTP, then open Advanced options on the import screen and enter the file path. The importer reads it directly and the upload limit never applies.
Products duplicated or skipped unexpectedly
Duplicates almost always mean Update existing products was left unchecked. Products skipped when you expected updates usually mean the opposite problem: it was checked, but the SKUs in your file don’t match anything in your catalog.
Check for trailing spaces and inconsistent capitalization in your SKU column. Both are common in supplier files and both stop a match.
A plugin is interfering
Plugins that hook into product creation, including SEO, translation, and inventory tools, can slow an import to a crawl or reject rows outright.
Test on a staging site with non-essential plugins deactivated. If the import runs clean there, reactivate them one at a time to find the culprit.
When The Built-In Importer Isn’t Enough
The built-in importer runs manually, reads CSV only, and applies your whole file in a single pass. Those three constraints define its ceiling. If your workflow needs scheduled imports, a supplier feed pulled automatically from a URL or FTP server, or a file format other than CSV, you’ve reached the point where a dedicated import plugin earns its cost.
- No scheduling: every import is triggered by hand from the dashboard.
- No remote file pull: you can point at a file already on your server, but the importer won’t fetch one from a URL or FTP server for you.
- CSV only: XML and JSON feeds have to be converted first.
- All-or-nothing updates: an update import applies every mapped column in the file, with no per-field control.
- Minimal logging: you get a summary count, not a per-row explanation of what failed and why.
If none of those describe your store, you don’t need to buy anything. For a monthly price update or a one-time catalog load, the free way to import WooCommerce products is also the right one.
Conclusion
The free tool that came with your store handles far more than its reputation suggests. Nearly every import problem traces back to the CSV rather than the importer, which means the fix is usually in the file you’re feeding it.
Here’s a quick recap of what we covered:
- Running the built-in importer from Products > All Products > Import
- Formatting your CSV: UTF-8, quoted fields, 1/0 values, and
>for nested categories - Structuring variable products as a parent row plus variation rows
- Using Update existing products to update by SKU instead of duplicating
- Fixing timeouts, upload limits, SKU mismatches, and plugin conflicts
Start small, test on a handful of products, and keep a backup before any update run. If you’re ready to make it easier to import WooCommerce products on a schedule you control, the fastest place to start is a clean export of what you already have. See what Store Exporter Deluxe can pull from your store.
Frequently Asked Questions
How do I import products to WooCommerce?
To import WooCommerce products, go to Products > All Products and click Import to open the built-in product CSV importer. Upload your CSV file, confirm the column mapping, and run the importer. No plugin is needed, and the tool is included with WooCommerce at no cost.
What file format do you need to import WooCommerce products?
CSV is the only format the built-in importer accepts, and it needs to be saved in UTF-8 encoding. Files in XML, JSON, XLS, or TSV have to be converted to CSV first, which any spreadsheet application will do on export.
Can I import variable products to WooCommerce?
Yes, variable products import through the built-in importer using a parent row plus one row per variation. The parent row uses the type variable and lists all attribute values; each variation row uses the type variation and references its parent by SKU or ID. Converting an existing simple product to variable takes two separate import passes.
How do I update existing products without duplicates?
Check the Update existing products box before running the import. The importer then matches rows to your catalog by product ID or SKU and updates them in place, skipping any row it can’t match. Always include a SKU or ID column, otherwise there’s nothing to match on.
How do I import product images?
Add publicly accessible image URLs to the Images column, separated by commas and wrapped in double quotes. The first URL becomes the featured image and the rest become gallery images, all downloaded into your Media Library. The importer can’t set alt text, so plan to add that separately.
Can I schedule automatic product imports?
No, the built-in WooCommerce importer has no scheduling and every run is triggered manually from the dashboard. Recurring supplier feeds need a dedicated import plugin that supports cron scheduling and remote file sources.
Why does my product import keep timing out?
Import timeouts happen when the file takes longer to process than PHP’s max_execution_time allows, which defaults to 30 seconds on most servers. Split your CSV into batches of 500 to 1,000 rows and import them one after another. Raising the PHP limit works too, though shared hosting plans often cap it.











