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#
| Measure | Before | After |
|---|---|---|
| Reporting granularity | Campaign level | Ad group and keyword level |
| Finding a zero-impression issue | Whenever someone checked | Slack alert in real time |
| Analyst time on manual reporting | Baseline | 40% less |
| Analyst headcount per new client | Grew with each client | New 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.






