QBR deck draft: pipeline, revenue and attribution numbers in one Notion outline
HubSpot + Stripe + HockeyStack + Notion
Who it's for
Sales leaders and RevOps who build the QBR deck by hand from the CRM, billing and attribution tools. You get a slide-by-slide outline in Notion with every number and its source, ready to move into your slides. HubSpot can be swapped for Salesforce or Attio, and Notion for Airtable.
What you get
Notion outline draft with a numbers check. Sample output: every company and person in it is fictional.
Draft Notion page: 'Q3 QBR deck outline' (not created yet) Slide 1. Q3 at a glance - New business closed won: $412K from 18 deals (HubSpot, Jul 1 to Sep 30) - Revenue collected: $1.18M from 214 paid invoices, refunds $14K shown separately (Stripe, same dates) - Pipeline created: $2.6M from 71 deals (HubSpot) Slide 2. Where pipeline came from (HockeyStack report 'Pipeline by channel', sourced) | Channel | Deals | Amount | |---|---|---| | Outbound | 25 | $910K | | Paid search | 22 | $780K | | Events | 14 | $640K | | Organic | 10 | $270K | Slide 3. Biggest wins - Quarry Lane Analytics (fictional), $96K, owner Priya Raman - Fernhill Software (fictional), $54K, owner Alex Rivera Slide 4. Gaps and asks: two placeholders for you to fill in. Numbers check: - HubSpot closed won $412K vs Stripe new subscriptions $388K. The $24K gap is Larkspur Freightworks (fictional), whose first invoice is dated Oct 3. - HockeyStack shows 71 deals created, HubSpot shows 71. Matches. Reply 'create' to make this page under 'QBRs' in Notion.
Time and cost
Estimate About 30–45 minutes, most of it checking the numbers.
Assumptions: One quarterly run: one HubSpot pipeline, one quarter of Stripe invoices and subscriptions, one HockeyStack report and one Notion page.
- HubSpot: Reads only: deals created and closed in the quarter, with stage, amount and owner. Credit use not confirmed by HubSpot.
- Stripe: Reads only: paid invoices, refunds, and new and cancelled subscriptions for the quarter. Credit use not confirmed by Stripe.
- HockeyStack: A report search, then one saved report read or one preview. Nothing is saved. Credit use not confirmed by HockeyStack.
- Notion: A search for the parent page, then one page created after you approve it. Credit use not confirmed by Notion.
Exact credit costs depend on your plan with each vendor. Check the tool pages before a large run.
MCP servers
Every server is confirmed in: ClaudeChatGPT
-
ClaudeChatGPTRead + writeCredits not confirmedNeeds admin or IT
https://mcp.hubspot.com -
ClaudeChatGPTClaude CodeCursorRead + writeCredits not confirmed
https://mcp.stripe.com -
ClaudeChatGPTRead + writeCredits not confirmedNeeds admin or IT
https://mcp.hockeystack.com/mcp -
ClaudeChatGPTClaude CodeCursorCopilotRead + writeCredits not confirmed
https://mcp.notion.com/mcp
Set up in a chat app
Every server in this recipe is confirmed for Claude and ChatGPT. Connect each one, then paste the prompts below into one conversation.
- Connect HubSpot without code (Claude, ChatGPT)
- Connect Stripe without code (Claude, ChatGPT)
- Connect HockeyStack without code (Claude, ChatGPT)
- Connect Notion without code (Claude, ChatGPT)
Developer setup
Auth setup and mcp.json for Claude Code and Cursor
- HubSpot: Sign in with OAuth in your client (run
/mcpin Claude Code). Do it once interactively, and the client stores and refreshes the token. - Stripe: Sign in with OAuth, or pass an API key as a Bearer token for headless use.
- HockeyStack: Sign in with OAuth in your client (run
/mcpin Claude Code). Do it once interactively, and the client stores and refreshes the token. - Notion: Sign in with OAuth in your client (run
/mcpin Claude Code). Do it once interactively, and the client stores and refreshes the token.
Put this in .mcp.json (Claude Code, project root) or ~/.cursor/mcp.json (Cursor). Swap the example keys for your own, and don't commit real ones. Remove the // comment lines if your client requires strict JSON.
{
"mcpServers": {
"hubspot": {
"url": "https://mcp.hubspot.com"
},
"stripe": {
"url": "https://mcp.stripe.com"
// headless alternative: "headers": { "Authorization": "Bearer YOUR_STRIPE_API_KEY" }
},
"hockeystack": {
"url": "https://mcp.hockeystack.com/mcp"
},
"notion": {
"url": "https://mcp.notion.com/mcp"
}
}
}
Step-by-step prompts
- Find HubSpot deals in {pipeline} created or closed between {quarter_start} and {quarter_end}. Show me pipeline created, closed won and closed lost with counts and amounts, open pipeline by stage, and the top five wins. Don't change any records.
- In Stripe, read paid invoices, refunds, and new and cancelled subscriptions for the same dates. Show me revenue collected with refunds on a separate line, and new subscriptions by customer. Compare them with HubSpot closed-won deals and list every mismatch. Don't create or change anything in Stripe.
- Search my HockeyStack reports for pipeline by channel. Use {report_name} for the same dates and show sourced pipeline by channel with deal counts and amounts. If no saved report fits, preview one and show me its definition. Don't save anything.
- Draft a QBR deck outline with one section per slide: at a glance, where pipeline came from, revenue, biggest wins, and gaps and asks. Put the source and date range under every number, and add a numbers check listing each mismatch. Find {parent_page} in Notion and show me the full draft.
- After I approve the draft, create it as one page under {parent_page} in Notion. Give me the link, and don't edit any other page.
Run it on a schedule (optional)
- Run it once a quarter, about a week before the QBR, so there's time to chase numbers that don't match.
- Run it by hand. Someone should check every number before it's presented.
- For a mid-quarter preview, run the first three steps only and stop before Notion.
Where this goes wrong
- Booked and collected revenue mixed up. HubSpot closed-won amounts and Stripe paid invoices measure different things. Keep them on separate lines with their source, and explain any gap deal by deal.
- Different date ranges in each system. Use the same start and end dates in all three tools, and print the range under every table. If one number covers different dates, the outline should say so.
- Attribution settings change the story. Sourced and influenced pipeline can differ a lot. Name the HockeyStack report and its attribution settings on the slide, and use the same report as last quarter.
- Refunds hidden in the revenue figure. Ask for refunds and voided invoices as separate lines, and check that collected revenue minus refunds is the figure on the slide.
Gotchas
- This was planned as a Canva draft design. Neither Canva listing (Canva, or Canva Connect for Developer Portal clients) confirms Claude or ChatGPT support yet, so this version writes the outline to Notion for you to move into your slides.
- HockeyStack's setup needs an admin: you must be a workspace Admin in the AI tool to add the custom connector. Only one HockeyStack instance can be connected at a time.
- HubSpot's setup needs an admin: non-admin users need a Super Admin to approve the connector first.
- Stripe on Claude Team or Enterprise: an owner must add it to the workspace first. If you connect with an API key, from December 2026 Stripe rejects full-access secret keys and restricted keys without the Agent tag.
- Stripe's analytics tool is in preview, so this recipe reads invoices and subscriptions directly instead.
- Notion's help center names ChatGPT Pro as the supported ChatGPT tier.
- Using Salesforce instead? Query opportunities with SOQL in place of the HubSpot deal search. Salesforce needs Enterprise Edition or above and an admin-created External Client App, and ChatGPT requires developer mode.
Download
Get the prompts, guardrails and expected output as one Markdown file. Paste it into a Claude Project or ChatGPT project's instructions, or save it as CLAUDE.md for Claude Code.
New recipe and breakage notes every week
Vendor sites: HubSpot. If we join an affiliate program, these links will be labeled as affiliate links.