Diagnostic-driven Quarterly Business Review (QBR) site builder for LeanScale client engagements. Ships two artifacts from one source: an interactive web app (cream + Inter + client brand) for the call walkthrough, and a PDF for the formal record.
Built and refined on the Patlytics Q2 2026 QBR. Designed to be reused across any LeanScale client.
Live reference exemplar: Patlytics Q2 2026 — internal team can request access.
Every QBR uses this locked-in 9-section + Appendix narrative arc:
01 Summary — Score + Quarter Recap + Forward Look + summary bar
02 The Wins — momentum bullets (carrying into Q[N+1])
03 Revenue — KPI cards from HubSpot
04 Funnel — LEAD → MQL → SAL → SQL → Won
05 Conversion — Q-over-Q deltas + interpretive reads
06 Channel · Reps — Channel mix · motion split · all-rep leaderboard
07 GTM Diagnostic — 6 pillars + 4 depts with score drivers · gaps + strengths
08 Data Integrity — compressed hygiene-flag grid
09 Q[N+1] Plan — single-quarter forward roadmap + Gantt + Capacity Math
Appendix — 5 collapsible reference rows
Flow: celebrate wins → numbers → diagnosis → prescription → appendix.
| File | Purpose |
|---|---|
SKILL.md |
Locked-in narrative arc · Q[N+1] Plan framework · Capacity Math · Do/Don't patterns |
QUICK_START.md |
First-time setup guide |
config.example.json |
Per-engineer config template — Teamwork user, Netlify team, per-client tokens/brand |
references/customization.md |
Section-by-section content rules · brand variable map · locked-in DON'Ts |
references/new-client-setup.md |
How to add a new client (brand scrape, Netlify site creation, config entry) |
references/new-quarter-workflow.md |
How to ship a new quarter for an existing client |
assets/template.html |
Starting-point HTML with Patlytics-style aesthetic (cream + Inter + brand-color ink) |
scripts/pull_teamwork_data.sh |
Teamwork API data pull (tasks + time entries) |
scripts/restructure.py |
Post-processor that splits sections by HTML comments, renumbers eyebrows, wraps overflow into Appendix accordions |
scripts/deploy_netlify.py |
Netlify API deploy with SHA-reuse to preserve historical quarter sub-paths |
scripts/create_client_site.sh |
Provision a new persistent Netlify site for a client |
scripts/update_landing.py |
Regenerate the client's landing page index after adding a new quarter |
- Pull data — Teamwork tasks/time, HubSpot Deals (for rep leaderboard), Vasco context graph (for funnel/conversion/integrity)
- Pull diagnostic from the GTM Diagnostic tool (Patlytics example:
clients.leanscale.team/c/<client>/diagnostic/gtm) - Build HTML using
assets/template.htmlas starting point, fill all sections per the narrative arc - Run
scripts/restructure.pyto renumber eyebrows + wrap appendix items - Render PDF via Chrome headless:
chrome --headless --no-pdf-header-footer --print-to-pdf - Deploy via
scripts/deploy_netlify.py(uses SHA-reuse to preserve historical quarters)
Full step-by-step in SKILL.md.
- Pull rep data live from HubSpot Deals API — don't infer from tenure
- Use HubSpot Companies count for customer totals (Vasco LIVE event has data bugs)
- Every Q[N+1] deliverable maps 1:1 to a diagnostic competency gap with named score lift
- "Why this score" breakdown under every pillar + department score
- Single-quarter forward roadmap — punt future quarters to their own QBRs
- Patlytics-POV framing in Quarter Recap + Forward Look (lead with client's numbers, not LeanScale's actions)
- Appendix accordion uses balanced-div parser to strip section-headers (regex non-greedy fails — leaves orphan h2/lede)
- No stars (★) in section headers or list items
- No "sourced 1:1 from the diagnostic" — say "Source: diagnostic"
- No Teamwork ticket numbers in client-facing narrative (Appendix task lists OK)
- No salesy Capacity Math language ("top up Q3 with project capacity" → "this requires extra hours")
- No unverifiable data claims (e.g., "X ↔ Y reconciled" without an actual data check)
- No placeholder quotas without disclaimer
- No engagement-end dates that may have shifted
Each engineer maintains their own ~/.claude/qbr-builder-team.config.json (or wherever). Template in config.example.json.
Includes:
- Your Teamwork user ID + subdomain
- Your Netlify team slug + shared site password
- Per-client: Teamwork project ID, Netlify site ID, monthly budget, brand colors, logo URL, HubSpot portal/token
Every QBR ships:
- Interactive HTML site — for the call walkthrough · client brand · charts, collapsible appendix
- PDF — rendered from the HTML · for email/archive
Built by Izzy Navin, LeanScale GTM Architect. Patterns refined through Patlytics Q2 2026 QBR build with Joe Zaghloul + Cameron Legge.
Internal LeanScale tooling. Contact Izzy for distribution outside the LeanScale team.