This is the everyday billing recipe: raise a bill on the matter you have been working, get the client to pay, and make sure your books agree. You do not toggle anything “paid” by hand - you record the money, and Opbox works out the status for you. For the bigger picture of how billing hangs together, see Billing & Invoicing.
Before you start: money needs a senior hand
Every step below that moves money is held to a higher bar than ordinary work.
- You need a senior (ADMIN) tier. A money action raising an invoice, taking a charge, recording a payment, or issuing a refund is refused for anyone below it.
- You re-confirm who you are. A money write triggers a second-factor (MFA) step-up: even if you signed in this morning, you re-prove yourself with your authenticator inside a short window before the action goes through. This is by design, so a stolen everyday session never reaches the money.
If a step below stops and asks for your authenticator, that is the step-up - approve it and carry on. If a step is simply refused, your tier is not high enough; ask an admin to do it or to raise your tier. For how tiers and the step-up fit together, see Security.
1. Raise an invoice on the matter
- Open the matter you want to bill and start a new invoice for the client.
- Add your line items - one row per thing you are charging for, each with a description, quantity, unit price, and tax. Add as many as you need.
- Let Opbox compute the subtotal, tax, and grand total for you. Amounts are held to the exact penny, so the totals always add up with no rounding drift. Do not type a total by hand.
- The invoice starts in draft. While it is in draft you can keep editing the line items. When it is ready, submit it and then authorise it - authorising is what makes it ready to go out and to take payment against.
This uses bill.invoice to create the invoice and
bill.invoice.transition to move it from
draft to submitted to authorised. (Raising and transitioning are money actions, so expect the
step-up.)
2. Send a pay link or take a card payment
Once the invoice is authorised:
- Raise a charge against it. This creates a pay link on the connected payment rail (a Stripe-class provider - card or bank transfer).
- Send the pay link to the client, or take the card payment there and then.
- When the client pays, the result flows back onto the invoice automatically. You do not re-key anything - the payment lands and the invoice updates from it.
This uses bill.charge. A charge is a money action, so
it needs the senior tier and the step-up. The same charge is idempotent: if you try to raise
the same charge twice, the duplicate is rejected, so a client is never billed twice for one click.
3. Record a manual payment if they paid offline
Sometimes a client pays by cheque or direct bank transfer, outside the pay link. Record it by hand so the invoice still reflects reality:
- On the invoice, record a payment for the amount received.
- Enter the payment reference - the cheque number, the bank reference, whatever identifies it.
- Save it. The invoice status re-computes straight away.
This uses
bill.payment.record. Two things to know:
- Duplicate-reference protection. If you (or a colleague) try to record a payment with a reference that is already on the invoice, Opbox rejects it. You cannot accidentally book the same cheque twice.
- It is a money action, so the senior tier and the step-up apply here too.
4. See the computed paid status
Open any invoice and the status is the truth, computed from the payments recorded against it - never a flag someone forgot to flip:
- Paid - the payments fully settle the total.
- Partially paid - some money has landed; the invoice shows the balance still outstanding.
- Overdue - authorised, past its due date, and not yet settled.
- Authorised - sent and waiting, nothing paid yet.
Because the status is worked out from real payments, it is never stale. You read a single invoice
with bill.invoice.get, or list and filter many of
them - by client, by status, by matter - with
bill.invoice.list. (Reading is not a money action,
so no step-up - any member can look.)
5. Refund if you need to
When you have to give money back:
- On a paid invoice, issue a refund for the amount to return.
- Opbox raises a matching credit note linked to the original invoice, re-computes the balance, and moves the status back accordingly. The whole adjustment is on the record.
This uses bill.refund (with the credit note from
bill.creditnote raised for you). A refund cannot
exceed what was actually paid - you can only give back money that came in. It is a money action,
so the senior tier and the step-up apply.
6. Reconcile against the ledger
Finally, make your billing view and your accounting platform agree:
- Run a sync to line your invoices up against your external ledger (Xero, QuickBooks, Stripe).
- Opbox pulls the payment status back, so both sides match.
This uses bill.sync. It is safe to re-run whenever you
like: it computes the reconciled status and owns no money logic of its own, so re-syncing never
double-counts.
That’s the loop
Raise, take payment (or record it), read the computed status, refund if you must, and reconcile. Every step is tied to the matter with a full audit trail behind it, and the money steps are protected by the senior tier and the MFA step-up. For the full feature picture see Billing & Invoicing; for how the protections work see Security.