WooCommerce has a built-in product importer under Products → Import. When it works, it is the quickest way to load or update a catalog from a spreadsheet. When it doesn't, the messages are short and the cause is often somewhere else: in how the file was saved, in your server limits, or in a column the importer did not recognise. This guide goes through the problems we see most often, in the order they usually appear, with a fix for each one.

Quick diagnosis: what you see and where to look

What you seeLikely causeJump to
The upload is refused, or “Invalid file type”Wrong file extension or a file that is not plain textFix 1
“Maximum size” is smaller than your filePHP upload limits on your hostingFix 2
Strange characters, or “The file is empty or using a different encoding than UTF-8”The file is not saved as UTF-8Fix 3
Every column ends up in one field on the mapping screenSemicolon or tab separated fileFix 4
Columns show “Do not import”Header names the importer does not recogniseFix 5
Rows skipped: “A product with this SKU already exists.” or “No matching product exists to update.”The “Update existing products” option does not match what you wantFix 6
Prices are empty or wrongCurrency symbols, thousands separators or the wrong decimal separatorFix 7
Stock is not updatedNo “Stock” column mapped, or text values instead of numbersFix 8
Images are missingImage URLs that WordPress cannot downloadFix 9
“Variation cannot be imported: Missing parent ID or parent does not exist yet.”Variation rows that cannot find their parent productFix 10
The progress bar stops and never finishesServer timeouts, memory limits or a firewall blocking the batchesFix 11

Before you change anything: test with five rows

Take a backup of the database first, or work on a staging copy of the store. Then copy the header row and five product rows into a new file and import only that. A five-row file imports in seconds, and the result tells you whether the problem is the file format, the mapping or one bad row. Once the small file imports cleanly, run the full file with the same settings. If you have not seen a working file yet, export two or three products under Products → Export. The export uses exactly the column names and value formats the importer expects, so it is the best template you can get.

Fix 1: The upload is refused or the file type is invalid

The importer only accepts CSV and TXT files. If you upload anything else, WooCommerce shows “Invalid file type. The importer supports CSV and TXT file formats.” and WordPress itself may refuse the upload with a message like “Sorry, you are not allowed to upload this file type.”

  • Make sure the file really is a CSV, not an .xlsx or .xls renamed to .csv. Open it in your spreadsheet program and use Save As → CSV (in Excel, choose CSV UTF-8 (Comma delimited)).
  • Check that the extension is not doubled, such as products.csv.txt, which some systems hide.
  • If your supplier sends XML, the built-in importer cannot read it at all. You need to convert it to CSV first or use a tool that reads XML directly; see how to import supplier XML into WooCommerce.

Fix 2: The file is larger than the maximum upload size

Under the file picker, WooCommerce shows “Maximum size:” followed by a number. That number comes from your server's PHP settings (upload_max_filesize and post_max_size), not from WooCommerce. You have three options:

  1. Split the file into several smaller CSVs, each with the same header row, and import them one after another.
  2. Raise the limits in your hosting control panel or ask your host to do it. Many hosts allow this per site.
  3. Use the server path option. Click Show advanced options on the first import screen. The field “Alternatively, enter the path to a CSV file on your server” lets you import a file you have uploaded by SFTP into your WordPress folder, which skips the browser upload limit.

Fix 3: Broken characters or “using a different encoding than UTF-8”

Accented letters turning into symbols, Greek or Cyrillic text disappearing, or the message “The file is empty or using a different encoding than UTF-8, please try again with a new file.” all point to the file's character encoding. Excel on Windows often saves plain “CSV” in a regional encoding rather than UTF-8.

  • Re-save the file as CSV UTF-8 in Excel, or export it from Google Sheets or LibreOffice Calc and choose UTF-8 as the character set.
  • In Show advanced options, WooCommerce has a Character encoding of the file setting. It is set to Autodetect by default; if you know the supplier's encoding, choose it there instead of re-saving.
  • If the importer warns that your server does not support the mbstring PHP extension, it will treat every file as UTF-8. Ask your host to enable mbstring, or convert the file to UTF-8 before uploading.

Fix 4: All the data lands in one column

If the mapping screen shows a single column containing the whole row, separated by semicolons, the file was saved with a semicolon delimiter. This is normal for spreadsheets set to European regional formats, where the comma is the decimal separator. Open Show advanced options and change CSV Delimiter from , to ;. For a tab separated file, the easiest fix is to re-save it as a comma separated CSV.

Fix 5: Columns are not mapped automatically

The importer recognises its own column names, the ones you see in a WooCommerce export, such as SKU, Name, Regular price, Stock, Categories and Images. A supplier file with headers like product_code, price_retail or qty will show “Do not import” next to those columns. Nothing is wrong with the file; you need to pick the matching WooCommerce field in each dropdown yourself.

  • If you import the same supplier layout regularly, keep Use previous column mapping preferences? ticked in the advanced options so your choices are remembered.
  • Columns that WooCommerce has no field for can be imported as custom fields by naming them Meta: your_field_name.
  • Leave columns you do not need on “Do not import”. Fewer mapped columns means fewer places for a bad value to break a row.

Fix 6: Rows are skipped because of the SKU or ID

When the import finishes, WooCommerce shows how many products were imported, updated, skipped or failed. Click View import log to see the reason for each skipped row. The two most common messages are opposites:

  • “A product with this SKU already exists.” You are importing in create mode, and the SKU is already in your store. If you meant to update those products, start the import again and tick Update existing products. If these are genuinely different products, give them different SKUs.
  • “No matching product exists to update.” You ticked Update existing products, and the row's ID or SKU does not match anything in the store. In update mode, WooCommerce only updates products that match by ID or SKU and skips the rest. Untick the option to create new products, or split new and existing products into two files.

Watch out for SKUs that look the same but are not: a trailing space, a leading zero removed by Excel (00123 saved as 123), or a long barcode turned into scientific notation (5.20E+12). Format SKU and barcode columns as text before you save the CSV.

Fix 7: Prices are empty, rounded or wrong

  • Remove currency symbols and thousands separators. €1.299,00 should be 1299,00 or 1299.00.
  • Use the same decimal separator as your store setting under WooCommerce → Settings → General, and check a few results after a test import.
  • Map the supplier's selling price to Regular price, not their wholesale or cost price. Supplier files often contain several price columns that all look plausible.
  • Only fill Sale price if the product is really on sale, and keep it lower than the regular price.

Fix 8: Stock does not update

In the importer, the Stock column holds the quantity and In stock? holds the status. When a row has a stock quantity, WooCommerce turns on stock management for that product; when the Stock cell is empty, stock management is turned off. So:

  • Map the supplier's quantity column to Stock and make sure it contains whole numbers, not text such as “Available” or “5+”.
  • For In stock?, use 1 for in stock and 0 for out of stock. Words like “Yes” or “In stock” are not converted.
  • If your supplier only provides a status (available or not), decide on a fixed quantity rule in your spreadsheet before importing, so that stock management behaves predictably.
  • For variable products, stock is set on the variation rows, not on the parent.

Fix 9: Images are missing after the import

The Images column takes full image URLs separated by commas. The first image becomes the product image and the rest go to the gallery. WordPress downloads each image into your Media Library during the import, so every URL has to be reachable from your server. Failures appear in the import log as “Not able to attach” or “Unable to use image”.

  • Open two or three image URLs in a private browser window. If they need a login, redirect to a page or return an error, WordPress cannot fetch them either.
  • Some suppliers block downloads from unknown servers (hotlink protection). Ask them to allow your server or to provide a downloadable image archive.
  • Very large images and slow supplier servers make each batch take longer, which can lead to the timeouts in Fix 11. Import a small file first to check how long image downloads take.

Fix 10: Variations fail or attach to the wrong product

Variable products need one row for the parent product (type variable) and one row per variation (type variation). The error “Variation cannot be imported: Missing parent ID or parent does not exist yet.” means WooCommerce could not find the parent for a variation row.

  1. Put the parent row above its variation rows in the file.
  2. Fill the Parent column of each variation with the parent's SKU, or with id:123 if you use product IDs.
  3. Give the parent its attributes with Attribute 1 name, Attribute 1 value(s) listing every option (for example S, M, L), and set Attribute 1 global to 1 if it is a global attribute.
  4. On each variation row, set the same attribute name with exactly one value that exists on the parent.

The safest template is an export of one variable product you have created by hand.

Fix 11: The import hangs or never finishes

The importer processes the file in small batches (30 rows at a time by default) through background requests from your browser. If one batch fails, the progress bar simply stops. Common causes are PHP time or memory limits, a security plugin or web application firewall blocking the repeated requests, and slow image downloads.

  • Keep the browser tab open and the computer awake until the import finishes.
  • Split the file and import it in parts. If the first part finishes, the problem is the size, not the data.
  • Ask your host to check the PHP error log at the time the import stopped, and to raise memory_limit and max_execution_time if they are low.
  • Temporarily check whether a firewall or security plugin blocked requests to admin-ajax.php during the import.
  • If one specific row always stops the batch, look at that row for unusual characters, a broken image URL or a missing parent.

When the CSV comes from a supplier every week

Most of the fixes above are one-time: once your file is saved correctly and the mapping is right, a single import works. The pattern changes when a supplier sends a new CSV (or an XML feed) every day or week. Then you repeat the cleaning, mapping and update import every time, and stock and prices are only as current as your last run. The built-in importer has no schedule and cannot fetch a file from a URL.

For that job you can keep a manual routine (export, update stock and price columns in a spreadsheet, re-import with Update existing products), described in how to auto-sync supplier stock and prices in WooCommerce, or use an import plugin or service that runs on a schedule. We compare the options fairly in our WP All Import alternative guide.

How FeedPup handles supplier CSV and XML files

FeedPup is our tool for recurring supplier feeds. You install the free FeedPup plugin from WordPress.org, connect your store, then paste the supplier's XML, CSV or TSV feed URL or upload a CSV file of up to 5 MB. Comma, semicolon and tab separated files are detected automatically, so the delimiter problem in Fix 4 does not come up. FeedPup suggests which supplier columns are titles, SKUs, prices, stock, images and categories, shows examples from your file, and you confirm each match before anything is imported. The free Basic plan lets you run a test import of up to 100 products as WooCommerce drafts, so you can check the result before paying.

Full imports and scheduled stock and price sync need a paid plan from €9.99/month, which re-reads a feed URL every 24, 6 or 2 hours depending on the plan. An uploaded file is a one-time snapshot and is not synced automatically. FeedPup only creates and updates products it imported, never deletes WooCommerce products, and if a supplier SKU already exists in your store, the new product gets a unique SKU suffix instead of overwriting yours. Plans and details are on FeedPup for WooCommerce.