New teams get free Claude credits for their trial. Learn more

How paid media agencies benchmark ROAS across clients

May 16, 2025•4 min read•Vivek Sah

Hi, this is Vivek, building Contextflo. I share practical notes on getting answers from your data, a couple of times a month.

How paid media agencies benchmark ROAS across clients

You manage paid media for a dozen clients. Each has their own Meta Ads, Google Ads, maybe TikTok. To answer "which client is getting the best ROAS this month" you log into ten ad managers and build a spreadsheet. Every Monday.

Paid media cross-client analytics setup

The problem

Ad platforms report well on one account at a time. The questions that actually run an agency are cross-client: portfolio ROAS, whether spend is allocated to the accounts that convert, which creative approaches work in which verticals. None of that exists natively in Meta or Google, because none of it is their problem.

The workaround is exporting, normalizing, and comparing by hand, which produces a snapshot that is stale by Wednesday.

The setup

  1. All Meta, Google and TikTok ad accounts → Fivetran or Supermetrics
  2. ETL tool → BigQuery or Snowflake
  3. Warehouse → Contextflo
  4. Contextflo → Claude

What you can ask once it is connected

Which client has the best ROAS this month across all channels?

Compare CPA trends for our DTC clients over the last quarter.

Which ad creative formats are driving the lowest CPA across the portfolio?

Client X's Meta ROAS dropped 30% this week. Is that a platform-wide trend or specific to them?

That last one is the question that saves accounts. When performance drops, knowing within a minute whether it is happening across your whole portfolio or only to that client completely changes the conversation you have with them. One is a market shift you are already on top of. The other is something you did.

Attribution will not agree with itself

Worth knowing before you build this. Meta and Google both attribute generously and on different windows, so summing ROAS across platforms produces a portfolio number that is confidently too high. Meta's default attribution counts conversions Google also claims.

This does not make cross-client comparison useless, it just means being deliberate. Compare like to like: Meta ROAS against Meta ROAS across clients, rather than blended ROAS against blended ROAS. If you do want a blended portfolio number, define once how you deduplicate it and save that definition so every future answer uses the same one, instead of it depending on who asked and when.

An agency that can explain its attribution assumptions is already ahead of most of the market.

Why it is worth the setup

The pipeline costs money and a day to set up, so it is not worth it for three accounts. Past ten, the Monday spreadsheet is already costing more than the pipeline does, and the spreadsheet cannot answer the question that matters most, which is whether a drop is yours or the market's.

Here is a more in-depth look at Contextflo and how it works.

What is Contextflo?

Contextflo is a governed context layer between your data and the AI your team already uses. Connect your warehouse once, and your team asks questions in their own Claude or ChatGPT. The model writes and runs the SQL; Contextflo supplies the definitions, the per-user access control, and the audit that make the answers trustworthy. Your data never moves, and you do not need a data team.

How it works

1
Connect your data
Point Contextflo at your warehouse or database, or upload a CSV. It reaches multiple sources at once, so a single question can span all of them.
2
Generate context automatically
Connect your code repo, Notion docs, or a data dictionary, and Contextflo annotates each table in your data source where it can. You review and correct them. That becomes the foundational context layer: your AI agent does not just see tables, it sees the context around them.
3
Define metrics and save golden queries
Pin the verified SQL behind a metric once. Every question then resolves against the same definitions, so the number is consistent no matter who asks or how they phrase it.
A short walkthrough on a BigQuery warehouse.

Your team queries in their own Claude or ChatGPT over MCP, so you bring any agent rather than a locked-in bot, and every answer comes back with the SQL shown and access enforced per user.