Meta Catalog for Shopify: Channel vs Feed and Catalog Hygiene
A Meta catalog for Shopify is filled in one of two ways: Meta's free Facebook & Instagram sales channel, which syncs over an API, or a scheduled data feed URL that Commerce Manager fetches hourly, daily or weekly. The channel suits single-market stores with clean data. A feed adds filtering, custom labels and per-country prices. Either way, give each catalog only one source.
What a Meta catalog for Shopify is used for
A Meta catalog is the product database in Meta Commerce Manager that Facebook and Instagram read whenever an ad or post needs to show a specific product. On Shopify, every variant becomes one catalog item with its own ID, title, price, image, link and stock status.
You need a catalog for Advantage+ catalog ads (Meta's current name for dynamic ads), for product-based collection and carousel ads, for product tags in posts and Reels, and for Shops. Standard image and video ads run without one.
The catalog is a copy of your Shopify store, and Shopify stays the source of truth. Most catalog work comes down to two decisions: how the copy gets made, and what it should and shouldn't contain. Both are covered here. Feed field formats and the data source screens are covered in the Facebook product feed guide.
Channel or feed: how to fill the catalog
Most Shopify stores fill their catalog through either Meta's Facebook & Instagram sales channel or a scheduled data feed. Manual uploads never update, and pixel-built catalogs give you almost no control, so neither works well for a live store.
| Facebook & Instagram sales channel | Scheduled data feed | |
|---|---|---|
| How data arrives | API sync from Shopify | Meta fetches a file URL on a schedule |
| What you control | What's on the Shopify product | Every item, field and ID |
| Best for | One market, clean data, simple ads | Segmented ads, several markets, ad-specific data |
The choice comes down to how finely you'll split your advertising. Picture a candle store with 80 products that sells only in the US and runs one retargeting campaign. The channel covers it. Now picture an apparel brand with 600 products in five sizes (3,000 catalog items) that sells in the US and Canada and wants separate campaigns for high- and low-margin lines. That brand needs custom labels and per-country prices, and those come much more easily from a feed.
When the Facebook & Instagram channel is enough
The Facebook & Instagram sales channel is Meta's official Shopify app. It's free, and it connects your Business portfolio, Facebook Page, Instagram account, ad account, pixel and catalog in one setup flow. After setup it syncs every product published to the channel, and price and stock changes come through without a file to manage.
It's a good fit when all of these are true:
- You sell in one country and one currency.
- Vendor holds real brand names, variants have barcodes, and product titles already read well in an ad.
- You'll advertise nearly the whole store, and product sets built on basic fields like product type, brand or price are enough.
You choose what syncs product by product. In Shopify admin, open a product, find the Publishing card, click Manage, and include or exclude Facebook & Instagram. For many products at once, select them in the Products list and use Include in sales channels or Exclude from sales channels from the bulk actions menu.
Before you build anything else on the catalog, write down one detail. The channel creates item IDs like shopify_US_8123456789_44876123456789 (country code, product ID, variant ID), and its pixel sends that same format as content_ids. If you ever move to a feed, the feed has to produce that format too.
Signs a store has outgrown the channel
A store has outgrown the channel when the ads need data the store doesn't hold, or need it in a different shape. These are the situations that usually push Shopify merchants to a scheduled feed.
You need to leave things out by rule. The channel works product by product. A feed can export only the "Bestsellers" and "Spring" collections, skip everything tagged wholesale, or drop variants under $20 that barely cover shipping.
You want custom labels. Meta offers five free fields (custom_label_0 to custom_label_4) for your own groupings: margin_high, clearance, summer, top_50. Product sets built on these let you change what a campaign advertises without editing the campaign.
Ads need different data from the store. For example, a lifestyle photo as the main ad image while product pages keep white-background packshots, shorter titles for carousels, or SEO titles instead of long product names.
You sell in several markets. Country feeds with local prices and currency, or language feeds with translated titles, are added to one catalog as overrides.
You advertise on more than Meta. Meta accepts Google-format XML, so one feed file can also go to Google Merchant Center, and TikTok and Pinterest catalogs accept the same format.
You can't see what Meta received. With the channel there's no file to open. With a feed you can load the URL in a browser and check exactly what a product looked like at the last fetch.
The tradeoff with a feed is freshness. The catalog is only as current as the last rebuilt file. If Meta fetches hourly but the file rebuilds every three hours, the catalog can be up to three hours behind. Check both numbers.
Switching from the Facebook & Instagram channel to a feed
Moving a live catalog from the channel to a feed is safe if item IDs stay the same and only one source supplies products at any time. When retargeting drops after a switch, it's almost always because the IDs changed or items were duplicated, not because of the feed itself.
Work through it in this order:
- Record the current ID format. In Commerce Manager, open a few items in the catalog. If they look like
shopify_US_..., that's what your pixel and Conversions API events send. - Build the feed with identical IDs. Feed tools usually have a product ID setting. Pick the one that reproduces the Shopify channel format exactly, country code included, and compare a few items side by side before going further.
- Choose the catalog. Putting the feed in a new catalog gives you a clean start: connect the same pixel to it in the catalog's Events tab, rebuild your product sets, and point catalog campaigns at it, which usually means duplicating them. Reusing the channel's catalog keeps sets and history, but you first have to stop the channel from writing products, and items can drop out and come back in between.
- Stop the channel syncing products. Exclude all products from the Facebook & Instagram channel so the feed is the only source. Many stores keep the app installed for its pixel and Conversions API data sharing and just stop syncing products through it.
- Verify after the first fetch. The item count should be close to the number of variants you export, with no doubles. Match rates in the catalog's Events tab shouldn't fall.
Plan the switch for a quiet week and never right before a sale. Here's a hypothetical example: a home goods store switches to a feed with plain variant IDs on the Monday before Black Friday. Its pixel keeps sending shopify_US_... IDs. Nothing shows as an error and the campaigns keep spending, but the events no longer match catalog items, so retargeting stops showing people the products they viewed during the store's biggest week.
One catalog per store
Use one catalog per Shopify store and add markets and languages to it as country and language feeds, rather than creating a catalog per market. Separate catalogs make sense for separate stores (different brands, domains and pixels) or for a small test catalog that keeps experiments away from live campaigns.
For international prices, take them from Shopify Markets rather than converting in the feed. If a converted price is €27.43 and the market's rounding shows €27.99 on the storefront, the catalog has to say 27.99 EUR, or shoppers land on a different price than the ad showed. The Facebook product feed guide walks through override columns for country and language feeds.
Variants and item_group_id in the catalog
Every Shopify variant is its own catalog item with its own id, price, availability, image and link, and variants of one product share an item_group_id. A t-shirt in 3 colors and 4 sizes becomes 12 items in one group.
The group decides what shoppers see. With item_group_id set, Meta treats the 12 items as one product and picks a variant to show. Without it, the same shirt can appear several times in one carousel. The channel sets the group automatically. With a feed, check that item_group_id holds the Shopify product ID and stays the same across every variant.
Check how variant titles read too. Shopify's "Default Title" on single-variant products, or option strings like "Black / M / Cotton", look odd in an ad. A readable pattern is the product title plus the options that matter: "Linen Shirt, Black, M".
Use each variant's own image wherever one exists. If the link opens the red variant but the image shows the blue one, shoppers bounce and the item can be flagged for mismatch.
Should sold-out variants stay in the catalog?
In most cases, yes: keep sold-out variants in the catalog marked out of stock. Meta won't advertise them, but they keep their approval status and pixel history, and they start serving again as soon as stock comes back.
Removing items and adding them back costs you. Each returning item goes through review again and starts without its history. A shoe store that drops size 9 every time it sells out and re-adds it on restock keeps resetting that item, usually on its best-selling sizes.
Remove items completely only when they should never be advertised:
- discontinued products you won't restock
- gift cards and digital vouchers
- shipping protection, gift wrap and other add-on products
- free samples and $0 items
- B2B-only or wholesale products
- "contact us for price" products
The tidiest way to handle these is a tag (for example no-ads) or a collection you exclude in one place, instead of unpublishing products one by one.
Continue selling when out of stock and other inventory traps
When Continue selling when out of stock is turned on for a Shopify variant, customers can buy it at zero or negative inventory, and many catalog setups then report it as in stock. That's correct for some stores and a costly accident for others, so decide on purpose how those variants should show in the catalog:
in stockif a supplier ships quickly enough that the customer won't noticepreorderoravailable for orderif shipping takes noticeably longerout of stockif the setting is a leftover from an old import that nobody meant to keep
Whatever you pick, match what the product page tells shoppers. An ad that says in stock leading to a page that says "ships in 6 weeks" wastes the click.
Three more inventory situations catch Shopify stores:
Stock at locations that don't ship online. If a retail shop's inventory is counted in the total, the catalog shows items as available that the web store can't fulfill. Base catalog stock on the locations that actually ship online orders.
Preorders with no date. Meta's preorder value expects the product to ship eventually. If you also set an availability date, keep it current.
Low-stock items in prospecting. A variant with two units left can sell out mid-campaign. Some stores add a low_stock custom label and exclude it from prospecting sets so prospecting budget goes to products with depth.
Catalog images that pass Meta's checks
Meta requires catalog images of at least 500 x 500 pixels. Use 1024 x 1024 or larger in practice, and square (1:1) images display most consistently across Facebook and Instagram placements.
The image problems that come up most on Shopify stores:
- Portrait fashion photos. A 2:3 model shot gets cropped in square placements, often cutting off shoes or a hem. Pad or resize the image for the catalog rather than reshooting.
- Small variant images. Swatch-style variant images uploaded at 300 px get flagged even when the main product image is fine.
- Text and badges on the image. "50% OFF" banners, watermarks and borders draw policy flags. Put promotions in sale_price or the ad text instead.
- Images that can't be downloaded. Deleted files, hotlinked images from a supplier's server, or a store behind a password block Meta's crawler. Open the image URL in a private browser window to check.
Some brands find white-background packshots look flat in a social feed. They send a lifestyle photo as the catalog's main image and keep the packshot as an additional_image_link (Meta accepts up to 20 additional images), which a feed makes possible without changing the product page.
Reading the Issues tab in Commerce Manager
The Issues view for a catalog in Commerce Manager lists errors and warnings. Items with errors don't serve at all. Items with warnings serve with weaker or missing data. Fix errors first, then use the data source's latest upload report to see each affected item ID and the field at fault.
| Issue | Usual Shopify cause | Fix |
|---|---|---|
| Missing brand | Blank Vendor, or a supplier code in Vendor | Fill Vendor with the real brand, or your store name for private label |
| Image too small or can't be downloaded | Low-res variant images, blocked URLs | Upload larger images, check URLs load publicly |
| Price mismatch | Markets rounding, tax shown differently, stale file | Use Markets prices, align tax display, rebuild the feed |
| Duplicate items | Channel and feed writing to one catalog | One source per catalog, one ID format |
| Policy rejection | Restricted products, health claims, image overlays | Edit the product, then request another review |
| Link doesn't work | Storefront password, deleted products, geo-redirect apps | Remove the password, exclude deleted items, let Meta's crawler past redirects |
| Empty or messy description | Description held in a page builder or metafield | Put a plain-text description in the Shopify description field |
Treat policy rejections more carefully than data errors. If you think a rejection is wrong, request a review on one item first and wait for the result before appealing hundreds, because repeated violations can restrict the whole catalog or your commerce account.
Work through warnings (missing GTIN, color, size, gender) in batches, starting with your top sellers. They don't block delivery, but they weaken matching and variant display.
Pixel matching and product sets
Catalog ads only work when the content_ids your pixel and Conversions API send exactly match the catalog's id field, and you can check the match rate in the catalog's Events tab. Product sets then decide which catalog items each campaign advertises, which is why labels like margin or season have to be in the catalog data before you need them. Campaign structure built on those sets, and the ID checks to run, are in the guide to dynamic product ads on Shopify.
Before a sale, don't rely on the fetch schedule alone. Rebuild the feed after changing prices, then start a manual update on the data source in Commerce Manager, so sale prices are live before the ads go out.
How Awesome Feeds helps
Awesome Feeds builds a Google-format XML feed URL from your Shopify catalog that's updated automatically and ready to add as a scheduled data source. Its Product ID format setting can output Shopify's Facebook channel "Global" format, so moving off the channel keeps your pixel matching, and its variant export mode decides whether sold-out variants stay in as out of stock. See Product ID format and pixel matching for the steps.
Don't have Awesome Feeds yet? Install it from the Shopify App Store →
Frequently asked questions
Is the Facebook & Instagram app for Shopify free?
Yes. Meta's Facebook & Instagram sales channel is free to install and sync, and you only pay for the ads you run. Third-party feed apps that add filtering, custom labels or multi-market feeds usually charge a monthly fee.
Why isn't my Shopify catalog syncing to Facebook?
With the sales channel, the usual causes are products not published to Facebook & Instagram, items still in Meta's review, or a broken connection between the app and the catalog's Business portfolio. With a feed, check that the data source schedule is active, that the feed URL loads in a browser, and that the file was rebuilt since your last change. The latest upload report on the data source shows whether the fetch failed or individual items were rejected.
Why does my Meta catalog have fewer items than my Shopify store?
Usually because some items were rejected, excluded from the sales channel, or filtered out of the feed. Check the Issues view and the data source's latest upload report, then confirm which products are published to the channel or included in the feed export.
Why does my Meta catalog show more items than I have products?
Meta counts every variant as a separate item, so a store with 200 products in 5 sizes shows about 1,000 items. If the count is roughly double what you expect, two sources (often the channel and a feed) are writing the same products with different IDs.
Do I need a Meta catalog to run Facebook ads for a Shopify store?
No. Standard image and video ads run without a catalog. You need one for Advantage+ catalog ads, product-based collection ads, Instagram and Facebook product tags, and Shops.