Every payment posts twice.
BiPay accepts cards for you and everyone underneath you, splits the fees down your agent tree, and writes both sides of every movement into a real ledger. Balances are derived from entries, never edited.
Onboarding our first merchants now.
| Account | Debit | Credit |
|---|---|---|
| Merchant receivable | 129.00 | |
| Processing cost | 3.53 | |
| Agent commission | 1.94 | |
| Platform fee | 2.58 | |
| Merchant payable | 120.95 |
Three ways to take the money
Same routing, same ledger, same settlement behind all three. Pick whichever fits how your merchant sells.
Payment links
Raise an invoice in the console, get a URL, send it to the payer. They pay on a page we host.
- Amount and payee fixed server-side
- Attempt cap enforced server-side
- Expires when you say
Hosted checkout
Redirect from your own cart. Card details reach us, never your servers.
- No card data in your scope
- Returns to your success URL
- Webhook on every state change
Direct API
Server-to-server against a versioned REST API, with idempotency keys on every write.
- Replay-safe by key, not by luck
- Signed outbound webhooks
- API reference
Agents underneath you, priced by you
Platform, agent and merchant sit in one tree. Every query is scoped to your branch of it on the server — not by hiding menu items in a browser.
You set what your agents pay. They set what their merchants pay. Neither can price below their own cost, and the platform sees the whole chain.
Fee rules are append-only. Changing a rate writes a new one with an effective date; the old rate keeps applying to everything already settled under it. You cannot rewrite history, only add to it.
Every figure to the right is one row in the ledger, not a report computed later.
Three processors, with failover
A declined authorisation is retried on the next eligible processor automatically. We list what we actually integrate — not a logo wall.
The database refuses to hold an unbalanced entry
Most platforms track a balance column and hope the arithmetic held. We do not have a balance column to corrupt.
Balanced or rejected
A deferred constraint checks every transaction at commit. Debits must equal credits or the whole transaction fails — not a nightly job that finds the drift next morning.
Integers, end to end
Money is carried as minor units in 64-bit integers from the card network to your screen. No floating point ever touches a balance. An unknown currency raises an error rather than guessing the decimal places.
Batches you can reopen
Settlement closes a batch and posts it. Refunds and chargebacks that land afterwards post against the period they belong to, so a closed month stays closed.
Want to see it against your own numbers?
Tell us the volumes and the split you have in mind and we will walk through what the ledger looks like for it.