Template
Facebook catalog feed template
The columns Meta requires in a product catalog feed, the optional ones that make Advantage+ catalog ads and Instagram Shopping work properly, example rows from four kinds of store, a CSV you can upload to Commerce Manager, and a plan to keep it filled from your own catalog instead of a spreadsheet.
We connect your store, build the feed and keep it in sync. Updated 2026-10-27.
At a glance
- Nine columns are required for every item: id, title, description, availability, condition, price, link, image_link and brand, plus google_product_category or fb_product_category.
- Availability is written with a space (in stock, out of stock), unlike Google's in_stock; price is a number, a space and the currency code (49.00 USD).
- Variants share item_group_id and differ in color, size, material or pattern; Instagram Shopping needs size for clothing and shoes.
- Commerce Manager accepts CSV, TSV, RSS XML, Atom XML and Google Sheets, uploaded once or fetched from a URL on a schedule.
- Textfinity's Meta channel template pre-fills these headers and publishes the file on a URL that Commerce Manager fetches on a schedule; we add that URL to your catalog with you.
What a Facebook catalog feed template needs
A Meta catalog feed is a flat file with one row per item and Meta's field names as the header row. Commerce Manager reads the headers, so spelling matters: image_link, not Image URL. The table lists the fields Meta marks as required for every item and the identifier fields it recommends. The same catalog serves Facebook ads, Instagram Shopping and Facebook Shops, so one file covers all three.
| Column | Requirement | Limit / format | Example |
|---|---|---|---|
| id | Required | Max 100 characters, unique; use the SKU | DRS-2210-BLK-M |
| title | Required | Max 200 characters, 65 recommended | Linen Wrap Dress, Black, M |
| description | Required | Max 9,999 characters, plain text, no links | Midi wrap dress in washed linen with a tie waist. |
| availability | Required | in stock, out of stock | in stock |
| condition | Required | new, refurbished, used | new |
| price | Required | Number, space, ISO 4217 code | 89.00 USD |
| link | Required | http(s) URL on your own domain | https://store.example/products/linen-wrap-dress |
| image_link | Required | JPEG or PNG, min 500 × 500 px, max 8 MB | https://cdn.example/drs-2210-blk.jpg |
| brand | Required | Max 100 characters | Marlowe |
| google_product_category | Required unless fb_product_category is set | Google taxonomy name or ID | Apparel & Accessories > Clothing > Dresses |
| fb_product_category | Required unless google_product_category is set | Meta taxonomy name or ID | clothing & accessories > clothing > dresses |
| gtin | Recommended | UPC, EAN, JAN, ISBN-13 or ITF-14, digits only | 0193456789012 |
| mpn | Recommended | Max 100 characters | 2210-BLK |
| product_type | Optional | Max 750 characters, your own path | Women > Dresses > Midi |
Field names and limits from Meta's catalog field reference for the Marketing API, checked 2026-10-27.
Variant, sale and inventory columns for Instagram Shopping and catalog ads
Meta marks the next group as required where applicable: every item that comes in sizes or colors must carry item_group_id and the attribute that varies, and anything on sale needs sale_price. Inventory and status columns matter only if you sell through Facebook or Instagram Shops with checkout.
| Column | When required | Limit / format | Example |
|---|---|---|---|
| item_group_id | Items with variants | Max 100 characters, same for all variants | DRS-2210 |
| color | When it distinguishes variants | Max 200 characters, words not hex codes | Black |
| size | Clothing and shoes in Shops; sized variants | Max 200 characters, no word size | M |
| gender | Gender-specific items | female, male, unisex | female |
| age_group | Age-specific items | adult, all ages, teen, kids, toddler, infant, newborn | adult |
| material | When it distinguishes variants | Max 200 characters | Linen |
| pattern | When it distinguishes variants | Max 100 characters | Solid |
| sale_price | Items on sale | Lower than price, same format | 69.00 USD |
| sale_price_effective_date | Timed sales | ISO 8601 start/end separated by / | 2026-11-27T00:00-05:00/2026-11-30T23:59-05:00 |
| quantity_to_sell_on_facebook | Shops with checkout | Whole number | 12 |
| status | Optional | active, archived (older feeds use visibility) | active |
| additional_image_link | Recommended | Several URLs separated by commas, quoted | "https://cdn.example/a.jpg,https://cdn.example/b.jpg" |
| custom_label_0 … custom_label_4 | Optional | Max 100 characters each | bestseller |
| rich_text_description | Optional | Max 9,999 characters, limited HTML | <p>Washed linen…</p> |
Meta product catalog CSV template versus XML
Commerce Manager takes CSV, TSV, RSS 2.0 XML, Atom 1.0 XML and a Google Sheet. The CSV is the easiest to inspect and to fix by hand; XML is what most platform plugins produce. Both carry the same field names, so a feed tool can emit either. In CSV, quote any field that contains a comma, and quote the whole list of additional image links.
If you already publish a Google Shopping feed, most of its columns are reusable; the differences are the availability spelling (in stock, not in_stock), the description length, and the Meta-only fields such as fb_product_category and quantity_to_sell_on_facebook. The same dress as a CSV row looks like this:
meta-catalog.csv (header and one row)
id,title,description,availability,condition,price,link,image_link,brand,google_product_category,item_group_id,color,size
DRS-2210-BLK-M,"Linen Wrap Dress, Black, M","Midi wrap dress in washed linen with a tie waist.",in stock,new,89.00 USD,https://store.example/products/linen-wrap-dress?variant=blk-m,https://cdn.example/drs-2210-blk.jpg,Marlowe,Apparel & Accessories > Clothing > Dresses,DRS-2210,Black,MInstagram Shopping catalog template: what changes
Instagram Shopping and Facebook Shops read the same catalog as the ads, with stricter rules on a few fields. Product tags on posts and Reels need an active item with an image on a plain background, and sized apparel must carry size so the variant picker works. If checkout runs on Meta rather than your site, quantity_to_sell_on_facebook controls what can be bought and status lets you hide an item without deleting it, which keeps its tag history. Items that are out of stock show as sold out in the shop and stop serving in ads, so an availability rule that follows your stock count is the single most useful line in the feed.
Textfinity treats these as the same Meta channel template. You add quantity_to_sell_on_facebook mapped from the stock column and status from an advanced rule, and the file serves ads, the Facebook Shop and Instagram tags at once.
Filling the Facebook catalog feed from your store
Nobody should maintain this file in a spreadsheet past a few dozen items. Connect the store once: Shopify directly, or a CSV or Google Shopping XML export URL from WooCommerce, Magento, PrestaShop or BigCommerce. Textfinity's Meta channel template creates one output column per field above with Meta's spelling. Map id and item_group_id with rename, build the title with combine (brand, product name, color, size), add the currency to the price with add suffix, and turn your stock status into in stock or out of stock with replace from regexp or an advanced rule. A merged source joins a Google Sheet of GTINs or Meta categories onto the catalog by SKU.
The feed is published as a file on a stable URL and rebuilt on the shop's sync schedule. In Commerce Manager that URL is added to the catalog as a scheduled data source; we do it with you, through access you give us or a short walk-through. Meta then fetches the file on its own timetable, so a price change in the store reaches the catalog without anyone re-uploading.
Examples
Worked examples, by situation
Four stores, four column sets. Each example is a row you could paste into the template, with the Textfinity rule that produces it from the store's own data.
Variant row with item_group_id and size
Before
Handle,Title,Option1 Value,Option2 Value,Variant Price,Variant Inventory Qty linen-wrap-dress,Linen Wrap Dress,Black,M,89.00,12
After
id,item_group_id,title,price,availability,color,size,quantity_to_sell_on_facebook DRS-2210-BLK-M,DRS-2210,"Linen Wrap Dress, Black, M",89.00 USD,in stock,Black,M,12
How we set it up
Rename the Shopify product id onto item_group_id and the variant SKU onto id; combine product title, option 1 and option 2 into title; add suffix " USD" on the variant price; availability from the advanced rule if calc{[variant_inventoryQuantity]} > 0 then "in stock" else "out of stock" (advanced expressions name Shopify fields with underscores).
Category and product_type from the store's own taxonomy
Before
SKU,Name,Categories,Regular price,Stock status VAS-33,Stoneware Vase 33 cm,"Decor > Vases",54.00,instock
After
id,title,google_product_category,product_type,price,availability VAS-33,"Stoneware Vase 33 cm, Sand",Home & Garden > Decor > Vases,Decor > Vases,54.00 USD,in stock
How we set it up
A replace from google sheet rule maps each WooCommerce category path to the Google taxonomy name for google_product_category; it replaces substrings, so list the longest paths first. product_type is a plain rename of Categories; a two-row replace from google sheet turns instock into in stock and outofstock into out of stock.
Timed sale price
Before
sku,name,price,compare_at,sale_start,sale_end SER-30,Vitamin C Serum 30 ml,34.00,27.20,2026-11-27,2026-11-30
After
id,title,price,sale_price,sale_price_effective_date SER-30,Vitamin C Serum 30 ml,34.00 USD,27.20 USD,2026-11-27T00:00-05:00/2026-11-30T23:59-05:00
How we set it up
sale_price is a conditional rule: compare_at matches regexp ^\s*$ → leave empty, otherwise rename compare_at; sale_price_effective_date is built with the advanced DSL: [sale_start] + "T00:00-05:00/" + [sale_end] + "T23:59-05:00". Meta removes the sale automatically when the window closes, so nobody has to edit the feed on the Monday.
German catalog with hidden made-to-order items
Before
sku,titel,preis_brutto,lagerbestand,lieferzeit RNG-07,Ring Mond Silber 925,79.00,0,made to order
After
id,title,price,availability,status,condition RNG-07,"Ring Mond, Silber 925, Größe 54",79.00 EUR,in stock,archived,new
How we set it up
Prices are already gross in the export, so add suffix " EUR" is all price needs. An advanced rule sets status: if [lieferzeit] equals "made to order" then "archived" else "active", which hides the item from the shop without dropping it from the catalog. A filter rule excludes rows where titel is empty.
Copy this plan
From template to a catalog Meta refreshes on its own
Six steps. The Commerce Manager parts happen on Meta's side; everything else is one feed in Textfinity.
01
Connect your catalog
Connect Shopify directly or paste the URL of a CSV export or a Google Shopping XML feed. Textfinity profiles the columns and counts the products so you can see what the store already provides.
What we set up: We connect your Shopify store, or read the CSV or XML export URL you send us, and review the column profile with you.02
Start from the Meta channel template
The template creates every required column with Meta's spelling and the optional variant, sale and inventory columns ready to map.
What we set up: We create the feed from the Meta (Facebook + Instagram catalog) channel template.03
Map the nine required columns
Rename for id, link, image_link and brand. Combine for title. Add suffix for the currency on price. Replace from regexp or an advanced rule for availability. Pick google_product_category from a Google Sheet lookup if your store has no category field.
What we set up: We map availability with an advanced rule and google_product_category with a replace from google sheet lookup.04
Add variants and sales
Map item_group_id from the parent product id and color, size, material or pattern from the variant options. Map sale_price with the condition compare_at matches regexp ^\s*$ leaving it empty, so it disappears when the discount ends.
What we set up: We give sale_price a condition: compare_at matches regexp ^\s*$ leaves it empty, otherwise it renames compare_at.05
Filter and check hygiene
Exclude gift cards, samples and items with no image. The feed hygiene profile flags image URLs that do not resolve, mixed-language descriptions and titles that repeat the brand twice.
What we set up: We add an exclude filter where the source image column is blank (product.featuredImage.url on Shopify).06
Publish and add the URL in Commerce Manager
The feed lives on a stable URL. In Commerce Manager, create an e-commerce catalog, then add the URL as a scheduled data source. Diagnostics and item approval happen inside Commerce Manager.
What we set up: We publish the feed and add its URL to your catalog's data sources, with access you give us or on a short call where we walk you through it.
Customization tips
Make it yours
Create the catalog as an e-commerce catalog before connecting anything
Meta catalogs have a vertical set at creation. Only an e-commerce (products) catalog accepts a product feed; a catalog created for another vertical cannot be switched later. Make it in Commerce Manager first, then add the feed URL to it as a data source.
Decide whether out-of-stock items stay in the file
Filtering them out keeps the catalog small, but Meta then treats the item as deleted and loses its tag and ad history. Keeping the row with availability set to out of stock preserves history and lets the item come back the moment stock returns. For seasonal catalogs the second option is usually better.
Keep titles short enough for the ad card
Meta allows 200 characters but recommends 65, and the ad card truncates earlier on mobile. Lead with product type and the attribute that matters in the image (color, material), and leave the brand out of the title if it already shows as the Page name.
Use fb_product_category only when you have no Google category
Meta accepts either taxonomy. If you already maintain google_product_category for Google Shopping, reuse it; keeping two taxonomies in sync is a second job. Add fb_product_category only for items Google's tree does not cover well.
Change the image URL when you change the image
Meta caches images by URL and does not re-fetch an unchanged address. Platforms that version image URLs (Shopify's ?v= parameter) handle this for you; on a self-hosted store, append a version query string with add suffix when you replace product photos.
Downloads
Take the files
FAQ
Questions about facebook catalog feed template
What fields are required in a Facebook catalog feed?
For every item: id, title, description, availability, condition, price, link, image_link and brand, plus either google_product_category or fb_product_category. Items with variants also need item_group_id and the attribute that varies (color, size, material or pattern). Items on sale need sale_price. Everything else, including gtin, custom labels and quantity_to_sell_on_facebook, is optional or recommended.
What file format does Meta Commerce Manager accept for a catalog?
CSV, TSV, RSS 2.0 XML, Atom 1.0 XML and Google Sheets. You can upload a file once, schedule Meta to fetch it from a URL, or connect through the Catalog API. A CSV with Meta's field names in the header row is the simplest to build and to debug.
Can I use my Google Shopping feed for Facebook?
Mostly. Meta reads the same field names for id, title, description, link, image_link, price, brand, gtin, item_group_id, color, size and google_product_category. You need to rewrite availability (in stock rather than in_stock) and add any Meta-only fields such as quantity_to_sell_on_facebook. A feed tool with two channel templates on the same catalog handles both without a second export.
Is the Instagram Shopping catalog the same as the Facebook catalog?
Yes. Instagram Shopping, Facebook Shops and catalog ads all read one catalog in Commerce Manager. Instagram adds a few conditions: items need an approved image, clothing and shoes need size, and only active, in-stock items can be tagged in posts and Reels.
How often does Meta refresh a hosted catalog feed?
On the schedule you set for the data source: hourly, daily or weekly. The file must be reachable at that time. Textfinity rebuilds its feed on the shop's own sync schedule and within about five minutes of a mapping edit, so the URL Meta fetches is always the latest build.
Set up for you
Have us build this Meta catalog feed from your store
Send us your Shopify store or export URL. We map the columns once from the Meta template, publish the catalog on a URL Meta fetches on schedule, and add it to your Commerce Manager with you.
Tell us your store and channels. We reply within 24 hours.