Charge anything.
See everything.

Any pricing model you can describe, rated to the sub-cent and simulated against real usage before it ships. On the processor you already use.

Early access. Every workspace starts in test mode, no processor or card required.

roi

Overview

Test environment · no production data or money

Billed this period
$182,940
USD · 412 invoices
Recovered
$21,406
68% of at-risk
At risk
$9,880
17 invoices retrying
Pending accounting
$3,120
ACH · oldest 2d
InvoiceCustomerAmountStatus
inv_8fa21cNorthwind Trading
3rd attempt · stripe
$4,820.00recovered
inv_71b0e4Corvus Analytics
next in 3d · adyen
$1,240.00retrying
inv_5c93aaMeridian Health
1st attempt · stripe
$18,600.00paid
inv_2ad7f1Ashgrove Labs
ACH · settling
$960.00pending
inv_44e0b8Pallas Robotics
hard decline · 04
$7,315.00failed

Bill an agent product

Tokens, credits, per-action. Input and output priced apart, per model.

See every attempt

Full charge and retry history per invoice. The trail is the record.

Keep your processor

Your merchant agreement. Your rates. Your vault. No re-tokenising.

Runs on the processor you already have a merchant agreement with

  • Stripe
  • Windcave
  • NMI
  • Fluidpay
  • Cybersource
  • Dejavoo
  • + your own, through one interface

Pricing is product.
Billing shouldn't say no.

Most billing platforms make you bend your pricing to fit them. roi rates whatever you can describe, and shows you exactly what it earned.

Every model, one plan.

Tiers, matrices, credits, minimums and seats combine in a single plan, not a workaround per customer.

Margin per model, not blended.

Provider cost rates against the same cells as price, so the loss-maker can't hide in an average.

Every retry on the record.

Durable workflows keep every charge attempt. The history is the audit trail.

And it runs on your processor. roi sees references, never card data, and funds settle from your PSP straight to your bank.

Agent & token billing

Know which model is losing you money

Price input and output separately, per model, at sub-cent precision. Provider cost rates against the same cells, so margin is per model, not a blended average hiding the loss-maker.

See the billing engine

ai_tokens · rate card

model × token_type · per 1M tokens
cost coverage 82%
ModelTypePriceProvider costMargin
gpt-4.1input$3.00$1.5050%
gpt-4.1output$15.00$7.5050%
opus-4.8input$3.00$5.00−67%
opus-4.8output$15.00$25.00−67%
(catch-all)—$4.00untracked0%
Blended margin reads 41%, but one model is underwater on every call. Untracked cost reports 0% margin, never 100%.

Billing engine

Meter, rate, invoice, recognise

Usage becomes tiers, tiers become invoices, invoices become collectable. One workflow.

Every pricing model

Graduated tier · API calls

Period 2026-06-01 → 2026-06-30 · 1,000,000 units metered
First 100,000$0.0000$0.00
Next 400,000$0.0012$480.00
Next 500,000$0.0008$400.00
Drag the period's usage and the tiers re-rate as the engine would.
Invoice inv_9c04de$880.00

Dunning engine

From brittle to unmissable

A durable workflow, not a cron job. Next Tuesday's retry still fires after a deploy, a restart, or an outage.

Run it in test mode

inv_8fa21c · Northwind Trading

$4,820.00
Dunning workflow · run 01JQ8F…7K2 · started 11 days ago
1
stripesoft_declinecode 51 · insufficient funds
day 0
durable timer · 3 days · survives deploys, restarts and outages
2
stripesoft_declinecode 51 · insufficient funds
day 3
durable timer · 7 days · retry routed to a second processor
✓
adyensucceededcode 00 · psp_ref AX7K92MQ
day 10
Recovered on attempt 3, across two processors+$4,820.00

MCP server

Point an agent at the engine

roi ships a hosted MCP server over the same public API: 60 tools, split by blast radius. Reads explore freely, writes carry idempotency keys, and moving live money demands a confirmation an agent cannot stumble past.

Connect your agent
claude · mcp.billroi.com
// 60 tools over the public API, split by blast radius:
// reads explore freely · writes carry idempotency keys · money is gated

› list_payment_methods  { customer_id: "cus_ashgrove" }
  2 cards on file · default visa ····4242 · expires 09/26

› set_default_payment_method  { id: "pm_71b0e4" }
  default moved · the next rebill charges ····7301

› refund_invoice  { invoice_id: "inv_44e0b8" }
  refused: confirm_live required against a live key
  the money tier never moves live funds on an agent's first try

Every model, one engine.

Graduated tiers
Each tier priced at its own rate.
Volume tiers
Whole quantity at the tier reached.
Matrix pricing
Rate by dimension: model, region, SKU.
Package pricing
Blocks of N, partial block rounds up.
Per unit
Sub-cent rates in millionths.
Flat fee
Platform fees, alongside anything else.
Prepaid credits
Blocks drawn down in expiry order.
Minimums
Commit, then true up as its own line.
Price ramps
Year one, year two, year three.
Seats
Peak in period, or seats at close.
Allowance + overage
First tier free, the rest metered.
Tier flat fees
A fee attached to a tier itself.

Combine them in one plan. Simulate a change against a customer's real history, or usage that doesn't exist yet, before you ship it.

Built like money software.

Durable by construction

The attempt history is the audit trail.

WorkflowSubscriptionWorkflow
History events1,284
Periods billed36
ContinueAsNew×3
Replay determinismverified

Integer money math

Minor units end to end. No floats.

amountMinor int64 = 88000
// $880.00 USD, exact

// never:
// amount float64 = 880.00

Test and live, truly apart

A rehearsal can't be mistaken for production.

Testrehearsals · no money
Liveproduction billing
Separate keys, separate ledgers, separate connections.

Price it however you want.
Know exactly what it earned.

Start in test mode. Bring a processor when you're ready to go live.