Weekly report by e-mail and Slack
The weekly report brings Pulse to your inbox or a Slack channel: leads (or purchases and revenue in shop projects), cost per lead, the best campaigns, open recommendations and tasks, and – when Search Console is connected – clicks and queries from Google Search. Each member subscribes for themselves; a report never shows more than the member may see in the dashboard, and it never contains names or contact details of leads, whatever the member's role.
In the dashboard
- Einstellungen › Wochenbericht of a project lists your reports that cover this project (the project itself, its client or all your projects) and sets up a new one pre-filled for it.
- Konto › Wochenberichte (
/account/reports) lists all your reports.
The wizard asks four questions – what the report covers, where it goes (your e-mail or a Slack channel), when (weekday, time, time zone, language) and which parts it contains – and then shows a preview with the numbers of the last full week. Every member can subscribe, viewers included; the public demo shows the page read-only.
The table of your reports can be sorted by every column, filtered by channel and status, searched, and its columns can be shown or hidden. Each row offers Test senden (live status: queued, sending, sent or failed – the button stays disabled until the test is done), Verlauf (the last deliveries with status, attempts and the problem in plain words), Bearbeiten, Pausieren / Fortsetzen and Löschen.
Subscribe
POST /v1/me/report-subscriptions
{
"channel": "email",
"scope": "project",
"projectId": "…",
"weekday": 1,
"time": "08:00",
"timezone": "Europe/Berlin",
"locale": "de",
"sections": ["kpis", "campaigns", "recommendations", "tasks", "traffic"]
}scope:project(one project, needsprojectId),org(every project of an organization you see, needsorgId) orportfolio(all your projects, neither id).channel: "slack"takeswebhookUrl– a Slack incoming webhook (https://hooks.slack.com/services/…) – and an optionalslackLabelsuch as#marketing. The URL is stored encrypted and shown only as a label plus its last four characters afterwards.weekdayis the ISO weekday (1 = Monday … 7 = Sunday);timeis local time intimezone. The send time follows daylight saving: 08:00 stays 08:00 local time all year.- Sections:
kpis,campaigns,sources,recommendations,tasks,traffic(Besucher),search(Search Console). Withoutsectionsa new subscription getskpis,campaigns,recommendations,tasksandtraffic. - Subscriptions are personal: the endpoints under
/v1/me/need a dashboard session; another person's subscription answers 404. One e-mail subscription per subject (a second one answers409 conflictwith the existingsubscriptionId), at most 50 per person.
GET /v1/me/report-subscriptions lists yours, PATCH /v1/me/report-subscriptions/{id} changes the
schedule, sections, language or webhook or pauses it (enabled: false), DELETE removes it with
its history. Resuming a subscription whose projects you can no longer see answers 409 conflict.
Content
| Section | What it shows |
|---|---|
kpis | Leads (shop projects: purchases and revenue), qualified leads, ad spend, cost per lead or per purchase, each with the previous week; organization and portfolio reports add one line per project (best first, at most 10) |
campaigns | The five campaigns with the most leads, with cost per lead |
sources | Leads and cost per platform (Google, Meta, LinkedIn, TikTok, without ads) |
recommendations | Up to three open recommendations per project with the reason; members without access to ad costs see a note instead |
tasks | Open alerts („Braucht Dich“) with a link to each |
traffic | „Besucher“ (project reports): Ø Besucher pro Tag with its change, Besuche and the share without ads with the previous week, the reason for the change („Warum?“: the channel group that moved most, its main source and the visits without ads), the best day, the visits from search engines (plus Google clicks when Search Console is connected), same-day returns (30-minute rule; returns on other days only above their consent gate). The first measured week has no comparison; a week under the project's minimum number of visits says so instead of showing figures |
search | Clicks, impressions, CTR and average position from Search Console with the previous week, plus the top queries |
With a lead target for the month and „Im
Wochenbericht zeigen“ switched on, the key numbers end with one line: „Im Oktober bisher 10 Anfragen,
Ziel 25.“ Subscriptions that already showed the key numbers received the traffic section once when
it was introduced; removing it in the wizard keeps it removed.
The report covers the last full ISO week (Monday to Sunday) before the send day, in the time zone of the subscription. Missing data is explained instead of left out: a week without visits says to check the installation, missing ad accounts or costs of one platform are named, and the search block says whether Search Console is not connected, expired, without permission or still syncing. Projects in different currencies are never summed. Demo projects are never sent.
Preview and test
POST /v1/me/report-preview renders exactly what would be sent – subject, text, HTML and the Slack
message – without sending anything (week such as 2026-W41 picks another week).
POST /v1/me/report-subscriptions/{id}/test answers 202 at once and sends right after, marked as
a test; it does not replace the week's regular report. At most 10 tests per person and hour
(429 rate_limited). GET /v1/me/report-subscriptions/{id}/deliveries shows recent deliveries with
their status (queued, sending, sent, failed, skipped), attempts and error.
Errors of a delivery start with a code:
| Code | Meaning | What happens |
|---|---|---|
destination_rejected | Slack refused the webhook (deleted, revoked, channel archived) | Not retried – enter a new webhook and send a test |
slack_unavailable | Slack did not answer, answered 429 or 5xx | Retried with backoff |
mail_failed | The SMTP server did not accept the mail | Retried with backoff |
mail_not_configured | The server has no SMTP (X3_SMTP_URL) in production | Skipped |
no_access | You lost access to the report's projects | Skipped, subscription paused |
demo_only | The report would only contain demo projects | Skipped |
missed | The scheduler did not run for more than three days after the send time | Skipped, the next week is sent normally |
A successful delivery clears the last error of the subscription.
Delivery
The scheduler job reports.weekly runs every 5 minutes and sends every subscription whose time has
come. Each report is sent at most once per subscription and week: a retried, repeated or
overlapping run never sends twice. Failed deliveries are retried by reports.retry after 5 minutes,
30 minutes, 2 hours and 6 hours (at most 5 attempts).
E-mails go through the server's SMTP connection (X3_SMTP_URL, sender X3_MAIL_FROM); without
it, development servers write the mail to the log and production servers skip it with
mail_not_configured – see environment variables. Slack messages
use incoming webhooks; no Slack app or extra configuration is needed.
Unsubscribe
Every e-mail carries an unsubscribe link and the List-Unsubscribe / List-Unsubscribe-Post
headers, so mail clients offer one-click unsubscribe (RFC 8058). The link's token is the credential;
opening the link shows what it refers to and unsubscribes only on the button:
| Endpoint | Purpose |
|---|---|
GET /v1/reports/unsubscribe/{token} | What the link refers to (channel, scope, weekday and time) |
POST /v1/reports/unsubscribe/{token} | Unsubscribe (idempotent; also the one-click target) |
Unsubscribing pauses the subscription; you can resume it under Konto › Wochenberichte.
Claude and MCP
| Tool | What it does |
|---|---|
reports_preview | Renders the weekly report of a project, an organization or all your projects (subject, text and Slack message) without sending |
reports_list | Your own subscriptions with schedule, status and next send – needs a personal sign-in (OAuth), not an API key |
Subscribing and test sends stay in the dashboard.