Advertise Only the Cheapest Variant

Stop paying to advertise eight near-identical rows of the same product. One Group products rule keeps the cheapest product per group, and one ID mapping keeps its identity stable across imports.

Updated July 25, 2026

If your feed carries several rows for what a shopper sees as one product — every size of a shirt, every offer for one barcode — you're spending budget saying the same thing several times over. This guide keeps one product per group, the cheapest one, and makes sure its identity doesn't wobble between imports.

It takes one rule and one mapping change, and about five minutes.

What you'll end up with#

A catalog where each product family appears once, represented by its lowest-priced member. If prices move and a different member becomes the cheapest, the catalog keeps the same product and just updates its price — no new product, no lost learning on the ad network side.

1. Find the value that identifies a product family#

You need one value that's the same for every row in a family and different between families. In most feeds that's one of:

  • a variant family id — often called item_group_id, parent_sku, style_code, or model
  • a barcode (GTIN/EAN), when your rows are competing offers for the same physical item
  • a combination like brand + style code, when neither alone is unique

Open the catalog from your project's Catalogs list, go to the Rules tab, and check the column list — or the Mapping tab's column rail — to see what your feed actually has.

If nothing identifies a family, stop here: without a shared value there's no group to reduce, and you'd be picking one product out of your whole catalog.

2. Add the Group products rule#

  1. On the Rules tab choose + Add rule, then set the action to Group products. The grouping editor opens.
  2. For What should grouping do?, choose Keep one product per group.
  3. Under Group products that share…, enter the family value you picked in step 1. Leave the matching mode on Smart unless you're grouping on barcodes, where Barcode is the better choice.
  4. Under Which product to keep, choose lowest and enter your price column.
  5. Leave the computed fields empty — you don't need any for this job.
  6. Check the live count at the bottom of the dialog. "~50 products → ~12 kept in a sample" means it's working; "~50 products → ~50 kept" means your group key is unique per product and nothing is grouping.
  7. Choose Done.

Give the rule a name while you're there — "Cheapest variant only" reads better than "Unnamed rule" the next time you open the tab.

3. Point the ID at the group key#

The editor will show a warning at this point: the kept product's ID doesn't come from the group key. Take it seriously — this is the step people skip.

Your ID field is probably mapped to each row's own SKU. That works fine normally, but here it means the catalog id changes the moment a different variant becomes the cheapest, and every ad network reads a changed id as a brand-new product: fresh learning, lost history, and a spike of "new" products in your reports.

Choose Set the ID in the warning, and Renable maps the ID to your group key — all of its parts, if you grouped on more than one. (You can also do it by hand on the Mapping tab, mapping ID to the same values.) Now every member of a group would produce the same id, so whichever one is kept, the id stays put.

If your group key isn't unique enough to serve as an id on its own, extend it on the Mapping tab — for example the family value with a fixed prefix.

4. Publish, then check#

Publish the catalog. The publish confirmation estimates how many products will be grouped into other products, so you can sanity-check the size of the change before it happens — if it says nearly your whole catalog, your group key is too coarse.

After the import runs, open the Activity tab and expand the run:

  • Products seen should be roughly your old count divided by the average family size.
  • Grouped into other products should carry the difference.
  • Nothing should show up under Excluded because of this rule — grouping and excluding are counted separately on purpose.

To check one specific family, use Trace on the Rules tab: pick a product that was grouped away and the trace confirms it was grouped rather than excluded, and — when it can identify it — names the product kept in its place.

If you change your mind#

Delete the rule (or switch its enabled toggle off) and publish. Every product comes back on the next import — nothing was deleted, they were only left out of the feed.

Variations on the same rule#

  • Keep the most expensive one instead — same rule, choose highest.
  • Keep the one that's in stock — point the selector at a stock-count column and choose highest.
  • De-duplicate identical rows — group on the barcode with Barcode matching and keep the lowest price. Same rule, different key.
  • Keep every product but show the family's lowest price — you don't want this guide at all: use Add computed fields to every product with a Smallest of price. See Grouping products.
  • Your family value is blank on some products — don't leave them out and don't let them pool together. In the same rule, condition on the family column being blank, Set field it to the product's id in the main branch, and move the Group products action into the "Otherwise…" branch. Products with a real family id get reduced to the cheapest; the rest keep an id of their own and pass through untouched. Grouping products walks through the shape.

Or ask Aimée#

Describe it in plain language — "only advertise the cheapest variant of each shoe, and keep the id stable" — and Aimée can add the rule and the ID mapping for you, then publish once you approve.

Related articles#