SEO Services
Marketing Agency / Technical Guide
Automate Weekly Client SEO/Ads Reports with n8n + Claude Step-by-Step Guide
A complete walkthrough for building an n8n + Claude pipeline that pulls every client’s GA4, Search Console and Google/Meta Ads numbers, runs anomaly detection, asks Claude to write the insight section in your agency’s voice, assembles a branded PDF and ships it to each client — fully white-label, every Monday at 9am.
Client config (Airtable)
Pull GA4 / GSC / Ads (parallel)
WoW / YoY anomaly detection
Claude writes insights
Branded PDF (Puppeteer)
Email + Slack handoff to AM
1. The Problem — Monday Morning Reporting Tax
Every digital marketing agency past ~12 retainer clients hits the same Monday morning ritual: an account manager opens 4 tabs per client (GA4, Search Console, Google Ads, Meta Ads), copies numbers into a Google Slides template, writes 3-5 bullets of “what happened last week” from memory, and sends it before the noon client check-in. Multiply by 30 clients and you’ve burned 25-40 analyst hours on a deliverable nobody is paid extra for — and the insights are inconsistent because three different humans wrote them.
Real numbers from a 32-client agency
| Active retainers | 32 |
| Avg analyst hours per weekly report | 1h 10min |
| Total weekly reporting hours (agency-wide) | ~38 hrs |
| Reports delivered before Monday 9am | 41% |
| Anomalies surfaced proactively (not by client) | 28% |
The hidden cost is bigger than the visible one. The clients who churn rarely cite “the report was late” — they cite “I never knew what was actually working.” Reports that just dump pretty charts let problems fester for weeks. The agencies that retain best are the ones whose Monday email always says clearly: “this went up because, this dropped because, here’s what we’re doing about it.”
What “automated reporting” means here
It is not a Looker Studio template with the client logo swapped in. That’s what most agencies already have, and it’s the reason clients say their reports feel generic. Real automation has three parts:
- Data layer: a single n8n workflow per agency that pulls GA4, GSC, Google Ads, Meta Ads in parallel for every client every Monday at 6am.
- Insight layer: Claude reads the WoW and YoY deltas, identifies the 3-5 things actually worth saying, and writes them in the agency’s house voice — not Google’s “sessions decreased by 12.3% week-over-week” style.
- Delivery layer: a branded PDF assembled with the client’s logo, color tokens and account-manager signature, emailed to the client and posted into the AM’s Slack channel for review-then-send.
2. System Architecture
Eight components, each replaceable. The orchestration layer is self-hosted n8n so the agency owns every credential and every line of report logic — clients hate when their reports stop because a third-party SaaS deprecated an integration. Airtable holds client config so AMs without code access can change a client’s logo, KPI list or recipient email.
The stack
Cost estimate (30 clients, weekly cadence)
| Claude Sonnet (30 clients x 4 weeks x ~3,500 tok in / 900 tok out) | ~$48 |
| Claude Haiku (subject lines + summaries) | ~$6 |
| VM (n8n + Chromium for Puppeteer on Hetzner CCX23) | ~$48 |
| Postmark (1,200 emails/mo) | ~$15 |
| Airtable team plan | ~$60 |
| Total / month (30 clients) | ~$177 |
At a typical agency loaded analyst rate of $65/hour, recovering even 25 of the 38 weekly reporting hours is ~$1,625/week or ~$84,500/year. The same orchestration layer slots into the broader AI automation services we deploy.
Client Config in Airtable
Every client is one row. The AM should be able to onboard a new client in 8-10 minutes by filling that row — no engineer needed. The schema is intentionally flat so it can be edited in the grid view; nested config goes into JSON fields that the AM rarely touches.
Airtable schema — `clients` table
n8n loader: pull active clients
Parallel API Pulls per Client
For each client, fire all four data sources in parallel — there is no dependency between them. The whole pull should finish in under 6 seconds even with cold caches. If one source fails, fail soft: still build the report from the others, and Slack the AM that the broken source needs reauth.
GA4 Data API request
Search Console — top movers
Google Ads — campaign report
n8n parallel-pull pattern
Use a Split In Batches node over the client list, and inside each iteration use four parallel HTTP nodes joined by a Merge node in “wait for all” mode. Wrap each external call in a Try/Catch sub-workflow so a single 401 from Meta doesn’t kill the entire run.
Anomaly Detection (WoW & YoY)
If you hand Claude a raw 50-row CSV and ask “what’s interesting?” you get a paragraph that lists the obvious. The trick is to do the math in code first, label each metric with a severity, and feed Claude only the labeled deltas. That keeps token cost low and makes Claude’s output focus on the right 3-5 things every time.
Threshold table (per-metric)
| Metric | Notable | Concerning | Critical |
|---|---|---|---|
| Sessions WoW | ±10% | ±20% | ±35% |
| Conversions WoW | ±15% | ±25% | ±40% |
| Revenue WoW | ±15% | ±25% | ±40% |
| CPA WoW | ±12% | ±20% | ±35% |
| ROAS WoW | ±10% | ±18% | ±30% |
| Organic clicks WoW | ±12% | ±22% | ±35% |
Anomaly classifier (n8n Function node)
After classification, filter to only the metrics tagged `notable`, `concerning` or `critical` and pass that filtered list to Claude. The “stable” rows still appear in the report’s data table — they just don’t get airtime in the insight section.
Claude Insight Prompt
The insight section is where automated reports live or die. A bad prompt gives you “Sessions decreased by 12.3% week-over-week” — a sentence the client could have generated themselves from the table. A good prompt makes Claude pick the 3-5 things actually worth saying, frame each in the agency’s voice, and split them into Wins, Concerns and Next Steps.
The system prompt
n8n HTTP Request to Claude
Sample output
Branded PDF Assembly
Render the report as HTML using the client’s brand tokens, then convert to PDF with Puppeteer. This pattern lets every report be infinitely customizable per client (logo, colors, fonts, section order) without per-client code. The HTML template lives in the n8n repo, the tokens come from the Airtable row.
Report HTML structure
Puppeteer render (n8n Code node)
Delivery + AM Handoff
There are two delivery models. The fully-automated one emails the PDF straight to the client at 9am Monday. The supervised one drops the PDF and Claude’s draft into the AM’s Slack channel at 7am for a 60-second review and a one-click “send” — the better choice when you’re rolling out, because it builds AM trust before you hand the keys over.
Slack review payload
Outbound email (Postmark)
Setting `From` to the AM’s address (with proper SPF/DKIM via Postmark) is the difference between “this looks like marketing automation” and “this looks like my account manager”. Always send `TrackOpens: true` and stash the open event in Postgres — open rate is the single best leading indicator that the report is actually being read. The same pattern drives our work for SaaS automations where personalized sender identity moves reply rates dramatically.
9. White-Label Layer
A real white-label system is more than a logo swap. It controls three layers per client: visual identity (logo, fonts, color tokens), voice (tone select that bends Claude’s writing style) and footer attribution (your AM, your domain, optional client-side co-branding). Done right, the report looks like the agency’s house product but feels like the client’s own internal document.
Per-client brand tokens
| Token | Source | Used in |
|---|---|---|
| brand_primary_hex | Airtable | Cover, section headers, KPI accent bar |
| brand_secondary_hex | Airtable | Section dividers, chart accent |
| brand_logo | Airtable attachment | Cover page top-left |
| brand_tone | Airtable select | Claude system prompt |
| am_name + am_email | Staff table | Footer + email From header |
| report_locale | Airtable | Number formatting, weekday names, currency |
Voice tone control
The `brand_tone` Airtable field swaps a one-paragraph block at the bottom of the Claude system prompt. The simplest implementation has three presets and they cover 90% of clients:
- Formal: “Write in a measured, professional tone. Use complete sentences. No contractions. Lead with data, follow with interpretation.”
- Friendly: “Write like a smart colleague explaining things over coffee. Contractions are fine. Lead with the human takeaway, not the percentage.”
- Technical: “Write for an in-house growth engineer. Use precise marketing terminology. Show the math when it matters. Skip the cheerleading.”
Multi-language reports
The `report_locale` token controls three things: the language the Claude prompt asks for (“respond in Hebrew” / “respond in Spanish”), the number format (`1,234.5` vs `1.234,5`) and the weekday/month names rendered in the cover page header. The HTML template uses `Intl.NumberFormat(locale)` and the same template handles Latin and RTL clients without forking.
10. Common Failures & Fixes
Three failure modes show up in nearly every agency rollout. They’re cheap to design around on day one and expensive to retrofit after the first 90 days of clients are reading reports.
Failure 1: Phantom anomaly during a known launch
Symptom: Client launched a new pricing page on Wednesday. Tuesday’s signups dipped 38% as expected. The Monday report leads with “Critical concern: signups down 38%” and the client’s CEO emails before lunch.
Fix: The AM-notes field. Add a `client_events` table in Airtable with date, label and direction. Auto-injected into Claude’s prompt, with a rule: “if a client event is logged within the report window, use it as the cause and downgrade severity by one tier.”
Failure 2: Token expiry on Monday morning
Symptom: Google Ads OAuth token expires Sunday night. 12 client reports go out at 9am Monday with the Ads section blank because the workflow swallowed the 401.
Fix: Run a credential health check on Saturday at 6pm — make a single dummy request per OAuth credential and Slack the agency owner if any return 401. Refresh tokens proactively rather than reactively. The Saturday window leaves Sunday available for manual reauth.
Failure 3: Claude inventing a cause
Symptom: Sessions are flat, but Claude writes “the recent algorithm update from Google likely contributed to the drop.” There was no algorithm update. The AM has to scrub the report.
Fix: Two rules in the system prompt — “never reference a Google or Meta update unless explicitly listed in the AM-notes field” and “never invent a cause not supported by query/campaign movers in the input.” Run a once-a-month spot check across 5 random reports and add new forbidden phrasings whenever you catch one.
11. Measured Results — 90 Days In
Numbers from a real implementation at a 32-client digital agency (4 AMs, 2 senior strategists, mixed SEO + paid retainers averaging $4.2k/month). No change in service offering during the test — the lift is entirely from time recovered, on-time delivery and insight quality.
The headline metric inside the agency is what AMs do with the reclaimed 29 hours: more strategy calls, more proactive optimizations between reporting cycles, and the bandwidth to take on net-new retainers without hiring. The retention improvement (an 11-percentage-point lift in 12-month logo retention) was the single largest revenue impact and only became visible at the 9-month mark.
Email open rate on the weekly report stabilized at 71% across the client portfolio. Anything below 50% is a signal a client has tuned out — the system flags it automatically and prompts the AM to schedule a check-in call.
12. Implementation Timeline & Cost
- n8n self-host + Puppeteer container: 6–10 hrs
- Airtable client config + n8n loader: 4–6 hrs
- GA4 + GSC + Ads OAuth + parallel pulls: 14–20 hrs
- Anomaly detection + thresholds tuning: 8–12 hrs
- Claude insight prompt + voice tone presets: 12–18 hrs
- HTML report template + brand tokenization: 14–20 hrs
- Slack review + Postmark delivery: 6–10 hrs
- AM training + run-book + monitoring: 6–10 hrs
- Week 1: Audit current reporting, lock the KPI list, design HTML template
- Week 2: Wire GA4/GSC/Ads + anomaly thresholds + Airtable schema
- Week 3: Claude insight prompt tuning against 4 weeks of historical data
- Week 4: Pilot on 5 clients, AM training, then ramp to full portfolio
- Includes: voice-tone presets, monthly insight quality review, ongoing prompt tuning
FAQ
Want this built for your agency’s reporting?
SEOKRU deploys this exact system in 4 weeks. We audit your current reporting, design the HTML template against your house brand, wire GA4/GSC/Ads/Meta for every active retainer, tune the Claude prompt against 4 weeks of your historical data and train your AMs on the new flow. You keep ownership of every component — workflows, prompts, templates, Airtable, the lot.
Talk to an agency automation engineer