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 column | Meta field | Transform in Textfinity |
|---|---|---|
| SKU (or ID) | id | rename; variations use their own SKU |
| Name | title | rename, or combine with Attribute 1 value(s) for variations |
| Description | description | remove from regexp to strip HTML tags |
| In stock? (1/0) | availability | conditional: In stock? is equal to 1 → add static value "in stock", otherwise "out of stock" |
| Regular price | price | add suffix " USD" (or your currency) |
| Sale price | sale_price | add suffix; leave empty when blank |
| Permalink / product URL | link | rename |
| Images (first URL) | image_link | replace from regexp: keep text before the first comma |
| Images (rest) | additional_image_link | replace from regexp: drop the first URL |
| Parent (variations) | item_group_id | rename; fall back to SKU for simple products |
| Attribute 1 value(s) = Color | color | rename |
| Attribute 2 value(s) = Size | size | rename |
| — (not exported) | brand | add static value, or merged source keyed by SKU |
| — (not exported) | condition | add static value "new" |
| Categories | google_product_category | replace 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.
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.
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.
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.
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.
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.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.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.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.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.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.
Tell us your store and channels. We reply within 24 hours.