Guide for business owners
The business SMS guide
SMS is still the most dependable way to reach a customer in Bangladesh. It works on every mobile phone, needs no app and no internet connection, and arrives in the same inbox as messages from banks and mobile operators. That reliability is why shops, e-commerce stores, schools, clinics and NGOs use it for order updates, one-time passwords, appointment reminders and notices.
But SMS also has rules that are not obvious at first: a Bangla message can cost twice as much as an English one of similar length, a single curly apostrophe can change how a message is counted, and a message marked “submitted” is not the same as one marked “delivered”. This guide explains those rules in plain language so you can write better messages and keep costs under control.
How business SMS works
When you press Send in the dashboard, or your website calls the SMS API, the message passes through several systems before it reaches a phone:
- Your dashboard or application creates the message: recipient number, text and sender ID.
- SMSGELY validates it (number format, sender ID, length, balance), stores it, reserves the cost from your wallet and places it in a queue. Every message is saved before anything is sent, so nothing is lost if a system restarts.
- A background processor picks up queued messages in batches and hands them to an SMS provider or aggregator that is connected to the mobile networks.
- The mobile operator (the recipient’s network) routes the message to the handset.
- The handset receives and displays it. If the phone is switched off or out of coverage, the network usually keeps trying for a limited time.
Information then flows back the other way. The provider tells SMSGELY whether it accepted the message, and later the operator sends a delivery receipt saying whether it reached the phone. Those updates become the statuses you see in delivery reports, and developers can receive them automatically through webhooks.
GSM-7 and Unicode encoding
Every SMS is sent in one of two character encodings, and the encoding decides how many characters fit in one message.
GSM-7: plain English text
GSM-7 is a compact alphabet designed for SMS. It covers English letters, digits, common punctuation such as . , ! ? : ; - ( ) " ' @ # % & and a handful of accented European letters. A single GSM-7 message can hold up to 160 characters.
A few characters live in an “extension table” and take two positions each: ^ { } [ ] ~ | € \. A discount code written as {EID10} therefore uses nine positions, not seven.
Unicode (UCS-2): Bangla, emoji and special symbols
Anything outside the GSM-7 alphabet, including every Bangla letter and digit, emoji, and typographic “smart” quotes, requires Unicode encoding. Unicode messages are counted in UTF-16 code units, and a single Unicode message holds up to 70 units. Most Bangla letters and signs are one unit each, but conjuncts are built from several code points (for example প্রিয় is six units), and most emoji take two units.
One character changes the whole message
Encoding applies to the entire message, not to individual words. If a 150-character English message contains just one non-GSM character, such as a curly apostrophe (’) pasted from a word processor, a long dash (—) or a 🙂, the whole message becomes Unicode. Its limit drops from 160 to 70 per message, and it will be split into three parts instead of fitting in one. When writing English messages, type straight quotes and plain hyphens, and check the live counter in the composer before sending.
Message length and parts
Text longer than a single SMS is split into parts (also called segments) and reassembled on the phone, so the customer sees one message. Each part needs a small header that tells the phone how to join them, which reduces the space per part:
- GSM-7: 160 characters in a single message, but 153 per part once the message is split.
- Unicode: 70 units in a single message, but 67 per part once the message is split.
You pay per part, so a 161-character English message costs the same as two separate messages, and a 71-unit Bangla message costs the same as two Bangla messages. By default SMSGELY allows up to 10 parts (and 2,000 characters) per message; this limit is configurable by the platform administrator.
Worked example: a Bangla order message
Here is a typical order confirmation written in Bangla:
প্রিয় গ্রাহক, আপনার অর্ডার #১০৪২ নিশ্চিত হয়েছে। আগামী ২-৩ কার্যদিবসের মধ্যে ডেলিভারি দেওয়া হবে। ধন্যবাদ, ShopBD
It is 114 UTF-16 units long. That is more than 70, so it cannot travel as a single message. Split into 67-unit parts, it needs 2 parts (67 + 47 units). Note that the English letters in “ShopBD” do not help: once any Bangla character is present, the whole message is Unicode.
The same information in English looks like this:
Dear customer, your order #1042 is confirmed. It will be delivered within 2-3 working days. Thank you, ShopBD
At 109 GSM-7 characters it fits comfortably within 160, so it is sent as 1 part. A longer English version of 205 characters would need 2 parts (153 + 52).
Short Bangla messages are still single-part. This one-time password message is 50 units, so it fits in one SMS:
আপনার ওটিপি ৪৮২৯১৩। ৫ মিনিট বৈধ। কাউকে জানাবেন না।
A slightly wordier version, “আপনার ওটিপি কোড ৪৮২৯১৩। এটি ৫ মিনিট পর্যন্ত বৈধ। কাউকে এই কোড জানাবেন না।”, is 73 units and would be billed as 2 parts, just three units over the limit. Trimming a few words is often the easiest saving you can make. Also note that the same Bangla word can be stored slightly differently depending on the keyboard used (for example, য় may be one or two code points), so always trust the composer’s counter over a manual count.
Quick reference: SMS limits
| Encoding | Used for | Single message | Per part (multipart) | Counts as 2 |
|---|---|---|---|---|
| GSM-7 | English letters, digits, basic punctuation | 160 characters | 153 characters | ^ { } [ ] ~ | € \ |
| Unicode (UCS-2) | Bangla, emoji, curly quotes, other scripts | 70 units | 67 units | Most emoji |
Default maximum per message: 10 parts or 2,000 characters. Parts in practice: GSM-7 up to 160 = 1 part, 161–306 = 2 parts, 307–459 = 3 parts; Unicode up to 70 = 1 part, 71–134 = 2 parts, 135–201 = 3 parts.
Masking vs non-masking SMS
The sender ID is what the recipient sees in the “from” field. There are two kinds:
Masking SMS
Masking SMS shows your brand name, such as SHOPBD, as an alphanumeric sender ID of 3 to 11 characters. Customers recognise you immediately, which helps with trust and brand recall. You request a masking sender ID from Dashboard → Sender IDs. Each request goes through review and shows a status of Pending, Approved, Rejected or Suspended, and supporting documents may be requested. Only approved sender IDs can send. Masking sender IDs are subject to the rules of Bangladeshi mobile operators and the regulator, so approval is not guaranteed and can take time.
Non-masking SMS
Non-masking SMS is sent from a sender number provided by the platform. No approval is needed, so you can start straight away. It is well suited to one-time passwords, alerts and internal notifications. Because the sender is a number rather than your name, include your business name in the message text so recipients know who it is from.
Prices can differ between masking and non-masking messages; see pricing for current rates.
Delivery reports and statuses
Every message has a status that changes as it moves through the system. You can filter delivery reports by date, campaign, sender and status, and developers can read statuses through the message status API. Here is what each status means:
| Status | What it means |
|---|---|
queued | The message is stored and waiting for the background processor to pick it up. Funds for it are reserved. |
scheduled | The message is stored and will be released at the date and time you chose (Asia/Dhaka). |
processing | The processor has picked the message up and is handing it to the SMS provider. |
retry_pending | A temporary problem occurred before the provider accepted the message; it will be tried again automatically. |
submitted | The provider has accepted the message. This is the point at which it is charged. |
sent | The provider reports the message has left its system towards the mobile operator. |
delivered | The operator confirmed the message reached the handset. |
failed | The message could not be delivered (for example, an invalid or unreachable number). Messages the network never accepted are not charged; a message the network accepted but could not deliver to the handset is normally charged, because the network processed it. |
rejected | The provider or operator refused the message, for example because of the sender ID or content. Rejected messages are not charged. |
cancelled | You cancelled the message (usually a scheduled one) before it was sent. The reservation is released. |
unknown | The outcome is uncertain, for example after a provider timeout. SMSGELY reconciles it with the provider and never resends it automatically. |
Two points are worth remembering. First, submitted means the provider accepted the message, not that the phone received it; only delivered confirms that. Second, some operators do not return delivery receipts for every message, so a message can remain at submitted or sent even though it arrived. The unknown status exists so that an uncertain outcome is never guessed: SMSGELY checks with the provider rather than sending again, which prevents duplicate messages and double charges.
Billing basics
SMSGELY uses a prepaid wallet in Bangladeshi taka (BDT). The cost of a message is simple:
Cost = number of parts × price per part
The price per part can differ for masking and non-masking messages and for GSM-7 and Unicode text; current rates are on the pricing page. The wallet works in two steps:
- Reserve. When a message is queued, its cost is reserved. Your wallet shows the total balance, the reserved amount and the available amount, so you never accidentally send more than you can pay for.
- Charge. The reserved amount is charged only when the provider accepts the message. If a message fails or is rejected before acceptance, or you cancel a scheduled message, it is not charged and the reservation is released.
You top up manually through bKash or Nagad, and staff verify the payment before the balance is added. Every movement appears in your transactions, and invoices are available as PDF.
Best practices
- Identify yourself. Start or end with your business name, especially with non-masking SMS.
- Lead with the purpose. Put the order number, code or appointment time in the first line.
- Keep it short. Aim for one part: 160 characters in English, 70 in Bangla. Remove filler words and greetings that add length without meaning.
- Watch for hidden Unicode. Text copied from Word or a website may contain curly quotes or long dashes that switch an English message to Unicode.
- Personalise with templates. Save reusable templates with variables such as {{name}} and {{order_id}}. Remember that long names make messages longer, so leave some headroom.
- Send at sensible times. Use scheduling (Asia/Dhaka time) for promotions and reminders, and avoid late-night messages unless they are urgent, such as a one-time password.
- Keep your lists clean. Import contacts by CSV into contact management, where Bangladeshi numbers are normalised and duplicates are detected. Remove numbers that keep failing.
- Test first. Send a new template or campaign to your own number before sending it to a group or a bulk campaign.
- Review reports. Check failed and rejected messages after each campaign to spot invalid numbers or sender ID issues early.
Consent, compliance and opt-out
Good SMS practice protects your customers and your sender reputation. Only send to people who have given you their number for that purpose, such as customers who placed an order, students’ guardians who registered with your school or patients who booked an appointment. Do not buy or rent number lists.
Separate transactional messages (order updates, one-time passwords, appointment reminders) from promotional ones (offers, announcements). For promotional messages, tell people how to stop receiving them, for example “To stop offers, call 09612345678”, and honour those requests promptly by removing the number from your groups. Follow the rules of Bangladeshi mobile operators and the regulator, and our SMS policy and acceptable use policy, which prohibit spam, deceptive content and impersonation.
Finally, treat phone numbers as personal data. Limit who can export contact lists, and read our privacy policy to understand how SMSGELY handles the data you upload.
Next steps
Ready to try it? Create an account, top up your wallet, and send a test message to your own phone. If you plan to connect a website or app, continue with the SMS API guide. Questions are welcome through support or the FAQ.
Put this guide into practice
Create an account, top up your wallet with bKash or Nagad, and send your first test SMS to your own number.