# 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.

Source: https://useqr.app/docs/troubleshooting/sms-qr-code-body-not-prefilled-on-ios · Last reviewed 2026-08-21 · UseQR is free forever, no signup.

---

## 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](/sms-qr-code) 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](/docs/troubleshooting/email-qr-code-body-line-breaks).

## If your code still fails

1. **Decode it** with our [scanner](/scan) and check which form it actually contains.
   Plenty of older generators still emit `sms:…&body=…`, which is broken everywhere
   except ancient iPhones.
2. **Check the split symptom.** Body missing on iOS but present on Android almost always
   means the `?body=` URI form, regenerate as `SMSTO`. Failing on both platforms usually
   means the code, not the payload; run the
   [not-scanning checklist](/docs/troubleshooting/qr-code-not-scanning-checklist).
3. **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.
4. **Consider the channel.** If your audience is on WhatsApp, a
   [WhatsApp QR code](/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

- https://useqr.app/sms
- https://useqr.app/whatsapp
- https://useqr.app/scan
