Nine Hours of Screenshots Every Monday for Client Reports
By Ergini, Software & AI Developer
A composite story. The company and the people in it are invented. The problem, the rules and the system are real, and the full blueprint is in the use case library.
TL;DR
A composite story: at a 22-person performance agency in Amsterdam, each account manager spends Monday screenshotting Google Ads, Meta and GA4 into nine client reports, and the commentary, the part clients actually read, is written last and without evidence. The pipeline I would build loads the data nightly, measures each client against their own targets, matches changes to causes the data can prove, and drafts the commentary in the client's language. The account manager edits, approves and sends every report.
08:30, nine tabs
Sanne opens the same tabs every Monday: Google Ads, Meta Ads Manager, GA4, Looker Studio, HubSpot for the two clients who share it, and a slide template with each client's logo on it. She has nine clients, and each of them expects a report by noon.
Client one is an online bike shop, judged on return on ad spend. She screenshots the Google Ads overview, crops it, pastes it onto slide three. The Meta chart goes on slide four, after she fixes its date range, which still says last 28 days. GA4 goes on slide five. Then three sentences of commentary, in Dutch. Client one takes fifty minutes.
The agency is invented: 22 people in Amsterdam, 36 retainer clients in the Netherlands and Germany, four account managers, a short report for every client each Monday and a longer one each month. The Monday is real at every performance agency that reports this way. The accounts themselves wait until Tuesday.
11:30, the sentence nobody can prove
At 09:40 the second client's Looker Studio report shows blanks. The Meta connector's token expired at some point last week, and nothing told anyone. Sanne exports a CSV from Ads Manager and rebuilds the chart by hand.
At 10:15 she reaches the client she worries about: a kitchen retailer with four showrooms near Cologne, measured on showroom appointments booked through HubSpot, reported in formal German. GA4 conversions have halved since Wednesday. Two emails and half an hour later she learns that the client's developer replaced the cookie banner on Wednesday. But the appointments in HubSpot fell too, so the banner is not the whole story, and finding the rest would mean digging through the Meta account's history for a morning she does not have.
So at 11:30 she writes the sentence every account manager has written at least once:
Die Performance wurde in der vergangenen Woche durch Schwankungen auf der Plattform beeinflusst. Wir beobachten die Entwicklung genau.
Performance was affected by platform fluctuations; we are monitoring closely. At 12:10 the kitchen retailer's marketing manager asks in Slack how last week went. The report is not out yet.
The afternoon goes to the other six. One chart now counts a different conversion action, because someone edited a data source. At 16:30 Jeroen, who founded the agency, reads the German reports, rewrites the platform sentence and asks the question Sanne could not answer: was it the banner or something in Meta? The ninth report goes out at 17:30. Nine hours, and the commentary, the only part clients read closely, was written last, by someone who had been taking screenshots since half past eight.
What each client actually pays for
Jeroen books a call that week. He has tried the AI summary in his reporting tool, and it restated the charts in full sentences.
I ask to see eight weeks of one client's Monday reports, with Jeroen's edits, and a plain list of what each client is judged on. The edits tell the story at once: he never touches a chart. He rewrites commentary, and nearly always the same kind of sentence, the one that explains a change without evidence.
The list takes him two days, because it has never existed in one place. The bike shop is judged on return on ad spend. The kitchen retailer pays for showroom appointments in HubSpot, not for the leads Meta counts. A software client wants qualified leads, a language school wants enrolments. Yet every report opens with the same platform metrics, because that is what the screenshots show. The real targets live in onboarding decks and in four account managers' heads.
One thing I rule out on the call. A vague sentence about platform fluctuations is bad, but a confident, wrong explanation is worse, because the client repeats it to their boss. So the model that writes the commentary will not be allowed to explain anything the data cannot prove.
Causes are records, not stories
The connectors are bought, not built. Supermetrics or Funnel land every client's Google Ads, Meta and GA4 data in BigQuery each night, and every morning code checks freshness and row counts per client and source. An expired token becomes a Slack message on Tuesday instead of a blank chart the following Monday.
What the connectors miss, a small job keeps. It snapshots the Google Ads change history every day, 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. For the clients who share HubSpot, it adds the outcomes they actually pay for.
Then each client gets a profile, a small version-controlled file the account manager owns: the primary KPI and its target, which system is the source of truth for conversions, the attribution settings, the language and tone, the known calendar, the Consent Mode setup. SQL measures the week against that profile, flags anything outside the client's normal range, and tries to match each flag to a cause the data can prove: a budget or bid change, a disapproved or paused ad, a tracking drop visible across sources, a shift in consent rate, a landing page outage. A flag with no match stays unexplained.
Only then does a model write. It gets the figures, the flags, the matched causes with their evidence and the tone notes, and drafts in the client's language from the start. Code then checks every number and every named cause in the draft against those inputs.
The kitchen retailer's Monday, before and after. What Sanne wrote at 11:30:
Performance was affected by platform fluctuations last week. We are monitoring closely.
What the draft would say at 07:00, before she touches it (in formal German, shown in English):
Showroom appointments booked through your website fell last week and cost per appointment rose above target. On Wednesday Meta disapproved two of the three lead ads that bring in most of your appointments; one was re-approved on Friday, the other is still under review. From Wednesday, the share of visitors accepting cookies on your website also fell sharply, so GA4 recorded fewer conversions than HubSpot. Those dates are marked, and HubSpot is the figure to trust for them. Appointments from ads seen over the weekend may still be credited, so these numbers can rise slightly next week.
Jeroen's question from 16:30 has its answer, with a date and a source for each half. The draft cannot know why consent fell, so it gives Sanne a note to raise with the client, and she hears about the new banner on Monday morning instead of after two emails. The blueprint for agency client reporting describes the monthly report; the weekly one runs on the same pipeline.
The weekend that looked like a collapse
Before any client sees a draft, the pipeline writes the last eight Mondays again for five clients, and each draft is laid next to what Sanne sent, what Jeroen changed, and the same week's figures as they stood a week later.
That last comparison finds the first problem. Almost every draft reports a weak weekend, and almost every weekend recovers. The platforms keep crediting conversions after the fact: Google Ads assigns a conversion to the day of the click, and Meta's API can report it on the day of the impression, so the last days of any week are still rising on Monday morning. A monthly report has a few days of this at the end. A weekly report written on Monday has it every single time. So the most recent days are now marked as still maturing, and each Monday's report restates last week's figures when they have moved.
The second problem is one sentence. A draft for the language school explains a dip in enrolments with "seasonal demand", which is plausible, and which no check found. The draft check catches it, because a named cause that is not among the matched causes fails against the inputs. The draft goes back once, and if it fails again it reaches the account manager with the sentence highlighted. The rule the model works under stays short: name what was matched, and write "not yet explained" for the rest. That phrase gives the account manager a question to ask instead of a claim to defend.
Sanne's name is still on it
Nothing reaches a client without the account manager's approval. The draft sits next to the charts, with each cause linked to its evidence, and Sanne adds what no pipeline knows: the client's plans, the tone of last week's call, the thing she promised to look into. The model may suggest next steps, and they are prompts for her to keep or delete, never text that goes out on its own.
The profiles belong to the account managers too, and the targets in them are agreed with each client, because a target is a commercial commitment, not a setting. The file's history shows who changed a target and when. When the data is incomplete, as with the banner, what to tell the client is Sanne's call. And every edit she makes is kept, because her edits show exactly where a profile or a check still falls short.
The same Monday, hour by hour
At 07:00 nine drafts are waiting in the review queue. At 08:30 Sanne opens that instead of nine tabs. The bike shop needs a few minutes: a budget change Jeroen made on Thursday is named in the draft, with its date.
At 09:40 there is no blank chart. The Meta token expired on Tuesday, the freshness check posted to Slack that morning, and it was fixed before lunch. At 10:15 the kitchen retailer's draft names the disapproved ads and marks the consent dates. Sanne adds a line about the showroom event the client mentioned on last week's call, and writes to the marketing manager about the banner.
At 11:30 there is no sentence about platform fluctuations to write. The kitchen retailer has the report before anyone asks for it in Slack, and the afternoon goes to the accounts themselves: the ad still in review, the enrolments nobody can explain yet. At 16:30 Jeroen reads the edits, not the reports.
If your Mondays look like Sanne's
Buy first, probably. AgencyAnalytics, Swydo, DashThis and Whatagraph connect to the ad platforms in minutes and produce the white-label dashboards clients know, and several add AI summaries. If your clients are judged on platform metrics and your reports are mostly charts, one of them costs less than any build. A custom pipeline earns its cost when the report has to know what those tools cannot: appointments and revenue from each client's CRM, targets that differ per client, and causes found in change history and ad review status.
Even then, keep the connectors and the charts you have, and build only the part that is yours: the profiles, the cause checks, the CRM blend and the review loop. That is usually a multi-step workflow with a human in the loop on the AI workflow automation page, and the effort depends mostly on how many CRMs, ad platforms and languages it has to cover. The full blueprint has the profile fields and the failure modes, and the post on structured outputs explains how a draft can be held to its inputs.
Frequently asked questions
How do I automate weekly client reports for my agency?
Automate the assembly and the first draft, not the sign-off. Connectors load Google Ads, Meta and GA4 data every night, SQL measures each client against their own targets, checks match changes to causes found in the account data, and a model drafts the commentary in the client's language. The account manager edits, approves and sends every report, starting from checked numbers instead of screenshots.
Can AI write the commentary for Google Ads and Meta reports?
Yes, if it gets computed figures and proven causes rather than raw exports. The model may only name causes the checks matched, such as a disapproved ad, a budget change or a tracking break, and writes 'not yet explained' for anything else. Every number and cause in the draft is checked against its inputs before the account manager sees it.
Why do last week's conversions change after the report goes out?
Because the platforms keep crediting conversions after the fact. Google Ads assigns a conversion to the day of the click, and Meta's API can report it on the day of the impression, so the last days of any period keep rising for a while. A Monday report should mark those days as still maturing and restate them the following week when they move.
Do AgencyAnalytics or Swydo already do this?
They handle connectors, white-label dashboards and scheduled sending well, and several add AI summaries. If your clients are judged on platform metrics and your reports are mostly charts, use one of them. A custom pipeline is worth it when clients are measured on CRM outcomes such as booked appointments or revenue, when targets differ per client, or when commentary should name causes found in change history.