Skip to content
Meta
Ad platforms

Meta catalog feed for Shopify

A Meta catalog powers Shops on Facebook and Instagram and the Advantage+ catalog ads that show people the products they viewed on your site. Feedflock turns your Shopify catalog into a Meta-ready feed with IDs that match your pixel and regenerates it every hour, so your ads and shop don't keep showing an old price or a size you have sold out of.

01 · ShopifyProduct in the catalog
Linen shirt SandNordlin · Men's shirtsSKU-2048 · S–XL
Price
1 290 Kč
In stock
0 pcs
When out of stock
02 · meta.xmlUpdated just now
<item>
<g:id>46123456789012</g:id>
<g:item_group_id>8812345678901</g:item_group_id>
<g:title>Linen shirt Sand</g:title>
<g:description>Soft linen shirt with a regular fit.</g:description>
<g:link>https://shop.example/products/linen-shirt-sand?variant=46123456789012</g:link>
<g:image_link>https://cdn.shop.example/files/linen-shirt-sand.jpg?v=1718000000</g:image_link>
<g:availability>out of stock</g:availability>
<g:condition>new</g:condition>
<g:price>1290.00 CZK</g:price>
<g:brand>Nordlin</g:brand>
<g:mpn>SKU-2048</g:mpn>
<g:google_product_category>Apparel &amp; Accessories &gt; Clothing &gt; Shirts &amp; Tops</g:google_product_category>
<g:product_type>Men&apos;s shirts</g:product_type>
<g:size>M</g:size>
</item>
ProductAdsShops
Linen shirt Sand
ServingServing
Mug Fjord 350 ml
PausedSold out
Trail Pro
ServingServing
Backpack Ridge 28 l
ServingServing
Soy candle Les
ServingServing
4products serving in ads
5still listed in Shops
Stock and visibility

Out of stock leaves the ad. It stays in the Shop.

Meta's availability has exactly two values (in stock and out of stock), and the feed's value decides where a product can sell: out-of-stock items stop serving in ads immediately, but stay in Facebook and Instagram Shops marked as sold out.

Feed health

Catch feed issues before Meta does.

Before every generation Feedflock checks that every field the channel requires is filled, and, on templates verified against the channel's own spec, that the values fit its rules. Most problems are fixed with one click, without editing products in Shopify.

Feed quality · meta.xml
76 / 100
To review: 4
Price without a currency on 4 productsMeta reads price as a number, a space and an ISO currency code, for example 1290.00 CZK.
Availability outside Meta's values on 6 productsMeta accepts exactly in stock and out of stock, spelled with spaces. There is no preorder or backorder value.
No brand on 9 productsWithout a brand, GTIN or MPN, Meta reports the item as missing a universal identifier.
Title over 200 characters on 3 productsMeta's limit for title is 200 characters, and it recommends keeping titles under 65 so they aren't cut off.

Setup

Live in five steps

From a bare Shopify store to a listed offer: the whole setup fits into one coffee break.

  1. Create a catalog in Commerce Manager

    Create a catalog in Meta Commerce Manager. It holds the products for both Shops and ads. For Shops, verify your store's domain in Business settings, because every item link has to point there.

  2. Install Feedflock

    Add Feedflock from the Shopify App Store. It reads your products, variants, stock and images directly through the Shopify API.

  3. Pick the Meta template

    Create a new feed and choose the Meta template. All nine required fields come mapped: id, title, description, availability, condition, price, link, image_link and brand (your Shopify vendor).

  4. Keep the IDs in line with your pixel

    The feed's id defaults to the Shopify variant ID, which is what Meta's own Shopify guidance uses. As long as your pixel sends the same values as content_ids, Advantage+ catalog ads can retarget the exact products people viewed.

  5. Add the feed URL as a data source

    In Commerce Manager, go to Data sources, add a data file and choose Use a URL. Set the currency and an hourly schedule. Feedflock always exports the full catalog, so a Replace schedule removes products you delete in Shopify.

    https://feedflock.appfleece.com/f/demo-meta/meta.xml

The feed

What the channel receives

meta.xml
<item>
  <g:id>46123456789012</g:id>
  <g:item_group_id>8812345678901</g:item_group_id>
  <g:title>Linen shirt Sand</g:title>
  <g:description>Soft linen shirt with a regular fit.</g:description>
  <g:link>https://shop.example/products/linen-shirt-sand?variant=46123456789012</g:link>
  <g:image_link>https://cdn.shop.example/files/linen-shirt-sand.jpg?v=1718000000</g:image_link>
  <g:availability>in stock</g:availability>
  <g:condition>new</g:condition>
  <g:price>1290.00 CZK</g:price>
  <g:brand>Nordlin</g:brand>
  <g:mpn>SKU-2048</g:mpn>
  <g:google_product_category>Apparel &amp; Accessories &gt; Clothing &gt; Shirts &amp; Tops</g:google_product_category>
  <g:product_type>Men&apos;s shirts</g:product_type>
  <g:size>M</g:size>
</item>
Live preview
Linen shirt Sand

Nordlin

Linen shirt Sand

1 290 Kč

Feed fields

g:id

46123456789012

g:item_group_id

8812345678901

g:title

Linen shirt Sand

g:description

Soft linen shirt with a regular fit.

g:link

https://shop.example/products/linen-shirt-sand?variant=46123456789012

g:availability

in stock

g:condition

new

g:price

1290.00 CZK

g:brand

Nordlin

g:mpn

SKU-2048

g:google_product_category

Apparel & Accessories > Clothing > Shirts & Tops

g:product_type

Men's shirts

g:size

M

The channel

Two surfaces, one catalog

One feed fills Shops on Facebook and Instagram as well as the ads that run on both, so a product update reaches every surface at once.

Retargeting built on viewed products

Advantage+ catalog ads show people the exact items they looked at in your store. That works because the IDs in your feed match the content_ids your pixel sends.

Sold out leaves the ad, not the shop

Once the feed says out of stock, the item stops serving in ads straight away. In Shops it stays listed as sold out for 56 days, so a quick restock doesn't cost you the listing.

The feed

  • The Meta template maps all nine required fields from Shopify, from id and price to brand
  • id defaults to the Shopify variant ID, the value Meta's Shopify guidance names and most pixels send, so variants never share an ID and retargeting lines up
  • One item per variant grouped by g:item_group_id. Each item links to its own variant, and size, colour and material come from your Shopify options
  • Compare-at prices are used only when they're higher than the selling price. g:price keeps the regular price and g:sale_price carries the discount, so Meta never ignores a sale
  • quantity_to_sell_on_facebook goes out only for tracked variants that stop selling at zero. Everything else counts as unlimited, the same way Meta's own Shopify sync treats it
  • Delivery options become g:shipping blocks priced per product, so a 'free above X' rate earns Meta's free-delivery overlay on the products that qualify
  • A readiness check reports wrong availability values, price formats and over-long titles before Meta does, and fetch tracking warns you if Meta stops downloading the feed

Deep dive

01

How Meta reads the feed

  • Commerce Manager fetches a data file from a URL hourly, daily or weekly, on the schedule you choose
  • The format is Google's: RSS 2.0 with the g: namespace, one item per variant
  • A Replace schedule treats the file as the full catalog, so anything missing from it is deleted
  • Feedflock hosts the file on a stable URL and regenerates it every hour
Technical details

Commerce Manager fetches a data file from a URL hourly, daily or weekly, on the schedule you choose, and you can request an update at any time. Meta has no XML dialect of its own. It reads Google's RSS 2.0 with the g: namespace, using the same field names, with one item element per variant.

Feedflock hosts the file on a stable URL and regenerates it every hour, so an hourly fetch always picks up current prices and stock. Because the export always contains the whole catalog, a Replace schedule keeps Meta in step with Shopify, and products you remove disappear from the catalog too.

02

The fields Meta requires

  • Nine required fields: id, title, description, availability, condition, price, link, image_link and brand
  • Availability takes exactly two values, in stock and out of stock, spelled with spaces
  • Price is a number, a space and an ISO currency code, with one currency per file
  • Brand can be replaced by gtin or mpn. Only an item with none of the three is flagged
Technical details

Nine fields are required: id, title, description, availability, condition, price, link, image_link and brand. Availability takes exactly two values, in stock and out of stock. Meta has no preorder or backorder state. Price is a number, a space and an ISO currency code, with one currency per file.

In place of brand, Meta also accepts gtin or mpn, and only an item with none of the three is flagged as missing a universal identifier. Feedflock fills brand from your Shopify vendor, gtin from the barcode and mpn from the SKU.

03

Variants, IDs and the pixel

  • Variants of one product share g:item_group_id, and each links to its own variant page
  • Every variant in a group carries the same set of variant attributes in a unique combination
  • A repeated id makes Meta ignore every item that shares it, so one shared SKU can take out a whole group
  • Keep id equal to the content_ids your pixel sends and retargeting holds together
Technical details

Variants of one product share g:item_group_id, and every variant in the group carries the same set of variant attributes, such as size, colour or material, in a unique combination. A different image alone does not make a variant. Variants may share the plain product title, because Meta tells them apart by their attributes.

The id must never repeat. When it does, Meta ignores every item that shares it, which is why Feedflock defaults to the Shopify variant ID rather than a SKU that may be reused. Keep it equal to the content_ids your pixel sends and retargeting holds together. Meta re-downloads an image only when its URL changes, and Shopify's versioned image URLs take care of that for you.

04

Ads and Shops from the same file

  • Shops need a size for items in clothing, shoe and costume categories
  • Without one, the item is hidden from the shop but can still run in ads
  • quantity_to_sell_on_facebook covers checkout on the platform; when it's empty, an in-stock item counts as unlimited
  • g:shipping with a price of 0 unlocks the free-delivery overlay in ads
Technical details

Shops on Facebook and Instagram ask for more than ads do. Items in clothing, shoe and costume categories need a size, and an item without one is hidden from the shop even though it can still run in ads. quantity_to_sell_on_facebook tells checkout on the platform how many units you can sell. When it's empty, an in-stock item counts as unlimited. Images should be at least 500 × 500 px, and square works best in Shops.

The g:shipping block drives the free-delivery overlay in Advantage+ catalog ads, which appears when the delivery price for a country is 0. Checkout shipping for Shops is set separately in Commerce Manager's shipping profiles. Sale prices go to g:sale_price, which Meta shows only when it's lower than g:price.

The takeaway

One URL, an hourly refresh and a template that already speaks Meta's catalog format, with IDs that match your pixel. Your Shopify catalog stays the single source of truth, and Meta always shows its current state.

Claude · ChatGPT

Or set up your Meta feed in chat

Connect Feedflock to Claude or ChatGPT and ask. It creates the feed as a draft, maps your categories to Meta's own tree and tells you what is still missing. You approve every change.

feedflock · mcp

Create a Meta feed for my store and map my categories.

I'll create it as a draft and show you each change before I make it.

FAQ

No. One catalog serves Shops and ads on both platforms, and the same feed fills it.
Hourly, daily or weekly, depending on the schedule you set on the data source, and you can request an update at any time. Feedflock regenerates the file every hour, so an hourly fetch always picks up current prices and stock.
The Shopify variant ID, which is the template's default. It matches Meta's own Shopify guidance and what most pixels send. Use the SKU only if every variant has a unique one and your pixel sends SKUs, because a repeated ID makes Meta ignore every item that shares it.
The feed sends availability as out of stock. The item stops serving in ads immediately and stays in Shops marked as sold out for 56 days before it's hidden. If you restock within that window, the listing comes straight back.
A feed gives you control over which fields go out, which products are excluded and how values are rewritten. Don't let two full sources fight over the same catalog. Meta documents a hybrid setup where the feed is the primary source and the Shopify sync only updates price, availability and quantity. That works because the feed's id is the Shopify variant ID, which is Feedflock's default.
Yes. Filter by collection, tag, price or stock level, or exclude individual variants, for example sizes you do not want to advertise.

Get on every marketplace that matters this afternoon.

Install free, connect your first feed in minutes, and let Feedflock keep it fresh and validated.

.myshopify.com