Here's the problem with an in-app upgrade banner: it only works on people who are already in the app. And the users most likely to blow through a usage limit and most likely to upgrade to fix it — the ones who leaned on your product hard for two weeks and then got busy — are frequently the ones who aren't logging in on the day the ceiling hits.
Full disclosure: I work for Ready, an SMS platform. So I have a horse in the "send more texts" race. But I'll be honest about where SMS is the wrong call here, because it often is, and the consent line you have to walk is narrower than most growth teams assume.
The idle-user gap
Think about who actually hits a plan limit. In most usage-metered SaaS — API calls, seats, storage, contacts, minutes — consumption isn't spread evenly across your base. A slice of accounts drives most of the volume, and their usage tends to spike in bursts. Someone imports a big list, runs a campaign, ships a feature, then steps away for a week while the numbers keep climbing on autopilot (scheduled jobs, background sync, teammates who kept working).
By the time they cross 90%, the person with billing authority may not have opened your dashboard in days. Your beautifully-designed "You're almost out of credits — upgrade now" banner is sitting on a page nobody's looking at. When they finally hit the wall, the experience isn't "let me upgrade," it's "why did this break," followed by a support ticket and, sometimes, a look at your competitor.
A text closes that gap. Not because SMS is magic — because it's the one channel that reaches a phone the user is holding regardless of whether they're logged in. Roughly speaking, opted-in SMS gets read within minutes; a lifecycle email might sit unopened for hours or forever. When the message is time-sensitive and account-specific, that delivery speed is the whole point.
This is account-utility, not marketing — mostly
The reason a usage-limit text is worth sending at all is the same reason you have to be careful with it: it lives close to the transactional/marketing line, and which side it lands on determines what consent you need.
A pure account-utility text — "Your workspace is at 92% of its monthly API quota. Jobs will start failing at 100%." — is informing an existing customer about the state of an account they pay for. That's the same category as a failed-payment alert or a security notice. It's not promoting anything; it's telling someone their service is about to degrade.
The moment you bolt on "Upgrade to Pro now and get 40% off," you've crossed into marketing, and marketing SMS needs express written consent for marketing specifically — not just "we have their number because they're a customer."
The honest version most teams land on:
- Utility notice, plain: "You've used 90% of your March plan. At 100%, sends pause until your cycle resets on the 1st." Reaches everyone with valid consent-to-be-contacted about their account.
- Utility notice with a neutral action: add "Manage your plan: [link]." Linking to a self-serve billing page where they choose to upgrade is a much softer line than pushing an offer. Still informational — you're telling them where the fix lives.
- Overt promo: "Upgrade now, 3 months free." This needs marketing consent, full stop.
If you only captured "we may text you about your account" at signup, stay in the first two buckets. This is the same wall clinics run into with recall-vs-marketing texts and ecommerce runs into with transactional order texts that can't carry a promo — the underlying rule is identical across industries.
Get the consent basis right at signup
The cheapest fix is to collect the right consent before you ever need it. When a user adds a phone number for 2FA or account alerts, that's the moment to also present a clean, separate marketing opt-in checkbox — unchecked, its own line, not bundled into your terms.
Two things worth separating in your own head:
- Consent to contact about the account (utility). Ties to the customer relationship.
- Consent to send marketing/promotional SMS. Explicit, express, logged.
Keep those numbers on separate registrations too, ideally. Sending your 2FA codes and your promo blasts from the same number is a filtering risk — the carriers treat those traffic types differently, and mixing them degrades both. We cover that split in MFA vs marketing number separation.
Ready records opt-in attestation for bulk and API sends, so you keep an audit trail of who consented to what and when. That trail is what you point to if a complaint ever surfaces. It doesn't make you lawsuit-proof — nothing does, and compliance is ultimately the sender's responsibility — but "here's the timestamped consent record" is a very different conversation than "we think they wanted it."
Timing: send before the wall, not after
The value of a usage-limit text collapses if it arrives at 100%. At that point the service is already degraded and you're doing damage control, not conversion. The window that converts is before the pain, when the user can act preemptively.
A cadence that works for most metered products:
| Threshold | Message type | Goal |
|---|---|---|
| 80% | Optional soft heads-up (skip if noisy) | Awareness |
| 90% | Utility notice + self-serve plan link | Preemptive upgrade |
| 100% | Utility notice: what paused, when it resets | Reduce support load, recover |
| Cycle reset | (No text needed) | — |
Two rules I'd hold to:
- Don't fire on every threshold for every account. A team that hits 90% every single month and never upgrades doesn't need a text at 90% — they need a plain reset reminder or nothing. Reserve the nudge for accounts trending toward a limit they don't normally hit.
- Respect quiet hours. A "your account is about to break" text at 11pm local reads as panic and, depending on jurisdiction, is TCPA exposure. Ready enforces quiet hours based on the recipient's area automatically, so a send queued during off-hours holds until morning.
For the mechanics of pairing SMS with in-app so you're not spamming people who do log in, In-App Upgrade Prompts Miss the 70% of Free Users Who Never Log Back In walks through the reach-gap math in detail.
When to NOT send this text
SMS isn't the right channel for every account state, and sending anyway tanks conversion. Skip the text when:
- The account is fully dormant and unlikely to return. If they haven't touched the product in 60 days, a usage-limit text is confusing (they're not using it — what limit?). That's a winback problem, not an upgrade problem, and it has its own cost ceiling.
- The limit hit is a background artifact, not user behavior. If a runaway job or a bug drove usage, texting "you're at 90%" makes you look broken.
- You only have utility consent and your message is really a promo. Rewrite it as utility or don't send it.
When NOT to Send a SaaS Upgrade Text breaks down the three account states where email beats SMS outright. Worth reading before you wire anything up.
The cost side, quickly
This is cheap enough that the math almost never argues against it — when the send is targeted.
Say 2,000 accounts trend toward a limit in a given month, and you send each one message at 90%. A tight utility notice like "You've used 90% of your March plan. Manage your plan: rdy.co/x" fits inside a single 160-character GSM-7 segment. On Ready's Standard tier that's:
2,000 × 1 segment × ($0.02 + $0.0045 carrier) = $49.00
Forty-nine dollars to reach 2,000 upgrade-eligible accounts on a channel they'll actually read. If even a handful convert to a higher plan, the ROI isn't close. Add a unicode character or an emoji, though, and your 160-char budget drops to 70 — the same message could split into two segments and double the cost, so keep utility texts plain-text and tight. (Full tiers on the ReadySMS page; the Growth rate of $0.016/segment kicks in automatically past 50,000 segments in a month.)
The practical takeaway
The in-app banner isn't wrong — it's just partial. It reaches the users already paying attention and misses the ones whose usage climbed while they weren't looking, who are often your best upgrade candidates. A single, plain, well-timed utility text at ~90% closes that gap for pennies.
Get three things right and the rest follows: capture marketing consent separately from account-contact consent at signup, keep the 90% message on the utility side of the line unless you've earned the marketing opt-in, and send before the wall, not after. Respect quiet hours, don't fire on chronic-limit accounts, and skip it entirely for the truly dormant.
If you want to test one send against your own trending-toward-limit segment, Ready gives you 2,500 free credits and self-serve 10DLC — start here and wire it to a single 90% trigger before you build the whole cadence.