The import wizard runs in four steps. This article covers the whole path, from preparing the file to reading the result.
Before you import #
- Back up the database. An import writes to live product, order or customer tables.
- Export the same data type first. The export file shows you exactly what column names the plugin expects. Match your file to it and most problems disappear before they start.
- Test with ten rows. Import a cut-down copy, check the result in WooCommerce, then run the full file.
Preparing your file #
Accepted formats are CSV, TSV, XML and XLSX, plus ZIP for bundles.
- One header row at the top. Header names are normalised, so spaces and hyphens become underscores and capitals are lowered. Regular Price and regular_price both work.
- UTF-8 encoding. In Excel, use Save As and pick CSV UTF-8, not plain CSV.
- Keep an identifier column. ID for everything, and SKU as well for products. Without one, the plugin cannot tell whether a row is new or an update.
- Remove empty rows at the bottom of the sheet. Excel likes to leave them behind and they show up as failures.
- Duplicate header names are handled by appending a number, so two columns called Price become price and price_2. Rename them properly instead, or the second one goes somewhere you did not intend.
Step 1: Choose what to import #
Eight tiles, matching the export side. Pick the type that matches your file. Importing a product file under the Order tile does not fail gracefully, it fails confusingly.
Step 2: Method and source #
Quick import #
Reads your file as-is and matches headers to WooCommerce fields automatically. It never overwrites an existing record: rows matching something already in your store are skipped and counted as skipped.
Use it for files the plugin itself exported, and for adding new records to a store where nothing should be overwritten.
Advanced import #
Adds the filter step and the column mapping step. This is the only path that can update existing records. Use it for anything where the column names are not already an exact match, and for every price or stock update.
Pre-saved template #
Loads a mapping you saved earlier. Ideal for a supplier file that arrives in the same shape every week.
Choosing the source #
- Upload a file from your computer.
- From a URL, which must be publicly reachable.
- FTP or FTPS.
- SFTP, with a password or a private key.
- Google Sheets, shared as anyone with the link can view.
Remote sources have their own article. If your file is larger than your host’s upload limit, a URL or FTP source sidesteps that limit entirely.
Set the delimiter to match your file. Comma is standard, semicolon is common in European exports. Get this wrong and every field lands in a single column.
XML and XLSX files are converted to CSV in the background before processing, so everything after this step behaves identically regardless of what you uploaded.
Step 3: Filters #
Import filters decide which rows in your file get processed, and what happens to rows that match an existing record.
The setting that matters most is the duplicate rule, labelled per data type as If product ID already exists, If category ID already exists, and so on. Skip, Update, or Create as new. This is covered in detail in its own article, and it is the setting people most often get wrong.
The other filters mirror the export ones. Date range, product status, product type, stock status, name and slug matching. They filter rows in your file, not records in your store. Setting stock status to In Stock does not touch your out-of-stock products, it just ignores file rows that say out of stock.
Step 4: Column mapping #
Every header in your file appears beside a dropdown of destination fields, with recognised names pre-selected. Review, correct anything mismatched, and leave the dropdown empty for columns you want ignored. The mapping article covers this in depth.
Click Import when you are satisfied.
While it runs #
Small files finish in the browser. Larger ones are handed to the background processor, which means you can close the tab and the import carries on. Progress is written to the History tab as each batch completes, so refreshing History shows you where it has got to.
Reading the result #
Open the run in History and look at four numbers:
- Created. New records added.
- Updated. Existing records overwritten.
- Skipped. Rows deliberately ignored, usually because a record already existed and your duplicate rule said Skip.
- Failed. Rows that could not be processed. An import can finish with a successful status and still have failures, so check this number rather than trusting the status alone.
Turn on Generate Import Log under Settings before a run you expect to have problems, and the log tells you which row failed and why.
Importing orders #
Two things behave differently for orders.
WooCommerce transactional emails are suspended for the duration of an order import, so importing two years of history does not email your customers about orders they placed long ago.
Order totals are read from your file rather than recalculated from the line items. If the total column is blank, the order arrives with a zero total even though the products are attached correctly. Keep the totals columns populated.
Import order for a full migration #
Categories, then tags, then products, then customers, then coupons, then orders, then reviews. Each stage references the ones before it. A bundle import applies this ordering automatically.