Final media, funnel and organic tables
Closed-period scorecard calculated in SQL
AI-written readout on the scorecard
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.
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
Slack, Google Chat, Discord or email at a fixed time, one message per client.
HTML or an editable deck in the structure approved by the client.
The account manager asks for the report and the agent follows the template in the context.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
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
spend / total results in the period, dividing only oncePitfalls that already happened
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.
The current month compared with a full month showed a steep drop that did not exist.
Compare closed periods or label the partial one.
Sections without a connector showed up with zeros and the client thought the channel had died.
Scope per client: no connector, no section.
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.
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.
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.
- For one client and one closed week, every number in the scorecard matches a direct query on the source table (zero difference).
- Every number cited in the AI-written readout exists in that client's scorecard for that period.
- A client without an SEO connector has no SEO section in the report, not even with zeros.
- Rerunning the send for the same period does not produce a duplicate message, and a client with an error does not block the send for the others.
- The current month, when it appears, is labeled as partial.
Agent package
Paste into Claude, ChatGPT or any client with the Nekt MCP connected.
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.
Build the "Automated recurring report" case in my Nekt workspace following the rules at https://academy.nekt.com/en/industrias/agencias/relatorio-recorrente-automatizado.md. 1) Find the source tables and confirm the columns the rules use. 2) Create a transformation at the stated grain applying every rule. 3) Run the acceptance test and show me the result of each item. 4) Create the case's context document in the workspace, leaving my clients' exceptions open for me to fill in.
Variations
Yesterday per client, short, for the media team, with Meta and Google side by side.
The journey across the whole cycle and a continuation proposal, instead of month over month.
Last 30, 90, 180 and 365 days against the previous window of the same size.