The quickest reliable way to bulk-add or update products in WooCommerce is the built-in Product CSV importer, loaded with a UTF-8 file that matches the official schema and includes IDs or SKUs so updates merge instead of duplicating. If you need continuous, automated syncing instead of occasional bulk jobs, the REST API or a normalized product feed is the better long-term tool.
TL;DR:
- Export a store sample, preserve its headers, save the file as UTF 8 with LF line endings, and keep SKUs and IDs as plain text.
- Check Update existing products and match rows by WooCommerce ID or unique SKU; blank fields generally leave existing values unchanged during updates.
- Import variable parent products first, confirm referenced global attributes already exist, then import variations separately using the parent ID or SKU.
- WooCommerce makes the first image URL the featured image, while redirected or expiring links may fail silently; test direct URLs with one product first.
- Back up products and the database before every import; if variations disappear, check server limits, especially max_input_vars, which WooCommerce recommends raising to 3000.
Table of Contents
- Product CSV schema and formatting essentials
- Prepare your CSV: recommended editors, templates, and producing a safe file
- Step-by-step import: upload, map columns, run the importer
- Updating existing products and safe merging (IDs vs SKUs)
- Images and media: URLs, pre-upload rules, and featured image behavior
- Troubleshooting large imports and server limits
- Importing variable products and variations sequencing
- Best practices for backing up data before import
- Using third-party plugins and tools to enhance CSV import functionality
- How to import other WooCommerce entities beyond products
- When to move from CSV to programmatic syncing or a normalized feed
- JewelCloud product feed and membership: an alternative to repeated CSV work
- FAQ
- Sources
Product CSV schema and formatting essentials
WooCommerce’s Product CSV Importer and Exporter expects a specific file structure, and most failed imports trace back to formatting rather than missing data. The file must be saved as UTF-8, and we recommend LF line endings since Excel sometimes introduces encoding quirks that corrupt special characters, currency symbols, and accented product names.
A handful of columns carry the most weight in every row:
- ID: the unique WooCommerce post ID, used to match and update existing products.
- Type: simple, variable, grouped, external, virtual, or downloadable.
- SKU: your own stock-keeping unit, often more reliable than ID for repeat imports.
- Name: the product title as it appears on the storefront.
- Published: 1 for live, 0 for draft.
Boolean fields like “Featured?” or “In stock?” accept either 1/0 or true/false, but pick one convention and stay consistent across the file. Multi-value fields, such as categories or tags, need to be quoted and comma-separated, and category hierarchy uses a “>” symbol, so “Rings > Engagement Rings” tells WooCommerce exactly where a product sits in your taxonomy.
Parent and child relationships for variations or grouped products use either an id: prefix pointing to the parent’s post ID or the parent’s SKU. When WooCommerce exports its own CSV, it defaults to SKU references rather than numeric IDs, which makes SKU the more portable choice if you plan to move the file between environments or re-import it after changes.
Prepare your CSV: recommended editors, templates, and producing a safe file
Spreadsheet software matters more than people expect. Google Sheets, LibreOffice Calc, and OpenOffice Calc all handle UTF-8 export cleanly, while Excel has a long history of mangling special characters and auto-formatting numbers in ways that break SKUs or phone-style IDs.
The fastest way to get a working template is to export your own catalog first. Go to Products > All Products > Export, generate a sample file, and use its headers and formatting as your baseline for new rows.
A short sequence keeps most imports clean:
- Export a sample CSV from your existing products to confirm WooCommerce’s expected headers.
- Build new rows in Google Sheets or LibreOffice, keeping SKUs and IDs formatted as plain text, not numbers.
- Save or export as CSV with UTF-8 encoding and LF line endings.
- Remove any columns WooCommerce does not recognize, or prefix custom fields with
meta:so they map correctly. - Scan headers one more time against the Product CSV Import Schema before uploading.
That last check catches most of the avoidable errors: a renamed column, a stray space in a header, or a numeric SKU that Google Sheets quietly turned into scientific notation.
Step-by-step import: upload, map columns, run the importer
Once your file is ready, head to Products > All Products > Import. You can upload a file directly or point to a local server path if you’re working with a developer on a large migration.
The next screen is the mapping step, where WooCommerce tries to auto-match your columns to its internal fields. Review every mapping rather than trusting it blindly:
- Columns it recognizes, like Name, SKU, or Regular price, map automatically.
- Unrecognized or custom columns often default to “Do not import,” which is a safety net worth checking rather than ignoring.
- You can manually reassign any column, including pointing a mismatched header to the correct field.
- Meta fields prefixed with
meta:map automatically to custom product meta, letting you bring in jewelry-specific attributes like metal purity or gemstone weight without extra plugins.
Clicking “Run the importer” kicks off an asynchronous process that works through your file in batches behind the scenes. Don’t close the browser tab while it runs. On larger files this can take several minutes, and interrupting it mid-batch can leave your catalog partially updated.
When it finishes, WooCommerce shows an import log listing how many products were created, updated, or skipped. Skipped rows usually point to a missing required field or a type mismatch, like trying to import a variation row without its parent already present, and the log typically names the row number so you can go fix it in the source file.
Updating existing products and safe merging (IDs vs SKUs)
Updating products safely depends entirely on how WooCommerce identifies “existing.” If your CSV includes the product’s ID, WooCommerce matches on that number directly. If you’re working from an external system without WooCommerce’s internal IDs, SKU becomes your anchor instead, and it works just as reliably as long as every product already carries a unique SKU.
A few habits prevent the two most common update mistakes, duplicated products and silently skipped rows:
- Confirm “Update existing products” is checked on the import screen before running the file. Skipping this step creates new products instead of merging changes into existing ones.
- Pull a fresh export before a major update so you’re working against current SKUs and headers, not a stale template from months ago.
- Leave fields blank in your CSV when you don’t want to change them. Blank fields are generally left untouched rather than wiped.
- Use
meta:prefixed columns for custom fields you want updated alongside standard product data, such asmeta:carat_weightormeta:ring_size_range.
This matters more on jewelry catalogs than most, where a single misaligned SKU column can overwrite pricing or availability across dozens of similar-looking SKU variants in one pass.
Images and media: URLs, pre-upload rules, and featured image behavior
Image handling causes more support tickets than almost any other part of the import process. WooCommerce pulls images either from your Media Library or from a public URL listed in the CSV, and the importer documentation notes that the first URL in the Images column always becomes the featured image.
- List multiple images for a gallery as comma-separated URLs in a single cell, for example:
https://example.com/ring-front.jpg,https://example.com/ring-side.jpg. - Redirected links or cloud-storage URLs with expiring tokens frequently fail silently during import, leaving products without images.
- Alt text cannot be imported natively through the standard CSV columns, so plan to add it manually or through a dedicated media plugin afterward.
- If images aren’t showing up after import, test with a single product row first and confirm the URL loads directly in a browser before troubleing the whole batch.
Pro Tip: Pre-upload your images to the WordPress Media Library and reference the resulting library URLs in your CSV instead of linking to an external host, since Media Library URLs are far less likely to break mid-import.
Troubleshooting large imports and server limits
Most large-catalog failures aren’t CSV problems at all, they’re server configuration limits quietly truncating your file. According to WooCommerce’s own troubleshooting documentation, missing variation data and incomplete saves are commonly caused by a low max_input_vars setting rather than anything wrong with the file itself.
Check these PHP settings before blaming the CSV:
- memory_limit: too low a value can halt an import partway through.
- max_execution_time: short timeouts cause imports to freeze on large files.
- post_max_size and upload_max_filesize: both need to accommodate your file size.
- max_input_vars: a common silent culprit, since complex products with many attributes or variations can exceed the default input count.
One documented fix: WooCommerce’s guidance recommends raising max_input_vars to 3000 in php.ini or .htaccess when variation data goes missing after an otherwise successful-looking import.
If you can’t adjust server settings yourself, your host can usually make the change on request. Verify the current values any time under WooCommerce > Status > Server Environment. When a fix isn’t available quickly, splitting the CSV into smaller batches and importing during a low-traffic window is the more reliable workaround.
Importing variable products and variations sequencing
Variable products trip up more imports than any other product type, mostly because of sequencing. Combining a parent product and all its variations into a single CSV pass tends to fail or produce incomplete variation data.
- Import the parent variable product first, in its own CSV, with Type set to “variable” and its attributes defined.
- Make sure any global attributes referenced in your file already exist in Products > Attributes before importing variations.
- Run a second import for the variation rows, referencing the parent by
id:or SKU, with Type set to “variation.” - Use
attribute:pa_attributecolumns to specify which attributes apply, andattribute_data:pa_attributeorattribute_default:pa_attributeto control variation-specific defaults.
This two-step approach, outlined in WooCommerce’s variation import documentation, avoids the most common cause of half-finished variable products after a bulk upload.
Best practices for backing up data before import
A CSV import that goes wrong touches your entire catalog at once, which makes a backup non-negotiable rather than optional busywork. Before running any import larger than a handful of test rows, export your current products as a CSV and store that file somewhere outside your WooCommerce install, not just in the Media Library.
A full database backup through your hosting panel or a backup plugin gives you a second layer of protection, since a CSV export alone won’t restore deleted categories, custom meta structures, or order history if something goes wrong at a database level. If your host offers staging environments, running your first import there before touching the live site catches mapping mistakes without any customer-facing risk.
It’s also worth timestamping your backups clearly, “products-backup-2026-03-10,” so that if an import needs to be rolled back, you know exactly which version reflects the state before changes. For stores running frequent updates, a simple habit works well: back up immediately before every import, not just the first one, since even a well-tested CSV can behave differently against a catalog that’s changed since your last test run.
Keeping two to three recent backups rather than one gives you room to compare what changed if an import produces unexpected results days later, when the cause is no longer obvious from the current state alone.

Using third-party plugins and tools to enhance CSV import functionality
The built-in importer covers most standard use cases, but several situations call for additional tooling. Scheduled or recurring imports, where you need the same CSV re-imported automatically on a timer, generally require a dedicated import plugin since the native tool only runs on manual trigger.
Plugins built specifically for advanced CSV workflows typically add features like scheduled imports, conditional field mapping, support for importing from remote URLs or FTP locations, and more granular control over how duplicate SKUs are handled. These tools sit on top of WooCommerce’s existing data structure rather than replacing it, so the same schema rules around booleans, taxonomy hierarchy, and meta: columns still apply.
For stores doing heavy post-import cleanup, like rewriting descriptions or standardizing product titles across hundreds of SKUs, a bulk product page editor can shorten the work that normally follows a large import. And once products are live, understanding your export options for downstream analytics helps you track how newly imported catalog data performs without manually pulling reports.
Before adding any plugin to the mix, confirm it plays well with WooCommerce’s native importer rather than maintaining a separate, parallel import path, since running two systems against the same product data is a common source of sync conflicts.

How to import other WooCommerce entities beyond products
Products get most of the attention, but WooCommerce’s CSV tools and related plugins extend to other data types as well. Customer data can be imported through WordPress’s native user import tools or dedicated WooCommerce customer-import plugins, which typically map CSV columns to billing address, shipping address, and account email fields much like the product importer maps to SKU and price.
Order imports are less commonly built into WooCommerce core and usually require a specialized plugin, since orders carry more interdependent data, line items, taxes, shipping methods, and customer references, than a flat CSV handles cleanly on its own. If you’re migrating from another platform, exporting orders from your old system and mapping them through an order-import plugin is generally more reliable than trying to recreate order history manually.
Coupons, too, can be bulk-imported via CSV with plugins that extend the same mapping-based approach: columns for coupon code, discount type, discount amount, and usage limits. The underlying logic across all of these imports mirrors the product importer closely enough that once you’ve worked through a product CSV successfully, customer, order, and coupon imports will feel familiar rather than like learning a new system from scratch.
When to move from CSV to programmatic syncing or a normalized feed
CSV imports work well for periodic bulk jobs, but continuous updates deserve the REST API instead, since it avoids file-based timeouts and handles fine-grained changes directly. For jewelry catalogs with heavy variant complexity, a normalized data feed cuts down on the mapping errors that repeated CSV work tends to introduce.
— Anthony
JewelCloud product feed and membership: an alternative to repeated CSV work

If you’re a jewelry retailer rebuilding the same CSV every time a vendor updates their line, we built JewelCloud’s Product Feed to remove that cycle. Our structured, standardized feeds keep attributes like metal type, carat weight, and stone grading consistent across suppliers, so you spend less time fixing mismatched columns and more time merchandising.
- Vendor data arrives already normalized for jewelry’s specific attributes, not generic retail fields.
- Updates sync automatically instead of requiring a fresh export and re-import every time inventory changes.
- Our Jewelry Vendor Membership - Silver plan runs $1,500 per month for suppliers who want to distribute through the network.
For a single product launch or a one-time catalog migration, the native CSV importer remains the right tool. When vendor relationships multiply and manual mapping starts eating a predictable chunk of your week, that’s the point to look at a feed built for jewelry specifically.
FAQ
How do I import a CSV file into WordPress?
WooCommerce’s CSV import happens through Products > All Products > Import, where you upload your file, map its columns to WooCommerce fields, and run the importer. The process requires a UTF-8 encoded file and works in asynchronous batches, so avoid closing the browser tab until it completes.
How do I import a CSV file in the correct format?
Save your file as UTF-8 with LF line endings, using plain-text formatting for SKU and ID columns so numbers aren’t auto-converted by your spreadsheet tool. Match your headers against the official Product CSV Import Schema before uploading to catch mismatched or unsupported columns early.
Can you provide a CSV template for importing products into WooCommerce?
The most reliable template comes from your own store: export existing products under Products > All Products > Export and use that file’s headers as your starting point. WooCommerce’s official schema documentation also lists every supported column with examples if you’re building a file from scratch.
How do I bulk import products in WooCommerce?
Prepare a UTF-8 CSV that matches WooCommerce’s schema, including SKU, Type, and Name columns, then upload it through Products > All Products > Import and map each column before running the importer. For catalogs with thousands of SKUs, splitting the file into smaller batches avoids the server timeouts and truncation issues documented in WooCommerce’s troubleshooting guidance.
Should I use CSV import or the REST API for ongoing updates?
CSV import suits one-time bulk jobs or periodic catalog refreshes, while the REST API is built for continuous, programmatic syncing without manual file uploads. If your catalog changes daily across multiple vendors, the API or a normalized feed service typically saves more time than repeated manual imports.

