You quoted the client "a penny a text." Your provider bill lands. The two numbers don't line up, and not in your favor. So you shrug, eat the difference, and tell yourself it's rounding.
It isn't rounding. It's usually three specific things — messages that split into more segments than you counted, unicode characters that quietly cut the segment size in half, and a carrier pass-through you forgot to add to the client side. Each one is small. Stacked across a dozen clients and a heavy send month, they turn a "30% margin" into something closer to break-even.
Full disclosure: I work for Ready, an SMS platform. We bill per outbound segment and itemize the carrier fee as its own line, which is exactly what makes this reconciliation possible in the first place — so I have a horse in this race. But the audit below works no matter whose invoice you're staring at.
The unit mismatch that starts it all
Here's the root problem: you rebill your client per message. Your provider bills you per segment. Those are not the same unit, and the gap between them is where your margin goes to die.
A message is one thing your client typed and hit send on. A segment is the carrier's billing unit — 160 characters of plain GSM-7 text, or 153 characters each once a message splits into multiple parts. Add a single emoji or a curly apostrophe and the whole message flips to unicode encoding, where a segment is only 70 characters (67 per part when it splits).
So one "message" your client counts as 1 can be 2, 3, or 4 segments on your invoice. If you rebill per message and pay per segment, you're short every time a message runs long.
Where the segments actually inflate
Three culprits account for almost all of it.
1. The 161-character overrun. A message that reads clean at 158 characters is one segment. Add "Reply STOP to opt out" — which compliance basically requires — and you're at 179 characters. That's two segments. Your client sent one message. You paid for two. We wrote a whole piece on the 158-character trap because it's that common.
2. Unicode inflation. The killer nobody catches. A 90-character promo is one GSM-7 segment. Drop a 🎉 in it and the encoding switches to unicode, the limit drops to 70, and that same 90-character message is now two segments. One emoji doubled the cost. A curly quote pasted from a Google Doc does the same thing silently — no emoji visible, just a “ instead of a ".
3. The carrier pass-through. Every segment carries a flat carrier fee on top of the messaging rate — on Ready that's $0.0045/segment, billed as its own line item. If your rebill number doesn't include it, you're absorbing it. We broke down exactly how that halves an assumed margin — it's the one people are most surprised by.
Run the audit: a worked example
Say you have a client on Ready's Standard tier ($0.02/segment + $0.0045 carrier = $0.0245 all-in per segment). You rebill them at $0.03 per message. Sounds like a fat $0.005 spread per text.
They send a 5,000-contact blast. The message reads:
Hey {name}! 🎉 Flash sale — 25% off everything through Sunday. Shop now: [link]. Reply STOP to opt out.
That's ~115 characters with a merge field, an emoji, and the opt-out line. The emoji forces unicode. At 67 characters per unicode multipart segment, 115 characters is 2 segments per recipient.
| Line | Per recipient | × 5,000 |
|---|---|---|
| Segments sent | 2 | 10,000 |
| Your cost @ $0.0245/seg | $0.049 | $490.00 |
| Your rebill @ $0.03/message | $0.03 | $150.00 |
| Margin | — | −$340.00 |
You rebilled by message and lost $340 on a single blast. The client thinks they sent 5,000 texts. Your invoice says 10,000 segments. Nobody's lying — you're just counting in different units.
Now rebill by segment at $0.035 instead:
| Line | × 10,000 segments |
|---|---|
| Your cost @ $0.0245 | $245.00 |
| Rebill @ $0.035/seg | $350.00 |
| Margin | $105.00 |
Same send. Same client. The only change is the unit you bill in and remembering the carrier line. That's the entire fix.
The reconciliation, step by step
Do this monthly, per client, before you invoice — not at renewal when the number's too big to explain away.
- Pull provider segment count per client/location. With Ready's GHL integration, sends are mapped per sub-account, so the segment total is already broken out by client rather than dumped into one agency-wide number.
- Pull your client-side message count — what you'll rebill from.
- Divide segments by messages. If the ratio is above ~1.2, something's inflating: long templates, emoji, or opt-out lines pushing over 160.
- Isolate the carrier line. On a transparent invoice the $0.0045/segment pass-through is its own row. Multiply it by total segments — that's the exact amount you must recover on the client side or absorb.
- Compute realized margin = (rebill total) − (segment cost + carrier total). Not your assumed margin. The realized one.
- Flag the offenders. Which templates are running 2+ segments? Which clients use emoji-heavy copy? Fix the copy or reprice the client.
If your provider bakes the carrier fee into one rounded per-message rate, step 4 is impossible — you literally can't see what you're paying. That opacity is the point of line-item pass-through billing: you can only reconcile what you can see.
The tier discount you're probably not passing through — or keeping
One more line most agencies miss. On Ready, once an account crosses 50,000 segments in a calendar month, the rate drops from $0.02 to $0.016 per segment automatically — a 20% cut on the messaging portion. Nobody picks a plan; it just applies.
If you rebill at a fixed per-segment number, that 20% drop is pure margin you keep — if you noticed it happened. Most agencies never re-check their cost basis after the crossover, so they either keep quoting off the old number (fine, more margin) or, worse, discount the client because "we're at volume now" without confirming the tier actually applied. The tier-crossover math is worth a look if you're sending anywhere near 50K a month.
Fixing the copy is cheaper than repricing
Before you raise a client's rate, audit their templates. A lot of segment inflation is self-inflicted and free to fix:
- Trim to 160. Cut the message so it lands under 160 GSM-7 characters. Eight words often saves a whole segment across every send.
- Drop the emoji from bulk sends. One 🎉 doubles a short message's cost. Save unicode for messages where it earns its keep.
- Watch for smart quotes. Curly quotes and em-dashes pasted from a doc silently trigger unicode. Retype them as straight characters.
- Shorten links. A long tracking URL can be the thing pushing you from one segment to two.
On the 5,000-contact example above, cutting the emoji and trimming under 160 turns 2 segments into 1 — halving that blast's cost with zero pricing conversation. That's the cheapest margin you'll ever recover.
The practical takeaway
Your bill and your rebill don't match because you're counting messages and paying for segments, and because the carrier pass-through hides inside a rounded rate. The fix is boring and reliable: rebill in the same unit you're billed in (segments), add the carrier fee explicitly to the client side, audit templates for the emoji-and-overrun inflators, and check whether the volume tier has quietly dropped your cost.
Run the six-step reconciliation once a month, per client, and the "missing margin" stops being a mystery — it becomes a line you can point at and either recover or repice around.
If you want to see the per-segment-and-carrier split laid out for yourself, that's how Ready bills by default — messaging rate on one line, carrier pass-through on another, mapped per client. You can start with 2,500 free credits and no card at app.tryready.com/signup and reconcile a real send before you commit to anything.