Marketing agencies · Reports

Automated recurring report

Each client's weekly or monthly report goes out on its own, in the same format, with the numbers calculated in the warehouse and the readout written by AI.

UsageWidely used
EffortMedium
ForAgencies that deliver a weekly or monthly report to each client.
Source

Final media, funnel and organic tables

Rule

Closed-period scorecard calculated in SQL

Outcome

AI-written readout on the scorecard

Activation

Scheduled send per client

What it solves

  • The report goes out on the right day and time, with no manual assembly.
  • Every client gets the same format, comparable across clients.
  • The period's readout comes written, with no made-up numbers.

Business questions it answers

Ask your agent these questions once the case is live.

How did client X's week compare with the previous week and with the month's average?
Generate client Y's monthly report for September.
What is the executive readout of client Z's LinkedIn for the closed month?
Which clients had the biggest drop in results last week?
Build the renewal presentation with client X's journey over the cycle.

What you need

  • Final media and funnel tables per client
  • The report structure approved with each client
  • An LLM API key stored as a secret in Nekt

What you get

  • A scorecard per client and period, with previous, average and change
  • An AI-written executive readout
  • Automatic delivery on each client's channel
  • Send log per client and period

Where to activate

Scheduled message

Slack, Google Chat, Discord or email at a fixed time, one message per client.

Page or presentation

HTML or an editable deck in the structure approved by the client.

On-demand AI agent

The account manager asks for the report and the agent follows the template in the context.

Ready to build?

The scorecard is simple SQL over tables that already exist. The work is in the per-client template and the sending notebook. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.

The problem

Building each client's report by hand eats days of the team's time at the start of every month, and every analyst does it differently. When AI is brought in to write it, it makes up numbers, compares a partial month with a full one, or fills in zeros for a channel the client never even hired.

How it is usually done, and the rule

Each row is a mistake that already happened in practice.

The common wayThe rule
01
Sending raw tables to the LLM to calculate and write.
Numbers come from SQL, the AI only writes

The scorecard, changes, ranking and priority are calculated in a table before the model runs. The LLM receives the finished scorecard for the client and period and writes the summary, highlights, alerts and recommendations. Priority is calculated in the transformation, not by the model.

02
Monthly report running on the 1st while conversions are still coming in.
Closed, explicit period

Monday to Sunday week (ISO) or a closed calendar month, in the client's time zone. The report runs after the data settles: Monday morning for the week, a few days after the month turns over for the month (e.g. the 4th). The current month only appears labeled as partial.

03
Each destination recalculates the change its own way.
Scorecard ready to read

One row per client, period and platform. For each metric: current value, previous period (_ant), average of the last 4 weeks including the current one (_med4) and change against the previous period (_var). The same scorecard feeds the dashboard and the message: the consumer only filters the period.

04
Partial month against a full month.
Compare windows of the same size

Week against the previous week, month against the previous month. For rolling windows, the last 30, 90, 180 and 365 days against the immediately preceding window of the same size. Cost per result for the period is total spend over total results, never an average of daily costs.

05
An SEO section with zero clicks for a client without Search Console.
Scope without a connector stays out of the report

If the client does not have the source connected (SEO, CRM, organic), the section is left out of the report; it does not show up with zeros. If the pipeline did not run in the period, the report says so instead of filling it in. Manual data (e.g. LinkedIn from a personal profile) is flagged as manual.

06
A different layout in every send.
Fixed structure approved by the client

Section order, charts, colors and typography live in a client context document, based on an approved reference report. Every report follows that structure. For presentations, use native, editable elements, never text baked into an image.

07
Filling in the target with the average of recent months.
Never estimate, ask

If next month's target, the period's deliverables or the client's assumptions are missing, the agent asks before building. A screenshot or value provided by the team only goes in when the table does not exist; never to fill in a number the warehouse has.

08
Sending on time with two-day-old data, with no warning.
Late data is flagged

Before sending, check that the source table is from today. If it is not, wait a short window (e.g. 25 minutes) and, if it still does not arrive, send with a note that the data is from the previous day.

09
A single loop that stops at the first error and resends everything on retry.
One send per client and period

Persistent log per client and period: rerunning does not resend. A failure for one client does not stop the others. Long messages are split at the channel's limit (e.g. 1,900 characters on Discord). A client who has left the portfolio does not get a report; churn is flagged.

Definitions

Report week
closed Monday to Sunday, in the America/Sao_Paulo time zone, ending on the Sunday before the send
Report month
closed calendar month, generated after the conversion sources settle
_ant
the metric's value in the previous period of the same size
_med4
average of the last 4 weeks, including the report week
_var
current / previous - 1; empty when the previous value is zero
Cost per result for the period
total spend / total results in the period, dividing only once
Readout
LLM text about the scorecard: summary, highlights, alerts and recommendations, with no number that is not in the scorecard

Pitfalls that already happened

Numbers made up by the AI

Given raw data, the model miscalculated and filled gaps with plausible values.

Hand over the finished scorecard and check every number in the text against it.

A drop that was a partial month

The current month compared with a full month showed a steep drop that did not exist.

Compare closed periods or label the partial one.

Zeros for a channel the client does not have

Sections without a connector showed up with zeros and the client thought the channel had died.

Scope per client: no connector, no section.

Generic readout

Note fields cut at 600 characters chopped off the client's exact wording, and the text came out generic.

Do not truncate the context that sets the tone; use high limits and only the fields needed.

Report with stale data

The chain ran late and the message went out on time with data from two days earlier, without anyone noticing.

Check the table's date before sending and warn when it is stale.

Duplicate or missing sends

An error for one client stopped all the others, and the retry resent to those who had already received it.

Log per client and period, and failure isolation.

Acceptance test

The case is done when every item passes.

Agent package

Paste into Claude, ChatGPT or any client with the Nekt MCP connected.

Full Markdown
Recurring client report
- The report covers one client and one closed period: a Monday to Sunday week or a calendar month, in the client's time zone. The current month only as partial, with a label.
- Every number comes from the scorecard calculated in the warehouse. The written readout contains no number that is not in the scorecard.
- Comparisons: previous period of the same size (_ant), average of the last 4 weeks (_med4) and change (_var). Never partial against full.
- Cost per result = total spend / total results for the period.
- A section without a connector enabled for the client is left out of the report; it does not show up with zeros. If the pipeline did not run, say so.
- Follow the client's approved structure: section order, charts and colors from their template document.
- If a target, assumption or deliverable for the period is missing, ask before building. Never estimate.
- Screenshots or provided values only when the table does not exist; never to fill in a number the warehouse has.
- A client with churn status does not get a report; just flag it.
Per-client exceptions:
- <client>: weekly report, sections in the order <list>, template approved on <date>.
- <client>: <scope> is manual data, provided by the team by day <n>.
- <client>: report result = <event>, cost including <x>% tax.

Variations

Daily summary

Yesterday per client, short, for the media team, with Meta and Google side by side.

Renewal

The journey across the whole cycle and a continuation proposal, instead of month over month.

Rolling windows

Last 30, 90, 180 and 365 days against the previous window of the same size.