The Bob scenario
Imagine Bob runs a 50-person logistics company. He signs up for your ₦12,000/month Max plan but his finance team doesn’t do card payments — they do bank transfers from their corporate account. Here’s how you handle Bob.Provision a virtual account
Give Bob a dedicated bank account number. Transfers to this account will be matched to his invoices automatically.This account number is Bob’s forever. Every transfer he sends to it will be matched to his account — even if his invoice changes or he changes plans.
Response
Show Bob his account details
Display the account number and bank name in your customer portal or email. Bob’s finance team sends their transfers here.No reference number needed — the dedicated account handles matching.
Create the subscription on transfer rail
Response
next_bill_at is when we open the invoice and start waiting. No card is charged.Bob pays — we match automatically
Bob’s finance team sends ₦12,000 (1200000 kobo) to account
0123456789 at Nomba MFB.Nomba sees the inbound transfer → matches it to Bob’s open invoice → marks the invoice paid → subscription renews.You receive:transfer.matched— transfer received and matchedinvoice.paid— invoice settledsubscription.renewed— billing period advanced
If Bob pays the wrong amount
Underpayment (₦11,000 on a ₦12,000 invoice):The invoice moves to Overpayment (₦13,000 on a ₦12,000 invoice):Invoice is marked
partially_paid. Bob still owes ₦1,000 (100000 kobo). The transfer.partial webhook fires. His subscription stays active — access isn’t cut — but the open balance stays on his account. The next transfer from his virtual account clears it.transfer.partial payload
paid. The extra ₦1,000 goes to Bob’s customer balance. It offsets his next invoice automatically.Unknown transfer (no open invoice):If a transfer arrives and there’s no open invoice — maybe Bob paid early — it goes into suspense. You resolve it via POST /admin/suspense/:id/resolve. See the admin API.