All articles

Developer Guides

Double-entry ledger integration for Nigerian fintechs: Build Auditable Wallet Balances

Build wallet balances that remain explainable through pending transfers, reversals and reconciliation. This guide covers ledger design, posting rules and a practical Paddle integration checklist.

23 Oct 2026 7 min read

Double-entry ledger integration for Nigerian fintechs is about more than displaying a naira balance. It gives your team a defensible record of who owns funds, what is available to spend and why every balance changed. For a wallet-enabled marketplace or business finance product, that record becomes essential when transfers are delayed, events arrive twice or customers dispute their transaction history.

This guide explains how to design the accounting layer around Nigerian collections and payouts, then connect it to Paddle’s financial infrastructure. The focus is an auditable wallet model—not another transfer endpoint tutorial.

Why a wallet balance needs a ledger

A mutable balance column can support an early prototype. It becomes fragile when several operations compete for the same funds or when a payment changes state after your application records it.

Suppose a customer receives ₦25,000 and requests a ₦7,000 payout. Your product must distinguish between money received, money reserved for that payout and money still available. If the payout fails, the reservation must be released without inventing a second deposit.

A double-entry ledger records each movement as balanced entries across accounts. For every journal, total debits equal total credits within the same currency. This makes inconsistencies easier to detect, although balanced entries alone do not prove that a payment actually happened.

The ledger should explain balances. Provider records and bank statements should independently substantiate them.

Design double-entry ledger integration for Nigerian fintechs

Start with an explicit boundary: your product ledger records financial obligations and movements; it does not itself hold bank deposits or grant permission to offer regulated services.

Paddle is a banking-as-a-service platform by Pickpadi Global Ltd, not a bank. Banking services are provided by CBN-licensed partner banks. Your product’s permissible structure depends on its operating model and applicable requirements. Check current guidance and obtain qualified advice where needed; this guide is not legal advice.

Define accounts by economic purpose

An illustrative account model for a platform accounting for customer funds includes:

  • Partner-bank settlement asset: funds represented by the relevant bank or settlement records.
  • Customer available liability: the amount owed to a customer that is available for use.
  • Customer reserved liability: customer funds committed to an unfinished operation.
  • Unallocated receipt liability: incoming funds whose beneficiary is not yet identified.
  • Fee revenue and fee expense accounts: separate accounts for earned charges and incurred costs.

The correct treatment depends on your contractual relationship to the funds. Have an accountant validate the chart of accounts rather than copying this model blindly.

Keep accounts currency-specific. A naira debit cannot balance a dollar credit simply because both entries share a transaction reference.

Establish identifiers before integration

Use different identifiers for the customer request, internal business operation, ledger journal and provider transaction. Store their relationships explicitly.

A provider reference answers “which external transaction is this?” A journal identifier answers “which accounting entry recorded its effect?” Treating them as interchangeable makes adjustments and investigations harder.

Model the complete balance lifecycle

Use a small set of posting templates that engineers, finance and operations can review together. The following examples assume the liability-based model above and omit fees.

Record an incoming collection

Once your agreed recognition criteria are met for a ₦25,000 collection:

  • Debit partner-bank settlement asset: ₦25,000.
  • Credit customer available liability: ₦25,000.

Do not credit spendable funds merely because a browser redirects to a success page. Use authenticated server-side evidence and the documented transaction status. Confirm whether that status represents receipt, settlement or another stage before defining your posting rule.

Reserve funds before a payout

For a ₦7,000 payout request:

  • Debit customer available liability: ₦7,000.
  • Credit customer reserved liability: ₦7,000.

The customer now has ₦18,000 available and ₦7,000 reserved. Total customer liability remains ₦25,000 because no money has left under this simplified model.

Check availability and create the reservation atomically. Otherwise, two simultaneous payout requests can both pass the same balance check.

Finalise or release the reservation

When sufficient evidence confirms the payout has completed:

  • Debit customer reserved liability: ₦7,000.
  • Credit partner-bank settlement asset: ₦7,000.

If the payout definitively fails before funds leave, release the reservation:

  • Debit customer reserved liability: ₦7,000.
  • Credit customer available liability: ₦7,000.

An unknown outcome is not a failure. Keep the reservation in place while investigating. If bank debits and payout completion occur at different times, introduce an appropriate clearing account rather than forcing both events into one posting.

Make journals immutable and posting atomic

Posted entries should not be edited to make balances look right. Correct errors through linked reversal or adjustment journals, preserving the original record and the reason for the correction.

Your posting service should enforce:

  • Balanced debits and credits for each currency.
  • Valid, active accounts with compatible currencies.
  • Integer minor-unit amounts instead of floating-point arithmetic.
  • Unique keys for each business operation and accounting effect.
  • Atomic creation of the journal and all its entries.

For NGN, store kobo internally, but follow the documented amount convention at each API boundary. Never assume every endpoint uses your internal unit.

A unique posting key might combine an operation identifier with an effect such as reserve or complete. Enforce that uniqueness in storage. An application-level “already processed?” check is insufficient when concurrent workers can both pass it.

Cached balances can improve read performance, but they must remain consistent with committed entries and rebuildable from the ledger.

Connect Paddle without creating two sources of truth

Paddle offers ledgers alongside virtual accounts, NIP payouts to 120+ Nigerian banks and other financial services. Before implementation, review the current documentation to establish supported ledger operations, account structures and transaction-event behaviour.

Decide which system owns the authoritative product balance. If Paddle’s ledger capabilities meet your requirements, use them according to their documented guarantees. If you maintain an internal accounting ledger, define exactly how its entries map to Paddle transactions. Avoid two independently writable balances with no reconciliation contract.

Build an integration layer that translates documented provider statuses into your own business states. Keep provider payloads separate from accounting decisions so a new event field does not silently change posting behaviour.

Where webhooks are supported, follow the documented authentication procedure, durably record accepted events and process them with retry-safe workers. Expect duplicate or out-of-order delivery. Where supported, transaction retrieval can help resolve ambiguous outcomes.

Reconcile accounting against external evidence

Run two distinct checks. Internal reconciliation verifies balanced journals and agreement between entries and balance projections. External reconciliation compares your records with provider transaction histories and relevant bank or settlement statements.

Match records using references, currency, amount and the appropriate accounting period. Timing differences should be explained, not automatically classified as losses or gains.

Route unresolved items into an exception queue with an owner, supporting evidence and a next action. Examples include a bank debit without a completed internal payout, an unmatched incoming collection or a completed provider transaction without a journal.

Never post unexplained differences directly into revenue just to close the queue.

Practical launch checklist

Before exposing wallet balances to customers:

  1. Approve the account model. Have finance and engineering review ownership, liabilities, clearing accounts and fee treatment.
  2. Document posting triggers. Specify the evidence required for collection recognition, reservation, completion and release.
  3. Test concurrency. Submit competing requests against the same available funds and verify that overspending is prevented.
  4. Replay events. Confirm duplicates and reordered notifications cannot create additional financial effects.
  5. Exercise uncertainty. Simulate timeouts, missing notifications and delayed bank movements without prematurely releasing funds.
  6. Test corrections and access controls. Require authorised, traceable adjustment journals rather than direct balance edits.
  7. Prove reconciliation. Investigate representative mismatches and rebuild balance projections before launch.

Build it with Paddle

Paddle brings ledger capabilities, virtual accounts and Nigerian payout infrastructure into your integration planning. Start with one currency, a reviewed account model and a complete collection-to-payout lifecycle before expanding your product.

Create a free account to explore Paddle, then read the API docs to confirm the current ledger interfaces, transaction statuses and integration requirements. Build balances that your customers can trust—and your engineering and finance teams can explain.

#Developer Guides#Nigeria#Ledgers#Wallet Infrastructure

Keep reading

Paddle Build Studio

Want us to build it with you?

Build for Africa and the world. Our team can deliver your fintech, web or mobile product in 2–3 weeks — or integrate Paddle APIs and build it yourself.