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.
Overview
Test environment · no production data or money
| Invoice | Customer | Amount | Status |
|---|---|---|---|
| inv_8fa21c | Northwind Trading 3rd attempt · stripe | $4,820.00 | recovered |
| inv_71b0e4 | Corvus Analytics next in 3d · adyen | $1,240.00 | retrying |
| inv_5c93aa | Meridian Health 1st attempt · stripe | $18,600.00 | paid |
| inv_2ad7f1 | Ashgrove Labs ACH · settling | $960.00 | pending |
| inv_44e0b8 | Pallas Robotics hard decline · 04 | $7,315.00 | failed |
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





- + 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 engineai_tokens · rate card
| Model | Type | Price | Provider cost | Margin |
|---|---|---|---|---|
| gpt-4.1 | input | $3.00 | $1.50 | 50% |
| gpt-4.1 | output | $15.00 | $7.50 | 50% |
| opus-4.8 | input | $3.00 | $5.00 | −67% |
| opus-4.8 | output | $15.00 | $25.00 | −67% |
| (catch-all) | — | $4.00 | untracked | 0% |
Billing engine
Meter, rate, invoice, recognise
Usage becomes tiers, tiers become invoices, invoices become collectable. One workflow.
Every pricing modelDunning 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 modeinv_8fa21c · Northwind Trading
$4,820.00MCP 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// 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.
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.
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.
Price it however you want.
Know exactly what it earned.
Start in test mode. Bring a processor when you're ready to go live.