Campaign Management

Catalog Ads at Scale: How to Run Thousands of SKUs

By Chris Pollard
September 23, 202621 min read

Running catalog ads at scale means operating a large product feed so Meta's delivery system spends across the inventory that can actually earn, rather than concentrating on a few familiar items. The approach uses one catalog as the single source of truth, divided into product sets sized to the conversion volume each can support. The main controls are core-set sizing, per-set spending limits, availability hygiene, and variant grouping. Done well, it keeps budget on sellable stock instead of dead SKUs.

You uploaded 4,000 SKUs. Last month's report shows most of the spend landed on about thirty of them, and you cannot tell whether that is the algorithm being smart or the algorithm being lazy.

That question is the whole job. Scale in catalog ads is not a budget problem, it is a catalog-size problem. The mechanics that make feed-driven product delivery effortless at 40 SKUs (connect a feed, let delivery pick the product) are the same ones that make it opaque at 4,000. Nothing breaks. You just lose the ability to see what is happening, and the feed quietly becomes the place where your margin goes to die.

The teams that operate large catalogs well treat the feed as an operations surface rather than a setup step. Below: why spend concentrates, how to structure around it, how to size your working set, how to stop losses without resetting learning, and how to keep stock and variants honest. The loading side of that job, getting the products in at volume, is covered in bulk catalog uploads.

What "at Scale" Actually Means for Catalog Ads

Scale here is about catalog size, not spend. A brand putting 200,000 dollars a month behind 60 SKUs has an easier operating job than one putting 20,000 behind 6,000 SKUs. The first has a merchandising problem it can see. The second has one it cannot.

The threshold is not a SKU number. It is the point at which inventory state, product economics, delivery concentration, and reporting can no longer be managed SKU by SKU. Some 800-product catalogs cross it; some 5,000-product catalogs do not, because the assortment is uniform. Below that line you can read every product row. Above it, most SKUs never receive meaningful impressions and manual inspection stops being possible.

Worth internalising first: Meta's delivery system treats your inputs as signals rather than instructions, and that applies to product selection as much as to targeting. So how the current delivery system reads your inputs explains most of what follows. A product set constrains the candidate pool; it promises nothing about distribution inside it.

The rest is four jobs: consolidate the data, size the core, stop the losses, keep the feed honest.

Why Meta Spends on the Same Few Products

Start with what Meta actually documents, because the gap between that and what people assume is where most bad decisions live.

Meta says catalog recommendations use a person's interests, intent, and actions. That is the extent of it. There is no published SKU-level ranking equation, no exploration allocation, no minimum impression guarantee per product, and no statement that price is a ranking feature. Meta's engineering write-up on Andromeda, its ads retrieval engine, describes how millions of candidate ads get narrowed before ranking. It is about ads, not about which product inside a catalog ad gets chosen.

Concentration is structurally expected, though, because the mechanism is a feedback loop. A handful of products start with stronger predicted action rates, from demand, price, page traffic, or purchase history. They get more delivery, which produces more outcome data, which raises the system's confidence in them. Unproven products get fewer opportunities, so they never accumulate the data that would change the verdict.

How lopsided does it get? The best quantified Meta-specific measurement available comes from a ROI Hunter analysis of 120 dynamic prospecting ad sets with a median catalog of 4,500 products: the top 1 percent of products took 50 percent of impressions, and the top 200 took 70 percent. Treat that as evidence that extreme concentration is plausible, not as a current benchmark. It dates from 2018, predates Andromeda, is vendor-published, and measures impressions rather than spend.

You will also hear that Meta favours cheaper products. That traces to a single practitioner source, and no Meta documentation or controlled study confirms it. The defensible version: under lowest-cost optimization, cheaper items may simply produce more purchase events per dollar. Indirect effect, not documented bias. It matters commercially either way, because a SKU that wins on CPA can lose badly on contribution margin.

Run the Concentration Diagnostic

Do not assume any of this about your own account. Measure it. Ads Manager exposes a Product ID delivery breakdown for catalog campaigns, and the Marketing API exposes product_group_content_id and product_set_id breakdowns. Export the product-level breakdown and calculate five numbers:

  • Percentage of eligible SKUs that received any impressions at all
  • Percentage that received any spend
  • Share of spend captured by your top 1, 5, 10, and 20 products
  • Share captured by the top 1 percent, 5 percent, and 10 percent of the catalog
  • Products that exceeded target CPA with no recorded purchase

Diagram showing how catalog ad spend concentrates, with a small share of SKUs absorbing most of the budget while most of the catalog receives no impressions

One warning that saves wasted analysis: the served SKU is not the purchased SKU. Someone can see one product, click through, and buy another. Keep served, clicked, and purchased as separate fields, and join Meta's delivery data to your order data rather than trusting product-level conversion attribution in Ads Manager, which remains incomplete and inconsistently available.

Concentration is not a bug to eliminate. It becomes a problem only when the concentrated set was chosen by accident instead of by you.

One Catalog, Many Product Sets

Here is the contradiction that trips up most teams. Meta's documented instruction is to keep everything in one catalog: it consolidates pixel and engagement data, improves match rate, and makes products available to your connected commerce account. The literal guidance is to create product sets instead of multiple catalogs. Meanwhile every experienced operator will tell you not to dump your whole catalog into one ad set.

Both are right, because they describe different objects.

The catalog is the data architecture. It is your source of truth for availability, pricing, and match rate, and splitting it fragments the signal that makes retargeting work. The product set is the media-buying architecture. It is the slice you point an ad set at, and it is how you direct budget. So: one catalog, many product sets. Multiple catalogs are defensible only when governance, brand ownership, commerce accounts, or genuinely incompatible backend systems prevent a shared source of truth.

Architecture diagram showing a single Meta product catalog as the data layer feeding multiple product sets, which each feed a separate ad set

Product sets can be static selections or rule-based filters that update as fields change. Rule-based is what you want at scale, because a static set is stale the moment your assortment moves.

Launch More. Click Less.

Upload hundreds of creatives at once, auto-match thumbnails to videos, and export directly to Meta Ads Manager.

Try Ads Uploader Free

No credit card required • 7-day free trial

How to Cut Product Sets

Four axes are worth using, in this priority order:

  • Margin band. The most valuable cut and the one almost nobody makes first. Native feed fields do not carry contribution margin, so you write it into a custom label from your own data.
  • Lifecycle. Proven, exploring, dormant. This is what lets you protect the core while still testing.
  • Category. The default everyone reaches for. Useful for merchandising logic and for matching a set to a specific creative angle.
  • Price band. Mostly a control on the cheap-SKU leak described above.

Most teams cut by category first because it is the axis the feed already contains. Margin is the better first cut: category tells you what a product is, margin tells you whether you want to sell it.

One counterweight before segmenting aggressively: Meta has tested broadening delivery beyond a selected product set, and a study of 18 advertisers reportedly produced 14 percent higher ROAS and 11 percent lower cost per purchase when eligibility widened. Small sample, reproduced by a Meta partner rather than a first-party page, so hold it loosely. The direction of travel is real, though. Meta's stated position at Cannes in June 2026 was that product data would become an essential input to all Sales campaigns. Over-segmentation has a cost, and it is rising.

Name your sets so the report is readable six months from now. Consistent naming conventions turn a product-set structure into something you can analyse.

How to Size Your Core Product Set

"Start with your bestsellers" is the advice everyone gives and nobody makes usable. Here is the usable version.

The binding constraint is conversion volume, not SKU count. Meta's guidance is that performance typically stabilizes once an ad set receives roughly 50 optimization events within a seven-day window. That threshold applies to the ad set, not to each product. Nobody needs 50 purchases per SKU.

So size your structure from the conversions your budget can buy:

Expected weekly purchases = (7 x daily budget) / target CPA
Learning-capable ad sets   = expected weekly purchases / 50

At 1,000 dollars a day and a 50 dollar target CPA, that is 140 weekly purchases, which supports two ad sets clearing the threshold with a little safety margin. Three would need near-perfect even allocation and would leave none. That arithmetic sizes your optimization pools. It does not tell you how many products belong in them.

For the product question, work from economics rather than a round number: build the core set from the products accounting for roughly 70 to 80 percent of recent product revenue or contribution profit, then subtract anything with thin stock cover, bad return economics, or a landing page that will not convert. What survives is your core.

Be honest about the limits. CPA moves as you scale, Advantage campaign budget does not distribute conversions evenly, attribution delay distorts anything recent, and 50 events is a guideline rather than a switch that flips. You will also see a claim that catalogs above roughly 600 SKUs cannot exit the learning phase. No Meta source corroborates it, so do not plan around that number.

Working the Rest of the Catalog In

Add products in waves, not in one dump, and give exploration its own separately budgeted ad set so discovery spend cannot compete with proven spend inside the same optimization pool. That makes it a budget-separation decision more than a targeting one, which puts it squarely in the ABO versus CBO question: campaign-level budget will always find the efficient thing, which is exactly why exploration needs its own container. Promote out of exploration on evidence at the next monthly recut, not on enthusiasm.

Stop-Loss Rules That Do Not Reset Learning

Now the part almost nothing else on this topic covers: how do you stop a losing product without breaking the campaign that is working?

The critical constraint is architectural. Meta's automated rules act on campaigns, ad sets, and ads. A rule cannot pause an individual SKU. A product set is not an independently pausable delivery entity. So SKU-level stop-loss has to happen at the data layer, through catalog labels, product-set filters, availability, or an API process.

That gives you a clear order of operations:

  1. Exclude at the feed first. Changing product-set membership alters the input without restructuring the campaign, and feed membership is not on Meta's published list of significant edits. Be precise about the claim: this reduces disruptive campaign edits. Meta does not promise product-set churn is learning-neutral.
  2. Cap at the ad set second. Ad-set spending limits still exist alongside Advantage campaign budget, though current interfaces may describe them as average rather than hard caps. This is your containment mechanism when budget sits at campaign level.
  3. Restructure last. Meta's documented significant edits include targeting changes, creative changes, changing the optimization event, adding a new ad, pausing an ad set for seven days or more, and changing bid strategy. There is no official rule that a 20 percent budget change is always safe.

Vertical flow diagram showing the stop-loss order of operations for catalog ads: exclude at the feed, then cap at the ad set, then restructure last

Rebuilds are sometimes warranted, and doing them by hand across dozens of product sets is where accounts lose days, which is the case for making structural changes in bulk.

Express thresholds as a multiple of target CPA, never a flat dollar figure:

Spend without a purchaseAction
0.5x target CPAFlag and monitor only
1.0x target CPAReview clicks, landing page, price, stock, match integrity
1.5x to 2.0x target CPAExclude, or demote to a lower-budget exploration set

Two guardrails on top. Require a minimum click or landing-page-view count before acting, or low-spend noise generates constant false kills. And evaluate on rolling three-day and seven-day windows, never same-day, because attribution has not matured.

Set that exclusion line generously. A study of Google feed ads covering 1.4 million products found that among items reaching 500 dollars of spend without a sale, 35.4 percent eventually converted, at a median delay of about two months. Different platform, but it illustrates the risk: an aggressive stop-loss does not only cut losers, it truncates slow converters before they report.

One note on the word automation. A cadence is only automated if something runs it on a schedule. At a few hundred SKUs a calendar reminder is fine. At several thousand, the export, the margin join, and the label update need to run without a human remembering.

Handling Out-of-Stock Items and Variant Sprawl

This layer is mostly automatic, which is exactly why its failures go unnoticed for months.

Catalog ads do pull availability from the feed, so sold-out items do stop serving. The gap is latency: the interval between your store selling out and the feed reflecting it. That window is where budget goes to products nobody can buy, and it scales with your sell-through rate.

For a temporary stockout, set availability to out of stock. Meta specifically recommends preserving the item rather than deleting it, because the retained record keeps its history and lets Meta retarget those shoppers with similar available products. Deleting is for permanent removal only. The mechanisms differ: out of stock is temporary commercial ineligibility, archived or staging status is stronger suppression across ads and shops, and omission from a full-replacement feed destroys the record entirely.

Meta's scheduled feeds separate incremental updates (create and update supplied items) from full replacements (also remove absent ones). For catalogs that change often, the documented recommendation is an hourly incremental update paired with a daily full replacement. Hourly is the floor, since scheduled feeds cannot run more frequently. If that is too slow, you need the Catalog Batch API or direct item updates, and no public documentation promises a propagation SLA. "Near real time" is not a number.

Match rate ties the catalog to the signal layer: it measures how many content IDs from your event source map to items in the connected catalog. Meta Business Engineering material classifies 90 percent or higher as high when one catalog is connected. The widely circulated 75 percent figure comes from vendor troubleshooting guidance, not Meta policy. Keeping it high depends on your event layer sending IDs that match the feed, which is a matter of firing standard events with the right content IDs and of the reliability that server-side tracking adds.

Save Hours on Creative Testing

Stop uploading ads one by one. Bulk process unlimited creatives with automatic media matching and direct API publishing.

Try Ads Uploader Free

No credit card required • 7-day free trial

Why Your 16 Variants Show as Two Cards

Every variant needs its own unique product id, and variants of one parent share an item_group_id. Meta models each feed row as an individual size or colour variant.

The display behaviour is what surprises people. No Meta documentation promises that every variant in an item group appears as its own carousel card. A dynamic catalog carousel is a recommendation unit, not an exhaustive variant selector, so grouping tells Meta these rows are one product and it may show only a representative one. That is usually what you want: a carousel showing the same messenger bag in sixteen colours is a worse ad than one showing sixteen different products. Decide deliberately:

  • A variant's primary image comes from that row's own image_link, and grouping does not override it. If the wrong colour keeps appearing, fix the field on that variant.
  • For size-only variants, point every row at the same parent image.
  • Archive or exclude variants that should never appear at all.
  • If a specific set of colours genuinely must appear in a fixed order, build a manual carousel. Breaking correct variant grouping to force more cards damages tracking, deduplication, and shop behaviour, which is a bad trade for one creative outcome.

The Catalog Ads Tool Landscape

Most of the pages competing on this topic are vendors selling their own answer, so here is a category map with no verdict attached. Work out which category your bottleneck sits in before you shop, because buying the wrong one is the common expensive mistake.

CategoryWhat it doesBuy it when
Ingestion and syndicationMoves product data from ecommerce, ERP, or PIM systems into Meta and other channelsYour data lives in several systems that disagree
Feed normalization and QAField mapping, taxonomy, localization, error detection, URL validationFeed errors and rejections are your recurring failure
Merchandising logicCustom labels, margin and inventory rules, exclusions, exploration queuesYou cannot express margin or stock cover in your feed
Creative enrichmentFrames, price overlays, promotions, templates, dynamic videoYour catalog ads are white-background product shots
Campaign construction and QABulk creation, naming, destination validation, previews, launch checksBuilding the ad sets by hand is the bottleneck
Product-level analyticsServed-product reporting, order-line joins, margin and return-rate analysisYou cannot answer the concentration diagnostic above

A creative-overlay tool does not fix a concentration problem, and a feed tool does not fix boring creative. Most teams buy the fourth category when their real problem is the sixth.

The build-versus-buy line has also moved. Meta now natively supplies multiple feeds per catalog, scheduled feeds and feed rules, product sets, custom labels, dynamic fields for name, brand, and price, frames and basic overlays, catalog product video, and expanding Product Insights reporting. Some of that used to be a paid tool's entire pitch. Third-party tooling still holds up for cross-channel feed governance, contribution-margin logic, product-level profit attribution, and bulk construction across many accounts or markets.

On creative specifically, test Meta's native creative automation before paying for an overlay layer. One caveat on the numbers quoted in this market: no credible neutral market-share study for this tooling exists. Vendor customer counts are not category adoption.

An Operating Cadence for Large Catalogs

The instinct at scale is to touch the account daily. Resist it. Here is a cadence that matches the data's actual refresh rate.

FrequencyWhat you actually do
DailyFeed processing failures, disapprovals, sudden catalog-count changes, match rate, campaign-level spend anomalies. No SKU judgments.
Twice weeklyExport Product ID delivery data, recalculate concentration and zero-delivery coverage, join to margin and stock, review threshold breaches
WeeklySeven-day optimization events by ad set, consolidate sets that cannot reach volume, refresh labels, audit top spenders for stock depth and landing-page quality
MonthlyRecut the core set on revenue or contribution profit, compare broad delivery against product-set tests, audit variant ID consistency across feed, pixel, and orders
QuarterlyIncrementality or holdout tests where volume permits, reassess whether segmentation creates value or just fragments learning, revisit tool spend

Two weekly checks get skipped constantly. First, confirm your top-spending products have the stock depth to support their delivery, because scaling into a stockout wastes a good week. Second, watch creative on the core set: a concentrated product set means the same items hit overlapping audiences repeatedly, so ad fatigue arrives faster than a full-catalog rotation would suggest.

Meta's own Performance 5 guidance reports that advertisers keeping less than 20 percent of overall spend in the learning phase reduced cost per purchase by as much as 68 percent. That is the argument for a slow cadence: every unnecessary edit is a tax.

Frequently Asked Questions

How many products should be in a Meta catalog ad campaign? SKU count is the wrong planning unit. Size ad sets from weekly conversion volume against the roughly 50 optimization events per week guideline, then fill them from the products making up 70 to 80 percent of recent product revenue.

Should I use one catalog or multiple catalogs? One catalog wherever products can share ownership, event data, and commerce infrastructure. Meta's instruction is to create product sets rather than multiple catalogs, because consolidation improves match rate and pools engagement data.

Why do my catalog ads show only the same few products? Meta optimizes for predicted outcomes rather than equal exposure, so early winners compound their data advantage. There is no published exploration quota. Run the concentration diagnostic before concluding anything is broken.

Are Advantage+ catalog ads the same as dynamic product ads? In substance, yes. They are the renamed successor to dynamic ads, and Meta still describes them as formerly dynamic ads. The 2025 rename of Advantage+ Shopping Campaigns to Advantage+ sales campaigns was a separate change that did not touch catalog ad naming.

Is Advantage+ Shopping the Meta equivalent of Google Performance Max? The nearest analogy is Advantage+ sales, and it is loose. Performance Max spans Search, Shopping, YouTube, Display, Discover, Gmail, and Maps with Merchant Center listing groups underneath. Meta runs inside its own surfaces with no search-query intent layer to inherit.

How do I stop catalog ads from showing out-of-stock products? Set availability to out of stock in the feed or through the API, and keep the item rather than deleting it. Use hourly incremental updates plus a daily full replacement, and move to the Batch API when an hour of latency is too slow.

Why do my product variants show as only two carousel cards? Variants sharing an item_group_id are one parent product to Meta, and nothing guarantees a card per variant. Fix a wrong image at that variant's own image_link, and build a manual carousel if a specific set of colours must appear in order.

How long should I wait before judging catalog ad performance? Seven days minimum where volume allows, longer on low-volume accounts. Check whether the ad set can reach stabilizing volume before blaming the products, and never make SKU calls on same-day data.

Conclusion

Operating catalog ads at scale comes down to five things:

  • Concentration is expected, not broken. The problem is only ever that the concentrated set was chosen by accident. Measure it before you change anything.
  • One catalog, many product sets. Split the media-buying architecture, never the data architecture.
  • Size the core to conversion volume, not to a SKU count. Fifty optimization events per ad set per week is the constraint; product revenue and margin decide what fills the pool.
  • Exclude at the feed, cap at the ad set, restructure last. Automated rules cannot pause a SKU, so stop-loss belongs in the data layer.
  • Availability and variant grouping are operations, not setup. Latency and item_group_id behaviour cost real money quietly.

The highest-value next step is the diagnostic above. Export a product-level breakdown, work out what share of your spend sits on what share of your catalog, and join it to margin. Most operators running catalog ads at scale have never seen that number for their own account, and it reframes every other decision on this list.

Chris Pollard
Chris Pollard

Chris is the founder of Ads Uploader, helping marketing teams and agencies save hours on Meta Ads automation. After years of watching teams waste time on repetitive ad uploads, he built the tool he wished existed.

Stop Uploading Ads
One by One

Upload hundreds of ads in minutes. Auto-match video aspect ratios and thumbnails. Direct publish to Meta.

Try Ads Uploader Free

No credit card required
7-day free trial

Ad Library Helper

Free Chrome extension to search, filter, and save ads from the Meta Ad Library.

Get It Free

Built by Ads Uploader

Ready to Scale Your Meta Ads?

See why performance marketers, agencies and brands trust Ads Uploader to handle their bulk creative uploads. Launch hundreds of ads in minutes, not hours.

Get Started Free

Free 7-day trial

No credit card required

Cancel anytime