Back to blogTechnical

How SMS Segments & Character Limits Actually Work

The real math behind GSM-7 and Unicode segmentation, 160 vs 153 characters, 70 vs 67, and the one hidden character that quietly doubles your bill.

Bullet SMS

Bullet SMS Team

August 30, 2026 · 7 min read

Share

Almost every bulk SMS bill has a moment where the numbers don't add up: a message that looks well under 160 characters gets charged as two or three. It isn't a billing mistake; it's the actual, spec-defined way SMS segmentation works, and once you know the rule it stops being surprising. If you're new to bulk SMS generally, our practical guide to what bulk SMS actually is is a good place to start first.

The two encodings, and why they exist

Every SMS is sent in one of two character encodings. GSM-7 packs the Latin alphabet, digits, and common punctuation into 7 bits per character, fitting more into the same 140-byte payload every SMS is limited to. Unicode (UCS-2) uses 2 bytes per character instead, because it has to represent every script in the world, including Devanagari. The moment a message contains a single character outside the GSM-7 alphabet, the entire message switches to Unicode, not just that one character.

The real limits, and why they change once a message splits

A single SMS segment holds 140 bytes. In GSM-7 that's 160 characters; in Unicode, 70. Those are the limits everyone knows. What's less well known is what happens once a message needs a second segment: every part, including the first, now has to carry a 6-byte header so the recipient's phone knows how to reassemble the parts in order. That leaves 134 bytes of actual message per part, not 140.

Encoding1 segment2+ segments (per part)
GSM-7 (English)160 characters153 characters
Unicode (Devanagari, emoji, etc.)70 characters67 characters

That's the whole rule. A 200-character English message doesn't split into “160 + 40”, it splits into two parts of 153 and 47, because the first part also has to carry the header once there's a second part coming.

The character that quietly doubles your bill

The most common way a message accidentally becomes Unicode isn't typing Nepali; it's pasting English text from Word, Google Docs, or a website. Those tools routinely swap a plain hyphen (-) for an en dash (), or straight quotes for curly ones. Visually the difference is almost invisible. Technically, it forces the entire message out of the 160/153-character GSM-7 world and into the 70/67-character Unicode one, a message that looked like it would fit in one segment can silently become three.

Real example

A 160-character English marketing message with a single pasted-in en dash needs 3 Unicode segments, not 1; the exact same text with a plain hyphen instead fits in a single GSM-7 segment. Nothing else about the message changes.

How to avoid it

  • Type directly into the compose box, or paste into a plain-text editor first, before pasting into your SMS tool.
  • Watch for smart quotes, em/en dashes, and ellipses (…), the usual culprits from word processors.
  • Extended GSM characters like { } [ ] ~ ^ | \ stay in GSM-7 but cost two units each; they won't force Unicode, but they do eat into your segment faster than a plain letter.
  • Check the real encoding and segment count before sending, not after.

You can check exactly how a message will be billed: character count, detected encoding, segment count, and characters remaining before the next segment, with our free SMS length calculator. It uses the identical detection logic Bullet SMS bills by, so what you see there is exactly what you'll be charged. For how that segment count actually turns into a rupee figure, see how bulk SMS pricing in Nepal really works.

Ready to send your first campaign?

Create an account, verify your number, and you can be sending within minutes.