Standard SMS capacity is up to 160 GSM-7 septets in one segment or 70 16-bit code units when the message uses the Unicode mode commonly labeled UCS-2. A longer message is split into concatenated parts, which commonly hold 153 GSM-7 septets or 67 Unicode code units each.
Those numbers are only the starting point. A caret consumes two GSM-7 septets, while one curly quote or emoji can switch the entire message to Unicode. Personalization, line breaks, and rewritten links can add more length after a marketer approves the copy.
This guide shows you how to identify the encoding, calculate the billable segments, and test the version that subscribers will actually receive. Use that process before you estimate campaign cost or enforce a template limit in code.
SMS Character Limit Quick Reference
Start with the encoding, not the number shown in a word processor.
| Encoding | Single SMS | Each Part of a Concatenated SMS | Counting Unit |
| GSM-7 | 160 | 153 | Septets |
| Unicode (commonly labeled UCS-2) | 70 | 67 | 16-bit code units |
The multi-part payload is smaller because a user data header tells the handset how to reassemble the parts. Most phones display the result as one message, but networks and providers usually process and charge for every segment.
These are the common limits for standard concatenation. A provider may use a different header or apply network-specific handling, so confirm the returned segment count before a large send.
Step 1: Detect Whether the Message Uses GSM-7 or Unicode
GSM-7 is a 7-bit alphabet designed for SMS. It covers English letters, digits, many common punctuation marks, and a small set of symbols. The ETSI version of 3GPP TS 23.038 defines the default alphabet and its extension table.
Count Septets, Not Visible Characters
Most characters in the default GSM-7 table consume one septet. Characters in the extension table require an escape character, so each one consumes two septets:
^ { } \ [ ] ~ | €
That detail can move copy across a segment boundary. A message with 159 basic GSM-7 characters and one euro sign looks 160 characters long, but it consumes 161 septets. It therefore becomes two concatenated parts.
GSM-7 also includes a few characters that are easy to misjudge. The standard apostrophe and straight quotation mark are supported. A curly apostrophe, curly quotation mark, or long dash usually is not. Copy pasted from a document editor can change the encoding even when the sentence looks nearly identical.
Treat One Non-GSM Character as a Message-Wide Change
Platforms commonly label the encoding as Unicode or UCS-2 when the text contains a character outside their supported GSM-7 tables. This can happen with Chinese, Arabic, Cyrillic, many accented characters, typographic punctuation, or emoji. The entire message then uses the Unicode limit; only the unsupported character does not get encoded separately. Many implementations count UTF-16 code units, which is why characters outside the Basic Multilingual Plane can consume a surrogate pair.
The practical comparison looks like this:
| Copy Element | Likely Encoding Effect |
| Plain English letters and digits | Remains GSM-7 |
| €, ^, {, or } | Remains GSM-7 but uses two septets |
| Curly quote “ or em dash — | Commonly changes the message to Unicode |
| Arabic or Chinese text | Requires Unicode |
| Emoji | Requires Unicode and may use two code units |
Watch Emoji and Combined Characters
The 70 and 67 Unicode limits refer to 16-bit code units in the common SMS implementation, not necessarily what a person sees as characters. Many emoji use a surrogate pair, which consumes two code units. Some emoji sequences include a base symbol, skin-tone modifier, joiner, or variation selector and consume still more.
Do not build a production counter from string.length without checking what that language counts. Your counter should classify the message encoding and measure the units used by the SMS API or provider. This small test prevents a cheerful emoji from doubling the segment count of an otherwise short reminder.

Step 2: Calculate the Number of SMS Segments
A single SMS carries up to 140 bytes of user data. GSM-7 packing fits 160 septets into that space, while UCS-2 commonly fits 70 16-bit code units. A concatenated message also needs a user data header. The header identifies the message reference and the position of each part, leaving less room for copy.
The common payloads are 153 GSM-7 septets or 67 Unicode code units per part. The concatenation mechanism is defined by 3GPP TS 23.040, while the exact usable payload can vary with the header and provider implementation.
Use the Right Formula
Use the single-message threshold first. Apply the concatenated threshold only after the copy exceeds it.
GSM-7:
if septets <= 160, segments = 1
otherwise, segments = ceiling(septets / 153)
Unicode:
if code units <= 70, segments = 1
otherwise, segments = ceiling(code units / 67)
That change in denominator creates a small boundary trap. A 160-septet GSM-7 message is one segment, but a 161-septet message is two segments with a combined capacity of 306 septets. The same pattern applies at 70 and 71 Unicode code units.
Work Through Three Boundary Examples
The examples below show why a visible count alone is unreliable.
- Basic GSM-7 Example: A message containing 160 basic GSM-7 characters uses one segment. Adding one more basic character produces two segments because ceil(161 / 153) = 2.
- Extension-Table Example: A message with 159 basic characters plus € contains 160 visible characters but uses 161 septets. It becomes two parts.
- Unicode Example: A message containing 71 BMP Unicode characters uses two parts because ceil(71 / 67) = 2. An emoji may consume two code units, so the visible count may be lower.
Budget for Segments, Not API Requests
Messaging invoices commonly price each transmitted segment. One API request that produces three concatenated parts can therefore cost about three times the destination rate for one part. Your commercial model should use:
estimated message cost =
recipient count × segments per recipient × destination segment rate
Personalized fields can make the segment count vary by recipient. When you model SMS pricing at scale, calculate the worst-case rendered template for each language and destination group. The same copy may be one part for one audience and two parts for another.
Do not assume concatenation is invisible operationally because the handset displays one bubble. Each part travels through the network separately, so a missing part can leave a broken message and additional parts create more opportunities for delay or out-of-order delivery. Content and routing may also be subject to filtering, but segment count alone does not determine whether a message is filtered.

Step 3: Test the Final Message Before You Send
Approved template copy is rarely the exact payload. Names replace variables, short links gain tracking data, and translated versions use different alphabets. Test the final rendered message at the point where your application submits it.
Render Realistic Worst Cases
Create test records for the longest plausible first name, company name, appointment type, coupon code, and link. A template may stay within one segment for “Hi Mia” and cross the boundary for “Hi Christopher.” Do not truncate a customer name or legally required opt-out text to protect a segment budget.
Test each supported language as its own template. Transliteration may reduce length, but it can also damage meaning, pronunciation, or trust. Unicode is the right choice when the recipient needs the original script.
Inspect the Delivered Link
Count the URL that the SMS provider will transmit. A neat placeholder in a campaign editor may expand into a longer tracking URL. A branded short domain can reduce length and help recipients recognize the sender, but the redirect must be tested on mobile networks and should lead to the expected secure domain.
Links also introduce trust and compliance decisions. Identify the brand in the message, explain the action, and avoid unfamiliar domains. Saving one segment is not worth making a payment or appointment link look suspicious.
Add a Pre-Send Validation Gate
The production check should return the encoding, unit count, segment count, and final estimated cost. Use the following sequence:
- Normalize only the characters your content policy permits; do not silently replace meaningful language.
- Render every variable and any provider-generated link.
- Classify the result as GSM-7 or Unicode.
- Count GSM septets or Unicode code units.
- Calculate the segments with the provider’s actual rules.
- Log the result with the template version and destination.
- Block or require approval when the segment count exceeds the template budget.
Add boundary tests at 160/161 GSM septets and 70/71 Unicode code units. Include extension-table symbols, curly punctuation, emoji, line breaks, and long variables.
The provider response is the final check. Compare your predicted count with the API or dashboard output during staging. Investigate any mismatch before a high-volume send because it may indicate a different header, character mapping, or URL transformation.

Common SMS Character Count Mistakes
Most segment surprises come from a small set of production habits. Check these before shortening useful copy.
- Trusting the Visible Count: A standard editor counts what readers see, but SMS billing depends on GSM septets or Unicode code units.
- Pasting Styled Punctuation: Curly quotes and long dashes can switch a plain-English message to Unicode. Replace them only when the style change does not affect meaning.
- Ignoring Extension Characters: Braces, a backslash, a caret, a tilde, a vertical bar, square brackets, and the euro sign consume two GSM-7 septets.
- Testing the Template Only: Variables and rewritten links can push the final payload over a boundary. Render representative and worst-case records.
- Removing Necessary Context: An aggressively shortened link message can look fraudulent. Keep the brand, purpose, and expected action clear.
- Treating Every Language as English: A 160-character design limit does not fit scripts that require Unicode. Give localized templates their own copy and budget.
- Assuming One Bubble Means One Charge: The handset may reassemble several network parts into one display bubble. Billing and delivery still operate at the segment level.
Shortening the message is only one option. You can remove redundant words, choose supported punctuation, move nonessential detail to a trusted landing page, or accept a second segment when the added context improves comprehension. If the content genuinely needs media or more room, compare MMS vs SMS instead of forcing every message into a one-segment target. The best decision balances cost, clarity, accessibility, and the risk of a missing part.
FAQ
Do spaces and line breaks count toward the SMS character limit?
Yes. Spaces, carriage returns, and line feeds consume message capacity. The exact unit use depends on the encoding and how the provider normalizes line endings, so test the submitted payload rather than the formatted preview.
Can a multi-part SMS appear as one message?
Yes. A compatible handset normally uses the concatenation header to reassemble the parts into one conversation bubble. The carrier still transports separate segments, and the provider commonly charges for each one.
Is Unicode SMS bad for deliverability?
No. Unicode is necessary for many languages and symbols. The main tradeoff is capacity: one part commonly holds 70 code units instead of 160 GSM-7 septets. Clear language is usually more valuable than forcing transliteration.
Does an emoji count as one Unicode character?
Not always. Many emoji require two UTF-16 code units, while joined or modified emoji sequences may use several. Use an SMS-aware counter instead of a visual character count.
Count the Message That Will Actually Be Sent
The SMS character limit is a rule about encoded capacity, not visual length. Detect GSM-7 or Unicode, count the correct units, and calculate concatenated parts only after the single-part limit is exceeded. Then repeat the check after personalization, localization, and link processing.
That workflow gives marketing, product, and engineering teams the same number before a campaign starts. If you are planning international bulk SMS, SMSBoosting supports API-based sending and delivery reports across supported destinations. Confirm destination, sender, and program requirements before scaling.



