What QR Codes and Short Links Do
A WhatsApp QR code or short link routes someone directly into a chat with your business — no need for them to type your phone number. Each code generates both a scannable QR image and a short URL of the form https://wa.me/message/<CODE>.
The code can be programmed with a prefilled message (up to 140 chars). When the user scans or taps, the chat opens with that text already populated in the input field — they tap send to start the conversation.
You manage QR codes via the WhatsApp Business Management API or the Business Manager UI.
Limitations
- 2,000 QR codes / short links per business phone number maximum.
- 140 character prefilled message limit.
- No analytics — Meta deliberately does not log scan counts or related data, for user privacy.
- Codes do not expire automatically — you delete them when done.
Create a QR Code
POST /<PHONE_NUMBER_ID>/message_qrdls
{
"prefilled_message": "Cyber Monday",
"generate_qr_image": "SVG"
}
| Field | Notes |
|---|---|
prefilled_message | Text that appears prefilled in the user's input when they open the chat. Max 140 chars. |
generate_qr_image | SVG or PNG. SVG is recommended for print materials (scalable). |
Response:
{
"code": "4O4YGZEG3RIVE1",
"prefilled_message": "Cyber Monday",
"deep_link_url": "https://wa.me/message/4O4YGZEG3RIVE1",
"qr_image_url": "https://scontent-iad3-2.xx.fbcdn.net/..."
}
code is the persistent identifier. deep_link_url is the human-shareable short link. qr_image_url is the scannable image asset hosted by Meta.
List QR Codes
GET /<PHONE_NUMBER_ID>/message_qrdls
Returns all QR codes on the phone number:
{
"data": [
{
"code": "4O4YGZEG3RIVE1",
"prefilled_message": "Cyber Monday",
"deep_link_url": "https://wa.me/message/4O4YGZEG3RIVE1"
},
{
"code": "WOMVT6TJ2BP7A1",
"prefilled_message": "Tell me more about your production workshop",
"deep_link_url": "https://wa.me/message/WOMVT6TJ2BP7A1"
}
]
}
The qr_image_url is not included in the list response — fetch the single QR code to get the image, or generate it again at create time.
Get a Single QR Code
GET /<PHONE_NUMBER_ID>/message_qrdls/<CODE>
{
"data": [
{
"code": "4O4YGZEG3RIVE1",
"prefilled_message": "Cyber Monday",
"deep_link_url": "https://wa.me/message/4O4YGZEG3RIVE1"
}
]
}
Update a QR Code
POST /<PHONE_NUMBER_ID>/message_qrdls
{
"code": "4O4YGZEG3RIVE1",
"prefilled_message": "Cyber Tuesday"
}
Updates the prefilled message in place — the code stays the same, so any existing scans / short links continue to work but with the new message text.
Response includes the updated message:
{
"code": "4O4YGZEG3RIVE1",
"prefilled_message": "Cyber Tuesday",
"deep_link_url": "https://wa.me/message/4O4YGZEG3RIVE1"
}
Delete a QR Code
DELETE /<PHONE_NUMBER_ID>/message_qrdls/<CODE>
{ "success": true }
After deletion, anyone scanning or clicking the code/link sees an "expired" error message.
User Experience
| User scenario | What they see |
|---|---|
| Scans an active QR code | Chat opens with the prefilled message in the input field |
| Clicks an active short link on mobile | Same — chat opens with prefilled message |
| Clicks short link on desktop browser | Desktop client launches; if not installed, user is prompted to install it |
| Scans / taps a deleted code | "This QR code [short link] has expired" error message |
| Scans / taps a code for a business they previously blocked | Prompted to unblock the business to continue |
Best Practices
- Use SVG for print materials so the code scales without quality loss.
- Don't customize the QR's appearance (colors, embedded logos) — preserves scan reliability. If you must, do it post-export with QR-aware tools that respect error correction zones.
- Use one code per language / locale. You're responsible for routing users to the right code based on geography.
- Track campaign attribution out of band. Since Meta provides no analytics, embed campaign markers in the prefilled message itself (e.g. "Cyber Monday code: CYB42") if you need to know which scan triggered which conversation.
vs Plain wa.me Links
A plain wa.me/<NUMBER>?text=Hello link works without the API — just click-through to a chat with prefilled text. The API-managed QR codes / short links add:
wa.me/<NUMBER>?text=... | API-managed (wa.me/message/<CODE>) | |
|---|---|---|
| Editable after creation | No (URL is the message) | Yes (POST to update) |
| Deletable | No | Yes |
| Phone number masked in URL | No | Yes |
| QR image generation | DIY | Meta-hosted |
| Per-tenant tracking | Use a different text per tenant | Use a different code per tenant |
| Limit | Unlimited | 2,000 per phone number |
For one-off campaigns, plain wa.me is fine. For tenant-specific or campaign-managed codes that need editing, use the API.