Engineering

Integrating African Payment Rails: What No One Tells You

February 20, 2025·7 min read·GeezSoft Team

Every fintech article about Africa talks about "the opportunity." Mobile money penetration. Unbanked populations. Digital leapfrogging. What they do not talk about is what it actually feels like to integrate Ethiopian payment methods into production software. This article fills that gap.

We have integrated Telebirr, CBE (Commercial Bank of Ethiopia), Awash Bank, and Dashen Bank into our live platforms. These are not sandbox integrations or proof-of-concept demos. These handle real ETB from real users every day. Here is what we learned.

The Fragmented Landscape

Ethiopia's digital payment ecosystem is fragmented in a way that European or American developers would find disorienting. There is no single dominant payment processor equivalent to Stripe, Square, or even M-Pesa (which dominates in Kenya but has no presence in Ethiopia). Instead, you have:

  • Telebirr: Ethio Telecom's mobile money service, the closest thing to a universal payment method. Most Ethiopians with a phone number can use it.
  • CBE Birr: Commercial Bank of Ethiopia's mobile banking product. Large user base but limited API capabilities for third parties.
  • Bank transfers: Direct transfers from Awash, Dashen, and other private banks. Each bank has its own system, its own transfer format, and its own reconciliation timeline.

There is no unified API that wraps all of these. No aggregator that handles the complexity for you. If you want to accept payments from Ethiopian users, you integrate each rail individually and build your own aggregation layer.

Manual Bank Transfer Flows

Here is a reality that shocks developers from markets with mature payment infrastructure: the most reliable payment method in Ethiopia is still the manual bank transfer.

A user opens their banking app, initiates a transfer to your company's bank account, includes a reference code, and then tells your system they have made the transfer. Your system must then verify that the transfer actually happened, match it to the correct user, and credit their account.

This is not a fallback. This is the primary flow for a significant portion of transactions.

To make this UX-friendly, we built the following:

  1. Reference code generation: When a user initiates a deposit, we generate a unique 8-character reference code and instruct them to include it in the bank transfer description.
  1. Pending transaction queue: Every deposit request creates a pending transaction record with the reference code, expected amount, and a 24-hour expiry.
  1. Verification interface: An admin dashboard shows all pending transactions alongside incoming bank statement data. Admins match incoming transfers to pending deposits by reference code and amount.
  1. Auto-matching: When possible, we automatically match transfers by exact reference code and amount. Matched transactions are auto-approved after a configurable delay.
  1. Notification flow: Users receive real-time notifications when their deposit is verified. If a deposit is not verified within the expected timeframe, they receive a follow-up with instructions.

This system processes hundreds of transactions daily with a verification accuracy above 99%. The key is making the manual steps as efficient as possible — not eliminating them, because the infrastructure does not support full automation yet.

Telebirr Integration: The Details

Telebirr is the closest thing Ethiopia has to a modern payment API, but "modern" is relative. Here is what the integration actually involves.

The official documentation is minimal and occasionally contradictory. We found that the sandbox and production environments behave differently in subtle ways — timeout values, error codes, and callback formats are not identical. Plan to spend significant time in production testing with small amounts before going live.

The payment flow is USSD-based. You initiate a payment request through the API, Telebirr sends a USSD prompt to the user's phone, the user confirms with their PIN, and Telebirr sends a callback to your webhook endpoint. In theory, this is clean and automatic.

In practice:

  • Callbacks can be delayed by 5-30 seconds, sometimes longer during peak usage. Your system must handle this gracefully — show the user a "processing" state and poll or wait for the callback.
  • Duplicate callbacks happen. Implement idempotency on your webhook handler. Use the transaction ID as a deduplication key.
  • Timeout handling is critical. If the user does not respond to the USSD prompt within 60 seconds, the transaction expires. But the expiry callback is not always reliable. Build a polling mechanism that checks transaction status after timeout.
  • Amount precision matters. Telebirr uses whole numbers for ETB amounts. If your system uses decimal amounts internally, round before sending to Telebirr and verify the returned amount matches.

Despite these challenges, once Telebirr integration is stable, it is the smoothest payment experience for Ethiopian users. No app switching, no reference codes, no manual verification. Tap, confirm, done.

The Challenge of Reconciliation

In mature payment markets, reconciliation is largely automated. Bank provides a statement, you match transactions against your records, discrepancies are flagged. In Ethiopia, reconciliation is a first-class engineering challenge.

Bank statements from Ethiopian banks come in various formats — some provide CSV exports, some provide PDF only, some require manual download from their portal. There is no standardized statement format across banks, and automated statement ingestion requires bank-specific parsing logic.

We built a reconciliation engine that:

  • Ingests statement data from multiple formats (CSV, manual entry)
  • Matches incoming transfers against pending deposits using reference code, amount, and date
  • Calculates match confidence scores for ambiguous matches
  • Flags discrepancies (deposits claimed but not found in statements, statement entries without matching deposits)
  • Generates daily reconciliation reports

The key design decision was making reconciliation a continuous process, not a batch job. Every new statement entry is processed immediately, and matched deposits are credited within minutes of verification. This matters for user experience — nobody wants to wait 24 hours for their deposit to appear.

How We Built a Verification System That Works

After six months of iteration, our payment verification system handles four payment methods with a unified interface. The abstraction looks like this:

Each payment method implements a standard interface: initiate payment, check status, process callback, and reconcile. The platform-level code does not know or care which payment method is being used — it talks to the abstraction layer.

The key reliability mechanisms:

  • Retry queues: Failed verifications are retried with exponential backoff. A single network timeout does not result in a lost deposit.
  • Audit trail: Every state change in a transaction's lifecycle is logged with timestamp, trigger (user, system, admin), and before/after state.
  • Escalation paths: Transactions that cannot be automatically resolved are escalated to admin attention with full context.
  • Balance protection: User balances are never credited until verification is complete. This prevents the double-credit bugs that plague systems with optimistic balance updates.

What Is Coming Next

The Ethiopian fintech infrastructure is improving. The National Bank of Ethiopia has been pushing for digital payment adoption. Telebirr's API is maturing. New payment aggregators are entering the market. Within two to three years, integrating Ethiopian payments may look more like integrating Stripe — but we are not there yet.

For now, if you are building software that needs to accept payments from Ethiopian users, plan for manual processes, build robust reconciliation, and do not assume any single payment method will cover your entire user base. The infrastructure gap is real, but it is an engineering challenge, not an impossible one. And solving it well is a genuine competitive advantage.