INNOVATE
05E-Commerce·Western Europe + UK

From four agencies and 2.1× ROAS to one team and 4.2× — at $5M+ in annual spend

A DTC brand had outgrown the agency model: four vendors, last-click attribution, and ad spend continuing on out-of-stock SKUs. We brought paid media in-house, built first-party analytics from scratch, and instrumented inventory-aware ad serving. ARR went from $20M to $54M in 18 months.

4.2×

average ROAS sustained over 18 months

vs 2.1× baseline across four prior agencies

Client

DTC consumer brand, $20M ARR at engagement start

Timeline

18 months ongoing (audit + foundation + run rate)

Team

2 engineers, 1 paid media strategist, 1 analyst, 1 designer

Engagement

Long-term retainer with quarterly strategy reviews

01 — Challenge

The situation we walked into.

A DTC consumer brand had scaled to roughly $20M ARR through paid media, but the model had stopped working. Four different agencies were running channels in parallel — Google, Meta, TikTok, and Pinterest — each optimizing for their own dashboard, none coordinating with each other or with the brand's actual inventory. ROAS was deteriorating quarter over quarter, attribution was fundamentally last-click, and the CFO was getting genuinely concerned.

  • 01$5M+ in annual paid media spend split across four channel agencies, each on a separate retainer with separate reporting.
  • 02Average blended ROAS of 2.1× and falling — down from 3.5× two years earlier with no clear cause identifiable from agency reports.
  • 03Last-click attribution only. The brand had a strong organic and email contribution that paid was getting credit for, while genuine top-of-funnel paid investment was being defunded for not 'converting.'
  • 04Inventory feeds were not connected to ad serving — campaigns kept running on SKUs that had been out of stock for weeks, generating impressions, clicks, and angry customer service tickets.
  • 05Looker dashboards existed but pulled from each agency's data feed at different schemas and refresh cadences. Nobody trusted the numbers.
02 — Approach

What we actually did, in order.

The core decision was structural before it was tactical: consolidate paid media in-house with one team accountable across channels, build the first-party data layer that the agencies had no incentive to build, then optimize.

01

Audit + structural recommendation

Six-week audit across all four channels: spend allocation, creative-iteration velocity, audience overlap, attribution model, inventory integration. Recommendation: terminate three of the four agencies, retain the most performant one as a creative-only partner, build everything else in-house with our team.

02

First-party analytics layer

Server-side Google Tag Manager + Snowplow event collection feeding a Snowflake warehouse. Schema designed in collaboration with the brand's finance team so the same numbers reconciled across paid media, finance, and the board reports. This took 10 weeks and was the most important thing we did.

03

Multi-touch attribution model

Implemented a position-based attribution model (40/20/40 first-touch / mid-touch / last-touch) with channel-specific weighting based on lift studies. The model was validated against incrementality holdout tests on Meta and Google quarterly.

04

Inventory-aware ad serving

Real-time inventory feed (every 15 minutes) automatically pausing ad sets, product feeds, and shopping campaigns on stocked-out SKUs across all four channels. Roughly 8% of ad spend was being burned on stockouts pre-launch. After: 0%.

05

Consolidated paid-media operations

Brought channel management in-house with our paid media strategist + analyst leading day-to-day operations. Weekly cross-channel reallocation based on the attribution model, not channel ROAS in isolation. Creative production retained at the surviving agency.

06

Decision-grade dashboards

Looker Studio dashboards built off the warehouse, not off agency feeds. Daily decisions, weekly leadership review, monthly board pack — all from the same source of truth. The CFO stopped asking which number was real.

03 — Stack

What it was built on.

Full technology stack
Next.js (commerce frontend)Server-side GTMSnowplowSnowflakedbtLooker StudioGoogle Ads APIMeta Marketing APITikTok Marketing APIPinterest APIPython ETLPostgreSQL
04 — Results

The numbers we will stand behind.

4.2×

average ROAS sustained over 18 months

vs 2.1× baseline

$5M+

in annual paid media spend managed in-house

100%

inventory-aware ad serving across all four channels

$20M → $54M

ARR growth over 18 months

Paid media + organic compounding

40%

reduction in agency management fees

05 — Outcome

What changed for the business.

The most important outcome wasn't the ROAS number — it was that the brand finally trusted its own numbers. Every weekly leadership meeting now starts from one dashboard, with finance, marketing, and operations all looking at the same figures. The CFO described it (informally) as 'the first time in three years I haven't had to argue about which version of the truth we are using.'

Paid media stopped being a black box and started being a manageable lever. The team can now answer 'if we add $200K of spend next month, where does it go and what should we expect?' with a defensible answer instead of a guess. That visibility is what unlocked the additional growth — leadership was willing to invest because they could see what they were investing into.

We continue as the analytics + paid media team on a long-term retainer, augmented by quarterly strategy reviews. The brand's in-house team has grown to handle creative direction and brand work, while we run the data + media operation.

06 — Timeline

How the engagement ran.

Our delivery process

01

Audit + structural recommendation

6 weeks

Cross-channel spend audit, attribution diagnostic, agency-vs-in-house decision framework, transition plan.

02

First-party analytics build

10 weeks

Server-side GTM, Snowplow events, Snowflake warehouse, schema reconciled with finance.

03

Attribution + inventory integration

8 weeks

Multi-touch attribution model, lift-test validation, real-time inventory feed, automated ad-set pausing.

04

Agency transition + in-house ops

6 weeks

Three agencies offboarded, paid media operations established in-house, creative agency retained on revised scope.

05

Steady-state operation

Ongoing

Weekly cross-channel reallocation, monthly board pack, quarterly strategy reviews + lift-test refresh.

07 — FAQ

What we get asked about this engagement.

Why bring paid media in-house instead of consolidating to one agency?+
Three reasons. First, the conflict-of-interest problem — agencies are paid as a percentage of spend, which biases them against efficiency improvements that reduce that spend. Second, the data problem — agencies build dashboards that reflect well on agencies, not first-party data infrastructure that works for the business. Third, the speed problem — in-house teams can react in hours, not weeks. None of those are solved by switching agencies.
What is the actual lift from inventory-aware ad serving?+
Roughly 8% of pre-engagement ad spend was being burned on stockouts. Eliminating that alone is an 8% efficiency gain. The bigger second-order effect is brand-perception — customers who click on an ad and hit an out-of-stock page tend not to come back. We never quantified that part precisely, but the customer service ticket volume on 'I clicked your ad and the product wasn't available' dropped to roughly zero within the first month.
Did the multi-touch attribution model change the channel mix?+
Substantially. Meta and TikTok received more credit (and budget) than the last-click model had been giving them — they were doing real top-of-funnel work that was getting credited to Google search. Google search received slightly less budget but its productivity per dollar improved because we stopped over-bidding on bottom-funnel branded terms that organic was already winning.
Could a different brand replicate this without the analytics rebuild?+
The analytics rebuild was non-negotiable for this engagement, and it would be for almost any DTC brand at this scale. Without first-party data you are optimizing against the wrong feedback signal. You can absolutely run good paid media on top of agency-supplied data, but you cannot reliably out-perform the structural ceiling that data quality imposes.

Have a similar problem?

Most engagements start with a 30-minute discovery call. No pitch deck, no NDAs on day one — just an honest conversation about your situation.

Schedule a Call