Real Stripe data where it's computable today (heartbeat, revenue, renewal rate, failed collections, target tracker, invoices). Tiles with a light red background still need input from you or a new integration — see the note on each.
Daily heartbeat
—
Loading…
Live from Stripe
Paying members
—
Loading…
Free members
—
Loading…
MRR
—
From paying members only
ARR
—
Annualized run rate
Renewal rate — by month
Month
Renewed
Churned
Not paid
Rate
Renewal rate — by quarter
Quarter
Renewed
Churned
Not paid
Rate
Uses each subscription's real cancellation date (Stripe's canceled_at/ended_at), not the rolled-forward current_period_end — so a canceled subscription only counts as churned once it actually ends. "Renewed"/"Not paid" come from invoices with billing reason "subscription_cycle" (an actual renewal charge, not a new signup).
This is a live reconstruction of Q3-to-date (Jul 1 → today) from real subscription start/cancellation dates, to prove the model works. It'll switch to tracking Q4 (Oct 1 → Dec 31) against the 1,350 target automatically once Q4 begins.
Failed collections — never counted as revenue
Member
Email
Amount
Failed on
Days ago
Status
Pulled live from Stripe invoices with status "open" (past due) or "uncollectible", scoped to subscriptions that are still active, trialing or past due today — a now-canceled subscription's old unpaid invoice won't show up here. These aren't in MRR/ARR above since only active/trialing subscriptions are counted there — but they're worth a dedicated view so an unpaid member is never mistaken for a paying one. "Visible in HubSpot" (per the requirement) is Phase 2 — for now this proves the underlying Stripe data is solid.
Membership lead pipeline (HubSpot deals)
Tracking toward the 611 new members targeted for Q3–Q4 2026 — live from the HubSpot deal pipeline, stage by stage.
Invoices on the HubSpot contact record — mockup of a contact-embedded module, real invoice data
Stripe's hosted invoice links expire after 30 days — this keeps every invoice permanently reachable from the contact itself.
Invoice
Amount
Status
Issued
The table itself and its data are real (a real customer's real recent invoices) — what's still a mockup is WHERE it lives: actually embedding this on the HubSpot contact record is Phase 2 build work, not something this app can do yet.
Stripe > Overview
Live data pulled from Stripe. Totals reflect the subscription status filter in Settings. Nothing is written to HubSpot yet.
Recent subscriptions
Customer
Plan
Status
MRR
Started
Invoice status
Stripe > Subscriptions
—
Customer
Email
Plan
Status
MRR
ARR
Started
Renews
Stripe > Invoices
—
Invoice
Customer
Amount
Frequency
Status
Issued
Due
HubSpot > Overview
—
Contacts by lifecycle stage
Lifecycle stage
Count
HubSpot > Contacts
—
Name
Email
Company
Lifecycle stage
Stripe ID
MM Role
Created
Data Reconciliation
Stripe is the source of truth for subscriptions and invoices. This compares Stripe customers against HubSpot contacts — nothing is written anywhere yet.
Stripe customer
Stripe email
Stripe ID
HubSpot contact(s)
HubSpot company
Role
Stripe customer
Stripe email
HubSpot contact(s)
HubSpot company
Role
Stripe customer
Stripe email
Candidate contact
HubSpot company
HubSpot email
Stripe customer
Email
Subscriptions
Created
Name
Company
Email
Lifecycle stage
Email
Stripe customer
Stripe ID
Created
Used for matching
Account
—
Profile
Change password
Admin
Companies, users and invites - visible to superusers only.
Companies
Name
Created
Users
Name
Email
Company
Role
Joined
Invite a user
Pending & past invites
Email
Company
Role
Status
Sent
Settings
API keys live in your .env file on this machine — they are never shown or editable here.
Stripe
—
Sync interval
Areas to sync
Subscription statuses to include
Unchecked statuses are filtered out of the Subscriptions tab and the Dashboard totals below — the underlying data stays synced, it's just not counted or shown.
HubSpot
—
Sync interval
Syncing
HubSpot contacts filters
Filter by lifecycle stage
Matching
Money format
Controls digit grouping and decimal punctuation everywhere an amount is shown — not the currency itself, which is always whatever Stripe reports.
Automated reconciliation
Writes to HubSpot on a schedule, without anyone clicking anything — deliberately narrower than the manual review screen on Data Reconciliation: it only backfills the Stripe ID on unambiguous email matches and creates contacts for new Stripe subscribers. Soft (name-only) matches and duplicate emails are never auto-applied — those always need a human on the Data Reconciliation page.