GSM-7 vs UCS-2
SMS has two encodings:
We detect the encoding automatically: the moment any character in your body falls outside the GSM-7 alphabet, the entire message switches to UCS-2 — you don’t get to send 160 Latin chars plus one emoji as one segment.
Examples
Preview the segment count before sending using
POST /v1/sms-templates/:id/render for templates, or compute it locally:
Why the count drops on concatenation
Multi-segment SMS uses a small header on each part to tell the phone how to reassemble the message. That header eats 7 chars in GSM-7 and 3 characters in UCS-2 — so a “160-char” segment really only has 153 of your characters to work with once it’s concatenated.Cost implications
A friendly emoji can 2x or 3x your cost if you weren’t expecting UCS-2:Best practices
Keep transactional under 160 GSM-7
Tight, no emoji, no fancy quotes. One segment per send.
Ascii-ify URLs
Don’t use URL shorteners with non-Latin chars — those force UCS-2.
Watch smart quotes
Word / Notes replace
" with " and ' with ' — both UCS-2.Preview campaign copy
Use the template render endpoint in CI to assert segment count ≤ 1.
Handy bytes worth avoiding
These tiny Unicode characters force the whole body to UCS-2:"(U+201C) and"(U+201D) — curly quotes'(U+2019) — typographic apostrophe…(U+2026) — ellipsis–(U+2013) and—(U+2014) — en/em dashes- Non-breaking space (U+00A0)
", ', ..., -, --, and plain space respectively.