Concentration riskAnonymized travel-tech marketplace · concentrated-revenue portfolio

How we diversified search advertising with a 7-label structure

Choose your version

About 90% of revenue came from the top ~1% of routes — and the more Google Ads leaned into them, the worse the concentration got. We built a labeling structure that surfaced hundreds of proven routes the platform had never spent on, so we could keep the cash cows and scale budget into routes that already worked.

~20%
Of Spend Shifted Off the Top Bucket
~14%
Revenue From Routes Ads Never Reached
300+
Proven Routes Put Into Spend
Outcome

Revenue concentration in the top bucket dropped from 90% to ~70% — without touching cash-cow spend or performance. The unlock: we diversified budget into ~300 routes Google Ads had never pushed but that already had backend revenue. Those routes performed much like the cash cows we were obsessed with — there were just far more of them, together rivaling the top 1% of the portfolio. That's how we scaled total ad budget: we kept the cash cows running long-term and funded proven routes the old structure could never allocate to.

All client names and numbers in this case study are anonymized, and the figures are illustrative of the real pattern rather than exact client data. The architecture, the label scheme, and the spend-rule pattern are described as-built so the takeaways are usable.

Current

Top ~5% of routes90%
Next tier6%
Following routes3%
Rest of catalog1%

After labeling

Cash Cows70%
Newly-funded routes (No/Low-Investment)14%
High Potential12%
Testing pool4%

~300 previously-unfunded routes went from 0% to ~14% of revenue — without touching the cash cows.

Where revenue lived before vs after the labeling structure.

Context

Client: the same anonymized travel-tech marketplace as the multi-country reporting case study — operating in 100+ countries, ~€3M/year in paid spend (around €10k/day at peak). Why they came to us: when we audited the account economics, the top ~1% of routes were driving ~90% of revenue. The instinct was to lean further into those top performers — which made the concentration worse every quarter and left the business one competitive shock away from a serious revenue hit. They wanted to scale spend, but the structure only knew how to feed the same handful of routes.

The "before" state

Three things were broken, and they fed each other:

  • Severe revenue concentration. The top ~1% of routes drove ~90% of revenue. If a bigger competitor entered one of those routes — or a substitute like a cheaper flight or train appeared — performance and volume could drop fast, taking a disproportionate share of total margin with them. (This is exactly what later happened, and it's what forced the diversification.)
  • Google Ads bias toward the best routes. Google Ads is a machine-learning system: the more conversions a route produced, the more the algorithm reinforced spend on it. That's good behaviour in isolation — but it created a self-feeding loop that piled almost all budget onto a few winners, and you can't break that loop just by rearranging campaigns or ad structure.
  • Routes that already worked organically were forgotten. Some routes had real revenue from organic and other non-paid channels, but because we weren't pushing them, Google Ads never got enough conversions on them — so the algorithm ignored them entirely. They needed their own bucket to be seen at all; otherwise the cycle kept them invisible.

The real risk of an undiversified portfolio

Leaning on so few routes meant a single competitive shock could wipe out a huge slice of revenue at once. When a larger competitor did enter the market, our performance and volume started declining — and we were forced to diversify and rebuild the lost revenue from new routes. Spreading proven demand across many routes is what protects you from exactly that.

What we actually did

We built a hybrid labeling structure on two data points — and deliberately kept it that simple:

  • Backend / ERP data — company-wide revenue and margin per route, straight from the business's own system of record (not the ad platform's view).
  • Google Ads data — spend, conversions, and the return on that spend.

Every route lands in exactly one label, and every label has a defined spend rule. Reporting then groups everything by label, so concentration is visible at all times. We chose just these two data points on purpose: the labeling is already complex enough, and together they answer the core question — which routes make the business money, and which ones is the ad platform actually funding?

On the roadmap (optional): SEO + search-volume data. We deliberately left these out of the as-built structure, but they're worth understanding — they move you from reactive to proactive.

  • Search volume = a demand signal. Pull the search volume for each route (or product) over the past ~24 months and forecast the next ~12. Instead of waiting for Google Ads to notice demand and react, you can see a season coming and bid ahead of it — proactive budget allocation rather than chasing the algorithm.
  • Search Console / SEO data = a save-or-double-down signal. If you already rank organically in the top 3–5 positions for a route, you get a choice: double down and own the paid result too, or skip paid there and save the money because organic already wins it. Either way you spend where it actually moves the needle.

Why we re-label weekly, not daily. The labels are automated, so you could update them every day — but we don't, and we recommend weekly or every two weeks. If routes jump between labels (and therefore between campaigns) every single day, the campaigns never stabilise and Google's algorithm can't optimise toward the right routes. A weekly or bi-weekly cadence gives the algorithm room to learn while keeping the structure current.

Layer 1 — Hard-filter labels (straight from the ERP data)

Before any scoring, every route is checked against a few business-logic rules. These all read the backend/ERP data, so they describe what's actually true for the business — not just what Google Ads happened to see.

LabelCondition (from ERP)What it meansSpend rule
SleeperNo meaningful revenue / no data — brand-new, tiny, never ranked organically, or never pushedUnproven, but not deadHeld out of active campaigns; our main pool to source new test routes from
No-InvestmentBackend revenue above a real floor, but ad spend ≈ €0Works organically; we've never funded itSurface and fund — reported alongside cash cows
Low-InvestmentBackend revenue above a real floor, but ad spend below a low thresholdBarely funded despite proven demandSmall fixed budget to scale into
LoserHigh spend and low ROI relative to the route's price (threshold below)Genuinely unprofitablePaused / excluded

A few of these matter more than they look:

  • Sleeper is one of the biggest pools — brand-new routes, very small ones, or ones that simply never got pushed. It isn't waste; it's the candidate list we pull new test routes from.
  • No-Investment and Low-Investment are among the most valuable labels. These are routes with proven backend revenue that Google Ads never funded. We surface them and report on them next to the cash cows, because in practice that's what many of them become once they finally get budget.
  • Loser uses a price-aware cost threshold. A route is only a loser if it both spent a lot and failed to return — and "a lot" is defined relative to the route's value: 2.5× the order value (the route or product price). Only once marketing spend exceeds ~2.5× a route's price without hitting a minimum ROI do we call it a loser. This stops the structure from prematurely killing higher-priced routes, which naturally need more spend before they can prove out.

Layer 2 — Score-based labels (for everything else)

The remaining routes — the ones that actually need a decision — get a 0–100 attractiveness score built from normalised metrics: GMV, conversions, cost, profit-on-ad-spend (POAS), and a seasonally-adjusted growth signal (explained below). The score maps to three tiers, each split into L1 / L2 / L3 sub-tiers so spend rules can differ inside a tier:

LabelScoreStrategic actionBudget rule
Cash Cow (L1–L3)60–100Defend and scale carefullySteady spend with a per-route cap; pull back if efficiency degrades over several periods
High Potential (L1–L3)30–59Test, then graduate to Cash CowFixed test budget; watch for the tipping point where efficiency drops
Low Score (L1–L3)1–29Test only if budget allowsSmall exploratory budget

L1 is the top third within a tier, L3 the bottom — so "Cash Cow L1" gets the highest ceiling while "Cash Cow L3" stays on a tighter leash.

Note — we tier with a logarithmic function, not fixed cut-offs. A log scale keeps a stable number of routes in each label across the whole season. Cash Cows are naturally the smallest group (they're the best routes), and a naïve cut-off would empty that label out of season — starving the campaign of routes and risking that it stalls. The log function always keeps enough routes (or products) in every label for the campaigns to keep functioning year-round, in season and out.

Keeping the numbers honest across seasons

Growth and revenue are easy to misread when a route is seasonal — it can look like it's booming just because it's in its high season, or look dead just because it's out of season. So for growth, GMV, and cost we don't compare single months. We use a 3-year window and compare the same season-window across the past three years.

That window is three months wide — the month before, the current month, and the month after — and we average them:

  • Current month — what's working right now.
  • Month after — what's coming (the season about to start).
  • Month before — what was working (the season tailing off).

Averaging those three gives a forward-leaning picture. If a route is heading into season, the "month after" lifts its average early; if it's rolling out of season, next month's lower numbers pull the average down. So instead of reacting to last month and waiting for Google's systems to catch up, we bid on the current season with a built-in signal of what's coming next — and it shifts dynamically as the calendar moves.

The discipline layer — what makes this actually work

  • Re-label every route weekly. The label is a snapshot of a route's current strategic role, not a permanent assignment — it's expected to move as the data moves.
  • Hold the spend rules between rebalances. Once a label sets a route's budget for the week, leave it alone until the next relabel. The failure mode that created the concentration problem in the first place is the small, constant "let's give the top performers a little more this week" — so the discipline is simply to not do that mid-cycle.
  • New routes start as Sleepers — every route is labeled by the same Layer 1 + Layer 2 rules. There's no special "new route" budget; a new route just has no data yet, so the rules put it in Sleeper until it earns its way out. The one exception is a separate Manual override (its own campaign, sitting outside the 7-label scheme) for routes a manager deliberately wants to push by hand — kept apart so it never distorts the automated structure.
  • Watch routes moving across tiers — mostly for reporting. Seeing a route climb from High Potential to Cash Cow (or slip the other way) is one of the most useful signals for understanding how a route behaved. It's powerful but not trivial to set up well, so treat it as a reporting upgrade rather than a day-one requirement.
  • Make the scoring reflect your business, and review it quarterly. The weights aren't fixed law. If your growth is dominated by Google Ads, score more heavily on Google Ads data and the structure becomes more reactive and Ads-led. If a lot of your revenue is organic or comes through channels Ads can't see, weight the ERP/backend data more so the structure pushes routes that work company-wide. There's no universal right answer — it's a business decision, and it's worth revisiting every quarter.

The "after" state

The structure didn't shrink the cash cows — it widened the base underneath them. Here's where revenue came from before and after, as a share of the total. (Route counts are shown as a share of the catalog; absolute numbers are anonymized.)

BucketShare of routesRevenue — beforeRevenue — after
Cash Cow~1%90%70%
High Potential~5%6%12%
No-Investment + Low-Investment<1% (~300 routes)0%14%
Low Score + Loser~34%4%2%
Sleeper (testing pool)~60%0%2%
Total100%100%100%

The headline isn't that the cash cows shrank — it's where the new revenue came from. The No-Investment / Low-Investment routes went from 0% to ~14% of revenue: ~300 routes Google Ads had never funded, which together rivaled the top 1% we'd been obsessed with. Meanwhile Low Score + Loser spend got trimmed (4% → 2%, money saved), and Sleeper became a genuine testing pool (0% → 2%) feeding the next generation of routes.

Small active portfolio — hits a ceilingBroad proven portfolio — keeps scaling

Line chart showing profit versus ad spend for two scenarios. A small product portfolio plateaus at 90,000 euros profit, while a large portfolio continues growing to 175,000 euros, demonstrating an 85,000 euro monthly profit gap.

Small Portfolio (50-100 products)
Larger Portfolio (500-1,000+ products)
Why diversifying lets you spend more: a small active portfolio hits a ceiling; a broad one keeps scaling.

That broader base is also why total ad spend could grow. A small set of routes hits diminishing returns fast — past a point, more budget just inflates CPCs on the same winners. A broad set of proven routes gives the algorithm fresh, profitable ground to spend into, so the whole account keeps scaling instead of plateauing.

A caveat on scale: this full structure earns its complexity on large catalogs (~10,000+ routes or products). If you're running a few hundred SKUs, it's overkill — keep the idea (separate proven-but-unfunded items from genuine losers) but collapse it to two or three labels.

What other teams could steal

Three things any team running paid media at scale could apply — specialist or not:

  1. Use hard rules and a score, not one or the other. Simple yes/no rules instantly handle the obvious cases (dead routes, proven-unprofitable routes, routes with backend revenue but zero ad spend). Then score only the routes that genuinely need a judgment call. Rules alone are too blunt to rank; scoring alone wastes effort scoring routes that don't deserve it. Together they're fast and precise.

  2. Your backend data sees revenue your ad platform never will — join them. Google Ads only knows what it spent on and converted. Your ERP knows every booking, including the ones that came in organically on routes you never advertised. The single highest-leverage move here was surfacing routes with real backend revenue and zero ad spend, then funding them. If you only ever look at the platform's own numbers, those routes stay invisible forever.

  3. Score by your own business logic — weight the data source that reflects how you actually grow. There's no universal scoring formula. If your growth is driven by Google Ads, lean the score toward Ads data and let the structure be more reactive. If a lot of your revenue is organic or runs through channels Ads can't see, weight your ERP/backend data more heavily so the structure pushes what works company-wide. The right weighting is a business decision, and it's different for every company.

Key Takeaways

Three things worth taking away.

1

Ad platforms are machine-learning systems — biased toward whatever is already converting.

That bias is good: you want the algorithm pushing your winners. But on a very large portfolio it concentrates almost all spend into a handful of best-sellers and leaves enormous untapped potential in routes and products it has never tried. Deliberately diversifying that portfolio is what lets you scale spend, revenue, and growth past the ceiling the algorithm settles on by itself.

2

A labeling structure is just a tool to guide the platform toward what it doesn't know can work.

It's a way to force spend onto routes and products the algorithm hasn't tried, so it gets more conversions and learns where it can scale next. You're not overriding the machine — you're feeding it the candidates it would never have surfaced on its own, then letting it optimize from there.

3

Machine learning is powerful, but every business is capped by its own data — a human has to steer.

Algorithms learn fast, but each company is limited by order volume and data, especially once you break it down to country or route level. There has to be a person evaluating what makes sense commercially and strategically, then guiding the automated platforms (Google Ads, Meta) toward the actual business goal — not just the locally optimal one.

Want to ship something like this?

We build these systems for paid advertising teams that want strategy and execution in one engagement. One-time audit or on-demand consulting.