Dashboard
Platform at a glance — ported from the v3.4 concept into the v3.5 shell
Active users
482
+31 this week
Relays this week
1,204
+12%
Pending registrations
12
3 > 48h old
MRR
$1,335
CAD · 41 paying orgs
Pending registrations
| Maya Okafor maya@studionorth.ca | pro trial | |
| Dev Batra dev@parallel.dev | team | |
| Lena Fischer lena@fischer.io | free |
Recent billing events
| Trial → paid conversion northbeam-studio · Loop discount applied at conversion | 2h ago |
| Seat true-up +1 → 6 seats parallel-dev · prorated · confirmed by admin | 6h ago |
| Subscription canceled — perk suspended quiet-harbor · win-back window opened (180d) | 1d ago |
| Webhook write failed → 500, Stripe retried, ok evt_1Rk…q2 · idempotency guard passed the retry | 2d ago |
Finance
Revenue, commitments, and cost — gated: finance / superadmin only
MRR
$1,335
CAD · 41 paying orgs
Collected (Jul)
$1,248
net of fees $1,193
Committed discount $
$1,530
17 active commitments
Realized discount $
$487.50
actual, not estimate
Committed vs realized. Committed = the estimate at mint (50% × 12 mo × $15 = $90/commitment). Realized = what a redeemed commitment actually cost — a subscription that cancels early stops its coupon with it, so realized lands under the estimate (realized_months / realized_cost, stamped on subscription.deleted).
Committed $ by state
| committed | 11 | $990.00 |
| redeemed | 6 | $540.00 est → $487.50 realized |
| suspended | 3 | $270.00 parked (win-back) |
| void | 2 | excluded · coupons revoked |
| expired | 4 | excluded · window lapsed |
Revenue snapshots (daily)
| Date | MRR | Collected | Subs |
|---|---|---|---|
| 07-18 | $1,335 | $64 | 41 |
| 07-17 | $1,320 | $118 | 40 |
| 07-16 | $1,305 | $0 | 40 |
| 07-15 | $1,305 | $91 | 40 |
Discount commitments
Loop founding-member perk lifecycle — shipped 2026-07-18 · relay-platform finance/db.py
committed→
redeemed
·
committed→
suspended⇄ win-back ·180d·
void
·
committed→ window lapses →
expired
Locked policy #1 — suspend, don't void. Cancel / leave-Loop parks the perk as a win-back offer; the daily sweep voids it (and revokes the Stripe coupon) after 180 days. Account deletion voids immediately. One active commitment per org — re-redeemed referrals and access codes return the existing grant, never a second one.
Commitments
| Org / user | Source | Grant | Status | Est $ | Realized $ | Window |
|---|---|---|---|---|---|---|
| northbeam-studio maya@studionorth.ca | loop_early_access | 50% × 12mo | redeemed | $90.00 | — live · mo 2 of 12 | applied at trial→paid |
| parallel-dev dev@parallel.dev | loop_promo | 50% × 12mo | committed | $90.00 | — | expires 2027-06-30 |
| quiet-harbor jo@quietharbor.co | loop_early_access | 50% × 12mo | suspended | $90.00 | parked | voids 2027-01-13 · 179d left |
| fernweh-labs ana@fernweh.io | loop_early_access | 50% × 12mo | redeemed | $90.00 | $37.50 5 of 12 mo served · canceled | realized < estimate |
| hollis-and-co sam@hollis.co | referral | 50% × 12mo | committed | $90.00 | — | expires 2027-05-02 |
| driftline (deleted) account_deleted | loop_promo | 50% × 12mo | void | $90.00 | $0 | coupon revoked |
| tidepool win_back_window_lapsed | loop_early_access | 50% × 12mo | void | $90.00 | $0 | sweep · coupon revoked |
| gable-works never subscribed | loop_promo | 50% × 12mo | expired | $90.00 | $0 | 365d window lapsed |
| mira-collective left Loop (settings) | referral | 50% × 12mo | suspended | $90.00 | parked | voids 2026-12-28 · 163d left |
| arden-supply erik (manual grant) | manual | 50% × 12mo | committed | $90.00 | — | expires 2027-07-11 |
Guard rails shipped: at-most-one-active per org (A2) · expires_at written at mint, 365-day redemption window (A3) · daily commitment-lifecycle sweep expires + voids · void revokes the Stripe coupon so the discount can't outlive the grant (A5).
Trials
Card-less Pro trials + Stripe-side trials — conversion, nudges, lapse
Trialing now
14
tier=pro · stripe_status=trialing
Converted (Jul)
5
36% cohort conversion
Nudges sent
9
T-7 ×6 · T-1 ×3
Lapsed → free
4
2 in dunning first
Locked policy #2 — discount applies at conversion. A Stripe-side trial flips trialing→active on the same subscription — no checkout. The webhook now applies the org's active commitment to the live subscription at that transition (apply_commitment_to_subscription). It previously evaporated, silently.
Trial cohort
| Org | Ends | Stage | Loop commitment | Outcome |
|---|---|---|---|---|
| northbeam-studio | converted 07-18 | converted | 50% applied at conversion ✓ | $7.50/mo × 12, then $15 |
| bright-alder | 07-25 · 7d | T-7 nudged | committed · will apply | — |
| cove-analytics | 07-19 · 1d | T-1 nudged | none | — |
| gable-works | lapsed 07-12 | → free | commitment expired with it | trial.expired sent |
Seats & Teams
Member ↔ paid-seat sync — Team $15/seat, 3-seat floor, prorated true-ups
Locked policy #3 — auto true-up with a confirm. Adding a member pushes the Stripe quantity (prorated); the invite flow answers 402 seat_confirmation_required with a seat-impact preview until the admin confirms. Member removal trues down but never below the floor. The old drift — invite members, bill unchanged — is closed.
Team orgs
| Org | Members | Paid seats | Floor | Sync | $ / mo |
|---|---|---|---|---|---|
| parallel-dev | 6 | 6 | 3 | in sync true-up +1 · 07-18 · prorated $8.06 | $90 |
| hollis-and-co | 4 | 4 | 3 | in sync | $60 |
| mira-collective | 2 | 3 | 3 | floor held removed 1 · stays at 3-seat min | $45 |
| arden-supply | 5 | 4 | 3 | confirm pending invite held at 402 until confirmed | $60 |
Guard demos
Seats & Segments
Cost and revenue by commercial status — free, EAP, paid, discounted — not one blended org list
2 open decisions this view assumes. (1) What EAP grace lapses into isn't decided — today the daily eap-graduation sweep drops an expired-grace org straight to free (app.py); if grace should instead land on a discounted paid tier, that conversion + its discount don't exist yet — "EAP · Grace" and "Free" are genuinely different populations below, not two labels for one thing. (2) The graduation discount shown here is a 30% placeholder until the campaign terms lock — the segment shape doesn't change either way.
Segment
Orgs in view
Maps to real code: tier / grace_expires_at — billing.py get_plan_status(). Seat sync (team only) — billing.sync_subscription_seats(). Contract discount — org_contracts.discount_pct. Cost attribution — finance/costs.py (planned, P4).
Churn & win-backs
Planned — P4 (after cost + reconciliation land)
P4 · planned
Churned MRR · dunning recovery · suspended-perk win-backs (reactivation offers by days-left in window) · cohort retention. Sits on top of the reconciliation work — not trustworthy before it.
Churned MRR · dunning recovery · suspended-perk win-backs (reactivation offers by days-left in window) · cohort retention. Sits on top of the reconciliation work — not trustworthy before it.
Contracted revenue forecast
Planned — P4 · forward booked revenue, not trailing MRR
P4 · planned
Per active sub: price × quantity × interval out to N months with renewal dates · step-ups when a discount window closes (50%/12mo bills mo 1–12 at $7.50, mo 13+ at $15 — estimated_cost + duration_months feed the curve) · trials probability-weighted at the cohort conversion rate · expected billings next 3 / 6 / 12 mo.
Per active sub: price × quantity × interval out to N months with renewal dates · step-ups when a discount window closes (50%/12mo bills mo 1–12 at $7.50, mo 13+ at $15 — estimated_cost + duration_months feed the curve) · trials probability-weighted at the cohort conversion rate · expected billings next 3 / 6 / 12 mo.
Cash flow & payouts
Planned — P5 · when capital actually lands, in CAD
P5 · planned
Stripe payout ingestion (payout.created / payout.paid + Balance API) · finance_transactions grouped by payout · cash calendar (charge dates + payout lag = bank-landing dates, CAD after FX) · runway = payouts − (platform_expenses + payroll).
Stripe payout ingestion (payout.created / payout.paid + Balance API) · finance_transactions grouped by payout · cash calendar (charge dates + payout lag = bank-landing dates, CAD after FX) · runway = payouts − (platform_expenses + payroll).
Payment gateway
Connection health and console-managed configuration — RCTX-1055 · adapter-driven, not Stripe-shaped
Scenario
Connected accountchecked 12s ago
STR
Stripe · Relay Context Inc.
acct_1RQx8kGH2 · CA · settles CAD
Health checks7 of 7 passing
Console-managed configuration
Secrets — presence only
API secret key
••••••••••••
present
Webhook signing
••••••••••••
present
Secrets live in /etc/relay/secrets and are read at boot. The console reports whether they are
present and working, never their values, and offers no way to set them. Rotation is a host operation, documented in the
gateway runbook.
Why this panel is adapter-shaped. Every row above comes from the active provider's own
adapter.health() and adapter.config_schema(), so a Launchpad product on a
different processor inherits this screen by implementing the adapter, with no console changes. Provider-specific checks
(Stripe Tax) arrive as adapter-declared rows rather than hardcoded ones. Contract: SPEC.payment-gateways.md (RCTX-1056).
The check that catches real outages is webhook freshness, and it needs no API call: the newest row in processor_events against the count of live subscriptions. Every other check catches misconfiguration; only this one catches the silence where money should be. Config writes are audited (RCTX-1054) and are the first natural candidate for approval quorum (RCTX-1053) — changing a price ID deserves a second pair of eyes.
The check that catches real outages is webhook freshness, and it needs no API call: the newest row in processor_events against the count of live subscriptions. Every other check catches misconfiguration; only this one catches the silence where money should be. Config writes are audited (RCTX-1054) and are the first natural candidate for approval quorum (RCTX-1053) — changing a price ID deserves a second pair of eyes.
Access codes
Issued-code audit — minting happens in the app; oversight lives here
Loop parity (decided): a grant_loop code now mints the same 50%/12mo commitment as a referral join — source loop_promo, so promo cost stays separable from referral cost in Commitments.
Issued codes
| Code | Campaign | Grants | Redeemed | Status |
|---|---|---|---|---|
| LOOP-SUMMER | loop-summer-26 | Loop + 30d Pro | 18 / 50 | active |
| PRESS-KIT | press-outreach | 30d Pro | 4 / 25 | active |
| EAP-CLOSE | eap-wave-3 | Loop | 31 / 31 | exhausted |
Demo analytics
Campaign funnels ending at MCP activation — the admin-only half; detail never surfaces in the room
Landing funnel · loop-summer-26
Landing view1,082100%
Demo started47644%
Code claimed20619%
Registered979%
MCP activated545%