ai
AI Marketing Reporting Automation: Weekly Summaries From an AI Agent on Rails
AI marketing reporting automation pulls approved metrics and writes a plain-language summary of what changed and what might explain it. A Reporting Summariser agent does this at read level (L1), from aggregates only. Queries produce the numbers, the model writes the words, and a check rejects any figure that does not match, on any customer data platform (CDP).
Rail level: L1 · Risk: low · Function: marketing operations
By Art Kukharenko · Published · Updated
All AI agent railsWho this is for: marketing-operations and analytics leads who want the time back and do not yet trust the numbers. Adopt the central rule, define the data scope, and run the first summaries with full review. The method is part of AI agent rails, and the rails explainer sets out the vocabulary. This job is the recommended first rail for a marketing-operations team.
Before: the manual workflow
The manual weekly report is a Friday afternoon in a spreadsheet. Someone copies numbers from five tools, and a copy error can stand unseen for weeks. Definitions drift, so "conversion" means one thing in the ad platform and another in the warehouse. The commentary varies by author, and a confident guess about a cause reads exactly like a finding.
What rules do and what the model does
Rules produce and check every number, and the model only writes the words around them. Fixed queries against a metric catalogue build a locked table, including each change and share, so the model never has to calculate. The model receives that table and writes the summary.
An automated check then compares the draft with the table. The check belongs to the reporting pipeline, outside the model, and it works in four steps:
- Extract every number, percentage, date and ranking word from the draft.
- Match each one to a cell in the locked table, allowing only the rounding you declared.
- Check direction words such as "rose" and "fell" against the sign of the change.
- Reject the draft if anything is unmatched, and return the list to the model. After a set number of failures, send the owner the table alone.
An illustrative example, with invented figures, shows the check at work.
Scroll horizontally to see all columns.
| metric_id | This week | Last week | Change |
|---|---|---|---|
| email_click_rate_promo_de | 2.1% | 2.6% | -0.5 points |
Scroll horizontally to see all columns.
| Draft sentence | Check result |
|---|---|
| "Promotional click rate in Germany fell 0.5 points to 2.1%." | Accepted: every figure matches, and the direction agrees |
| "Promotional click rate fell by 5%." | Rejected: 5% is in no cell |
| "The drop was caused by the new subject line." | Sent back by the wording rule: a cause stated as fact |
| "One hypothesis is the subject-line change on 12 May (calendar entry c_44)." | Accepted: a hypothesis with evidence |
Causes are written as hypotheses with evidence, never as findings. A number check cannot judge meaning, so a simple wording rule flags causal phrases, and the owner reads for the rest. CXL's reporting workshop teaches the same separation: reconcile one revenue number against its source, keep facts, hypotheses and missing data apart, and label a run incomplete when a source fails 3. A failed source should produce that label, not last week's numbers.
After: the job on rails, step by step
Weekly marketing report automation on rails runs as a fixed pipeline, so the model sees only a locked table and writes only the summary.
- The schedule fires, or the report owner makes a request.
- Fixed queries run, and nothing else can query.
- The table locks with a freshness stamp and a result hash.
- The model drafts the summary, with hypotheses and "what this does not show".
- The number check runs. A rejection returns to step 4.
- The owner reviews every report for the first weeks, then samples.
- A separate service delivers the report to a fixed list.
- The ledger writer records the run, outside the agent.
Why is delivery not the model's tool?
Delivery stays out of the model's hands because the session would otherwise hold all three Rule of Two properties 1. Campaign names and tracking parameters are untrusted text, since agencies and feeds write them. The metrics are sensitive business data. Posting to Slack or email would be external communication. With all three, one poisoned campaign name could steer a report to a place it should not go.
So delivery runs in a separate service with fixed recipients. The model holds no send, post or share tool, and the tool allow-list enforces that. The session keeps two properties and stays at L1. The 7 things article covers real incidents in this class.
What may a reporting agent read?
A reporting agent may read aggregates and definitions, and a data view enforces that limit outside the model.
Scroll horizontally to see all columns.
| Allowed | Not allowed |
|---|---|
| Aggregates above a minimum group size | Row-level profiles or individual records |
| Metric definitions from the catalogue | Free-text customer content, such as reviews or tickets |
| The campaign calendar | Small cells that could identify people |
| Fixed query results | Ad hoc queries or exports |
Model placement follows the data. Because the job works on aggregates, an external model is acceptable where the contract allows, and a private model suits regulated teams. If a report uses only non-personal ad platform data, a SaaS reporting tool may be perfectly fine. Say so in your rail card and move on.
The rail card
The rail card fixes what the Reporting Summariser may do. It has no propose or execute tools, because its summary is read-only output for review. The rail card guide explains the fields.
Scroll horizontally to see all columns.
| Field | Value |
|---|---|
| Job | Write a plain-language summary from approved metric queries. |
| Trigger | A schedule, or a request from the report owner. |
| Data scope | Aggregates above a minimum group size, metric definitions and the campaign calendar. No row-level data. |
| Tool scope | Read: fixed metric queries, metric catalogue, calendar. Propose: none; the summary is read-only output for review. Execute: none; a separate service delivers the report. |
| Output contract | Summary, locked figures table, query references, hypotheses, and what the report does not show. |
| Gate | The owner reviews each report at first, then samples. |
| Limits | Budget per run, minimum group size, no export. |
| Ledger | Query IDs, result hash, model version, report version, reviewer. |
| Evaluation | Spot checks of figures and claims, and an automated number check on every run. |
| Owner and kill switch | Analytics or marketing-operations lead. Stop the schedule, and the last reviewed report stays available. |
What the ledger shows for one report
One report leaves one record, so anyone can trace a sentence back to a query. The record below is illustrative, with example value values.
{
"record_id": "aud_000961",
"event": "report.reviewed",
"rail": "reporting-summariser@v4",
"queries": ["q_email_weekly@v7", "q_paid_weekly@v3"],
"result_sha256": "77ce...",
"fresh_at": "<timestamp>",
"number_check": {"attempts": 2, "result": "pass"},
"agent": {"model": "model-id@version"},
"report": {"ref": "rpt_0412", "version": 2},
"reviewer": "analytics_lead_01",
"delivery": {"service": "report-delivery", "list": "marketing-weekly@v2"},
"ledger": {"prev_hash": "12ab...", "hash": "90ef..."}
}
Three ways it fails, and the control for each
Reporting agents rarely fail on arithmetic once the number check runs, so most failures sit in meaning and context.
Scroll horizontally to see all columns.
| Failure | How it shows up | Control |
|---|---|---|
| An invented cause | A plausible story is written as fact and repeated in a meeting. | The hypothesis rule, evidence links and owner review. |
| A changed metric definition | A trend breaks because the definition moved, not the market. | Versioned definitions, plus an automatic note in the summary when a version changes. |
| Partial data read as a trend | A late feed, or a change in consent choices or modelled conversions, looks like a real drop. | Freshness stamps, a run labelled incomplete when a source fails, and a consent note where it changes what is counted. |
Over-reliance is the slower risk, because people stop opening the dashboard. Link every section of the summary back to its dashboard view, and keep sampling.
Metrics that are honest
Honest reporting metrics measure accuracy and review effort, not hours saved. Definitions come from the AI marketing operations roadmap, and no vendor time claim belongs in your business case.
- Numeric errors on spot checks. The target is zero. Any error is a defect in the check, so fix the check.
- Share of claims with evidence. Count each claim in the summary that links to a query or calendar entry.
- Reviewer edits per report, by rail and role. Annex III point 4(b) of the EU AI Act lists monitoring workers' performance as a high-risk use 2, so take advice before tracking named reviewers.
- Review time against writing time, measured by your team on your own reports.
How vendor tools compare
Packaged tools and templates mostly automate delivery, and the pages we read do not describe a number check. We opened these on 1 November 2026, and features may exist that the pages do not describe.
Scroll horizontally to see all columns.
| Tool | Where the data goes | Number checking described? | Review step described? | Delivery |
|---|---|---|---|---|
| Flozic automated marketing reports 4 | Connected ad, analytics and CRM tools; location not stated | No | No | Email and Slack on a schedule |
| Domo Marketing Report AI Agent 5 | Connects to your data infrastructure through Domo | No | No | Email on a schedule |
| n8n workflow 6420 6 | Google Ads, Facebook Ads and Analytics through GoMarble MCP, then a Claude or OpenAI model | No | No | Gmail |
| Supermetrics agent on Google Cloud 7 | Built with Vertex AI Agent Builder and the Agent Development Kit | No | No | Described as automating the weekly cycle |
A template that lets the model hold the mail step puts all three Rule of Two properties in one session, so move delivery out if you adopt one. Doing nothing is sometimes right too: if nobody acts on the report, stop producing it before you automate it. PrivyCDP's product page describes AI-assisted review of reports, with limits on data access and review of results.
How this feeds the VP Marketing agent
The Reporting Summariser covers one function, and the VP Marketing agent reads across functions. The weekly summary, with its query references and hypotheses, gives that readout reviewed inputs. Each agent keeps its own rail, so neither widens the other's data scope.
Checklist
- Every figure comes from a fixed query against the metric catalogue.
- The table holds each change and share, so the model never calculates.
- The number check rejects any unmatched figure.
- Causes appear only as hypotheses with evidence links.
- Aggregates enforce a minimum group size in the data view.
- A separate service delivers to a fixed list, and the model holds no outbound tool.
- The owner reviews every report at first, then samples.
- Each section links back to its dashboard view.
To see the order in which a team should add agents, read AI agents for marketing operations, or return to the AI agent rails hub. To write this rail for your own team, download the rail card template.
Browse use casesFunction playbooksAgent roster
FAQ
Can AI write marketing reports?
Yes, if you split the work. Fixed queries produce the numbers, an automated check compares every figure in the draft with the table, and the model writes only the words around them. A person reviews each report at first and then samples. Without that split, a language model can produce confident, wrong numbers.
How do you stop AI inventing numbers in reports?
Do not let the model calculate or query. Give it a locked table that already holds each change and share. Then extract every figure from the draft and match it to a cell, rejecting anything unmatched. Track errors found on spot checks. If one gets through, treat it as a defect in the check.
What data should a reporting agent see?
Aggregates above a minimum group size, metric definitions and the campaign calendar are enough for a weekly summary. It does not need row-level profiles, free-text customer content or small cells that could identify people. Enforce this in a data view, because an instruction in a prompt to ignore a column is not a control.
Should AI send reports automatically?
A service can, once the owner is sampling rather than reading every report, but the model should not hold the send tool. Campaign names are untrusted text, and the data is sensitive. Adding an outbound tool would give one session all three Rule of Two properties. Keep delivery separate, with fixed recipients.
What should a weekly marketing report include?
Start with what changed and how much, from a locked figures table. Add likely causes as hypotheses with evidence, then what to check next. Include a freshness stamp, any change in metric definitions and a section on what the report does not show. Link each section to its dashboard so readers can go deeper.
Sources
This article is general information, not legal advice.
Further reading
- AI Reporting Agent for Marketing
- AI Agents for Marketing Operations: A
- AI Agent for Marketing Anomaly
- Agent rails
- AI Agent Permissions Template Download
Published: · Updated:
Editorial dates describe content changes. Confirm current sources before making legal, security or purchasing decisions.