The cheapest way to cut bank SMS alert costs in Nigeria is to make every alert fit one GSM-7 segment of 160 characters, remove anything that forces Unicode (the naira sign is the usual culprit), and stop sending by SMS what customers do not need by SMS. Customers now pay NGN 6 per alert at many banks, up from NGN 4 since 1 May 2025, as reported by Brandcom, so alerts that are short, clear and worth paying for also reduce complaints and churn.

Last reviewed: 27 October 2026

This guide is for digital banking, card and channels teams at Nigerian banks, microfinance banks and payment service banks. It explains how alert costs build up, how to rewrite templates, which alerts should stay on SMS, and how to check every template automatically before it goes live.

How alert costs build up

An alert's cost is simple arithmetic: number of alerts x segments per alert x price per segment. Most teams negotiate the price and ignore the other two factors, which they control completely.

  • Segments per alert. A message in the GSM-7 character set fits 160 characters in one segment. Once it is longer, each part carries 153 characters, so a 170-character alert bills as two. If any character falls outside GSM-7, the whole message switches to Unicode (UCS-2): 70 characters for one segment, 67 per part after that.
  • Number of alerts. Credit alerts for tiny inbound amounts, failed-transaction notices that are followed by a reversal notice, and marketing dressed as alerts all add volume.
  • Price per segment. Set by your provider and your volume. On eSMS Africa, Nigerian messages start at NGN 9.1 on the basic tier and NGN 6.1 on the enterprise tier ($0.0046).

When the bank recovers the alert cost from customers per alert, a two-segment template means the bank pays twice for something the customer is charged once for, or the customer pays for a message padded with text they did not need.

The characters that double your bill

A single non-GSM-7 character turns a 150-character alert into a three-segment Unicode message. The common offenders in Nigerian bank templates:

CharacterWhere it comes fromUse instead
The naira signTemplate designed in a word processorNGN
Curly quotes and apostrophesCopy-paste from Word or emailStraight ' and "
Long dashesAutocorrectA plain hyphen -
EmojiMarketing-led templatesNothing
Characters from customer names in other scriptsBeneficiary names from transfer narrationsTransliterate or truncate the narration field

Narrations are the hidden risk: the template is clean, but a sender types an emoji in the transfer description and your alert for that one transaction goes out in Unicode. Strip or replace non-GSM-7 characters in variable fields before rendering. Our explainer on GSM-7 versus Unicode encoding covers the character set in detail.

Rewrite the template: before and after

A typical long-form debit alert, laid out with labels on every field, runs past 160 characters once real account names and narrations are filled in:

Txn: Debit | Acct: 012****789 | Amt: NGN25,000.00 | Desc: TRANSFER TO ADAOBI OKONKWO-FOODSTUFF MAR | Date: 27-10-2026 14:05 | Avail Bal: NGN140,350.20 | Ref: 000123456789

That is more than 170 characters, so it bills as two segments. A compact version keeps every field the customer uses to spot fraud and fits one segment even with a long narration truncated to 20 characters:

OkeBank DR NGN25,000.00 Acct 012**789 TRF ADAOBI OKONKWO 27/10 14:05 Bal NGN140,350.20 Ref 3456789. Not you? Call 0700 000 0000

Rules that get most templates into one segment:

  • Use DR and CR, which Nigerian customers already recognise, instead of "Debit transaction".
  • Drop field labels the customer does not need ("Txn:", "Desc:", "Avail Bal:" becomes "Bal").
  • Show the date as DD/MM and time as HH:MM. The year adds nothing.
  • Mask the account to the last three or four digits.
  • Truncate narrations to a fixed length and keep the last digits of the reference.
  • Keep the fraud line ("Not you? Call...") short but never drop it: it is the reason customers value alerts.

Sample templates that fit one segment

AlertSample
CreditOkeBank CR NGN80,000.00 Acct 012**789 From CHINEDU EZE 27/10 09:12 Bal NGN220,350.20 Ref 4458120
Card purchaseOkeBank Card **4821 used NGN18,500.00 at SHOPRITE LEKKI 27/10 18:40 Bal NGN121,850.20. Not you? Block: *000*7# or 0700 000 0000
Failed transfer, reversedOkeBank: Transfer of NGN25,000.00 to ADAOBI OKONKWO failed and has been reversed. Bal NGN140,350.20. Ref 3456789
SecurityOkeBank: New login to your app on a new phone at 21:14. If this was not you, call 0700 000 0000 now. We never ask for your PIN.

The failed-transfer sample shows another saving: one message that says "failed and reversed" replaces separate debit, failure and reversal messages when the reversal is immediate.

Send less by SMS without losing customers

Customers keep paying for alerts because alerts protect them. Cut volume where the customer gains nothing, and keep SMS where it catches fraud:

  • Keep on SMS: debits, card transactions, new-device logins, PIN and limit changes. These reach the customer even when mobile data is off or the app has been removed by a fraudster.
  • Offer a choice: credit alerts below an amount the customer sets, in-app push or email for statements and monthly summaries. Make the setting easy to find, explain the trade-off, and record the choice.
  • Remove: cross-sell messages sent on the alert sender ID, "your statement is ready" SMS for customers who already receive email statements, and duplicate notices.

Before changing which alerts go by SMS, check your obligations under the CBN's rules on bank charges and customer protection, your customer terms, and your fraud team's view. Some customers rely on SMS alerts precisely because they do not use the app.

Keep marketing out of alerts. Promotions belong on a separate sender ID: the NCC's partial DND lists banking, insurance and financial products as category 1, and customers on DND who have not allowed that category should not receive them. Adding an offer to an alert makes it longer and turns a message the customer pays for into an advert. Our article on bulk SMS to DND numbers explains the split.

Check every template automatically

Template changes happen often: new products, new narration fields, a marketing team request. Add a pre-flight check to your alert service that renders each template with the longest realistic values and fails the build if it would bill as more than one segment.

# Python 3: reject any alert template that would cost more than one segment
GSM7 = set("@\u00a3$\u00a5\u00e8\u00e9\u00f9\u00ec\u00f2\u00c7\n\u00d8\u00f8\r\u00c5\u00e5"
           "\u0394_\u03a6\u0393\u039b\u03a9\u03a0\u03a8\u03a3\u0398\u039e\u00c6\u00e6\u00df\u00c9"
           " !\"#\u00a4%&'()*+,-./0123456789:;<=>?\u00a1ABCDEFGHIJKLMNOPQRSTUVWXYZ"
           "\u00c4\u00d6\u00d1\u00dc\u00a7\u00bfabcdefghijklmnopqrstuvwxyz\u00e4\u00f6\u00f1\u00fc\u00e0")
GSM7_EXT = set("^{}\\[~]|\u20ac")   # these count as two characters

def segments(text):
    if all(c in GSM7 or c in GSM7_EXT for c in text):
        n = sum(2 if c in GSM7_EXT else 1 for c in text)
        return 1 if n <= 160 else -(-n // 153)
    return 1 if len(text) <= 70 else -(-len(text) // 67)   # Unicode (UCS-2)

def render_alert(t):
    text = (f"{t['bank']} DR NGN{t['amount']} Acct {t['masked']} "
            f"{t['desc'][:20]} {t['when']} Bal NGN{t['balance']} Ref {t['ref']}")
    assert segments(text) == 1, ("alert would bill as multiple segments", text)
    return text

Send the alert with POST https://sms.esmsafrica.io/api/messages/send, your approved transactional sender ID and the rendered text. Delivery reports arrive by webhook and in the dashboard, so you can reconcile what was sent, what was delivered and what you charged customers. Charging a customer for an alert the network never delivered is a common source of complaints.

Checklist

  1. Every alert template renders to one GSM-7 segment with worst-case values.
  2. No naira sign, curly quotes, long dashes or emoji in templates.
  3. Variable fields (narrations, merchant names) sanitised and truncated.
  4. Immediate failures and reversals combined into one message.
  5. Customer choice for low-value credit alerts and statement notices, recorded.
  6. Fraud alerts (debits, cards, logins, limit changes) always on SMS.
  7. Marketing on a separate sender ID, never inside alerts.
  8. Monthly reconciliation of sent, delivered and charged alerts.

Frequently asked questions

How much do Nigerian banks charge for SMS alerts?

Many banks moved from NGN 4 to NGN 6 per alert from 1 May 2025, citing higher telecom tariffs, as reported by Brandcom from a Guaranty Trust Bank customer notice. Check each bank's own published charges.

Why does the naira sign make alerts more expensive?

It is not in the GSM-7 character set, so the whole message switches to Unicode, where one segment holds 70 characters instead of 160. Writing NGN keeps the alert in GSM-7.

Can we move all alerts to push notifications?

Push is cheaper but does not reach customers whose app is uninstalled, logged out or offline. Keep fraud-critical alerts on SMS and check your regulatory and contractual obligations before removing any.

Do alerts reach customers on DND?

Alerts sent on an approved transactional sender ID typically do, because networks apply DND to promotional traffic. This is operator practice, so confirm your sender ID approval with each network.

Sources

See how Nigerian banks and microfinance banks structure alerts on the banking SMS page for Nigeria, compare tiers on the pricing page, and read our guides to OTP fraud controls for fintechs and the CBN 2026 security rules. Sender ID steps are on the Nigeria sender ID page. Create an account to test your templates with a free test key.