Build a Daily KPI Digest Email in 30 Minutes (No Code)
Morning coffee. Email arrives. Numbers you care about, with day-over-day deltas and a one-line take. Build the whole thing from scratch without writing code.
The build: every morning at 7 AM, you get an email with your KPIs, day-over-day deltas, week-over-week deltas, and one AI-generated sentence about what changed.
Total time: 30 minutes. No code.
What you'll need
- -Where your KPIs live (Google Sheets, Airtable, Stripe, your DB)
- -n8n cron (or Make scheduler)
- -Email sending (Resend, Gmail, or n8n's built-in)
- -AI API key
Step 1: Schedule trigger (2 min)
n8n cron node. Set to fire daily at 7 AM in your timezone.
Step 2: Fetch KPIs (10 min)
This step varies by where your data lives. Two examples:
Google Sheets: Add a Google Sheets node. Read the relevant range. The sheet should have today's row and yesterday's row at least.
Stripe: Add a Stripe node. Pull recent invoices, subscriptions, or revenue summaries.
Your DB: Add an HTTP Request node pointing at your internal API, or a Postgres node if you can connect directly.
Goal: end up with a JSON object that has today's numbers AND yesterday's numbers AND last-week-same-day numbers.
Step 3: Compute deltas (3 min)
Add a Code node:
```javascript const today = $input.first().json.today; const yesterday = $input.first().json.yesterday; const lastWeek = $input.first().json.lastWeekSameDay;
const metrics = ['revenue', 'signups', 'mrr', 'active_users'];
const deltas = metrics.map(m => ({ metric: m, today: today[m], dayOverDay: today[m] - yesterday[m], dayOverDayPct: ((today[m] - yesterday[m]) / yesterday[m] * 100).toFixed(1), weekOverWeek: today[m] - lastWeek[m], weekOverWeekPct: ((today[m] - lastWeek[m]) / lastWeek[m] * 100).toFixed(1), }));
return [{ json: { deltas, raw: today } }]; ```
Step 4: AI commentary (5 min)
Add an AI node. Prompt:
``` You are commenting on a daily KPI report.
Today's metrics with deltas: {{ JSON.stringify($json.deltas) }}
Return ONE paragraph (3-5 sentences) covering: - The single most notable change (good or bad) - Whether the pattern is consistent with recent days - One specific thing to investigate or celebrate
Do NOT list every metric. Do NOT say "let's continue to monitor". Do NOT pad with generic commentary. Be specific. Be brief. ```
Step 5: Format the email (5 min)
Add an HTML email node. Template:
```html <div style="font-family: monospace; max-width: 600px;"> <h2>KPIs for {{ date }}</h2>
{{#each deltas}} <div style="border-left: 3px solid {{#if positive}}#10b981{{else}}#ef4444{{/if}}; padding-left: 12px; margin-bottom: 16px;"> <div style="font-size: 14px; text-transform: uppercase; color: #666;">{{ metric }}</div> <div style="font-size: 24px; font-weight: bold;">{{ today }}</div> <div style="font-size: 12px;">{{ dayOverDayPct }}% vs yesterday | {{ weekOverWeekPct }}% vs last week</div> </div> {{/each}}
<p style="font-style: italic; border-top: 1px solid #ccc; padding-top: 16px;"> {{ ai_commentary }} </p> </div> ```
Step 6: Send and test (5 min)
Send to yourself. Verify the email lands. Verify the numbers match the source. Verify the AI commentary is sane.
Run the workflow manually (not waiting for 7 AM) to test.
Common gotchas
- -Time zones: cron in n8n uses server TZ by default. Force a specific TZ in the node settings.
- -Division by zero: yesterday's metric is 0 → delta calc errors. Add a guard in the Code node.
- -Stale data: if your source data lags by a day, today's numbers might actually be yesterday's. Document this in the email.
What I do with this
Every morning at 7 AM I see the numbers before I check my phone. By the time I'm at my desk I already know what's worth investigating.
The AI commentary is what makes this different from a dashboard. A dashboard tells you everything. The commentary tells you what to focus on.
What to add next
- -Anomaly detection (flag metrics outside 2 standard deviations)
- -Cohort-by-cohort breakdowns
- -Compare-to-target lines if you have targets set
- -A weekly Monday version with the prior week summarized
Start with the daily. Add the weekly once the daily is reliable.
Want the full guide? Check out our deep-dive page for more context, FAQs, and resources.
read the full guide