What "Good" Delivery Rate Actually Looks Like
We've processed hundreds of millions of SMS messages and seen delivery rates ranging from 62% to 99.4% from different customers sending to similar destinations. That's a massive gap.
The difference between 85% and 97% delivery on 100,000 monthly messages is 12,000 messages actually reaching people every month. At £0.0300/message, you're paying for those undelivered messages either way.
Here's the thing: most delivery rate problems are fixable. Not all of them — some numbers are simply unreachable — but the majority of delivery failures come from correctable issues in list quality, content, routing, or configuration.
These are the 15 techniques that consistently move the needle.
1. Run HLR Lookup Before Every Bulk Campaign
HLR (Home Location Register) lookup queries the mobile network in real time to check whether a number is active and which network it's on. Numbers that return as "absent subscriber" or "unknown subscriber" will fail delivery.
Running HLR on your list before sending removes dead numbers before you spend money on them. On a typical B2C list that's 6 months old, we see 3–8% of numbers flagged as inactive. Removing them before sending improves your apparent delivery rate and saves cost.
Cost: most providers charge £0.001–0.003 per HLR lookup, making it cost-effective for any list larger than a few thousand numbers.
2. Clean Your List of Invalid Number Formats
You'd be surprised how many lists have formatting issues: numbers with spaces, wrong country codes, wrong number lengths, leading zeros where there should be a country prefix.
Before sending, normalise all numbers to E.164 format: +447912345678 for UK, +12125551234 for US. Most SMS platforms will auto-normalise, but it's worth validating your data before upload.
A simple regex check catches most issues: a valid mobile number should be 10–15 digits after the + sign.
3. Segment Out Long-Inactive Numbers
If a number has returned UNDELIV for the last 3+ sends over 90+ days, it's probably not coming back. Remove it.
Yes, some will eventually become active again (someone who ported and is now back on coverage, etc.), but the realistic recovery rate is low enough that keeping these numbers drags down your delivery rate metrics and wastes send budget.
Practical threshold: remove numbers with 3 consecutive UNDELIV errors and no successful delivery in 120+ days.
4. Use a Registered Sender ID
An alphanumeric sender ID like "ACMESHOP" instead of a random mobile number:
- •Increases trust — recipients know who's messaging them
- •Reduces spam filtering — registered IDs are whitelisted on UK networks
- •Improves delivery rates by 1–3% on direct routes
- •Required for certain industry verticals (financial services, healthcare)
BulkSMSRates facilitates sender ID registration with UK networks. The SMPP gateway and HTTP API both support custom sender IDs.
Note: alphanumeric sender IDs don't accept replies. If two-way messaging matters, use a virtual number instead.
5. Keep Message Content Clean
Carrier filtering is real and accounts for a meaningful percentage of delivery failures that look like UNDELIV but are actually REJECTD at a network level.
Common content triggers:
- •"FREE", "FREE GIFT", "FREE TRIAL" (especially in caps)
- •"WINNER", "PRIZE", "YOU HAVE WON"
- •"CLICK HERE NOW", "LIMITED TIME OFFER" (generic, spammy phrasing)
- •URLs from domains flagged by carrier spam databases
- •No opt-out instruction (missing STOP keyword)
What doesn't trigger filtering: specific offers with numbers ("30% off"), brand names, actual product names, and normal conversational language.
6. Use Tier-1 Routes, Not Grey Routes
This one is about your provider, not your own setup. "Grey routes" are unofficial, non-commercial paths through carrier networks — typically used by cheap providers to lower costs. They have:
- •No service level agreements with destination networks
- •Fake or delayed DLRs (you think the message delivered but it didn't)
- •Variable delivery rates (can be fine for weeks, then drop to 60% overnight)
- •Risk of sudden disconnection
Ask your provider directly: "Do you use grey routes?" If they don't know what grey routes are, that's your answer.
BulkSMSRates uses only direct and tier-1 routes with genuine DLR from destination networks. Check our rates page — we're transparent about which routes we use per country.
7. Set Appropriate Message Validity Periods
When a handset is off or out of coverage, messages queue at the SMSC waiting for the device to reconnect. The validity period determines how long the SMSC waits before giving up.
Default: 48–72 hours on most platforms. This is fine for general marketing.
For time-sensitive messages (OTPs, flash sale ends in 2 hours), set a short validity — 30 minutes or 1 hour. A sale code delivered 6 hours after a sale ended is worse than no delivery at all: it creates confusion and support tickets.
Set validity via the validity_period parameter in the API or SMPP submit_sm TTL field.
8. Avoid Peak Carrier Network Load Times
There are specific windows where carrier networks handle high volumes and prioritise traffic differently:
- •9am–9:30am on weekdays (everyone waking up and checking phones)
- •12pm–12:30pm (lunchtime notification bursts)
- •Major national events (sports finals, elections, bank holidays)
Sending a large campaign during these windows doesn't guarantee failure, but you may see slightly elevated ENROUTE times and a small uptick in timeouts. If your campaign isn't time-critical, spread sends across a 2–3 hour window rather than blasting all at once.
9. Handle DLR Feedback Loops Properly
You should be reading your DLR (Delivery Report) data and acting on it, not just tracking an aggregate delivery percentage.
Set up your system to:
- •Flag numbers with UNDELIV: add to a "pending review" list
- •Remove numbers with 3+ consecutive UNDELIV: add to suppression
- •Track ENROUTE (in transit) separately from DELIVRD (confirmed delivered)
- •Watch for sudden spikes in REJECTD — this often indicates a content filter change
This feedback loop is how you keep list quality high over time. Ignore it and quality degrades.
10. Validate Numbers Against Country Rules
Different countries have different mobile number formats and ranges. Indian mobile numbers start with 6, 7, 8, or 9 and are 10 digits. UK mobile numbers start with 07 or +447 and are 11 digits. US numbers are 10 digits after country code.
Sending to numbers that don't match the country's valid mobile number range will fail immediately. Validate number format against the destination country before sending — this is separate from HLR lookup and catches formatting errors without a network query.
11. Monitor Opt-Out Rates Per Campaign
Opt-out rates above 0.5% on a campaign are a signal. High opt-outs mean either:
- •The message wasn't relevant to the segment that received it
- •You're sending too frequently
- •The offer was poor
- •The timing was wrong (late night sends, for example)
Campaigns with high opt-outs also affect future delivery: repeated opt-outs from the same sender ID can flag that ID for increased carrier scrutiny.
12. Avoid URL Shorteners on Shared Domains
Generic URL shorteners (bit.ly, tinyurl.com shared pools) can be blacklisted by carriers because other senders on the same domain have abused them. When your link gets caught in that blacklist, your message is rejected.
Options:
- •Use direct URLs where length allows
- •Use a branded short domain (yourcompany.to/code or similar)
- •Use a dedicated short URL service separate from the shared pools
Some SMS platforms include dedicated short URL tracking — check your provider.
13. Test With Multiple Handsets Before Large Sends
Before a major campaign, send to 5–10 test numbers across different UK networks (EE, O2, Vodafone, Three) and device types. This catches:
- •Encoding issues (special characters showing as ?)
- •Content filter rejections on specific networks
- •Sender ID display differences
- •Message segmentation issues
14. Check Encoding — GSM-7 vs Unicode
A standard 160-character SMS uses GSM-7 encoding. The moment you include a character outside the GSM-7 character set (emoji, accented characters not in GSM-7, some symbols), the message switches to Unicode (UCS-2) encoding, which halves the character limit to 70 per segment.
A 160-character message with one emoji becomes a 2-segment message. That doubles the cost and sometimes triggers different carrier handling.
Stick to GSM-7 characters for marketing messages. If you use personalisation that might include special characters (customer names with accents), either normalise the text or explicitly set Unicode encoding and adjust your character counts.
15. Work With a Provider Who Gives You Real Data
This is less a technical tip than an operational one. Some providers give you clean, real DLR data. Others give you "delivered" reports for messages that were never confirmed delivered by the destination network.
Ask your provider:
- •"Are your DLRs genuine delivery confirmations from destination networks or are they intermediate SMSC confirmations?"
- •"Do you provide per-network delivery rate breakdowns?"
- •"What's your SLA for DLR delivery?"
With genuine DLRs, you can identify exactly which numbers are failing, why, and at which network. With fake DLRs, you think you're at 97% delivery but you might be at 80%.
Putting It Together
The difference between an 88% and a 97% delivery rate comes down to these fundamentals:
- •Clean list (HLR lookup + format validation)
- •Quality routing (tier-1, not grey routes)
- •Clean content (no spam triggers, opt-out included)
- •Registered sender ID
- •Proper DLR handling and list maintenance
Most teams implement 4–5 of these at launch and ignore the rest. Implementing all 15 consistently is what gets you into the 97–99% range and keeps you there.