Board reporting is the single most senior deliverable most finance and RevOps teams produce, and it is still assembled by hand in most companies, an analyst pulling exports from Stripe, HubSpot and Xero into a spreadsheet, then rebuilding the same slides every month. This workflow automates the assembly, the variance calculation, and even a first-draft explanation of what moved and why, while keeping a human firmly in control of what actually reaches the board.
Workflow diagram
flowchart TD
A[Monthly Trigger] --> B[Pull Stripe MRR]
A --> C[Pull HubSpot Pipeline]
A --> D[Pull Xero P&L]
B --> E[Merge Data Sources]
C --> E
D --> E
E --> F[Calculate MRR & Growth]
F --> G[Calculate Pipeline Metrics]
G --> H{Data Quality OK?}
H -->|No| I[Flag Finance] --> J[Wait For Fix] --> K[Compare Prior Month]
H -->|Yes| K
K --> L[Compare Against Budget]
L --> M{Variance > 10%?}
M -->|Yes| N[AI Variance Commentary]
M -->|No| O[Merge Commentary]
N --> O
O --> P[Build KPI Table]
P --> Q[Generate Slides Deck]
Q --> R[Populate Charts]
R --> S[Export PDF]
S --> T[CEO Review Gate]
T --> U{Approved?}
U -->|Yes| V[Distribute To Board]
U -->|No| W[Request Revisions]
V --> X[Log Distribution] Every branch shown here (IF/Switch outcomes) exists as a real conditional in the downloadable JSON, not a simplification for this diagram.
Why board decks are a bad place to save time carelessly
Most back-office automation optimises for speed above all else. Board reporting is the exception: the audience is small, senior, and reads every number closely, so the workflow is designed around accuracy and reviewability first, speed second. That shows up in three deliberate choices: a data quality gate before any calculation happens, an explicit human approval gate before distribution, and a full audit log of what was sent to whom.
The monthly schedule trigger fires on the 1st at 06:00, early enough that a data problem discovered by the Data Quality Check node still leaves days to fix it before the board meeting, rather than finding out the afternoon before.
Consolidating three systems that were never meant to talk
Stripe knows recurring revenue. HubSpot knows the sales pipeline. Xero knows the actual profit and loss. None of the three has any concept of the other two, and a board wants all three synthesised into one coherent story: revenue, forward pipeline coverage, and whether the business is actually profitable doing it.
The three pulls run in parallel and rejoin at Merge Data Sources, then two Code nodes calculate the metrics a board actually asks about, MRR and net revenue retention from the Stripe side, win rate and pipeline coverage from HubSpot. Keeping these as separate, named calculation steps rather than one large script makes the model auditable, a finance team member can read exactly how NRR was derived without reverse-engineering a black box.
Variance commentary: where AI earns its place carefully
The Variance Exceeds Threshold? gate is deliberate: an AI-drafted explanation is generated only for line items that moved more than 10% against budget, not for every metric on every run. This keeps the AI's job narrow and checkable, explain this one specific, material movement, rather than narrating an entire business.
Every AI-drafted commentary still passes through the CEO Review Gate before the deck goes anywhere. This workflow never sends a board communication without a human confirming it, the Wait node pauses on a webhook that only fires when someone actually approves, and an Approved? branch routes rejected drafts back for revision rather than distributing a first draft under pressure of a deadline.
Node-by-node reference
| Node | Type | Role |
|---|---|---|
| Monthly Schedule Trigger | Schedule Trigger | Fires day one of each month, early morning |
| Pull Stripe / HubSpot / Xero | HTTP Request ×3 | Parallel pulls of revenue, pipeline and P&L data |
| Calculate MRR & Growth | Code | MRR, net revenue retention, month-over-month growth |
| Data Quality Check | IF | Blocks calculation on missing fields rather than reporting bad numbers |
| Compare Against Budget | Set | Computes variance percentage per line item |
| Variance Exceeds Threshold? | IF | Gates AI commentary to genuinely material movements |
| Generate Variance Commentary (AI) | HTTP Request | Claude drafts an explanation for flagged variances only |
| Generate Board Deck | HTTP Request | Populates a Google Slides template programmatically |
| CEO Review Gate | Wait (webhook resume) | Nothing ships without explicit human approval |
| Distribute To Board Members | HTTP Request | Sent via a tracked data-room link, not a plain attachment |
26 total nodes in the downloadable file, including sticky-note documentation embedded directly on the canvas.
Key logic, in code
Net revenue retention calculation
const startingMrr = $json.startingMrr;
const expansion = $json.expansionMrr;
const contraction = $json.contractionMrr;
const churnedMrr = $json.churnedMrr;
const nrr = ((startingMrr + expansion - contraction - churnedMrr) / startingMrr) * 100;
return [{
json: {
...$json,
nrr: Number(nrr.toFixed(1)),
nrrHealthy: nrr >= 100, // below 100% means existing customers are net-shrinking
}
}]; Budget variance gate
const actual = $json.actual;
const budget = $json.budget;
const variance = ((actual - budget) / budget) * 100;
return [{
json: {
...$json,
budgetVariance: Number(variance.toFixed(1)),
needsCommentary: Math.abs(variance) > 10,
}
}]; Before / after
| Metric | Before | After this workflow |
|---|---|---|
| Time to assemble board pack | 2-3 days of analyst time | Under 2 hours, mostly review |
| Data consistency across sources | Manual copy-paste, error-prone | Pulled and calculated identically every month |
| Variance explanations | Written under deadline pressure | Drafted automatically, human-refined |
| Distribution tracking | None, email attachment | Per-board-member view analytics |
Prerequisites
- n8n v1.40+ with Switch v3 and webhook-resume Wait support
- Read-only Stripe, HubSpot and Xero API credentials
- Anthropic API key for variance commentary
- Google Slides/Docs OAuth2 with a board-deck template already built
- DocSend or equivalent tracked document-sharing API, Slack bot token, Airtable PAT
Common pitfalls
Never let this auto-send without the review gate
The CEO Review Gate is the entire safety mechanism. Removing it to "save time" turns a drafting tool into an uncontrolled board communication channel.
Budget data must be current
A stale budget in Xero makes every variance calculation meaningless. Confirm the current fiscal year budget is loaded before the first run each year.
AI commentary needs a fact-check pass
The model explains movements based on the data it is given, it cannot know about a one-off event nobody logged anywhere. Treat its output as a first draft, always.
Want this deployed, configured and monitored?
The template is free. Wiring in your real credentials, tuning the logic to your business, and keeping it running when an upstream API changes is what we do.
Get my free automation plan →Frequently asked questions
Can this work with QuickBooks or NetSuite instead of Xero?
Yes, only the P&L pull node changes. The consolidation, variance and approval logic is accounting-system agnostic.
How is the deck template customised?
Generate Board Deck duplicates a Google Slides template you control, so your existing branding, slide order and chart types carry over automatically.
What happens if a board member never opens the deck?
DocSend-style tracking makes that visible in Log Distribution, letting IR or the CEO follow up specifically rather than assuming everyone read it.