Zambian e-money apps should send an SMS receipt for every transaction, show any charge before the customer confirms, tell the customer quickly when a transaction fails and when it is reversed, and warn dormant-wallet holders before funds are treated as abandoned. The Bank of Zambia's National Payment Systems Directives on Electronic Money Issuance, 2023 set out these duties, and its 2024 directive bans a list of charges, including fees for failed transactions and balance enquiries.

Last reviewed: 27 October 2026. This article summarises the gazetted 2023 directives and press reports of the 2024 directive. It is not legal advice; confirm details with the Bank of Zambia.

What the 2023 e-money directives require

The National Payment Systems Directives on Electronic Money Issuance, 2023 were published in the Zambia Gazette of 14 July 2023 and replaced the 2018 directives. They apply to any person conducting e-money services in Zambia. The directives that turn into customer messages are:

DirectiveWhat it says (summarised)Message to send
33(1)(c)Make the customer aware of the costs of the service before carrying out any transactionCharge shown on the confirmation screen; fee repeated in the receipt
39(1)(b)Disclose transaction charges electronically at the point of transacting, before the customer completes the transactionIn-app or USSD confirmation, not SMS after the event
32(1)(b)Complete customer transactions in real timeReceipt sent from the same event that posts the transaction
32(2)(f)Resolve a failed local transaction within 48 hoursFailure notice, then a reversal or completion message
32(2)(a) to (c)Tell customers how to complain, the process, time limits and how to appeal; display it in branches, agent outlets and electronic channels, and explain redress at onboardingWelcome SMS with the help line and a link to the complaints page
32(4)If a customer reports that the SIM linked to the wallet may be compromised, check the wallet, tell the customer whether it was tampered with and suspend outgoing transactions until identity is validatedSuspension and confirmation messages
18(2) and (3)E-money is presumed abandoned after two years without customer activity; notify the customer at least three months before, using channels such as SMSDormant-wallet warning
40Keep customer information and transaction records for at least ten yearsKeep SMS logs with the transaction record

Note the distinction in 39(1)(b): the fee has to be visible before the customer completes the transaction. An SMS receipt afterwards is useful evidence, but it does not replace the confirmation screen.

The 2024 directive on unwarranted charges

In September 2024 Zambia Monitor reported that the Bank of Zambia had issued directives prohibiting unwarranted charges and fees on electronic money services. According to that report, e-money institutions may not charge for depositing money into a customer's wallet, add surcharges to merchant payments, charge for bill payments, charge for failed or unsuccessful transactions, charge for balance checks, charge for electronic monthly statements, or charge to open, close or reactivate a wallet. Institutions that break the directives face fines of up to ZMW 200,000, imprisonment of up to two years, or both, as reported.

Three consequences for your messaging:

  • Balance SMS must be free. If customers can request a balance by USSD or SMS, the message must not trigger a charge.
  • Failure messages must not mention a fee. A failed transfer cannot cost the customer anything, so a template that shows "Fee ZMW {{fee}}" on failures is a compliance risk.
  • Bill-payment receipts show the bill amount only. If your system adds a convenience fee to bill payments, review it before you put it in a receipt.

Receipt templates that customers can check

Customers compare your receipt with their bank or network wallet record. Use the same amount format, identify the counterparty, give a reference and the balance, and keep it under 160 characters.

ChipaPay: ZMW {{amount}} sent to {{payee}} {{date}} {{time}}. Fee ZMW {{fee}}. Bal ZMW {{bal}}. Ref {{ref}}. Help 0977000000
ChipaPay: ZMW {{amount}} paid to {{merchant}} {{date}}. Bal ZMW {{bal}}. Ref {{ref}}. Help: 0977000000
ChipaPay: you received ZMW {{amount}} from {{sender}} {{date}} {{time}}. Bal ZMW {{bal}}. Ref {{ref}}.

Failures and reversals

ChipaPay: your transfer of ZMW {{amount}} to {{payee}} failed. No fee was charged. Any debit will be reversed within 48 hours. Ref {{ref}}.
ChipaPay: ZMW {{amount}} from failed transfer {{ref}} has been returned to your wallet. Bal ZMW {{bal}}. Help: 0977000000

Fee changes, dormancy and SIM risk

ChipaPay: from {{date}} the fee for {{service}} changes to ZMW {{fee}}. Full tariff: go.esmsafrica.io/cptariff. Questions: 0977000000
ChipaPay: your wallet has had no activity since {{date}}. Use it or withdraw by {{deadline}} to keep it active. Help: 0977000000
ChipaPay: outgoing payments on your wallet are paused while we confirm your identity, after your SIM report. Call 0977000000.

Building receipts into the payment flow

The safest design sends the receipt from the event that posts the ledger entry, not from a later batch job. A minimal pattern:

  1. The ledger posts the transaction and emits an event with a unique transaction ID.
  2. A notification worker builds the SMS from a versioned template and calls the eSMS API, storing the transaction ID with the message ID.
  3. If the call times out, the worker retries with the same transaction ID and checks its own store first, so the customer never gets two receipts.
  4. The delivery-report webhook updates the record. Failed deliveries are retried once, then flagged for an in-app notice.
// Node.js: send a receipt after the ledger confirms the transfer
async function sendReceipt(tx) {
  if (await alreadyNotified(tx.id)) return;          // idempotency
  const text = `ChipaPay: ZMW ${tx.amount} sent to ${tx.payee} ${tx.date}. ` +
               `Fee ZMW ${tx.fee}. Bal ZMW ${tx.balance}. Ref ${tx.ref}.`;
  const res = await fetch('https://sms.esmsafrica.io/api/messages/send', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.ESMS_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ to: tx.msisdn, text, sender_id: 'CHIPAPAY' })
  });
  await markNotified(tx.id, await res.json());
}

Use a test key beginning esms_test_ while you build; it simulates sends and delivery reports without charge. The fields are in the HTTP API documentation, and our tutorial on receiving delivery reports covers the webhook side. For one-time passwords, see OTP for fintech apps in Zambia rather than building codes into receipts.

Sender ID, timing and data

  • Sender ID. Register an alphanumeric ID such as CHIPAPAY on MTN, Airtel and Zamtel. Numeric sender IDs are not supported by Zambian networks, as reported in published operator guidelines. Our registration fee in Zambia is a one-time USD 100 covering all networks. See sender ID registration in Zambia.
  • Timing. Receipts, failure notices and security messages are transactional and should go out immediately at any hour. Only promotions should follow ZICTA's 2011 daytime directive (no promotional SMS between 20:00 and 07:00).
  • Data. Wallet numbers, balances and transaction histories are personal data under the Data Protection Act No. 3 of 2021. Mask account numbers and keep SMS logs as part of the ten-year transaction record.

Costs

Receipts are usually a wallet's largest SMS volume, so every extra segment matters. A one-segment SMS to a Zambian number is ZMW 0.2104 ($0.0104) at the basic tier and ZMW 0.18 at the enterprise tier. Templates with long merchant names can spill into a second segment, so cap the merchant field (for example at 20 characters). Live rates are on the pricing page.

Compliance checklist

  • Charges shown on the confirmation screen before the customer completes the transaction.
  • Receipt sent from the ledger event, idempotent by transaction ID.
  • No fee on balance checks, failed transactions, deposits, bill payments or e-statements.
  • Failure notice sent at once; reversal or completion within 48 hours, with a second message.
  • Welcome message explains the complaint route and appeal.
  • SIM-compromise flow suspends outgoing transactions and informs the customer.
  • Dormant-wallet warnings scheduled at least three months before the two-year mark.
  • SMS logs retained with transaction records for ten years.

Frequently asked questions

Does an SMS receipt satisfy the fee-disclosure rule?

Not on its own. Directive 39(1)(b) asks for charges to be disclosed electronically at the point of transacting, before the customer completes the transaction. Show the fee on the confirmation step, then repeat it in the receipt.

Can we charge for SMS balance requests?

According to reports of the 2024 directive, balance checks are among the charges e-money institutions may not impose. Treat balance SMS as free.

How fast must a failed transaction be fixed?

Directive 32(2)(f) requires a failed local transaction to be resolved within 48 hours. Send a failure notice immediately and a second message when the funds are returned or the transfer completes.

What should a dormant-wallet notice say?

That the wallet has been inactive, the date by which the customer should use or withdraw the funds, and a help number. Directive 18 expects the notice at least three months before funds are presumed abandoned.

Sources

See wallet and payment-app templates on our page for mobile money and fintech SMS in Zambia, compare with SMS for banks and co-operatives in Zambia, and create an account to start building with a free test key. Rates are on the pricing page.