Template

WooCommerce product CSV template

WooCommerce's built-in importer wants a specific set of headers, 1/0 booleans, a Parent column for variations and comma-separated image URLs. This page lists every column with its allowed values, shows a variable product laid out correctly, gives you a small CSV to start from, and explains how the same catalog becomes Google Shopping and Meta feeds afterwards, since Textfinity has no WooCommerce plugin and reads an export URL instead.

We connect your store, build the feed and keep it in sync. Updated 2026-10-27.

At a glance

  • SKU and Name are the only required columns; everything else is optional. Booleans are 1 or 0, Published is 1, 0 or -1 (draft).
  • Variable products are a parent row with Type 'variable' plus one row per variation with Type 'variation' and Parent set to the parent's SKU or id:123.
  • Images are a comma-separated list of public URLs in one quoted cell; the first becomes the featured image. Categories use ' > ' for hierarchy.
  • The importer and exporter live under Products in wp-admin; files must be UTF-8 CSV. Columns it does not recognize default to 'Do not import'.

WooCommerce product CSV columns and allowed values

These are the headers the built-in Product CSV Importer maps automatically. If you use different names, the mapping screen lets you assign them by hand, but exports from WooCommerce already use these, so keeping them means zero mapping on import.

Column headerMaps toAllowed values and notes
IDidExisting product ID; overwrites that product on import
Typetypesimple, variable, grouped, external, variation; add virtual or downloadable comma-separated
SKUskuRequired; auto-generated if missing
NamenameRequired
Publishedstatus1 published, 0 private, -1 draft
Is featured?featured1 or 0
Visibility in catalogcatalog_visibilityvisible, catalog, search, hidden
Short descriptionshort_descriptionFree text or HTML
DescriptiondescriptionFree text or HTML
Regular priceregular_priceNumber, e.g. 24.99, no currency symbol
Sale pricesale_priceNumber; blank for no sale
In stock?stock_status1 or 0
Stockstock_quantityA number enables stock management; blank disables it; 'parent' on variations
Categoriescategory_idsComma-separated; ' > ' for hierarchy, e.g. Furniture > Desks
Tagstag_idsComma-separated
Imagesimage_id, gallery_image_idsComma-separated public URLs in one quoted cell; first is featured
Parentparent_idFor variations: parent SKU or id:100
Attribute 1 nameattributesGlobal attribute name, or plain text; repeat as Attribute 2 name, etc.
Attribute 1 value(s)attributesComma-separated on the parent; a single value on each variation
Attribute 1 visibleattributes1 or 0
Attribute 1 globalattributes1 if it is a global attribute, else 0
Attribute 1 defaultdefault_attributesDefault selection on variable products
meta:your_keymeta dataPlain-text custom meta; the lowercase prefix meta: maps the key automatically

Headers and values from the WooCommerce Product CSV Import Schema and Importer & Exporter wiki pages, checked 2026-10-27.

Laying out a variable product

A variable product is one parent row and one row per variation. The parent has Type 'variable', the full comma-separated list of attribute values ('S, M, L') and no price. Each variation has Type 'variation', Parent pointing at the parent SKU, exactly one value in Attribute 1 value(s), and its own SKU, price and stock. The variation rows need no Name; WooCommerce composes one from the parent name and attribute value.

variable product, columns trimmed

Type,SKU,Name,Published,Regular price,Stock,Parent,Attribute 1 name,Attribute 1 value(s),Attribute 1 global
variable,OAK-DESK,Oak Writing Desk,1,,,,Width,"120 cm, 140 cm",1
variation,OAK-DESK-120,,1,449.00,6,OAK-DESK,Width,120 cm,1
variation,OAK-DESK-140,,1,499.00,4,OAK-DESK,Width,140 cm,1

Images, categories and the encoding mistakes

Images must be reachable by URL when the import runs; WooCommerce downloads each one into the media library. Put several in one cell, comma-separated and wrapped in double quotes, and the first becomes the featured image. Categories that do not exist are created, with ' > ' marking parent and child, so 'Furniture > Desks > Standing' makes three levels in one go.

Two encoding problems account for most failed imports. The file must be UTF-8; a CSV saved from Excel in another encoding mangles accented characters in names and descriptions. And any cell containing a comma (a description, a multi-value attribute, an image list) must be wrapped in double quotes or the importer reads the extra commas as new columns. Google Sheets and Numbers handle both correctly when you export as CSV.

From WooCommerce to a Google Shopping or Meta feed

The WooCommerce exporter produces a file you download, not a URL, and Textfinity has no WooCommerce plugin. To keep a feed in sync you need the catalog reachable by URL: a feed plugin that publishes Google Shopping XML or CSV, a scheduled export dropped on your own host, or a Google Sheet you keep current. Textfinity reads that URL on a schedule, so the first decision is which URL you will maintain.

After that the WooCommerce columns map onto channel attributes much like any CSV: Name to title, Regular price to price, Sale price to sale_price, Images (first URL) to image_link, Categories to product_type, 'In stock?' to availability through a rule, and your Parent column to item_group_id so variations group correctly. A merged source adds columns WooCommerce never had, such as GTINs from a supplier sheet.

WooCommerce column → Google Shopping attribute (mapping rules)

Name            → title        (combine with [Attribute 1 value(s)])
Regular price   → price        (add suffix " EUR")
Sale price      → sale_price   (add suffix " EUR"; leave empty if blank)
Images          → image_link   (replace from regexp: ",.*$" → "")
In stock?       → availability (condition In stock? is equal to 1: add static value "in_stock",
                                otherwise "out_of_stock"; advanced expressions cannot read a name with a space)
Parent          → item_group_id (rename)

Examples

Worked examples, by situation

Three rows from three stores, each showing a column rule that trips people up.

Furniture · WooCommerce import · 2 widths per desk

Parent and variation rows that group correctly in a feed

Before

Type,SKU,Name,Regular price
simple,OAK-DESK-120,Oak Writing Desk 120 cm,449.00
simple,OAK-DESK-140,Oak Writing Desk 140 cm,499.00

After

Type,SKU,Name,Regular price,Parent,Attribute 1 name,Attribute 1 value(s)
variable,OAK-DESK,Oak Writing Desk,,,Width,"120 cm, 140 cm"
variation,OAK-DESK-120,,449.00,OAK-DESK,Width,120 cm
variation,OAK-DESK-140,,499.00,OAK-DESK,Width,140 cm

How we set it up

Two simple products become one variable product. In the feed we map item_group_id as a rename of Parent, so Google shows one listing with a width selector, and title as a combine of Name and Attribute 1 value(s).

Food · WooCommerce import · 4 images per product · accented names

Quoted image lists and UTF-8 names

one row, columns trimmed

Type,SKU,Name,Regular price,Categories,Images
simple,CAFE-ESP-250,Café Espresso 250 g,8.90,Coffee > Espresso,"https://cdn.example/esp-front.jpg,https://cdn.example/esp-back.jpg,https://cdn.example/esp-beans.jpg"

How we set it up

Save as CSV UTF-8 so 'Café' survives. At feed time we map image_link with replace from regexp ",.*$" → "", which keeps the first URL, and additional_image_link with remove from regexp "^[^,]*,", which drops it and keeps the rest.

Electronics · WooCommerce import · 1,500 SKUs · GTINs in a supplier sheet

Adding GTINs the export does not have

Before

SKU,Name,Regular price
SL-ANC-1,ANC Over-Ear Headphones,149.00

After

id,title,price,gtin
SL-ANC-1,ANC Over-Ear Headphones,149.00 EUR,4006381333931

How we set it up

We join the supplier Google Sheet as a merged source on SKU. The gtin column then maps like any other attribute; nothing is re-imported into WooCommerce.

Copy this plan

Import the CSV, then publish feeds from an export URL

Steps one to three in wp-admin; we do four to six in Textfinity. Budget an hour.

  1. 01

    Export one product to get your store's headers

    Products → Export in wp-admin, all columns. The exported file shows the exact headers your version writes; start your template from it or from the download below.

  2. 02

    Fill the rows, one per simple product or variation

    SKU and Name on every product row; Type and Parent on variation rows; images comma-separated in quotes; Published 1 or -1 for drafts. Save as UTF-8 CSV.

  3. 03

    Import and map in wp-admin

    Products → Import → upload → check the column mapping screen → run. Tick 'Update existing products' only when the file carries IDs or SKUs you mean to overwrite. Keep the tab open until the batches finish.

  4. 04

    Publish the catalog on a URL

    Use a WooCommerce feed plugin that emits Google Shopping XML or CSV, a scheduled export placed on your host, or a Google Sheet. Textfinity needs a URL it can fetch on a schedule; it has no WooCommerce plugin.

    What we set up: We read the XML or CSV URL or Google Sheet you send us on the shop's schedule.
  5. 05

    Start from the channel template and map WooCommerce columns

    Name, Regular price, Sale price, Images, Categories, In stock? and Parent cover Google's required attributes; the template lists the rest.

    What we set up: We create the feed from the Google Shopping channel template and map each WooCommerce column as a rename, combine or conditional rule.
  6. 06

    Exclude drafts and zero stock, then publish

    Then add the feed URL to Merchant Center as a scheduled data source. Meta and TikTok feeds reuse the same shop with their own templates.

    What we set up: We add exclude filters on Published is not equal to 1 and Stock is equal to 0, then add the feed URL to your Merchant Center with you.

Customization tips

Make it yours

Put brand in a column, not in the name

WooCommerce has no brand column by default; many stores bury it in Name. A 'meta:brand' column or a global Brand attribute gives every channel a clean brand value and keeps titles buildable by rule.

Use global attributes for anything you will filter on

A global attribute (Attribute 1 global = 1) is shared across products with consistent values; plain-text attributes drift into 'Blue', 'blue ' and 'BLUE'. Feed hygiene's value-consistency check will show the drift, but it is cheaper to prevent.

Choose the export URL before you choose the plugin

A feed plugin that publishes Google Shopping XML on a URL is the least work; a scheduled export on your host is free but needs a cron job; a Google Sheet is easiest to edit by hand but someone must keep it current. All three work as a Textfinity source.

Keep Sale price blank rather than equal to Regular price

A sale price equal to the regular price makes channels show a fake discount of zero. Leave it blank and map sale_price with 'leave empty' under the condition Sale price matches regexp ^\s*$.

FAQ

Questions about woocommerce product csv template

Where is the official WooCommerce product CSV template?

WooCommerce ships sample_products.csv inside the plugin at wp-content/plugins/woocommerce/sample-data/, and keeps a copy in its GitHub repository. Any export from Products → Export also produces a file with the correct headers. The download on this page uses the same headers with three example rows.

Which columns are required in the WooCommerce product CSV?

SKU and Name. The importer generates a SKU if yours is missing, but you should supply one because variations, merged data and channel feeds all key on it. Every other column is optional.

How do I import variable products in WooCommerce from CSV?

One row with Type 'variable' carrying the attribute names and the full comma-separated value list, then one row per variation with Type 'variation', Parent set to the parent SKU (or id:123), a single attribute value, and its own SKU, price and stock.

Can I use the WooCommerce CSV export as a Google Shopping feed?

Not directly. Google expects its own headers and values (title, link, image_link, in_stock). A feed tool maps WooCommerce columns to Google's. Because the export is a downloaded file, you also need the catalog on a URL (feed plugin, hosted export or Google Sheet) for the feed to stay in sync; Textfinity reads that URL on a schedule.

Does the importer handle images from URLs?

Yes. Put one or more public URLs in the Images cell, comma-separated and wrapped in quotes. WooCommerce downloads them into the media library during import and uses the first as the featured image.

Set up for you

Have Google and Meta feeds set up from your WooCommerce catalog.

Send us your export URL or Google Sheet. We map Name, prices, Images and Parent once in Textfinity from the channel templates, and the software rebuilds the feeds on a schedule.

Get your feeds set upOr email support@textfinity.io

Tell us your store and channels. We reply within 24 hours.