One gateway, one ledger, every payout accounted for.
PayHub collects payments through Paystack or Flutterwave on behalf of every company you onboard,
tracks exactly what each one is owed in a real double-entry ledger, and runs the payout-approval
workflow that gets it safely into their bank account.
Four steps from a customer's payment to money in your bank.
1
Collect
A customer pays through Paystack or Flutterwave — PayHub picks up the difference so your app only ever talks to one API.
2
Ledger credit
The moment it's confirmed, a balanced double-entry transaction credits the company's balance — never a number that can drift from its own history.
3
Approval
The company requests a payout to a bank account PayHub has already verified against the provider's own records. An admin reviews and approves it.
4
Payout
The transfer goes out for real through the same provider. Once it's confirmed, the ledger reflects it — not a moment before.
Worked example
A ₦25,000 charge, entry by entry
Not a mockup of a dashboard — this is what the ledger actually posts when a charge settles. Toggle the fee to see it change.
1
Webhook received
Provider confirms the charge
Event
charge.success
Reference
phb_a1B2c3d4
Idempotency key
charge_settled:phb_a1B2c3d4
Gross amount
₦25,000.00
2
Double-entry post
Ledger entries, signed to zero
company_balancethis company's account+₦25,000.00
platform_clearingcash held in PayHub's provider account-₦25,000.00
Sums to ₦0.00 — balanced
3
What happens next
Nothing moves until it's approved
The company's available balance reflects this the instant the webhook is processed.
Requesting a payout holds the amount aside — it doesn't touch the ledger yet.
Only an admin's approval, followed by the provider confirming the transfer, posts the offsetting entry.
Illustrative figures — the fee shown here is an example; a live account defaults to 0% until an admin configures one.
What PayHub does
Everything between "they paid" and "you paid them"
Not a payment gateway on its own — the accounting and payout layer that sits on top of one, so the parts that are easy to get wrong (whose money is whose, who approved what) are handled once, correctly.
Collect either way
Paystack or Flutterwave, picked per charge. The company never sees the difference.
A real ledger
Every charge and payout is a balanced, double-entry transaction — never a number that can drift.
Payouts you control
A company requests, an admin approves, then the transfer goes straight to their verified bank account.
Bank-verified accounts
A payout destination is resolved against the bank's own records before it's ever usable — not just whatever name was typed in.
One API, any app
A single key authenticates as one company. Built for your own backend to integrate directly — not tied to any one platform.
Self-service onboarding
Create your own account directly — no waiting on a platform admin to set you up first.
Idempotent by design
Every ledger post carries an idempotency key — a retried webhook or a duplicate request can never post the same money twice.
Scoped access tokens
Admin and company sessions issue separate token scopes — a company session can never be replayed as platform-admin access, or vice versa.
Runtime-configurable fee
The platform service fee lives in the database, not a hardcoded constant — an admin can change it without a deploy, and it's shown on every affected charge.
How the money actually moves
From a customer's card to your bank account
Not a black box — this is the real ledger path every charge takes, node by node.
Customer pays
Via Paystack or Flutterwave checkout, resolved per charge.
Provider webhook
Platform clearing
Money lands in PayHub's own provider account first — held here in transit.
platform_clearing
Company balance
Credited by a balanced double-entry post the instant the charge settles.
company_balance
Payout, approved
Company requests it, admin approves it, the real transfer API pays out.
Bank account
If a platform fee is configured, its share is split off into a separate platform_fees ledger account at the same moment the charge settles — never taken from an already-completed payout.
Why not integrate directly
What you'd otherwise have to build yourself
Concern
Integrating Paystack/Flutterwave yourself
With PayHub
Multiple sellers or schools
Track who's owed what in your own database, by hand
A ledger account per company, always summing to the truth
Switching or mixing providers
Separate integration, keys, and webhook handling per provider
One API — provider is a parameter, not a rewrite
Paying sellers back out
Build your own approval flow and bank-verification step
Built in: verified account, admin approval, real transfer
Duplicate webhook safety
Something you have to remember to de-duplicate yourself
Idempotency keys enforced at the ledger layer
Audit trail
Whatever logging you happened to add
Every webhook event stored, whether acted on or not
For developers
One request to start collecting
The same API a school's dashboard uses under the hood — call it directly from your own backend with the API key you got at signup.
Create a charge, get a checkout link back
Pass an amount, a provider, and your customer's email. PayHub returns a hosted checkout URL —
redirect your customer there, and a webhook settles the ledger the moment they pay.
Anywhere money changes hands and someone needs to be paid back out
Schools
Fee payments from parents land in a ledger the school can see and understand, with a clear, approved path to get it into the school's own account.
Marketplaces & platforms
Any app with multiple sellers or vendors who each need their own balance, their own payout history, and their own approval trail.
Your own backend
Skip both dashboards entirely and call the API directly — a single key authenticates as your company from whatever you're already running.
How it's kept honest
Trust, built into how it works — not just claimed
Custodial by designMoney lands in PayHub's own Paystack/Flutterwave account first — a company never hands over their own provider keys.
Balances can't driftEvery balance is computed by summing a company's ledger entries, not stored as a number that could quietly go wrong — every transaction is asserted to sum to zero before it's ever saved.
No payout without approvalRequesting a payout doesn't move money. An admin has to approve it before a real transfer is ever initiated.
Every event is loggedEvery webhook a provider sends is recorded, whether or not it was acted on — a full audit trail of why a balance changed when it did.
Questions
Before you ask
Can I use my own Paystack or Flutterwave account instead?
No — PayHub is custodial, meaning it collects into its own provider account and tracks what's owed to you in the ledger. That's what lets it verify bank accounts and gate payouts behind approval consistently for every company.
What happens if a payout transfer fails?
Nothing is deducted from your balance until the provider actually confirms the transfer succeeded. A failed transfer leaves your balance exactly as it was — you can simply request the payout again.
Does PayHub take a cut of what I collect?
Only if the platform admin has configured a service fee — it defaults to 0%. If one is set, it's deducted automatically when a charge settles, and shown as its own line in your ledger.
How fast is a payout once it's approved?
As fast as the provider's own transfer API — PayHub initiates it immediately on approval and updates your balance the moment the provider confirms it landed.
Do I need to be technical to use this?
No — sign up, add a bank account, and request payouts entirely from the dashboard. The API is there if your own developers want to integrate charges directly into your app.
Ready to get paid, properly accounted for?
Create your account in under a minute — no admin approval needed to get started.