Outcome-based AI-agent billing
Most AI pricing charges for activity, not for what the activity was worth. Outcome-based pricing is the opposite axis: you pay only when an AI agent produced a verified business result — a resolved ticket, a booked appointment, a confirmed identity. On Orbit the charge gate is the same rubric evaluator you use for QA: a conversation becomes billable only when the LLM judge marks it PASSED against one of your rubrics, and only if you turned outcome charging on. Three pricing models live side by side on Orbit, and this page is about the third:- Seat pricing — a flat monthly cost per human workspace member, independent of how much they do. Agents that replace headcount do not fit this model at all.
- Per-token pricing — the LLM-spend meter. It tracks cost truthfully but charges for attempts, pass or fail: a conversation that burned tokens and resolved nothing costs the same as one that closed the ticket. That meter is LLM spend attribution and it keeps running unchanged — token costs are an input to your cost-to-serve view, not a revenue line.
- Outcome pricing — one fixed-rate charge per confirmed resolution, attached to the rubric that judged the conversation. If nothing passes, nothing bills.
passed flag and a confidence score. Outcome billing consumes exactly those rows: passed = true plus tenant opt-in is the only combination that produces a charge.
Where the opt-in lives
Outcome charging is off for every workspace until you enable it, and it stays tenant-owned: you read and write two settings keys on your organization through the self-serve API, and no other tenant’s config affects yours.outcome_charge_enabled— the top-level boolean gate. While it is false, the metering pipeline never emits a charge for your conversations, whatever the rate config says.outcome_pricing— the rate object,{ defaultRateMicroCents, perOutcomeRateMicroCents }.
{ data, meta } envelope. A workspace that has never touched the config reads back the opt-out defaults, so a settings form always renders a stable shape:
The pricing model
Rates are integer micro-cents — the same unit the wallet ledger runs on. One US dollar is 100,000,000 micro-cents (one cent = 1,000,000 micro-cents), so the default rate of 500,000 micro-cents is $0.005 per resolved outcome. Two fields price every charge:defaultRateMicroCents— applied to any resolved outcome whose rubric has no explicit override. Default 500,000 ($0.005).perOutcomeRateMicroCents— a map from an outcome key to a rate. The outcome key is the rubric’s stable id, so renaming a rubric never re-prices its historical charges and your per-rubric override keeps holding. Price a “booked-appointment” rubric higher than a “resolved-ticket” rubric by key, not by display name.
Where charges come from
The metering producer is wired into the rubric evaluator itself and runs after the outcome row is already written:- A conversation completes and the judge evaluates it against your rubric, persisting the outcome row (
passed, confidence, rubric id). - If — and only if — that row was newly written with
passed = true, the producer checks your two settings keys through the shared organization-settings read cache. - When
outcome_charge_enabledis true, it resolves the rate for the rubric’s outcome key (per-outcome override first, then the default) and emits exactly one billable usage event: quantity 1, the resolved rate carried in the event metadata, currency USD. - The charge lands in the same append-only wallet ledger every other Orbit charge uses — Wallets, credits, and charges — and you read it back from the same places, including
GET /api/v1/billing/transactions.
- One charge per conversation-rubric pair. The usage event’s idempotency key is derived from the conversation id plus the rubric id — the same pair the outcome row’s uniqueness constraint keys on, so the DB and the billing feed dedupe identically. A replayed evaluation of the same conversation collapses to a single charge; you never get billed twice for one resolution.
- Fail-open on the pipeline, not on the gate. If the usage-event feed hiccups or your settings row can’t be loaded, the error is logged and swallowed — the conversation-close path is never blocked by a billing problem, and the missing-charge fallback is “not enabled,” never “charge by accident.”
- Metering is best-effort, the opt-in is not. You see a skipped charge as a zero row, not as a conversation failure; the audit surface for passed conversations is the outcome row itself (with the judge’s confidence), which is written before metering fires.
Worked example
Enable outcome charging and price your two rubrics differently:rub_appointment debits 2,000,000 micro-cents; a PASSED evaluation on any other rubric debits 500,000; anything that fails the judge debits nothing. The response returns the persisted config re-read from the settings row.
After an agent conversation passes, read the debit back from the ledger the same way you read any other charge:
How it reads next to LLM spend
Outcome charges and LLM-spend attribution are two different feeds on purpose. The LLM spend feed attributes token costs by feature × model × conversation — it tells you what a resolution cost. Outcome charges are the revenue complement — they tell you what a resolution billed. Because both feeds key on the same conversation id, you can stack them: a conversation’s P&L line pairs the LLM tokens it consumed against the outcome charge it produced, and the conversations that pass nothing carry only their (still accurate) token costs.Limits
- No money moves on the config endpoints. GET/PUT on
/api/v1/billing/outcome-pricingonly reads and writes the two settings keys; charges fire downstream in the metering producer when a rubric marks a conversation PASSED. - Opt-in is a precondition to any charge. If
enabledis false, the metering pipeline records the outcome rows but emits no billable event — enabling is always your explicit action. - Rates are integers in micro-cents, bounded to $10/outcome. A non-integer rate or a value over the ceiling is rejected with 422 before persistence.
- The rubric is the gate. A conversation that never gets evaluated, or evaluates to not-passed, bills zero regardless of pricing config.
Cross-references
- Wallets, credits, and charges — the append-only ledger outcome charges settle into.
- LLM spend attribution — the cost-side feed outcome billing complements.
- QA evaluations and the performance leaderboard — the rubric scorecard pipeline the PASSED gate rides on.
- The call-quality evaluation lifecycle — the operations layer around those scorecards.
- AI agent architecture — where the evaluator and the run lifecycle meet.