Deep link and image returned: This operation calls POST /{phoneNumberId}/message_qrdls and returns a QR code identifier (code), a deep_link_url (the https://wa.me/... link equivalent), and optionally a qr_image_url pointing to a hosted PNG. Set generateQrImage to true to receive the image URL.
When to Use
- Marketing collateral generation: A campaign workflow creates a unique QR code per campaign with a campaign-specific prefilled message, then embeds the
qrImageUrl into the campaign's print and digital materials.
- Product packaging QR: A product launch workflow generates QR codes with prefilled support messages (e.g. "I need help with product [SKU]") to be printed on packaging for instant customer support access.
- Event registration: An event management workflow creates a unique QR code per event that, when scanned, opens WhatsApp with a prefilled RSVP message containing the event code.
- Retail point-of-sale display: Each store location gets a QR code with a prefilled message including the store ID so the support team can immediately identify which location a customer is contacting from.
- Automated onboarding handoff: After completing a web onboarding form, a workflow generates a QR code with a prefilled welcome message and embeds it in the confirmation email so the user can instantly open a WhatsApp conversation.
Configuration
Connection
| Field | Required | Description |
accessToken | Required | Permanent System User access token. Store in BizFirst Credentials Manager. |
phoneNumberId | Required | Numeric string ID of the phone number the QR code will link to. |
apiVersion | Optional | Meta Graph API version. Defaults to v18.0. |
Operation
| Field | Required | Description |
prefilledMessage | Required | Text that will be pre-populated in the user's WhatsApp message field when they scan the QR code. Max 512 characters. |
generateQrImage | Optional | Image format for the QR code image. Set to PNG or SVG to receive a qrImageUrl. Defaults to PNG if omitted. |
Sample Configuration
{
"resource": "qrcode",
"operation": "create",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"prefilledMessage": "Hi! I'd like to know more about your summer sale.",
"generateQrImage": "PNG"
}
Validation Errors
| Error | Cause |
accessToken is required | The accessToken field is empty. |
phoneNumberId is required | No Phone Number ID supplied. |
prefilledMessage is required | No prefilled message text was provided. |
prefilledMessage too long | The message text exceeds 512 characters. |
100 (Meta) | Invalid Phone Number ID or the number is not registered. |
200 (Meta) | Insufficient permissions to create QR codes for this number. |
Output
Success Port
| Field | Type | Description |
code | string | Unique identifier for this QR code. Use this code in qr-code/get, update, and delete. |
prefilledMessage | string | The prefilled message text stored against this QR code. |
deepLinkUrl | string | The https://wa.me/qr/{code} URL that opens WhatsApp when tapped on mobile. |
qrImageUrl | string | Hosted URL of the QR code PNG/SVG image. Present when generateQrImage was set. |
status | string | "created". |
rawResponse | string | Full raw JSON from the Meta Graph API. |
Error Port
| Field | Type | Description |
status | string | "failed" or "error". |
errorCode | string | Meta error code or "timeout". |
errorMessage | string | Human-readable error description. |
Sample Output
{
"code": "4RNL66ENMHZJ7A1",
"prefilledMessage": "Hi! I'd like to know more about your summer sale.",
"deepLinkUrl": "https://wa.me/qr/4RNL66ENMHZJ7A1",
"qrImageUrl": "https://scontent.whatsapp.net/v/qr/4RNL66ENMHZJ7A1.png",
"status": "created",
"rawResponse": "{\"code\":\"4RNL66ENMHZJ7A1\",\"prefilled_message\":\"Hi!...\",\"deep_link_url\":\"https://wa.me/qr/4RNL66ENMHZJ7A1\",\"qr_image_url\":\"https://scontent.whatsapp.net/v/qr/4RNL66ENMHZJ7A1.png\"}"
}
Expression Reference
| Value | Expression | Notes |
| QR code identifier | {{ $output.createQr.code }} | Store this for later update and delete operations. |
| Deep link URL | {{ $output.createQr.deepLinkUrl }} | Embed in emails, PDFs, or websites as a tap-to-chat link for mobile users. |
| QR image URL | {{ $output.createQr.qrImageUrl }} | Use as the src of an <img> tag in marketing email templates or pass to a PDF generation node. |
| Prefilled message | {{ $output.createQr.prefilledMessage }} | Confirm the prefilled text matches the campaign intent before storing the QR asset. |
Node Policies & GuardRails
| Policy Area | Recommendation |
| Credential storage | Store the access token in BizFirst Credentials Manager. |
| QR code inventory | Store the returned code value in your database immediately. It is the only way to update or delete the QR code later. Meta does not provide a lookup by prefilled message text. |
| Message content | Keep prefilled messages short and generic. Do not include personalised customer data (names, account numbers) in prefilled messages — QR codes are static and visible to all scanners. |
| Image URL expiry | The qrImageUrl may have a limited validity window. Download and host the image in your own storage immediately if you need a permanent reference. |
| Cleanup unused codes | Use qr-code/delete to remove QR codes when a campaign ends. Unused QR codes still consume quota against the phone number's QR code limit. |
Examples
Campaign QR Code Generation with Image
{
"resource": "qrcode",
"operation": "create",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"prefilledMessage": "Hi, I'm interested in the {{ $input.campaignName }} offer.",
"generateQrImage": "PNG"
}
A campaign launch workflow creates a QR code per campaign. The qrImageUrl is passed to a CDN upload node that hosts it as a permanent asset. The code and deepLinkUrl are stored in the campaigns database. The qrImageUrl is embedded in a Mailchimp template for the campaign email.
Product-Specific Support QR
{
"resource": "qrcode",
"operation": "create",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"prefilledMessage": "I need support for product SKU {{ $input.productSku }}",
"generateQrImage": "PNG"
}
A product catalogue workflow generates one QR code per product SKU. Each QR code includes the SKU in the prefilled message so support agents immediately know which product the customer is contacting about. The code values are stored in the product table and the images are embedded in the product inserts print file.