Facebook Product Feed for Shopify: Setup, Fields and Mistakes
A Facebook product feed is a file (usually XML or CSV) that lists every product you want in your Meta catalog, with its ID, title, price, availability, link and image. You host it at a URL, add it as a scheduled data source in Meta Commerce Manager, and Meta fetches it hourly, daily or weekly so your catalog powers Advantage+ catalog ads, Instagram Shopping and Facebook Shops. Most problems come from bad product data and from feed IDs that don't match the IDs your pixel sends, not from the feed format.
What the feed actually does
Meta doesn't read your Shopify store directly. Everything it shows in catalog ads, shop tabs and product tags comes from a catalog in Commerce Manager, and the catalog is filled by one or more data sources. A product feed is the most common data source for stores that want control over what Meta sees.
The feed feeds three things:
- Advantage+ catalog ads (the format previously called dynamic product ads), which show each shopper the products they viewed or similar ones.
- Facebook and Instagram Shops and product tags in posts, where those are available in your country.
- Product sets, the filtered groups of products you target in campaigns.
If the feed is wrong, every one of those is wrong too. A price that's $5 off in the feed is $5 off in your ads.
Three ways to get Shopify products into a Meta catalog
| Method | How it works | Good for | Watch out for |
|---|---|---|---|
| Shopify's Facebook & Instagram channel | Meta's sales channel app syncs products through the API | Small catalogs, stores that want Shops and checkout features | Limited control over titles, images, labels and which variants sync |
| Scheduled feed URL | A feed app or custom script publishes an XML/CSV file; Meta fetches it on a schedule | Stores that run ads seriously and need control over data | You must keep IDs consistent with your pixel |
| Manual upload or Google Sheets | You upload a file or connect a sheet | Tiny catalogs, testing | Goes stale the moment prices or stock change |
Many stores use both: the Shopify channel for the pixel and Shops, and a feed URL for an ads catalog. That works, but be careful about running two catalogs with different ID formats. Your pixel can only match one of them cleanly (more on that below).
Meta accepts CSV, TSV, RSS XML, ATOM XML and Google Sheets for feeds. A Google Shopping-format XML file is accepted as-is, which is handy because the same file can also go to Google Merchant Center, TikTok and Pinterest.
The fields Meta requires
Every item needs these. Missing any one of them gets the item rejected.
| Field | What to put in it | Common Shopify source |
|---|---|---|
id | A unique, stable ID per variant (max 100 characters) | Variant ID or SKU |
title | Product name, max 200 characters | Product title, optionally with variant |
description | Plain text about the product | Product description, HTML stripped |
availability | in stock, out of stock, preorder, available for order | Inventory quantity and policy |
condition | new, refurbished, used | Usually new |
price | Number plus ISO currency, e.g. 29.99 USD | Variant price |
link | The product page URL, ideally pointing at the variant | Product URL with ?variant= |
image_link | Direct URL to the main image | Featured or variant image |
brand | Brand name (or provide gtin/mpn) | Vendor |
Fields worth adding even though they're optional:
sale_pricefor discounted items, so ads show a strikethrough.item_group_idto tie variants of the same product together.color,size,gender,age_groupfor apparel. They improve matching and make variant filters work.google_product_categoryorfb_product_categoryto help Meta classify items.custom_label_0throughcustom_label_4(up to 100 characters each) for your own segmentation.additional_image_linkfor extra photos used in carousel and collection formats.
Fix the product data before you connect anything
The feed is only a copy of your Shopify data. Clean data in Shopify means a clean catalog.
Titles
Shoppers see your title in a small card, often cut off after 30-40 characters on mobile. Put the important words first. "Merino Crew Sweater – Navy, Men's" beats "The Everyday Classic by Northfield Knitwear".
If your Shopify titles are written for brand voice, consider using the SEO title (the "Search engine listing" field) in the feed instead. Many stores already wrote shorter, keyword-led titles there.
Descriptions
Meta wants plain text. Strip HTML, remove "Free shipping on orders over $50!" banners and size-chart tables. Keep the first two sentences descriptive, since that's what gets shown when anything is.
Images
Meta asks for at least 500 x 500 pixels and recommends 1024 x 1024 or larger. Square (1:1) images display best across Feed, Stories, Reels and Shops. Common trouble spots:
- Tall portrait photos (4:5 or 2:3 fashion shots) get cropped awkwardly in square placements.
- Lifestyle images as the featured image, where the product is a small part of the scene. Catalog ads work better with a clean product shot first.
- Text overlays like "SALE 40%" or watermarks, which can trigger rejections and look stale after the sale ends.
If your best ad image isn't your Shopify featured image, the feed should be able to send a different one per product.
Brand and GTINs
For your own products, brand can simply be your store name. For resold products, use the real manufacturer brand and include the GTIN (UPC/EAN barcode) from the Shopify barcode field. Leaving vendor as a supplier name like "Wholesale Co Ltd" makes ads look odd.
Variants
Export one item per variant, all sharing the same item_group_id. A T-shirt in 3 colors and 5 sizes becomes 15 catalog items in one group. Meta then shows the right color in ads when someone viewed the navy one.
Make the link point to the specific variant (/products/tee?variant=1234567890). Otherwise a shopper clicks a red shirt ad and lands on the default blue.
Prices and sale prices
Put the regular price in price and the discounted price in sale_price. In Shopify terms, the Compare-at price is your regular price and the variant price is the sale price. If you sell in the EU or UK and show tax-inclusive prices, make sure the feed price includes VAT too. A feed price lower than the checkout price is a fast way to get ad rejections and angry customers.
Availability
Keep sold-out items in the feed marked out of stock rather than deleting them. Meta won't advertise out-of-stock items, but keeping them preserves their history and avoids pixel events pointing at IDs that no longer exist. When they come back in stock, they're ready immediately. Remove items only if they're discontinued for good.
Setting up the scheduled feed in Commerce Manager
Once you have a feed URL, connecting it takes a few minutes:
- Open Commerce Manager and pick your catalog (or create one with the E-commerce type).
- Go to Catalog > Data sources and choose Add items.
- Choose Data feed, then the option to use a URL and schedule uploads.
- Paste the feed URL. If it's password-protected, add the credentials.
- Set the schedule: hourly, daily or weekly, plus the time and time zone.
- Pick the default currency if your file doesn't include currency on every price.
- Start the upload and wait for the first fetch to finish.
After the first fetch, open the data source and check the Issues tab. Fix anything flagged as an error first; warnings for missing optional fields can wait.
For a store with daily price or stock changes, an hourly or daily fetch is reasonable. Keep in mind the catalog is only as current as the last fetch and the last time your feed file was regenerated, so "hourly" in Commerce Manager doesn't help if the file itself updates once a day.
Make your feed IDs match your pixel
This is the mistake that breaks catalog ads without showing an obvious error.
When a shopper views a product, your Meta pixel (and Conversions API) sends a ViewContent event with content_ids. Meta looks those IDs up in your catalog to know which product to retarget. If the pixel sends 44012345678901 (a Shopify variant ID) and your feed's id is TEE-NAVY-M (a SKU), nothing matches. Your retargeting ads then fall back to generic products or don't deliver.
How to check it:
- In Commerce Manager, open the catalog and look at the Events section, which shows whether pixel events are matched to catalog items and the match rate.
- In Events Manager, open your pixel, view a recent
ViewContentevent and compare itscontent_idswith the IDs in your feed.
Shopify's Facebook & Instagram channel usually sends variant IDs, sometimes in a prefixed format depending on the channel's settings. Whatever your pixel sends, set your feed's id to the same format. Aim for a match rate well above 90%. Once you've picked an ID format, don't change it, or Meta loses the history attached to every item.
Structure the catalog so you can actually use it in ads
A feed with 3,000 products in one undivided catalog limits what you can do. Product sets and labels let you build campaigns that match how you sell.
Product sets
Product sets are filters on catalog fields: brand is X, price under 50, product type contains "dresses", custom label 0 is "bestseller". Typical sets for a fashion store:
- Bestsellers for prospecting.
- New arrivals (last 30 days) for repeat buyers.
- Clearance with a sale price set, for a separate budget.
- High margin items, for a campaign with a higher target cost.
Product sets based on Shopify collections are common, since your collections already reflect how you merchandise. You'll need the collection information in the feed (as a label or product type) to filter on it.
Custom labels
Use the five custom label slots for things Meta can't know: margin tier, season, bestseller status, price band. Keep values short and consistent ("margin_high", not "High margin items (above 60%)"). A label that changes daily is fine as long as the feed updates as often.
Selling in several countries or languages
If you sell in the US, UK and Germany, one USD catalog will show Germans dollar prices. You have two options:
- Separate catalogs per country, each with its own feed in local currency. Simple, but it multiplies setup and pixel matching.
- One catalog with country and language feeds. Your main feed holds the base data, and supplementary country feeds override price and availability for a country, while language feeds override title, description and link. Each override file uses an
overridecolumn with values likeDEfor a country orde_DEfor a language.
With Shopify Markets, the prices in country feeds should come from the market's price list (including any rounding rules), not a converted number, so the ad price matches what the shopper sees on your site.
Mistakes that cost stores the most
- Feed IDs that don't match the pixel. Check this first if catalog ads underperform.
- Two catalogs connected to the same pixel with different ID formats. Pick one catalog for ads.
- Sending every product, including samples, gift cards and wholesale-only items. Exclude them with tags or collections before they waste spend.
- Prices that differ from the checkout, usually tax, currency or an expired sale price. Meta can reject items and the account can get flagged for price mismatches.
- Portrait or lifestyle images cropped into squares. Resize to the ratio your placements use.
- A feed that updates less often than your stock changes. If you drop a product weekly and sell out in hours, a daily fetch means ads for sold-out items.
- Deleting sold-out items instead of marking them out of stock.
- Links to the parent product instead of the variant, so shoppers land on the wrong color.
- Ignoring the Issues tab after the first upload. Rejected items silently stay out of every ad.
How Awesome Feeds helps
Awesome Feeds (formerly Awesome Facebook Product Feed) turns your Shopify catalog into a Google-format XML feed URL that Meta Commerce Manager accepts as a scheduled data source, and it rebuilds the file automatically when products, prices, inventory or collections change. You can choose the product ID format to match your pixel, export compare-at prices as sale prices, pick and resize images per channel, set custom labels, and add collection IDs as internal labels for product sets. Start with creating a product feed, then follow adding it to Commerce Manager.
Don't have Awesome Feeds yet? Install it from the Shopify App Store →
Frequently asked questions
Do I need a product feed if I use Shopify's Facebook & Instagram channel?
Not necessarily. The channel syncs products to a Meta catalog for you. Stores add a separate feed when they need more control over titles, images, variants, labels or which products appear in ads. If you run both, make sure only one catalog is used for ads and its IDs match your pixel.
How often does Facebook update my product feed?
Meta fetches a scheduled feed hourly, daily or weekly, whichever you set in Commerce Manager. The catalog is only as fresh as the feed file itself, so check how often your app or script regenerates the file. You can also trigger a manual fetch from the data source page.
Why are products missing from my Facebook catalog?
The usual causes are missing required fields (often image, brand or price), images below 500 x 500 pixels, policy rejections, or the product being excluded from the feed in the first place. Open the data source in Commerce Manager and check the Issues tab, which lists each affected item and the reason.
Can I use the same feed for Facebook and Google Shopping?
Yes. Meta accepts Google Shopping-format XML, so one well-built feed can serve both Commerce Manager and Google Merchant Center. You may still want separate feeds when the channels need different images, titles or product selections.
What image size should a Facebook product feed use?
Meta's minimum is 500 x 500 pixels, and 1024 x 1024 or larger is recommended. Square images display most consistently across Feed, Stories, Reels and Shops. Avoid text overlays and put a clean product shot first.