A readout to a client's leadership team
Case study

True Interactive cut manual campaign reporting time by 40%

Analysts pulled campaign-level numbers by hand across four ad networks, so every new client meant more analyst hours.

True Interactive

True Interactive

40%less analyst time spent on manual campaign reporting

The workflow before#

True Interactive is a paid media agency running campaigns for clients across Google, Meta, LinkedIn and TikTok. Each reporting cycle, analysts logged into every network, pulled performance by hand, mostly at the campaign level, and stitched it into client reports. Then they wrote the story themselves: why cost per lead jumped, why one channel slowed. Detail below the campaign, like which ad group or keyword moved, took extra digging. Problems such as an ad group dropping to zero impressions surfaced only when someone happened to look. Because all of it was manual, every new client the agency signed meant more analyst hours.

What we built#

We built True Interactive one reporting pipeline that pulls detailed performance from all four ad networks into Google BigQuery, defines every metric once and watches the numbers for trouble. Analysts stopped copying data and started reading it, and account teams now hear about a broken campaign within hours instead of at the next report.

Keyword-level detail from every network

We expanded the agency's Rivery pipelines to bring in data down to the ad group and keyword level from Google Ads, Meta, LinkedIn and TikTok. It all lands in BigQuery on a schedule, so an analyst's starting point is a full, current dataset. Going to keyword level from the start means a client's 'which keywords?' question no longer needs a fresh data pull.

Shared metric definitions

A semantic layer on top of BigQuery defines metrics like spend, conversions and cost per acquisition once, for every client and every report. Each network counts those a little differently, so we put the reconciliation in one place. Dashboards and alerts read the same numbers.

Slack alerts when something breaks

Anomaly rules run against fresh data and post to the account team in Slack when a serious issue appears, starting with a campaign or ad group dropping to zero impressions. We started with a short list of high-certainty alerts on purpose. Teams trust an alert that's always real, and they mute one that cries wolf.

How we delivered it

We built on the agency's existing Rivery setup instead of replacing it, extending pipelines network by network and moving clients' reports onto the shared metrics as each was ready. Alerts launched with a small set of rules and grew as account teams asked for more. We also designed the next step with the analysts: AI-drafted explanations of each KPI shift, written for an analyst to review before anything goes to a client.

Before and after#

MeasureBeforeAfter
Reporting granularityCampaign levelAd group and keyword level
Finding a zero-impression issueWhenever someone checkedSlack alert in real time
Analyst time on manual reportingBaseline40% less
Analyst headcount per new clientGrew with each clientNew clients onboarded without adding analysts at the same rate

What's next#

The next step is putting the AI-drafted KPI narratives into production. An LLM reads what changed in the BigQuery data and drafts the reason behind it, and an analyst edits and approves the draft before it reaches a client. That turns the slowest part of every report into a review.

ShareLinkedInEmail

Rivery ingests granular performance data from the Google Ads, Meta, LinkedIn and TikTok APIs into Google BigQuery at ad group and keyword grain. A semantic layer on top defines shared metrics so dashboards and alerts read the same numbers.

Anomaly rules run against each fresh load and push alerts to account teams through the Slack API, starting with high-certainty cases such as zero impressions at the campaign or ad group level.

The generative narrative layer is designed to read KPI changes from BigQuery and draft explanations for analyst review. It was proposed and designed in this engagement and is not yet in production.

Next step

Let's build the case study we tell next.