The email you don't want: "We're disputing the $600 texting charge on last month's invoice. We never agreed to that volume, and we can't verify what we're being billed for."
Now you're on the clock. Stripe or the client's card issuer gives you a window — usually 7 to 10 days — to submit evidence. If you can't produce a record that ties that $600 to actual, dated, opted-in sends, you eat the loss and the chargeback fee. Do it twice and your processor starts flagging your account.
Full disclosure: I work for Ready, an SMS platform built with agencies in mind. So I have a horse in this race. But the reconciliation problem I'm describing is provider-agnostic — it bites agencies on Twilio, on GoHighLevel's native billing, on every reseller model — and the fix is the same everywhere: log at the segment level, itemize the pass-through, and be able to export it on demand.
Why "we sent a bunch of texts" doesn't survive a dispute
A client's dispute almost never says "you overcharged me by 3 cents a message." It says "we don't recognize this." And the reason they don't recognize it is that messages and segments are two different units, and most agencies bill in one and report in the other.
A message is what your client typed. A segment is what carriers actually meter. A plain 160-character SMS is one segment. Add one emoji and the whole message drops to a 70-character unicode limit — so a 175-character promo with an emoji becomes three segments. Your client thinks they sent 5,000 "messages." The carrier billed 15,000 segments. The invoice reflects the carrier number. To your client, the invoice looks inflated 3x.
That gap is the entire dispute. I've written about the mechanics of it before — the 22,000-messages-billed-as-38,000-segments reconciliation is the same failure showing up at renewal instead of in a chargeback. Same root cause: you can't show the segment math.
What the chargeback packet actually needs
When you respond to a dispute, the processor doesn't want your assurance. It wants documents that let a stranger reconstruct the charge. For SMS, that's four things:
- The signed agreement or scope that establishes the per-message (or per-segment) rate and states that texting is usage-based.
- A segment-level send log — dated, timestamped, per-campaign, with recipient counts and segment counts.
- The carrier pass-through breakdown, itemized separately from your markup, so the numbers reconcile against the underlying provider bill.
- Consent records — proof the recipients were opted in, which quietly answers the unspoken "were these even legitimate sends?" question.
If you have all four, most disputes close in your favor before they reach the issuer. If you're missing #2 and #3, you're arguing from memory.
The line item that makes the invoice legible
Here's where invoice structure wins or loses the fight before it starts. Compare two ways of billing the same month:
| Presentation | What the client sees | What happens in a dispute |
|---|---|---|
| Rounded blended rate | "SMS — $600.00" | No reconstruction possible. Client challenges the whole number. |
| Segment + pass-through, itemized | "24,490 segments × $0.02 = $489.80 / carrier pass-through 24,490 × $0.0045 = $110.20" | Every dollar traces to a countable unit. Dispute collapses. |
That second row is exactly how Ready bills: the per-segment rate ($0.02 on Standard, dropping to $0.016 automatically past 50,000 segments in a calendar month) and the $0.0045/segment carrier pass-through are itemized separately, never baked into a rounded number. Whatever you rebill on top, you can hand the client a bill where 24,490 × two numbers = the total, and there's nothing left to argue about.
The failure mode most agencies fall into is rounding to a clean $0.03 or $0.04 and hoping nobody asks. When someone does ask, you can't decompose the number — and a number you can't decompose is a number you lose. I dug into the specific way the pass-through erodes margin when it's hidden in the carrier pass-through post; the same opacity that costs you margin also costs you disputes.
Worked example: the $600 invoice, reconstructed
Say the disputed month looks like this:
- Two campaigns: a 150-char reminder (1 segment each) to 8,000 contacts = 8,000 segments.
- A 175-char promo with an emoji (3 unicode segments each) to 5,000 contacts = 15,000 segments.
- Inbound replies handled: not billed as outbound, but logged.
Total outbound: 23,000 segments.
Your cost on Ready Standard: 23,000 × ($0.02 + $0.0045) = $563.50. You rebilled at $0.026/segment blended, landing near the $600 the client is disputing.
Now the chargeback response practically writes itself:
- Campaign A: 8,000 contacts, 1 segment each, sent [dates], 8,000 segments.
- Campaign B: 5,000 contacts, 3 segments each (unicode — emoji in creative the client approved), sent [dates], 15,000 segments.
- 23,000 segments × agreed $0.026 = $598.
- Underlying carrier pass-through of $103.50 itemized on the export.
The moment the client sees that Campaign B's segment count tripled because of an emoji in copy they signed off on, the dispute is dead. Not because you argued harder — because the unit of billing is now visible and countable.
Where the records need to live
Exports only help if they exist before you need them. A few practices that turn "I think we sent that" into "here's the log":
- Keep send records at the segment level, per campaign, with timestamps. Ready logs this and you can export it; whatever tool you use, confirm you can pull dated segment counts, not just message counts.
- Keep inbound in the same system. Ready's unified inbox — and, for connected accounts, the two-way sync into GoHighLevel — means the reply thread that proves "yes, this contact was actively engaged" lives next to the send record. In a dispute over a specific number, a screenshotted conversation is disproportionately persuasive.
- Keep consent/attestation on file. Ready records opt-in attestation for bulk and API sends. That audit trail does double duty: it defends the invoice and it defends you if the dispute is really a smokescreen for a compliance complaint. (Who's liable when a client's list is bad is its own mess — I covered the liability split here.)
- Snapshot the underlying provider bill monthly. Your rebill reconciles against it. If your processor asks you to prove the pass-through is real and not a markup dressed as a fee, the itemized carrier line does that.
Don't let the tier discount become the next dispute
One subtle trap: if you cross 50,000 segments in a month, Ready's per-segment rate drops from $0.02 to $0.016 automatically. Your cost falls. If you're rebilling at a fixed rate and silently keeping the difference, that's fine as margin — until a sharp client audits the line item and asks why the carrier tier changed but their rate didn't.
That's not a chargeback risk exactly, but it's the same disease: a number the client can't reconstruct is a number they'll eventually challenge. The tier-crossover margin math is worth deciding on deliberately rather than getting caught by it.
The practical takeaway
A disputed SMS invoice is won or lost in how you stored the data, not in how you argue. Bill in segments, not messages. Itemize the carrier pass-through instead of rounding it into a blended rate. Keep dated, per-campaign segment logs and the consent trail exportable. Do that and the chargeback packet assembles itself — every dollar traces to a countable unit the client already agreed to.
If your current setup can't produce a segment-level export with the pass-through broken out, that's the gap to close before the next dispute, not during it. Ready itemizes both by default and starts with 2,500 free credits, no card required, if you want to see what a legible bill looks like — take a look at the product or sign up and export a test send to check the trail yourself.