Why this matters
An SMS looks like a simple string of characters, but billing and delivery work on segments. A message that fits in one segment is billed once. A longer message is split into parts, each billed separately. Understanding what sets the segment size lets you predict cost accurately and, with small changes, often halve it.
The size of a segment is decided by the encoding. There are two encodings you will meet in practice, and a single character can switch a message from the roomier one to the tighter one. Teams that miss this see campaign bills that are two or three times their estimate.
The two encodings
GSM-7 is the default alphabet. It covers basic Latin letters, digits and common punctuation. Each character takes seven bits, which is why 160 of them fit in a 140-byte payload. UCS-2 is used when the message contains any character outside the GSM-7 set. Each character takes two bytes, so only 70 fit in one segment.
When a message is longer than one segment, part of every segment is used for a header that tells the handset how to reassemble the parts. That is why the per-part limits fall to 153 and 67. The recipient sees one message; you are billed for every part.
What triggers UCS-2
- Hindi, Arabic, Tamil and any other non-Latin script
- Emoji and many symbols
- Curly quotes and long dashes pasted from word processors
- Accented characters that are not in the GSM-7 set
- Non-breaking spaces copied from web pages
Just one such character is enough. The whole message is then encoded as UCS-2, and the limit drops from 160 to 70.
Worked examples
| Message | Encoding | Characters | Segments billed |
|---|---|---|---|
| Plain English order update | GSM-7 | 148 | 1 |
| Same text with one emoji | UCS-2 | 149 | 3 (67 per part) |
| Plain English, long reminder | GSM-7 | 300 | 2 (153 per part) |
| Hindi message | UCS-2 | 95 | 2 (67 per part) |
| Hindi message, short | UCS-2 | 60 | 1 |
The second row is the lesson. Adding one emoji to a 148 character message moves it from one segment to three. The text barely changed; the cost tripled.
Characters that count twice
Even inside GSM-7, some characters are part of an extension table and take two positions. These include [ ] { } ^ ~ | \ and the euro sign. A message full of such characters fits fewer than 160 characters in one segment.
How to estimate cost before you send
- Take the final template text. Use the exact approved wording with the longest realistic variable values
- Check the encoding. If any character is outside GSM-7, assume UCS-2
- Count characters. Count the fixed text plus the longest variable values
- Apply the limits. Divide by 160 or 153 for GSM-7, or by 70 or 67 for UCS-2, and round up
- Multiply by volume and rate. Segments times recipients times the per-segment rate for the destination
Do this for the worst case, not the average. A customer with a long name or address can push a message into a second segment, and a campaign has many such customers.
Ways to keep messages to one segment
- Cut filler. Remove greetings and phrases that add nothing.
- Shorten links. A link is ordinary text and counts character by character.
- Keep variables short. Use first names, not full names, if the message works without more.
- Normalise punctuation. Strip curly quotes and long dashes automatically before sending.
- Send in the local script only when you need it. A Hindi or Arabic message is worth the extra cost when comprehension matters, but test whether a short English line with a local-language reply link is enough.
India, DLT and encoding
In India the approved template text is what you must send. If your approved template contains a character that forces UCS-2, every send is UCS-2. Check this when you write the template, because you cannot fix it later without registering a new one. See the DLT checklist.
What recipients see
Recipients see one joined message. Handsets reassemble the parts using the header. A small number of older devices or networks display parts separately or out of order, which is another reason to keep important messages, such as OTPs, within a single segment.
Checklist before sending a campaign
- Preview the segment count in the composer
- Test the longest variable value
- Remove curly quotes, long dashes and non-breaking spaces
- Confirm the encoding is what you expect
- Multiply segments by volume to estimate cost
- Keep OTPs and alerts to one segment
Planning a campaign: a short case
Imagine a retailer sending an order-ready alert to 200,000 customers. The draft reads: “Hi Priya, your order #48213 is ready for pick-up at our Jaipur store. Please carry a photo ID. Thank you for shopping with us!” It is plain English and 118 characters, so it is one segment. Now the marketing team suggests adding a smiley and a typographic apostrophe in the store name. The message flips to UCS-2, where one segment holds only 70 characters, so at about 120 characters it needs two segments. The bill doubles from 200,000 segments to 400,000 for a change nobody thought of as a cost decision.
The fix is a process, not a lecture. Put an encoding check in the approval step for every template, show the segment count next to the preview and agree who can approve a change that raises it. Small teams can do this with a checklist; larger ones can enforce it in code by rejecting a send that would exceed an agreed segment budget.
Delivery effects of long messages
Segments are not only a billing matter. Each part travels separately through the operator network and each can fail separately. The longer a message, the more chances a part is delayed or lost, and a handset that is missing one part may show nothing at all. For time-sensitive traffic such as OTPs, payment alerts and appointment reminders, aim for one segment, even if that means a shorter, plainer message.
Reporting you should expect
Good reporting shows segments, not only messages. Compare the segment count with the message count in your logs. If the ratio is much above 1.0 for traffic you believe is short, you have an encoding or length problem worth investigating.
- Report segments per message by template
- Alert when the ratio rises week on week
- Review the top five templates by segment spend each month
Further reading
- 3GPP TS 23.038, which defines the GSM 7-bit default alphabet
- 3GPP TS 23.040, which defines concatenated short messages
Frequently asked questions
Do links count towards the limit?
Yes. A link is ordinary text. Use a short link to save characters.
Is the recipient charged per segment?
No. Recipients see one joined message. Segments affect what you are billed.
Why does my preview show more segments than I expected?
A character outside GSM-7 or a long variable value is the usual cause. Check both.
Does a space count?
Yes. Every character counts, including spaces and line breaks.
Can I force GSM-7 for a Hindi message?
No. Hindi characters are outside GSM-7, so the message is UCS-2.