Weekly Marketing Report With an AI Agent, Windsor.ai and n8n
By Joris van Huët
Enterprise Interim CMO & Marketing Leader · 15+ years · 50+ orgs
Published
2026-10-26
The short answer: if one marketing lead loses Monday morning to pasting GA4, Google Ads and Meta figures into a report, an n8n agent reading Windsor.ai data can write the draft for $23 + $24 = $47 a month on monthly billing, plus model tokens counted in cents (Windsor.ai pricing, n8n pricing, checked on 26 October 2026), and nothing goes out until a named person has ticked every figure against the sheet it came from. A team already paying for Supermetrics in Google Sheets gets a lighter version on Starter at $55 a month (Supermetrics pricing). For example, if the report takes 180 minutes by hand and the check takes 30, the lead gets 150 minutes back each week, which is 150 x 52 / 12 = 650 minutes a month.
Disclosure: I may earn a commission through some links on this site. It does not change what this page says.
Writing the paragraphs is the easy half. A model writes fluent sentences about any table, including one it has misread: last week's column taken for this week's, two platforms' conversions added up as if they were orders. So the setup is built around the check.
Before you build anything:
- Price a run, not a platform. n8n bills one execution per complete workflow run, so a Monday schedule uses 4 or 5 of Starter's 2,500 a month (n8n pricing). The model is billed by its provider per token. For example, a run that reads 40,000 tokens and writes 3,000 at the $2.00 and $10.00 per million that OpenAI lists for gpt-6.1-sol costs 0.04 x $2.00 + 0.003 x $10.00 = $0.11, and five Mondays cost $0.55 (OpenAI API pricing).
- Start from the report you already send. List the figures that appear every week, each with its source and date range. That list becomes the sheet's columns and the agent's brief.
- Fix what "last week" means. Google Ads reports conversions on the ad impression date, while other tools use the date the conversion happened (Google Ads data discrepancies). Write down Monday to Sunday and one time zone, and give both to every tool.
- Time the old way for three Mondays. Minutes to assemble, minutes to check, and corrections made after the report went out. That is the baseline the agent has to beat.
What you need
- A Windsor.ai account with GA4, Google Ads and Facebook Ads connected. Basic covers 3 data sources and 75 accounts, and the Windsor MCP server comes with every plan (pricing page).
- Ad logins with read-only or reporting access for that connection, so the platform itself rejects any change (Windsor.ai answers).
- A Google Sheet that serves as the record, and an n8n workspace, Cloud or the free self-hosted Community Edition (choosing n8n).
- A model API key. Windsor's own n8n guide uses OpenAI (Windsor MCP in n8n).
- A Slack app for the approval, with interactivity switched on (Slack approvals).
Monday, step by step
- The record fills itself. A Windsor.ai destination task writes rows into a tab called source, one per date, channel and campaign. Set Columns to Match on date and campaign so each sync updates a row instead of adding a duplicate (Sheets guide). Basic syncs destination tasks daily (pricing page).
- The trigger. A Schedule Trigger fires on Mondays at 07:00. It runs on the workflow's time zone if you set one, and on the instance's otherwise, so set it (Schedule Trigger).
- The agent reads. A Google Sheets node gets last week's rows (Get Row(s)) and passes them to an AI Agent node with a chat model attached (AI Agent). For questions the sheet cannot answer, such as which campaign moved, add an MCP Client Tool pointed at
https://mcp.windsor.ai/with your Windsor API key as the bearer token, as Windsor's n8n guide shows. - Narrow what it can touch. In the MCP Client Tool, set Tools to Include to Selected and keep only read tools such as get_data (MCP Client Tool). Windsor lists 137 write actions across 19 connectors (write actions), and a report needs none of them.
- The agent decides and writes. Its instructions: headline figures come from the sheet only; every sentence names the figure it rests on; anything from a drill-down query carries the account, metric and dates it used; comparisons are this week against last week, never a mix of periods. The draft ends with a table of every number, its tab and row, and its date range.
- The human check. A Slack node sends the draft with Send and Wait for Response, Response Type set to Approval, Capture Who Responded on, and Restrict Who Can Approve set to the report owner. The workflow waits. The owner ticks the table against the source tab and approves or declines, and the output records who it was (Slack approvals).
- The output. On approval, a Gmail node sends the text to the distribution list (Gmail operations), and a row in a log tab records the date and the approver. On decline, nothing is sent and the owner fixes the sheet or the brief.
Why Slack: with n8n's default link buttons, anyone holding the link can respond and n8n cannot tell who clicked (Slack approvals), and this report's value is knowing who checked it.
What the checker is looking for
Wrong periods and wrong bases are quick to spot once the table names its rows. The slower one is conversions. Google Ads only reports conversions that follow a Google Ads interaction from the same account, and its help page warns that another tool may credit those conversions to other platforms (Google Ads data discrepancies). Meta's standard attribution counts events within 1 or 7 days of a link click and within 1 day of an ad impression (Meta attribution settings). For example, a shopper who clicks a Google ad on Monday, sees a Meta ad on Thursday and buys that evening meets both definitions, so one order can sit in both columns.
The rule for the agent follows from that: report each platform's conversions as that platform's figure, put the backend's orders or leads beside them, and state the gap without closing it. The rule for the checker is to reject any sentence that adds two platforms' conversions together.
The free version, and what paying adds
By hand, the job costs nothing but the morning: export last week from GA4, Google Ads and Ads Manager into the source tab, give any chat model the same instructions and closing table, tick it, send it. Windsor.ai's free plan, with 1 data source, 1 account and 30 days of data, can automate the largest channel on its own (pricing page), and n8n's Community Edition runs the workflow on your own server for free (choosing n8n). Paying buys the other sources on a schedule, a run that nobody has to start, and an approval that names its approver.
Teams already on Supermetrics can stay in the spreadsheet. A weekly scheduled refresh updates the whole file (scheduled refreshes), and Add results summary by AI writes a summary of a query at the top of the sheet. It uses GPT 4 by default, allows 15 summaries a month on a Google Sheets subscription, and passes data through the ChatGPT API, which keeps it 30 days and does not train on it (AI summary article). It summarises one query at a time, so the comparison across channels stays with you, and so does the same check of summary against table.
What it costs
| Setup | Billed monthly | Billed yearly, per month | What sets the price |
|---|---|---|---|
| Windsor.ai Basic | $23 | $19 | 3 data sources, 75 accounts, 5 destination tasks |
| n8n Cloud Starter | $24 | $20 | 2,500 executions |
| Model tokens, example above | $0.55 | $0.55 | Five runs at $0.11 |
| Supermetrics Starter | $55 | $44 | 1 core destination, 3 sources, 1 user |
Checked on 26 October 2026 on the pricing pages of Windsor.ai, n8n, OpenAI and Supermetrics. On monthly billing the agent route comes to $23 + $24 + $0.55 = $47.55. Supermetrics lists Claude, ChatGPT and Copilot on Starter, but its AI tools article calls AI chats a separate destination not in every package, so check the Hub first (AI tools article).
Windsor.ai includes write actions on every plan, the free one too, because an assistant that pauses campaigns from a chat window is part of what it sells (Windsor.ai answers). A reporting agent gets nothing from that default except exposure, which is why step 4 trims the tools and the login stays read-only.
How to know it worked
Three numbers, taken against the baseline from your three timed Mondays: minutes from data in the sheet to report sent, figures the checker corrected per draft, and corrections made after sending, which should stay at zero.
For the first four weeks, run both: the lead builds the report the old way while the agent drafts its own, and every difference is either an agent misreading or a slip by hand. That parallel month is the holdout for the process. After it, if corrections per draft stay above zero for three weeks running, fix the brief or the sheet; the approver is doing the job.
A report can match every platform and still overstate what marketing caused, because each column is that platform's claim. The free test of cause is a geographic holdout: pause one channel in one region for two weeks and compare orders there with the rest. Later, if you want that comparison running every week beside the report, a causal attribution tool such as Causality Engine is built to do it; disclosure: I founded it. Which figures belong in a leadership report at all is the subject of the one-page CMO dashboard.
Per-tool detail sits elsewhere: the Windsor.ai entry and how to keep ad history in BigQuery with it, the n8n entry and an n8n agent with a Slack approval, and the Supermetrics entry with budget pacing in Claude.
FAQ
What happens if the approver is on holiday?
The workflow keeps waiting, because Restrict Who Can Approve lets only the listed users act and anyone else who clicks gets a private notice (Slack approvals). Add a deputy to the list before the holiday, not during it.
Why give the agent a sheet when it can query Windsor directly?
Because the check needs a fixed table that does not change between the draft and the review. The MCP tool answers follow-up questions; the headline numbers come from rows a person can see.
Does this work in Claude instead of n8n?
Yes, with a person starting it each Monday: Windsor.ai connects in Claude under Customize, Connectors (Windsor.ai answers), and the same closing table and the same check apply.
ABOUT THE AUTHOR
I am Joris van Huët, an enterprise interim CMO. 15+ years, 50+ organizations, including ING, P&G, Nestlé, BNP Paribas, WeTransfer and Vinted. I take on innovation projects (venture building, design sprints), agentic marketing (setting up and running AI agents) and hands-on multi-channel work. See the track record.
I wrote and published this with AI assistance, and I answer for it. Claims about my own experience are limited to the track record above, and a statistic links to its source or is labelled as an example. I sell interim and fractional CMO work, which is why this site exists. How this site is written.
The agents in this article, built into your workflows and handed over to your team: the first one within two weeks.