What this workflow does
- Monthly on the 1st, 7am (Schedule Trigger) starts the run.
- Read client config (Google Sheets) loads one row per client: GA4 property, Google Ads customer ID, recipients, tone notes, targets and the account team’s context notes for the month.
- Build date ranges and queries (Code) works out the three periods and builds the GA4 request and the Google Ads query for each active client.
- GA4: run report (HTTP Request) calls the GA4 Data API with three named date ranges for sessions, users, key events and engagement rate.
- Google Ads: monthly metrics (HTTP Request) runs a GAQL query for cost, clicks, impressions, conversions and conversion value by month.
- Compute KPIs and build prompt (Code) computes each KPI with month-over-month and year-over-year change and target status, and flags anomalies such as spend with zero conversions or a missing data source.
- Claude: draft commentary (HTTP Request) returns an executive summary, wins, concerns and next steps as structured output, using only the KPI table, context notes and tone notes.
- Check numbers and format draft (Code) handles
refusal,max_tokensand API errors, and rejects any draft containing a number that is not in the KPI table. - Draft passes checks? (If) sends good drafts to Slack: account manager approval, which waits up to 72 hours for Approve or Decline. Failed checks go to Slack: reporting exceptions with the reasons.
- Approved? (If) sends the report through Gmail: send report to client. A declined draft stays with the account manager to edit.
Before you import
- A Google Ads developer token for your manager account with Explorer access or higher. New tokens start at Test access, which only works on test accounts. Apply early; approval is outside your control.
- Google Analytics and Google Ads OAuth2 credentials with access to every client property and account.
- An Anthropic API key, a Slack app with
chat:write, and Gmail OAuth2.
Setup
- Create the Clients tab with the columns listed in the sticky note.
- Replace
REPLACE_WITH_SHEET_ID,REPLACE_WITH_GOOGLE_ADS_DEVELOPER_TOKEN,REPLACE_WITH_MANAGER_ACCOUNT_ID,REPLACE_WITH_APPROVALS_CHANNEL_ID,REPLACE_WITH_EXCEPTIONS_CHANNEL_IDandREPLACE_WITH_AGENCY_NAME. Prefer loading the developer token from your secret store over pasting it into the node. - Check the Google Ads API version in the URL against Google’s sunset dates.
- Ask account managers to fill in context notes before the 1st. Without them, commentary can only describe numbers, not explain them.
Test it
Set one internal or friendly client to active, run the workflow manually, and compare every KPI with the GA4 and Google Ads interfaces for the same dates. Edit a context note and run again to see the commentary change. Approve in Slack and confirm the email arrives with the right recipients.
Make it production-ready
- Most reporting errors come from a wrong account ID or conversion action, so review the config sheet quarterly.
- Store raw daily rows in BigQuery or Postgres so you can rebuild any month and add Meta, LinkedIn and Search Console extractors.
- Add an error workflow and spread clients across a few minutes to stay inside API quotas.
- Render a branded PDF or link a Looker Studio dashboard once the commentary is trusted.
Read the full guide at How to automate client reporting for marketing agencies, or talk to us about adding more ad platforms.