Integration

WooCommerce + Meta catalog

WooCommerce exports products one way, Meta Commerce Manager wants them another. This page shows which WooCommerce columns feed which Meta fields, what breaks in between (variations, HTML descriptions, 'in stock' spelling, categories) and how to keep the catalog refreshed without a plugin on your WordPress install.

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

At a glance

  • Meta requires id, title, description, availability, condition, price, link, image_link and brand (or gtin/mpn) for every item; variants also need item_group_id.
  • WooCommerce has no 'Brand' or 'Condition' column in its standard export, and its availability is a 1/0 'In stock?' flag, not Meta's 'in stock' text.
  • Textfinity reads a WooCommerce CSV export URL or a Google-format XML feed URL (no WordPress plugin), maps it to Meta's spelling and publishes a feed URL that Commerce Manager fetches hourly, daily or weekly.
  • We set the feed up in Textfinity for you and add its URL to your catalog in Commerce Manager with you, through access to your business portfolio or on a short call.

What WooCommerce exports and what Meta wants

WooCommerce's built-in exporter (Products → Export) produces a CSV with one row per product and one per variation, in the store's own vocabulary: Name, Regular price, Sale price, In stock?, Stock, Categories, Images, Parent, Attribute 1 name. A feed plugin would rename those on the server; Textfinity does the same job from the export URL, so WordPress stays untouched.

Meta's spec is stricter than it looks: plain text only, availability is the literal phrase 'in stock' or 'out of stock', price is a number plus an ISO currency code ('24.99 USD'), and the link must sit on the business's own domain. The table is the mapping for a typical store.

WooCommerce columnMeta fieldTransform in Textfinity
SKU (or ID)idrename; variations use their own SKU
Nametitlerename, or combine with Attribute 1 value(s) for variations
Descriptiondescriptionremove from regexp to strip HTML tags
In stock? (1/0)availabilityconditional: In stock? is equal to 1 → add static value "in stock", otherwise "out of stock"
Regular pricepriceadd suffix " USD" (or your currency)
Sale pricesale_priceadd suffix; leave empty when blank
Permalink / product URLlinkrename
Images (first URL)image_linkreplace from regexp: keep text before the first comma
Images (rest)additional_image_linkreplace from regexp: drop the first URL
Parent (variations)item_group_idrename; fall back to SKU for simple products
Attribute 1 value(s) = Colorcolorrename
Attribute 2 value(s) = Sizesizerename
— (not exported)brandadd static value, or merged source keyed by SKU
— (not exported)conditionadd static value "new"
Categoriesgoogle_product_categoryreplace from google sheet (substring find-and-replace: keep column A paths specific)

Meta field names, required set and value formats from Meta's catalog fields reference (developers.facebook.com), checked 2026-10-27. WooCommerce column names from the product CSV importer/exporter documentation.

Five things that break between WooCommerce and Meta

  • Variations arrive as separate rows with a Parent column. Map item_group_id from Parent and pull the variant attribute columns into color and size, otherwise Meta shows every size as a separate product.
  • Descriptions contain HTML. Meta's description field is plain text; a 'remove from regexp' transform with <[^>]+> strips the tags, and the result must stay under 9,999 characters.
  • Availability is a 1/0 flag and Meta rejects '1'. The conditional rule in the table converts it; a filter rule can exclude Stock = 0 if you prefer not to list sold-out items at all.
  • Brand and condition are not WooCommerce columns. Add a static value for single-brand stores, or join a Google Sheet (SKU → brand) as a merged source. Meta needs at least one of brand, gtin or mpn.
  • Categories are WooCommerce categories, not the Google taxonomy. Meta accepts google_product_category, so one lookup sheet from category path to Google category ID fixes the whole catalog.

How the WooCommerce catalog reaches Meta

The finished feed is a plain URL that the catalog fetches: in Commerce Manager the catalog's Data sources take a data feed with 'Use a URL', the Textfinity feed URL and a schedule (hourly, daily or weekly, times in UTC). Meta will not fetch a scheduled feed more often than once per hour. We add it with you, through access to your business portfolio or on a short call.

Textfinity re-reads the WooCommerce export on its own schedule and rebuilds the feed, so a price change in WordPress shows up on the next Meta fetch; feeds whose rules change are rebuilt within about five minutes. After the first fetch, check Diagnostics in Commerce Manager: rejected items, warnings and the active count, which should match the product explorer in Textfinity.

WooCommerce CSV to Facebook catalog without a plugin

The honest trade-off: Textfinity has no WordPress plugin, so it needs an export reachable by URL rather than API access to the store. Most shops already have one from a feed plugin or the built-in exporter saved to a public path. From there every mapping, filter and AI rewrite lives in Textfinity, a change to the Meta feed never touches WordPress, and the same export URL can feed Google Merchant Center, Pinterest and TikTok with their own mappings.

Examples

Worked examples, by situation

Three WooCommerce stores with three different problems. Each example shows the export row as it arrives and the Meta row Textfinity produces.

Fashion · Meta catalog · 1,400 variations

Variation rows become grouped items with color and size

Before

Type,SKU,Name,Parent,Attribute 1 value(s),Attribute 2 value(s),Regular price,In stock?
variation,TEE-NAVY-M,"Organic Tee - Navy, M",TEE,Navy,M,29.00,1

After

id,item_group_id,title,color,size,price,availability
TEE-NAVY-M,TEE,Organic Tee Navy M,Navy,M,29.00 USD,in stock

How we set it up

We rename Parent → item_group_id, Attribute 1 value(s) → color, Attribute 2 value(s) → size; title is one 'remove from regexp' on Name, pattern ' -|,', which turns 'Organic Tee - Navy, M' into 'Organic Tee Navy M'; In stock? goes through the conditional rule.

Home goods · Meta catalog · 350 SKUs · HTML descriptions

HTML stripped from the description, first image isolated

Before

Description: <p>Hand-thrown stoneware mug.<br>Dishwasher safe.</p>
Images: https://cdn.shop/mug-1.jpg, https://cdn.shop/mug-2.jpg

After

description: Hand-thrown stoneware mug. Dishwasher safe.
image_link: https://cdn.shop/mug-1.jpg
additional_image_link: https://cdn.shop/mug-2.jpg

How we set it up

We map description with replace from regexp (?:\s*<[^>]+>)+ to a single space, so the <br> leaves a gap between the sentences; image_link uses replace from regexp to keep everything before the first comma; additional_image_link uses the inverse pattern. Feed hygiene's URL validation flags any image that is not a well-formed URL before Meta does.

Multi-brand electronics · Meta catalog · 2,800 SKUs · EU store

Brand joined from a Google Sheet, EUR prices, sold-out items excluded

Before

SKU,Name,Regular price,Stock,In stock?,Categories
HP-4421,Noise Cancelling Headphones,149.00,6,1,Audio > Headphones

After

id,title,brand,price,availability,google_product_category
HP-4421,Noise Cancelling Headphones,Soundcore,149.00 EUR,in stock,505771

How we set it up

We add a merged source (Google Sheet keyed by SKU) that supplies brand; price gets add suffix ' EUR'; google_product_category comes from 'replace from google sheet' mapping Categories to Google IDs. A filter rule 'Stock is equal to 0' → exclude keeps sold-out products out of ads entirely, so only rows like this one, with stock, reach Meta.

Copy this plan

Plan: WooCommerce export to Meta catalog

About an hour the first time. You provide the export URL; we set up the rest in Textfinity and add the feed in Commerce Manager with you.

  1. 01

    Get a WooCommerce export URL

    Use the URL of an existing feed plugin's output, or have the built-in exporter (Products → Export) run on a schedule to a public path. CSV, or XML in a Google feed plugin's RSS format, both work.

  2. 02

    Profile the export

    Check the file's column names, fill rates and product count, and look for HTML, bad URLs and mixed values before mapping.

    What we set up: We add the export URL as the source in Textfinity and run feed hygiene on it.
  3. 03

    Create the Meta feed from the template

    The Meta template pre-names every column with Meta's spelling. Map the required nine first, then item_group_id, color and size.

    What we set up: We start the feed from the Meta Ads (Facebook + Instagram) channel template and map it with rename and combine.
  4. 04

    Fix availability, price and description

    Add the conditional rule for availability, the currency suffix on price and sale_price, and the HTML-stripping regexp on description.

    What we set up: We map availability as a static value with the condition In stock? is equal to 1, price with add suffix and description with remove from regexp.
  5. 05

    Fill brand, condition and category

    Static values for single-brand stores; a Google Sheet merged source for brand and a lookup sheet for google_product_category otherwise.

    What we set up: We join a brand sheet as a merged source and map google_product_category with replace from google sheet.
  6. 06

    Filter what should not be advertised

    Exclude drafts, out-of-stock items and anything under a price floor so Meta never sees them.

    What we set up: We add exclude filters: Published is not equal to 1; Stock is equal to 0.
  7. 07

    Add the feed in Commerce Manager

    In Commerce Manager, add a data feed to the catalog with Use a URL, paste the feed URL and choose a schedule. Then watch Diagnostics after the first fetch.

    What we set up: We add the feed URL to your catalog as a scheduled data feed, with access to your business portfolio or on a short call.

Customization tips

Make it yours

Decide whether sold-out items stay in the catalog

Sending them as 'out of stock' keeps the item IDs alive so Meta's retargeting history survives a restock; excluding them with a filter keeps the catalog small and the diagnostics quiet. Stores with fast-cycling stock usually keep them; seasonal stores exclude.

Use google_product_category rather than fb_product_category

Meta accepts either. If you already maintain a Google taxonomy lookup for Merchant Center, reuse the same sheet for Meta and you maintain one mapping instead of two. Only switch to fb_product_category if Meta's Shops require a category Google's taxonomy lacks.

Keep item ids stable across replatforming

Meta ties ad history and pixel events to the id. Map id from SKU, not from the WooCommerce numeric ID, so a WordPress migration or a re-import does not orphan every product. If SKUs are missing, feed hygiene's completeness check tells you how many before you publish.

Hourly fetch is only worth it for stock, not copy

Set Meta's schedule to hourly if stock levels change through the day; daily is enough where only titles and prices move. Textfinity's own sync schedule has to run at least as often as Meta's fetch or the extra fetches read the same file.

FAQ

Questions about woocommerce facebook catalog feed

Do I need a WooCommerce plugin to send products to a Facebook catalog?

No. Meta only needs a feed file it can fetch by URL, or a catalog linked through its API. Textfinity reads a WooCommerce CSV or Google Shopping XML export URL and produces the Meta-formatted feed, so nothing is installed in WordPress.

Which fields does Meta require in a WooCommerce product feed?

id, title, description, availability, condition, price, link and image_link for every item, plus brand (or a gtin or mpn). Variants need item_group_id and the attribute that distinguishes them (color, size). Meta rejects the whole item if a required field is missing or malformed.

Why does Meta reject my WooCommerce availability values?

WooCommerce exports 'In stock?' as 1 or 0, and Meta only accepts the words 'in stock' or 'out of stock'. Convert the flag with a conditional rule: In stock? is equal to 1 → 'in stock', otherwise 'out of stock'. The same applies to 'instock' and 'in_stock' from some plugins: Meta wants the space.

How often does Meta fetch a WooCommerce feed?

On the schedule you set in Commerce Manager: hourly, daily or weekly, never more than once an hour. Textfinity rebuilds the feed on its own schedule and within about five minutes after a rule change, so the next Meta fetch picks up the changes.

Can one WooCommerce export feed both Facebook and Instagram?

Yes. One Meta catalog serves Facebook Shops, Instagram Shopping and Advantage+ catalog ads. One Meta feed in Textfinity, added to the catalog once, serves both surfaces.

Set up for you

Send us your export URL. We'll map it to your Meta catalog.

We set up the feed in Textfinity from the Meta template and fix availability and brand once; the software re-reads WooCommerce on a schedule and Commerce Manager fetches the result, hourly if you want.

Have us build my Meta feedOr email support@textfinity.io

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