Don't advertise your entire catalogue. A practical guide to product feeds.

Before anyone sees your Shopping ad, the feed has already decided everything: which products enter the auction, with what price, image and availability. This guide brings together what you need to know about the product feed: what it is, where it works, how to manage it in Merchant Center, and how (and why) to split the catalogue into groups instead of advertising everything at once.

Definition

What a product feed is and where it comes from

The feed is often treated as a technical attachment to a campaign. In practice, it is the most important file in product advertising:

Definition

A product feed is a structured list of a shop’s products (in a file such as XML or CSV, or delivered via API) in which each product is described by a set of attributes: identifier, name, price, availability, image, link and category. Advertising platforms build product ads from the feed, which is why the feed is in practice the first creative of the campaign: it decides which products enter at all and how they are presented.

Where does it come from? Most often it is generated by the shop platform or one of its modules (XML/CSV export), sometimes via API, and in larger shops from a data warehouse. Whatever the source, one rule applies: the feed must tell the truth about the shop. The price and availability in the ad must match the product page, otherwise products will be disapproved.

This is what a single feed record looks like (illustrative example, attribute names according to the Google specification):

One product in the feed · attributes and values

AttributeValueRole
idLAMP-8451-MSthe key that links everything
titleLoft table lamp, brass, E27the text the product is found by
price62.25 EURmust match the product page
availabilityin_stockcontrols whether the ad serves
image_linkhttps://…/lampa-8451.jpgthe ad’s visual creative
product_typeLighting > Table lampsyour own hierarchy for splits
brand · gtinBrand A · 5901234123457matching to the Google catalogue
custom_label_0high-marginyour label for segmentation

The last row is the most interesting: custom labels are the only attributes that describe your strategy rather than the product, and catalogue segmentation is built on them.

Ecosystem

Where the feed works: Merchant Center, Meta and other channels

One catalogue, many workplaces. The same set of products feeds different advertising systems. Each has its own format and its own management interface, but all draw on the same truth about the products:

feed.xmlfetched on a schedule
<item>
  <id>LAMP-8451-MS</id>
  <price>62.25 EUR</price>
  <availability>in_stock</availability>
  <custom_label_0>high-margin</custom_label_0>
</item> <!-- …and so on, 4,800 times -->

One file, four destinations

GoogleMerchant CenterShopping · Performance Max · free listings
MetaProduct cataloguecatalogue campaigns · FB and IG shops
MicrosoftMerchant CenterShopping campaigns in Bing
Pinterest · TikTokCataloguesproduct pins · catalogue ads

Google Merchant Center is the feed’s command centre in the Google ecosystem: from here products flow into Shopping campaigns, Performance Max and free product listings. This is also where diagnostics live: approved / disapproved statuses and the reasons for disapproval.

The Meta catalogue powers catalogue campaigns on Facebook and Instagram, as well as shops in those apps. It is managed in Commerce Manager, where you define the data source (file, scheduled fetch or API) and product sets.

Other channels work in a similar way: Microsoft has its own equivalent of Merchant Center for Shopping campaigns on Bing, while Pinterest and TikTok have their own catalogues. Good practice: one source of truth for products and format conversions per channel, instead of separately maintained files whose prices drift apart over time.

Strategy

Why not to advertise the whole catalogue at once

The default scenario in most shops looks the same: one Shopping campaign, the whole catalogue attached, a shared budget and one ROAS target for everything. The algorithm gets a contradictory task: a single target has to cover products with 50% and 9% margins, bestsellers and products without a single sale in months.

Here is how it looks on illustrative data from a home furnishings shop (one campaign across the whole catalogue, last 30 days):

One campaign · whole catalogue of 4,800 SKUs · 30 days · spend and revenue according to Google Ads · illustrative data

Product groupSKUShare of spendShare of revenue (Google Ads)Avg. margin
High margin + A turnover52018%46%48%
Low-margin bestsellers34024%27%19%
Active long tail2,61044%24%33%
Long tail with no sales for 90 days1,33014%3%–

The algorithm knows neither margin nor strategy: it optimises a shared target across everything it received in the feed. Until the catalogue is split, this table stays invisible.

The effect of a single shared budget

58% → 27%

More than half of spend (58%) lands in the long tail of the catalogue, which returns 27% of the conversion value reported by Google Ads. At the same time, the group delivering almost half of that value receives less than a fifth of the budget, because nobody separated it out.

long-tail spend: 58% long-tail conversion value (Google Ads): 27% leaders’ budget: 18%

The real risk

A campaign on the whole catalogue subsidises the weakest products at the expense of the best. Products with no margin and no turnover compete in the same auctions as the leaders, and the shared ROAS target averages out the result: the campaign “breaks even”, even though half of the budget inside it works below the profitability threshold.

The feed is more than a technical file. It is the first budget decision: it determines which products enter the auction at all, before anyone sets a bid.

Framework

How to split the catalogue: six segmentation axes

A good split comes from data, not from the category tree. Categories describe what a product is, whereas a campaign cares about how a product performs: how much margin it leaves, how fast it turns over, whether it is in stock. Six axes cover almost every case:

Segmentation axisQuestion it answersExample use in a campaign
Marginhow much is actually left from a salea separate campaign with a higher budget for high margin
Turnoverhow fast the product sellsbestsellers as the stable core of Performance Max
Stock levelwhether there is anything to selllimited delivery at low stock, stop for out-of-stock items
Price positionwhich price tier the product competes indifferent messaging and bids for premium products
Season and trendwhen the product has its momentseasonal groups switched on and off in one move
Life cyclenew arrival, core range or clearancenew arrivals with their own test budget, clearance separately

In the feed, the split is carried by custom labels (custom_label_0–4): five slots, each holding one value per product, with free-form content. A dictionary agreed in advance works best: one axis per slot, short values, no special characters or spaces:

Example label dictionary · one axis per slot

SlotAxisExample values
custom_label_0marginhigh-margin · mid-margin · low-margin
custom_label_1turnoverturnover-a · turnover-b · turnover-c
custom_label_2stock levelfull-stock · low-stock · last-units
custom_label_3price positionunder-25 · 25-75 · premium
custom_label_4season or life cyclenew · season-autumn · clearance

A label is only a carrier: a value makes sense only when a calculated number stands behind it: margin from cost of goods, turnover from sales, stock from the warehouse.

Key point

The minimum sensible start is two axes: margin and turnover. Simply crossing “high margin × high turnover” against “the rest” separates a group that deserves its own budget, and the long tail stops eating into the leaders’ spend.

Methodological note: labels based on margin, turnover and stock are calculated from shop data, so they work for every channel. A label based on ad cost per product is a different story: that granularity exists in the source data only for Google Shopping campaigns; Meta and TikTok report costs at ad level at the lowest, not at product level.

In practice · Google Merchant Center

How to split the feed in Merchant Center

In Merchant Center, splitting the catalogue comes down to one thing: every product must be given label values. There are three ways, from the simplest to the most flexible:

  1. Labels in the primary feed

    If the shop platform lets you populate custom_label_0–4, the values travel with the products. This is the simplest route, but every change to the labelling logic requires a change on the shop integration side.

  2. Supplemental feed

    A separate file or spreadsheet with two columns: id and label values. Merchant Center attaches it to the primary feed by id, overwriting nothing except the specified attributes. It is the standard way to segment without touching the shop integration.

  3. Feed rules

    Rules in Merchant Center can assign a label conditionally, for example “if price is greater than X, set custom_label_3 = premium”. They are good for simple splits based on attributes already in the feed, but they cannot replace labels calculated from sales data.

  4. Fetch schedule

    The primary and supplemental feeds should refresh at least once a day, shortly after prices and stock levels are updated in the shop. That way the split in your campaigns always reflects reality.

  5. Diagnostics per group

    Once the feed has been processed, check the statuses: how many disapproved products fall into each group. Disapproved bestsellers hurt more than a disapproved long tail, and without a split that difference stays invisible.

Practice · campaigns

How to split product campaigns in Google Ads and Meta

Labels in the feed are only potential. Money starts working differently only when the split is reflected in the campaign structure.

Google Ads and Performance Max: product groups

  1. Open the product split in the campaign

    In a Shopping or Performance Max campaign, select listing groups and split the catalogue by custom label, product type or brand.

  2. Exclude what you do not want to pay for

    The “everything else” group collects the rest of the catalogue by default. Exclude it deliberately or keep it with a separate, low bid; this is the most frequently skipped step.

  3. Split segments into separate campaigns

    Groups with different roles should have separate campaigns: leaders with a higher budget and a realistic ROAS target, the long tail with a test budget. Shared campaign = shared target = averaging.

  4. Match targets to each group’s margin

    A group with a 48% margin can tolerate a lower ROAS than a group with a 19% margin. The campaign target should follow from the group’s profitability, not from one number for the whole account.

  5. Revisit the split after every data change

    Products move between groups: a bestseller drops into the long tail, a new product becomes a leader. Reviewing labels on a regular schedule keeps the structure alive.

Meta Ads: product sets in the catalogue

  1. Create sets in the catalogue

    In Commerce Manager, define product sets using filters on feed fields: availability, price, brand, product type or custom label. A set is the equivalent of a product group in Merchant Center.

  2. Target the campaign at a set, not the catalogue

    In a catalogue campaign, choose a specific set as the product source. Using the whole catalogue as the source means the algorithm decides on its own what to promote, including products with no margin.

  3. Build exclusion sets

    A separate “unavailable and last items” set is useful as an exclusion in remarketing. Nothing irritates a customer more than an ad for a product that is no longer available.

  4. Separate sets, separate messages

    A premium set and a clearance set deserve different creatives and different bids. Splitting the catalogue also means splitting the language you use to speak to the customer.

Key point

The same labels across all channels. If custom_label_0 means “margin” in Merchant Center, the same field should mean “margin” in Meta sets. One label dictionary for the whole ecosystem means fewer mistakes and comparable results between channels.

Automation

Automatic product labelling in DataOrganizer

The hardest part of segmentation is calculating the labels, not clicking through the panels. Margin requires the unit cost per SKU, turnover requires sales history, stock requires warehouse data: three different sources that have to be combined and kept up to date. This is exactly what automated e-commerce analytics does.

DataOrganizer labels products automatically: using the shop’s connected data, it calculates margin, turnover, stock and price position for every SKU, then splits the catalogue into ready-made product groups. Values update with the daily data refresh: the “low-stock” label disappears when a delivery reaches the warehouse, and a bestseller that slows down drops out of the leaders group by itself. The result connects to Merchant Center as a supplemental feed fetched on a schedule, or exports to a file for the Meta catalogue.

AI assistant DataOrganizer app
connected sourceslast 90 days
Split the catalogue into groups by margin and turnover and prepare labels for Merchant Center.
AI
Combining unit cost, sales and stock levels…
AI

Catalogue of 4,800 SKUs split into four groups by margin (from unit cost) and turnover over the last 90 days:

GroupSKUShare of revenuecustom_label_0
High margin + A turnover52046%high-margin-turnover-a
Low-margin bestsellers34027%bestseller-low-margin
Active long tail2,61024%tail-active
Tail with no sales in 90 days1,3303%tail-90-days

The labels are ready as a supplemental feed: add its URL in Merchant Center on a daily schedule and the values will refresh along with the data. The “high margin + turnover A” group is worth moving into a separate campaign with its own target.

Download supplemental feed (CSV)Show products in group
From data. Margin, turnover and stock are calculated automatically, not by hand in a spreadsheet. Daily. Labels refresh together with the data sources. For campaigns. A supplemental feed for Merchant Center, a file for the Meta catalogue. Per source. A simple pricing model: you pay for connected sources.

The same groups can be browsed and modified by asking questions, in the app or through DataOrganizer MCP in the chat you use every day:

Claude ChatGPT Gemini CLI

Where the advantage lies

In how current the label is, not in the label itself. Manually calculated labels start ageing on the day they are uploaded. Labels calculated from connected, daily refreshed data follow the shop: when the margin or stock changes, the group changes, and the campaigns change with it.

FAQ

Frequently asked questions about product feeds

What is the difference between a primary feed and a supplemental feed?

The primary feed is the full list of products with all required attributes; it creates the products in Merchant Center. A supplemental feed does not create products: it adds or overwrites selected attributes, matching the primary feed by id. This makes it possible to add custom labels, for example, without modifying the shop integration that generates the primary feed.

How many custom labels does a Google feed have?

The Merchant Center specification provides five slots: custom_label_0 to custom_label_4, with one value per slot for each product. The values are free text; you decide what they mean. Good practice: one segmentation axis per slot and a fixed vocabulary of values without diacritics or spaces, shared across all advertising channels.

Does splitting the catalogue hurt Performance Max?

A split that is too granular can do harm: every campaign needs enough conversions for the algorithm to learn from. A safe approach is two or three data-driven groups (margin, turnover) and deliberate exclusions rather than a growing number of micro-campaigns. A data-based split on its own usually helps, because the algorithm stops averaging a single target across products with vastly different profitability.

How do you exclude out-of-stock products from ads?

The foundation is a correct availability attribute: a product marked as out_of_stock is not served in Google product ads. In Meta, a product set is restricted with an availability filter. It also pays to act in advance: a label such as low-stock lets you turn down the budget on products that are about to run out, before they disappear from the shop and from the campaigns.

How often should the product feed and labels be updated?

The feed should refresh at least once a day and after every major change in prices and stock levels, and the fetch schedule in Merchant Center is best set for the hours just after the shop data is updated. Update analytical labels (margin, turnover, stock) at the same pace as the data they are calculated from: campaign segmentation should reflect today’s shop, not last week’s.

Cheat sheet for the whole guide

Three rules for working with a product feed

1. The feed is the campaign’s first creative. Before any ad is created, the feed decides which products enter the auction, at what price and with what availability. A single source of truth for products, converted per channel, saves you from all the other problems.

2. Split the catalogue by data, not by category. Margin and turnover are the minimum starting point; custom labels custom_label_0–4 carry the split, and product groups in Google Ads and product sets in the Meta catalogue put it into practice. A campaign covering the entire catalogue averages the target and subsidises the long tail at the expense of the top sellers.

3. A label is only as good as it is up to date. Values calculated from connected data, such as automatic labelling in DataOrganizer, follow the shop and return to Merchant Center as a supplemental feed on a schedule. A manual spreadsheet starts going stale on the day it is uploaded.


DataOrganizer · automatic product labelling

Split your catalogue into data-driven groups

Connect your shop and see how your catalogue splits by margin, turnover and stock, with labels ready for Merchant Center and Meta. Instant demo account; you only pay for connected sources.