Troubleshooting
SMS QR code body not prefilled on iPhone
The sms: URI split its body syntax across platforms: older iOS wanted an ampersand where Android used a question mark, and some iOS versions dropped the body entirely. The SMSTO:number:message form avoids the whole split and is recognised by current iPhone and Android cameras, which is why UseQR emits it.
The classic platform split
Prefilled-SMS codes are the textbook example of a payload that "works on my phone" and fails on the client's. The reason is historical: there have been two competing syntaxes, and iOS and Android disagreed about one of them for years.
The URI form. RFC 5724 standardised the sms: URI, and the de-facto extension adds
the message as a query field:
sms:+15551234567?body=Your%20message
Android handles this. iOS is the problem child: early iOS versions required an
ampersand instead of the question mark (sms:+15551234567&body=…; invalid as a URI,
but it was what worked), and across the years various iOS versions opened Messages with
the number but silently dropped the body from ?body= links. The result was a
generation of QR codes that prefilled everything on Android and only the number on
iPhones.
The scanner form. Barcode scanners converged on a simpler convention that predates the URI politics:
SMSTO:+15551234567:Your message here
Number after the first colon, message after the second, message text literal (no percent-encoding). This is the form scanner vendors standardised on, and it is what current iPhone and Android camera apps recognise, number and body.
What to use today
| Payload | Android camera | iOS camera |
|---|---|---|
SMSTO:+15551234567:Hi |
Number + body | Number + body |
sms:+15551234567?body=Hi |
Number + body | Number reliable; body has varied by iOS version |
sms:+15551234567&body=Hi |
Broken | Legacy-iOS workaround only: do not use |
The answer is the first row. UseQR's SMS generator emits
SMSTO:number:message for exactly this reason. It is the one form with no known
platform split in current OS versions. The number is normalised on the way in: spaces,
dashes, dots and parentheses are stripped, and the result must be 7–15 digits with an
optional leading +. Always include the country code with +, a national-format number
prefills correctly at home and dials the wrong thing for any traveller who scans it.
Two details about the SMSTO body worth knowing: colons inside the message are fine (the
format splits on the first two colons only), and the message is plain literal text, so
what you type is what appears, no %20, no encoding, unlike a
mailto body.
If your code still fails
- Decode it with our scanner and check which form it actually contains.
Plenty of older generators still emit
sms:…&body=…, which is broken everywhere except ancient iPhones. - Check the split symptom. Body missing on iOS but present on Android almost always
means the
?body=URI form, regenerate asSMSTO. Failing on both platforms usually means the code, not the payload; run the not-scanning checklist. - Mind the length. SMS bodies belong under a couple of hundred characters: beyond that the code densifies fast and, past 160 GSM characters, the message splits into multiple SMS parts on sending.
- Consider the channel. If your audience is on WhatsApp, a WhatsApp QR code with a prefilled message avoids SMS quirks entirely and is often the better fit for business enquiries.
FAQ
Why does my SMS QR code open Messages without the text on iPhone?
The payload uses the sms: URI with a ?body= parameter, whose body handling has been inconsistent across iOS versions. Regenerate using the SMSTO:number:message form, which current iPhone and Android cameras both prefill completely.
What is the difference between sms: and SMSTO:?
sms: is the RFC 5724 URI scheme with the message in a percent-encoded body query field. SMSTO: is the barcode-scanner convention: number, colon, then the literal message text. SMSTO is the form that behaves consistently across today's platforms.
Does the message text in SMSTO need percent-encoding?
No. The message after the second colon is literal text: spaces, punctuation and even colons pass through as typed. Percent-encoding it would put literal %20 sequences into the composed message.
Can a QR code send an SMS automatically?
No. On every platform the code only opens the messaging app with number and text prefilled; the user must still tap send. That confirmation step is deliberate and cannot be bypassed by any payload.
Try it: free, no signup
Related
- QR code scans on Android but not iPhone, Usually a decoder difference, not a broken code: Android-only URI schemes, Micro QR, very dense codes or an old iPhone. Causes ranked, with fixes.
- Email QR code body loses its line breaks, mailto bodies need %0D%0A line breaks per RFC 6068, %20 spaces and %2B plus signs. The encoding traps, the density cost, and verified payload examples.
- QR code not scanning: the checklist, Work through these in order, because they are ranked by how often they are the actual cause: quiet zone, contrast, size for distance, glare, blur from…
- QR code not working: a 60-second diagnosis, Every failed QR code lands in one of three classes, never detected, decodes the wrong thing, or a broken destination. A 60-second flow finds yours.