Billing in Opbox runs where the work runs. Every invoice is tied to the matter it bills and the client it bills to, so the bill is never a spreadsheet living off to one side - it is part of the same record as the documents, the parties, and the time. You raise it, send it, take payment against it, and reconcile it, and the whole chain stays attached to the matter with a full audit trail behind it.
Money is never approximate. Every amount is held and computed in exact minor units (whole pennies, cents), so totals, tax, and balances add up to the penny with no rounding drift. The status of an invoice is a fact the system computes from the payments recorded against it - not a flag someone remembered to toggle.
What it does
Invoices with line items, tied to the matter. An invoice is raised against a matter and a client, with line items (description, quantity, unit price, tax). The subtotal, tax, and grand total are computed for you in exact minor units. Each invoice carries a signing attestation linking it to the person and the action that created it, so an invoice can always be traced back to its origin.
A computed paid status, not a manual one. Every invoice moves through a clear lifecycle: draft, submitted, authorised, then paid, partially paid, overdue, or voided. You do not set “paid” by hand - you record a payment, and Opbox works out whether that settles the invoice in full, settles it in part, or leaves a balance. The status always matches the money that has actually landed.
Charges and pay links (Stripe-class). Opbox can raise a charge against an external payment rail and reconcile the result back onto the invoice, so a client can pay by card or bank transfer and the invoice updates from the payment, not from a manual note. The same charge path is built to plug into a live provider (Stripe, GoCardless, and the like) by connecting the rail once - the billing logic does not change.
Refunds and credit notes. When you need to give money back, Opbox issues a refund and raises a matching credit note linked to the original invoice. The refund cannot exceed what was actually paid, the invoice balance is re-computed, and the status moves back accordingly - all recorded as an immutable entry, so the books stay honest.
Reconciliation and ledger sync. Opbox reconciles against an external ledger (Xero, QuickBooks, Stripe), pulling payment status back so your billing view and your accounting platform agree. Sync is safe to re-run: it computes the reconciled status and owns no money logic of its own, so re-syncing never double-counts.
Firm branding and defaults. Set your firm’s base currency, invoice numbering, and payment terms once, and brand the client-facing invoice with your own themes. Existing invoices keep the branding they were issued with, so a theme change never rewrites a bill you have already sent.
AI cost control on the same rails. The same money discipline governs what your AI agents spend. Every AI call records its cost to an append-only ledger, and you can read spend against budget at any time - so the assistants doing the work are held to a budget the same way an invoice is held to a balance.
How you use it
Raise an invoice on a matter. From the matter, raise an invoice for the client, add line items, and let Opbox compute the totals. It starts in draft, where you can keep editing; submit it and authorise it when it is ready to go out.
Send a pay link. Authorise the invoice and raise a charge against it. The client gets a pay link and settles by card or bank transfer; the payment flows back and updates the invoice automatically.
See payment status at a glance. Open any invoice and the status is the truth: paid, part-paid with the balance outstanding, overdue, or still authorised and waiting. Because the status is computed from recorded payments, it is never stale.
Record a payment by hand when you need to. Paid by cheque or direct transfer outside the rail? Record the payment against the invoice and the status updates the same way. Each payment carries a reference, and a duplicate reference is rejected, so you cannot accidentally record the same payment twice.
Refund a client. Issue a refund against a paid invoice. Opbox raises the linked credit note, re-computes the balance, and moves the invoice status back - with the whole adjustment on the record.
Reconcile against your accounts. Run a sync to line your invoices up against your external ledger and pull payment status back. Re-run it whenever you like; it will not double-count.
The kernel verbs behind it
Everything above is built on a small set of governed kernel verbs. Each one goes through the same front door: it is permission-checked and audited before it runs, and every money write is recorded as an immutable entry you can trace.
| Verb | What it does |
|---|---|
bill.invoice | Raise an invoice against a matter and client, with line items and computed totals. |
bill.invoice.transition | Move an invoice through its lifecycle (submit, authorise, void). |
bill.invoice.get | Read a single invoice, its line items, totals, and current status. |
bill.invoice.list | List and filter your invoices - by client, by status, by matter. |
bill.charge | Raise a charge against a payment rail to take card or bank payment. |
bill.payment.record | Record a payment against an invoice; the paid status re-computes. |
bill.refund | Issue a refund and re-compute the invoice balance. |
bill.creditnote | Raise a credit note linked to the original invoice. |
bill.sync | Reconcile against an external ledger (Xero, QuickBooks, Stripe). |
bill.defaults.set | Set your firm’s base currency, invoice numbering, and payment terms. |
bill.theme.upsert | Author a branding theme for client-facing invoices. |
cost.query | Read your AI spend against budget across the workspace. |
These run through the same governed front door as the rest of the substrate, so the agent and the CLI call exactly the verbs above - there is no separate billing engine to keep in sync.
Money moves need a senior hand
Because these verbs move real money, they are held to a higher bar than ordinary reads and writes. Any verb that touches money is restricted to senior roles, and a money write triggers an MFA step-up: you re-confirm who you are at the moment you do it, not just when you signed in. A duplicate charge or payment is rejected by design, so the same money cannot move twice. For how the permission tiers, step-up, and audit fit together, see Security.