Guide · WooCommerce Product Uploads

How to Bulk Upload Products to WooCommerce Without the Import Errors

To bulk upload products to WooCommerce, you prepare a CSV file with one row per product, then run it through the built-in importer at Products, All Products, Import. That is the whole process on paper. In practice it is also where most store owners lose an afternoon: the import finishes, half the rows were skipped, and the products that did import have wrong prices, missing images, or no stock status. This guide walks through the full process in order, from a clean CSV to a verified import, with the errors that break imports and the exact fix for each one.

The short version: Build your file from WooCommerce's sample CSV, never from a blank spreadsheet. One row per simple product, prices as plain numbers, SKUs unique, images as full URLs. Run a 10-row test import first, then the full catalogue. Variable products need one parent row plus one row per variation. Re-imports update by SKU or ID and do not create duplicates when the identifiers match. The built-in importer is free and covers most catalogues; a plugin such as WP All Import is worth it for supplier feeds, XML files, or scheduled updates.

1. How to bulk upload products to WooCommerce: pick your route first

There are two routes, and the choice is made by the shape of your catalogue. The built-in importer is free, already installed with WooCommerce, and reads CSV files only. It processes one file per run, has no scheduling, and cannot filter rows, so every row in the file is imported.

The second route is a plugin. WP All Import reads CSV, XML, Excel, JSON, and Google Sheets in whatever layout they arrive in, maps the columns automatically, and can pull an updated file from a URL on a schedule. If a supplier sends you a new file every week, a plugin earns its price in the first month.

2. Get the sample CSV and build your file from it

Do not start from a blank spreadsheet. WooCommerce publishes a sample product CSV with every column header spelled exactly as the importer expects, and building from it removes the most common failure: a header the importer does not recognise. In the WordPress admin, go to Products, All Products, Export, and download your current catalogue.

The columns you will actually use are a small subset of the full list: Type, SKU, Name, Published, Short description, Description, Regular price, Sale price, Categories, Tags, Images, In stock?, Stock, Weight, and, for variable products, Parent and the attribute columns. The header row must stay exactly as WooCommerce spells it, including the question marks in "In stock?" and the capitalisation of "SKU". Save the file as CSV UTF-8.

3. The CSV rules that decide whether the import works

Most import failures trace back to six rules. One row per product. A simple product is one row; a variable product is one parent row plus one row per variation, covered in section 6. Prices are plain numbers. Type 24.99, not $24.99 and not 1,299.00 with a thousands comma. Dates use YYYY-MM-DD. Sale dates go in as 2026-11-20. Multiple values in one cell are separated by commas, and the cell is wrapped in quotes. Categories, tags, and image URLs all work this way. Images are full URLs. Every image is a complete https address pointing at a file that already exists on a public server. Every row needs a Type and a Name. A row with no Type is skipped silently, and a row with no Name imports as an unnamed product.

This is the artefact of this guide: a ready-to-copy CSV template with two example rows. Paste it into a text editor, save it as products.csv, and replace the example values with your own.

Type,SKU,Name,Published,Short description,Description,Regular price,Sale price,Categories,Tags,Images,In stock?,Stock
simple,HOOD-BLK-M,Classic Black Hoodie,1,Heavyweight black hoodie.,"320gsm cotton hoodie, lined hood, kangaroo pocket.",49.99,,Clothing > Hoodies,"hoodie, black, winter",https://aamirtechs.com/wp-content/uploads/hoodie-black.jpg,1,40
simple,HOOD-GRY-M,Classic Grey Hoodie,1,Heavyweight grey hoodie.,"320gsm cotton hoodie, lined hood, kangaroo pocket.",49.99,39.99,Clothing > Hoodies,"hoodie, grey, winter",https://aamirtechs.com/wp-content/uploads/hoodie-grey.jpg,1,25

4. Prepare the data: SKUs, prices, and categories

Data preparation is the unglamorous half of a bulk upload. We have cleaned catalogues of 12,000 SKUs, and the pattern is always the same: the mess was created at upload time and paid for for years afterwards.

SKUs must be unique. A SKU is the identifier WooCommerce uses to match a re-import to an existing product. Two rows with the same SKU will collide: the second row overwrites the first, or is skipped. Run a duplicate check in the spreadsheet first.

Prices must be final. Confirm the regular price and the sale price for every row. A sale price with no regular price is ignored.

Categories must match your store structure. WooCommerce creates categories that do not exist yet. Check Products, Categories first, and spell each category exactly as it exists.

Descriptions must be complete. Every product needs a short description that sells and a full description that answers buyer questions. We handle more than 300 e-commerce support tickets a week across client stores, and many are questions the product page should have answered.

5. Run the import: the exact steps

The import itself takes minutes. Run a test import first: a 10-row test catches every systematic error while the damage is still ten products, not ten thousand.

Step 1: make a test file. Copy the first ten rows of your CSV into a separate file.

Step 2: open the importer. In the WordPress admin, go to Products, All Products, Import. You will see one file field and one checkbox, "Update existing products". Leave that checkbox unticked for a first import.

Step 3: upload and map the columns. Choose the CSV file and click Continue. WooCommerce shows a mapping screen: each column from your file on the left, a WooCommerce field on the right. Built from the sample CSV, every column maps itself. A column showing "Do not import" means a misspelled header, so fix it in the file.

Step 4: run the importer and read the summary. Click Run the Importer. The summary reports four numbers: imported, updated, skipped, and failed. If anything was skipped or failed, download the linked error log: it names the row and the reason for every failure.

Step 5: spot-check five products on the front end. Open five imported products as a customer would see them. Check the price, the image, the stock status, and the category. If the five are right, run the full file the same way. If any are wrong, fix the file, delete the test products, and run the test again.

6. Variable products: one parent row, one row per variation

Variable products are where most bulk uploads break, because they are the only case where one product is several rows. The structure is simple: one parent row that holds the product itself, plus one row per variation, linked by the Parent column.

The parent row has Type set to variable, the product Name, the categories, the descriptions, and the attribute definitions: Attribute 1 name set to Size, Attribute 1 value(s) set to S, M, L, Attribute 1 visible set to 1, and Attribute 1 global set to 1 if the attribute already exists in Products, Attributes.

Each variation row has Type set to variation, Parent set to the parent product's SKU, its own unique SKU, its own regular price, and Attribute 1 value set to the single option it represents, such as S.

Watch for two failures. If the variations appear as separate simple products on the shop page, the Parent column was blank or did not match the parent SKU. If the variations import but the size dropdown never appears, the attribute was not marked visible on the parent row.

7. Images, stock, and the fields that fail silently

Three fields fail without an error message, which makes them worse than the errors in section 8.

Images. The importer downloads each image URL into the media library during the import. The first URL in the Images cell becomes the featured image, and the rest become the gallery. If a URL returns a 404, or points at a file that needs a login, the product imports with no image and no error. Check every image URL in a browser before you import.

Stock. The "In stock?" column takes 1 or 0, and the Stock column takes the quantity. A product with "In stock?" set to 1 and no quantity imports as in stock with no quantity shown. A product with a quantity but "In stock?" set to 0 imports as out of stock and cannot be bought.

Visibility and status. The Published column takes 1 for published, 0 for draft, and -1 for private. The Visibility column takes visible, catalog, search, or hidden. A product with Published set to 1 and Visibility set to hidden imports successfully and is invisible everywhere except its direct URL.

8. Ten import errors and the exact fix for each

When an import goes wrong, the fix is almost always in the file, not in WooCommerce. Work through this list in order.

1. Invalid or duplicate SKU. Two rows share a SKU, or a row reuses the SKU of an existing product. Give every row a unique SKU, then re-import.

2. Rows skipped with no reason shown. Download the error log from the summary screen. A skipped row usually has a blank Name or a blank Type.

3. Prices import as zero. The price cell contained a currency symbol or a thousands comma.

4. Images are missing. The URLs were relative paths, local file paths, or pointed at files that do not exist. Use full https URLs.

5. Products import but are invisible. Published is set to 0, or Visibility is set to hidden. Set Published to 1 and Visibility to visible, then re-import with the update option ticked, as in section 9.

6. Variations became separate products. The Parent column was blank or did not match the parent SKU. Set Parent to the parent product's SKU on every variation row.

7. Categories are wrong or duplicated. A typo in a category name creates a new category. Check the spelling against Products, Categories.

8. A column is not recognised. The header is misspelled or uses different capitalisation. Copy the header from the sample CSV exactly.

9. The import times out on a large file. Split the file into batches of 500 to 1,000 rows and import them one at a time.

10. A re-import created duplicate products. The file had no ID or SKU matching the existing products, so the importer created new ones. Export the catalogue first so the ID column is present, and tick "Update existing products".

9. Update products in bulk without creating duplicates

A bulk upload is not only for new products. The same importer updates prices, stock, and descriptions across a whole catalogue. The rule is simple: the importer matches each row to an existing product by the ID column first, and by SKU second. If neither matches, it creates a new product, which is how duplicates happen.

Start by exporting the current catalogue from Products, All Products, Export. The exported file already has the ID and SKU columns filled, which is the whole trick: edit that file instead of building a new one. Change only the columns you need, and keep the ID column intact.

On the import screen, tick "Update existing products" before you run it. Then check the summary: the updated count should match the number of rows in your file, and the imported count should be zero. If the imported count is not zero, delete the new products, fix the IDs or SKUs, and run the update again.

10. When a plugin is worth paying for

The built-in importer covers a one-off upload of a finished CSV. It stops covering you in three situations. First, supplier feeds: if a supplier sends a new file every week in XML or Excel, converting it to CSV by hand every time is a weekly job that a plugin automates. Second, scheduled updates: if prices or stock change daily, a plugin can pull the file from a URL on a schedule. Third, scale: catalogues above roughly 5,000 products import faster through a plugin that processes the file in the background instead of in one browser request.

WP All Import is the usual choice, and current guides put its WooCommerce package at around $169 a year as a market price. Before you buy, run the free importer on a test file first: a plugin will not fix duplicate SKUs, broken image links, or prices with currency symbols.

11. Common questions

How many products can I bulk upload at once?

WooCommerce has no hard product limit. The practical limit is hosting, so split large files into batches of 500 to 1,000 rows.

Can I bulk upload products from Excel?

Not directly. The built-in importer reads CSV only, so save the spreadsheet as CSV with UTF-8 encoding first.

Does a bulk upload overwrite existing products?

Only when a row matches an existing product by ID or SKU and "Update existing products" is ticked.

Why are my product images not importing?

The most common cause is a URL the importer cannot reach: a relative path, a local file path, or a link that returns a 404. Use full https URLs to files that exist on a public server.

Can I bulk upload variable products?

Yes. Use one parent row with Type set to variable and one row per variation with Type set to variation and Parent set to the parent SKU, as in section 6.

Want the catalogue uploaded cleanly, without the import errors?

Our product upload and listing service handles the full job: data cleanup, the CSV build, variable products, images, and a verified import, with a post-import check on every product. We have cleaned catalogues of 12,000 SKUs, we have built WordPress sites since 2018 across more than 120 projects, and we handle over 300 e-commerce support tickets a week across client stores. You get a catalogue that is live, searchable, and priced correctly, not a half-imported file to debug.

Related: Product upload and listing service · WooCommerce store setup checklist · The website migration checklist · How much does it cost to fix a WordPress website?

WhatsApp Us
WhatsApp Us Discuss Your Requirements