The CRM works whether you pay us or not. Every entity, every record, every list view, every workflow, every audit row — free. The agent is the metered surface, and the meter is cost-plus on the real LLM bill.
The record layer carries no seat charge. The record-write path is always open. The agent has one gate: your billing status. That is the whole story.
The cost-plus meter
Every agent turn writes a usage row. The row carries the tokens the provider consumed and the dollar cost those tokens actually cost us, priced against the provider’s rate card at the moment the row was written.
Your daily bill is the sum of those dollar costs, multiplied by our margin. Default 3.0x. Clamped between 1.0x and 10.0x. The multiplier is public — the platform architecture page shows where it lives and who can change it.
A power-user turn costs more than a casual one, billed in proportion. A flat per-turn price would lose money on heavy turns and overcharge light ones. The substrate already tracks the truth; we bill against it.
The Stripe wiring, in exact terms
One Stripe Subscription per tenant. Many line items on that subscription.
The metered line is priced at one cent per unit. Reported quantity is yesterday’s cost times the margin, in cents. The invoice line reads “Assistant usage: N units × $0.01”.
A nightly sweep runs once per UTC day. The idempotency key is agent-usage:{tenant}:{day}. Re-run the sweep after a Stripe outage and nothing double-bills — the sweep sees the day is already reported and does nothing.
Every billing-status change writes an audit row. Every usage report writes one. Ask us why a given invoice reads what it reads and the answer is one indexed query.
Per-tenant caps, monitored not documented
Caps live on the meter, not on the payment line. Default $5 per day, $100 per month. Calendar-bounded hard block at 100%. The cap is enforced whether or not the tenant subscribes to the agent — a free trial cannot accidentally run up a bill because the meter refuses the turn before the provider call happens.
Workflow-driven and chat-driven usage share the same meter. An agent invoked from a scheduled inbox trawl draws down the same bucket as an operator asking a question at /agent. The CFO surface reads that ledger straight.
Modules, flat or per-seat
Every module carries three attributes: a Stripe price id, a billing unit, and a list price. The billing unit is either flat (quantity always 1) or per_seat (quantity equals the active user count). A module with no Stripe price id is free of recurring charges. The core CRM is exactly that.
Enable a paid module and a line item appears on your subscription. Disable it and the item is removed. Invite a user to a per-seat module and the seat count re-syncs. The sync is idempotent — no Stripe round-trip when nothing changed.
Stripe handles proration and tax. We keep the local-side link and the audit trail.
What your billing status gates
Your tenant sits in one of five states: inactive, trialing, active, past_due, cancelled. One column. Stripe webhooks are the only writer.
inactive,trialing,active— the agent serves turns.past_due,cancelled— the agent refuses with a message pointing at/settings/billing. The CRM is untouched. Records still list, still filter, still write. Workflows still run.
Dunning is that column. There is no parallel shadow store to fall out of sync with Stripe.
The takeaway
The record layer is free because that is the honest price of what an open-standards substrate costs to run per tenant. The agent is cost-plus because that is the honest way to bill a variable-cost provider call. The margin multiplier is a public number. The caps are public numbers. The idempotency key is a string you can grep for.
Ready to try it? Start a trial or talk to us if you want the numbers walked through against your shape of team.