Plans, Stripe and revenue

The three plans and their limits, free mode, configuring Stripe, and what the revenue view does and does not claim.

Two admin pages, both needing platform.manage_billing.

The plans

Plan What it covers Workspaces Repositories Evidence kept
Free One workspace, one repository. Collision detection and context briefing. 1 1 14 days
Pro Every workspace, observed evidence from CI, the full change record. unlimited unlimited 180 days
Business Governance, policy enforcement, the audit export and SSO. unlimited unlimited 1095 days

Every organization starts on Free with a 14-day trial.

A subscription's status mirrors Stripe — trialing, active, past_due, canceled — plus one Madebook value of its own, comped.

Default list prices are $29 per month or $290 per year for Pro, and $79 per month or $790 per year for Business, per seat.

Free mode

One switch, on Admin → Stripe & plans, for every paywall on the deployment.

Free mode treats every organization as Business — no workspace or repository caps, no evidence-retention limit, no plan gates anywhere on the platform. Flip back to paid and everything returns exactly as it was: trials and comped plans are frozen while free mode is on, never expired.

The badge reads Everything is free or Paid mode, and the button Make everything free or Switch back to paid.

Free mode ON — every paywall, gate and trial is hidden.

Paid mode ON — plans, gates and trials are back.

While free mode is on, trial reminder emails are not sent.

Configuring Stripe

Paste the account's secret key (sk_live_…, or sk_test_… while testing). It is verified against Stripe before being accepted and encrypted at rest.

The key is verified against Stripe before it is stored — Madebook asks Stripe who the account is. With no encryption key configured on the server, the whole thing is refused:

No encryption key is configured, so a Stripe key cannot be stored.

The badge reads Connected · {hint} with the first and last four characters, or Not configured.

The webhook

Webhook endpoint — add this in the Stripe dashboard (Developers → Webhooks), events: checkout.session.completed, customer.subscription.*, invoice.payment_failed.

No signing secret is needed — events are verified by re-fetching them from Stripe by id.

That is the important design point: the endpoint trusts nothing it is sent. It reads only the event id from the body and fetches the event back from Stripe over an authenticated connection.

Prices

Four fields: Pro monthly, Pro annual, Business monthly, Business annual — all per seat, in dollars. Annual is the total charged per seat per year.

Saved prices apply to every NEW checkout — existing subscriptions keep the price they signed up at. Stripe prices are immutable; a change mints a new one.

Each price must be at least $1.00.

Prices saved — new checkouts use them; existing subscriptions keep their old price.

Every save is audited as whether the Stripe key was set, cleared or unchanged, whether free mode changed, and which prices moved. Never the key, and not even its last four characters.

Revenue

From live Stripe subscriptions only. Complimentary plans are counted as organizations but earn nothing.

Four figures — MRR, ARR (run rate), Paying organizations and On trial — then a breakdown of where organizations sit: Paying, Trialing, Complimentary, Free. Then a table of paying organizations, largest first, with their plan, seats, billing interval and monthly amount.

Two conditions are stated above the figures when they hold, because either one changes what the number means: free mode is on (nothing is being charged, whatever the figures say) and no Stripe key is configured on this deployment.

What the number means

The page's own caveat is the important part, and it is worth repeating in any conversation about the figure:

The number on this page is an estimate and says so.

Recurring revenue is computed from Madebook's own rows multiplied by the current list price. That is wrong for grandfathered customers — so grandfathered organizations are counted separately rather than folded in at a rate they are not paying.

Stripe remains the authority on money; this is a management view, not an accounting one.

An organization is counted as paying only when its status is active or past_due and its plan is not free.

Because a trialing organization stores free as its plan while actually using Pro, each row also carries the plan it is entitled to and where that entitlement came from — two admin pages disagreeing about the same customer is how someone emails them the wrong thing.

Organizations on a price they keep are marked grandfathered in the table, and the count is repeated underneath it with the reason: their figures are computed at today's list price and are therefore wrong for them.

Complimentary plans

A complimentary plan can be granted through the API and is counted on the revenue page. There is no button for it in the admin interface.