Use caseReporting and analyticsWorkflow automation
Agency client reports with commentary drafted from the data and approved by the account lead
Automated client reporting for agencies: Google Ads, Meta and GA4 results measured against each client's targets, with commentary drafted for the account lead.
A blueprint, not a client story. The business described is illustrative; the architecture, integrations and trade-offs are real, and this is how I would build it. By Ergini, .
The short version
A monthly reporting pipeline for performance marketing agencies. Connectors load Google Ads, Meta and GA4 data into BigQuery, code measures each client against their own targets and attribution settings, and checks look for provable causes such as budget changes, disapproved ads and tracking breaks. A model drafts the commentary in the client's language, naming only causes the checks found. The account lead edits and sends every report. An optional add-on compares logged hours with each statement of work.
- Best for
- Performance agencies with 20 or more retainer clients, where analysts lose the first week of every month to assembling reports.
- Connects to
- Google Ads, Meta Ads and GA4, Supermetrics or Funnel, BigQuery or Google Sheets, Looker Studio, HubSpot, Slack, Harvest, Productive.io or ClickUp
- The AI does
- Drafts each client's commentary in their language from computed KPIs and matched causes, and condenses a month of account changes into a few lines.
- People do
- Account leads edit, approve and send every report, own each client's targets, and decide what to tell a client when data is incomplete.
- Built as
- AI Workflow Automation, usually $15K - $30K
The first five working days of every month
Say you run a performance marketing agency of 25 people with 40 retainer clients, most on Google Ads and Meta, a few on LinkedIn. Every client gets a written report by the fifth working day. Today that looks like this:
- An analyst refreshes each client's Looker Studio report, or exports last month's figures from Google Ads, Meta Ads Manager and GA4 where the connector has broken again.
- They sanity-check the numbers and find one client's GA4 conversions halved on the 18th. Twenty minutes later they learn the client's developer replaced the cookie banner.
- They copy charts into the client's slide template, fix date ranges widget by widget, and notice one chart now counts a different conversion action.
- They write the commentary: what happened, why, and what the agency will do next. For the German-speaking clients, in German.
- The account lead reads it the evening before it is due, rewrites half, and asks why cost per lead rose. Nobody is sure whether it was the budget cut or the disapproved ads.
- The report goes out on day five or six, after the client has already asked about the month in Slack.
At two to three hours a client, that is 80 to 120 hours of analyst time a month, most of it in the same week, and it comes straight out of retainer margin. The commentary, the only part clients read closely, gets the least care, because it is written last.
The monthly run, from connector to client inbox
Loading and checking run nightly all month, so month end becomes a review rather than a scramble. The model writes the draft, and what it may call a cause is settled before it starts.
01 Trigger · Supermetrics or Funnel, BigQuery
Nightly load, all month
Supermetrics or Funnel lands each client's Google Ads, Meta and GA4 data in BigQuery every night, with freshness and row counts checked per client and source, so a broken connector is noticed the next morning, not on reporting day.
02 System · Google Ads API, Meta Marketing API, HubSpot API
Snapshot what the connectors miss
A small job stores the Google Ads change history daily, because the API's change_event resource only returns the last 30 days, along with ad review status on both platforms, budgets and bid strategies. Where clients share it, HubSpot adds qualified leads and closed revenue.
03 Plain code
Measure each client against their own profile
SQL computes each client's KPIs from their profile: which conversion counts, which attribution setting, which currency, which target. A client who pays for qualified leads is never judged on ROAS.
04 Plain code
Flag anomalies and match them to causes
Changes beyond a client's normal range are flagged, then matched against causes the data can prove: a budget or bid strategy change, disapproved or paused ads, a tracking drop visible across sources, a consent-rate shift, a landing page outage. A flag with no match stays unexplained.
05 Decision
Is the month fit to report?
Rules decide, per client, on the second working day.
- Sources complete and the tracking checks pass then draft the full commentary
- A tracking break or consent gap hit part of the month then draft with the affected dates marked, plus a note for the account lead to raise with the client
- A connector is stale or a platform is still revising figures then hold the draft, rerun the next morning, and tell the account lead why it is late
06 AI model · Structured output
Draft the commentary in the client's language
A model receives the KPI table, the flags, the matched causes with their evidence and the profile's tone notes, and drafts in the client's language from the start, returned through structured outputs. It may only name matched causes, and writes 'not yet explained' for the rest.
07 Plain code
Check the draft against its inputs
Each number and named cause in the draft is matched to the inputs. A mismatch sends the draft back once; a second failure reaches the account lead with the problem highlighted, not hidden.
08 Person
The account lead edits and approves
The draft sits next to the charts, each cause linked to its evidence, in the usual human-in-the-loop approval pattern. The lead adds what no system knows, such as the client's plans or last week's call, and approves. Nothing reaches a client without that approval.
09 Result
Publish, and keep the edits
Approved text goes into the client's Looker Studio report or a branded PDF. The lead's edits are stored, because they show where the profiles and checks fall short, and they become the next evaluation cases.
A draft for one client, and the checks that shaped it
An illustrative client: a furniture retailer in Germany, reported in formal German. The draft is shown here in English, as the account lead sees it on the second working day of September, before editing.
Review queue, Wednesday 2 September, client 17 of 40
- compute_kpis(client: "c17", month: "2026-08", profile: "qualified_leads")spend EUR 18,420, budget EUR 18,500 / qualified leads 212 in HubSpot, target 240 / cost per qualified lead EUR 86.89, target EUR 75.00, 16% over
- detect_anomalies(client: "c17", month: "2026-08")cost per qualified lead up from 13 Aug / Meta lead volume down 31% from 13 Aug / Google Ads steady
- match_causes(client: "c17", from: "2026-08-10", to: "2026-08-20")3 of the 5 highest-volume Meta lead ads disapproved 13 Aug / 2 edited and re-approved 19 Aug, 1 still in review / no budget or bid changes / consent rate steady
- crm_outcomes(client: "c17", leads_created: "2026-08")38 of 212 qualified leads booked a showroom visit / 9 closed-won, EUR 41,300 / last 7 days of attribution still maturing
Draft commentary · German, shown in English
August in brief: cost per qualified lead was EUR 86.89, 16% above the EUR 75 target, on spend of EUR 18,420 against a budget of EUR 18,500. Why: on 13 August Meta disapproved three of the five lead ads that bring in most of your leads. Two were edited and re-approved on 19 August; the third is still under review. Meta lead volume fell by 31% while they were off. Google Ads performed steadily all month. What the leads became: of August's 212 qualified leads, 38 have booked a showroom visit so far and 9 have bought, worth EUR 41,300 in your CRM. Please note: leads from ads seen in the last days of August can still be credited, so these figures may rise slightly in September's report.
- The account lead added a sentence about the new sofa range launching in October, which the client mentioned on a call, and approved.
What each client's profile holds
Generic reporting treats every account alike. The profile is where this build stops doing that: a version-controlled file per client, owned by the account lead.
| Field | Example | Why the report needs it |
|---|---|---|
| Primary KPI and target | Cost per qualified lead, EUR 75 | The commentary leads with what the client pays for, not the platform's favorite metric |
| Source of truth for conversions | HubSpot lifecycle stage 'Sales Qualified Lead', matched through the click ID captured on the form | Platform leads and qualified leads differ, and the profile says which one the target is set on |
| Attribution settings | Meta 7-day click, 1-day view; Google Ads data-driven | Changing a window changes the numbers, so the profile pins it and the report names it |
| Currency and timezone | EUR, Europe/Berlin | Accounts in another currency or timezone are converted before anything is compared |
| Language and tone | German, formal (Sie), no English jargon | The draft is written in the client's language from the start, not translated at the end |
| Known calendar | Summer sale in July, showroom event in September | Planned spikes and dips are expected, not reported as anomalies |
| Consent Mode setup | Advanced, banner managed by the client's developer | Tells the tracking checks what normal looks like here, and who to call when it breaks |
| Statement of work | Paid social and search, 20 hours a month | Feeds the scope check, and stops a report promising work the client has not bought |
Consent gaps, late conversions and the wrong culprit
Six failure modes decide whether account leads still trust the drafts after the first month. Each has a rule in code.
Consent Mode leaves holes
In Consent Mode's advanced setup, Google tags send cookieless pings when a visitor declines and GA4 and Google Ads model some missing conversions; in the basic setup, declined visits send nothing. A banner that breaks mid-month produces a drop that is not real, so the checks compare trends across GA4, the ad platforms and the CRM, track consent rate per client, and mark the affected dates instead of explaining them.
Conversions keep arriving after the month ends
Google Ads credits a conversion to the day of the click, and Meta's API can report it on the day of the impression, so the last week of a month keeps rising after it ends. Drafts run on the second working day, the final days are marked as still maturing, and last month's figures are restated in the next report when they move.
Every client defines success differently
One client pays for qualified leads, another for ROAS on a product feed, a third for store visits. Targets, conversion sources and attribution settings come from the profile, so a report never celebrates cheap clicks for a client who needs expensive leads.
Commentary that blames the wrong cause
The most damaging sentence in a client report is a confident, wrong explanation. The model may name only causes the checks matched, each with its evidence: the disapproval date, the budget change, the consent drop. Anything else is written as not yet explained, which gives the account lead a question to ask instead of a claim to defend.
Platform numbers and CRM numbers disagree
Meta reports 260 leads, HubSpot has 212 qualified ones, and the client's sales team remembers fewer. The report shows each number under its own label, says which one the target is set on, and never adds platform figures together. When the gap comes from reps updating the CRM late, a CRM update agent fixes the source rather than the report.
A connector stops syncing and nobody notices
Expired tokens and API changes break connectors without an error anyone sees, and a report built on a half-loaded month looks perfectly normal. Nightly freshness and row-count checks per client and source alert Slack the day it happens, weeks before the report is due.
The split between the model, the pipeline and the account team
The AI model
Draft the commentary in the client's language
Clear German or Dutch from a table of figures is quick for a model and slow for an analyst at month end.
Condense a month of account changes into a few lines
Change histories are long and noisy. The model summarizes, and the evidence stays linked.
Suggest next steps for the lead to keep or delete
Useful prompts for the account lead. None reaches a client unless a person chooses it.
Plain code
Load data and snapshot change history
Connectors plus scheduled API calls, with freshness checks per client and source.
Compute KPIs against each client's profile
SQL, so any number in a report can be traced to a query.
Match anomalies to causes
A cause is a record in the data, not a plausible story.
Check the draft's figures and causes
Catches a misquoted number before the account lead has to.
A person
Edit, approve and send every report
The account lead owns the client relationship, and the words that go into it.
Agree targets and profiles with the client
Targets are commercial commitments, not configuration.
The optional add-on: logged hours against the statement of work
The same pipeline can answer a question agencies rarely ask until renewal: is this client costing more hours than they pay for? Each week, time entries from Harvest, Productive.io or ClickUp are matched to the client's statement of work by service line. When a retainer runs ahead of plan, or work appears under a task type the SOW does not include, the account lead gets a short note with the entries behind it and a draft change request.
Two rules keep it useful rather than awkward. The model only classifies time entries against the SOW's deliverables; whether to bill, absorb or raise the extra work is always the account lead's call. And it reports by client and deliverable, never by person, so it stays a scoping tool rather than a way to watch staff. In Germany a works council, where one exists, has a say over technical systems that can monitor employee performance, so it should see the design before launch.
AgencyAnalytics or Swydo, or a reporting pipeline of your own?
For most agencies, buy first. AgencyAnalytics, Swydo, DashThis and Whatagraph connect to the ad platforms in minutes, produce the white-label dashboards clients are used to, and several now add AI-written summaries. If your clients are judged on platform metrics and your reports are mostly charts, one of these costs less than any build, and I would tell you to use it.
A custom pipeline earns its cost when the report has to know things those tools cannot: qualified leads and revenue from each client's CRM, offline sales, targets that differ per client, agency-specific KPIs, and causes found in change history and ad review status. Without that context, any automated summary can only describe what the charts already show, and the account lead ends up rewriting it.
The hybrid is often best. Keep Supermetrics or Funnel for connectors and Looker Studio or your reporting tool for the charts, and build only the part that is yours, the client profiles, the cause checks, the CRM blend and the review loop, as AI workflow automation. If you switch reporting tools later, that part moves with you. Pointed at the agency's own numbers instead of its clients', the same approach becomes a weekly KPI brief.
How you would know it is working
A blueprint has no results to report, so here is what I would measure from the first week instead, on your own data.
- Analyst hours per report
- Logged reporting time per client in the months before launch, against the months after.
- Edits per draft
- How much the account lead changes each draft, by client and section. Falling edits mean the profiles and checks are right; persistent edits show what is missing.
- Unexplained changes
- Share of flagged changes the checks could not match to a cause. The ones account leads later explain become new checks.
- Delivery day
- The working day each report is sent, against today's fifth or sixth.
- Data problems caught mid-month
- Stale connectors and tracking breaks flagged before month end, and how many days before the report they were found.
What a build like this costs
This is built as AI Workflow Automation, which runs $3.5K - $60K overall. A build like this one usually lands in the multi-step workflow tier: $15K - $30K, 3-5 weeks. The first working version runs on your real data well before the end of that window.
What it costs to run
Connector subscriptions such as Supermetrics or Funnel are usually the largest line, priced by sources and accounts. Model costs are small: one draft per client per month, plus revisions, comes to cents per client. BigQuery storage and queries for 40 clients' marketing data are modest.
What moves the price
- How many clients have CRM or offline revenue to blend, and how many different CRMs that means
- Ad platforms beyond Google and Meta, each with its own API, attribution rules and review statuses
- How many languages the commentary is written in, and how formal each client expects it
- Whether connectors into BigQuery already exist, or the pipeline starts from raw API credentials
- The scope add-on, which depends on how consistently time is logged against clients and deliverables
Who this is for
- Performance marketing agencies with 20 or more retainer clients and analysts who lose the first week of each month to reporting
- Agencies whose clients are measured on qualified leads, CRM revenue or offline sales rather than platform conversions
- Agencies and consultancies that still build each client's status PDF by hand
- Teams reporting to clients in several languages from one office
- Agencies that switched on the AI summary in their reporting tool and found it only restated the charts
Questions people ask about this
How do I automate client reporting for my agency without losing quality?
Automate the assembly and the first draft, not the sign-off. Connectors load the data, SQL measures each client against their own targets, checks match changes to causes found in the account data, and a model drafts the commentary. The account lead edits and sends. Quality usually improves, because the draft starts from complete, checked numbers instead of a rushed copy-paste.
Can AI write the commentary for Google Ads and Meta reports?
Yes, if it is given computed figures and proven causes rather than raw exports. In this build the model may only name causes the checks found, such as a disapproval or a budget change, and writes 'not yet explained' for anything else. Every number in the draft is matched against its source before the account lead sees it.
Do AgencyAnalytics, Swydo or DashThis already do this?
They handle connectors, white-label dashboards and scheduled sending well, and several add AI summaries. For reports built on platform metrics, they are enough. A custom pipeline is worth it when clients are measured on CRM revenue or offline sales, when targets differ per client, or when you want commentary that names causes found in change history.
How does it handle Consent Mode and missing conversion data?
It tracks consent rate per client, compares trends across GA4, the ad platforms and the CRM, and marks the dates where tracking or consent changed instead of explaining them. The account lead sees which dates are affected, so the conversation with the client is about fixing the banner, not about a performance drop that never happened.
Can the reports be white-label and in the client's language?
Yes. The commentary is drafted in the client's language from the start, using the tone notes in the client's profile, and published into your existing Looker Studio template or a branded PDF, so reports look like the ones clients already receive. The account lead's edits are kept, which shows where each language needs better tone notes.
How much does agency reporting automation cost?
It is a multi-step workflow with a review step, usually three to five weeks, in the tier shown on this page. The main drivers are the number of CRM integrations, ad platforms and languages. Running costs are dominated by connector subscriptions, and model costs per report are small.
Sources