Same QR image, new text: This operation calls POST /{phoneNumberId}/message_qrdls/{qrCodeId} with a new prefilled_message. The QR code graphic and deep link URL remain the same — no reprint or redistribution of physical materials is required. The new message is effective immediately upon success.
When to Use
- Seasonal campaign refresh: Printed materials for a permanent display (e.g. in-store poster) contain a QR code. When the campaign season changes, this node updates the prefilled message text without requiring a reprint of the physical materials.
- Offer text update: An automated promotions workflow updates the prefilled message on campaign QR codes to reflect the current offer, e.g. switching from "summer sale" to "back to school" messaging.
- Compliance correction: A content compliance review identifies prohibited text in a QR code's prefilled message. An automated remediation workflow updates the offending code's text to a compliant alternative.
- Multi-language rotation: A localisation workflow cycles QR codes through language variants (English/French/Spanish) by updating the prefilled message text to match the current active language period.
- Dynamic personalisation: A location-specific QR code's message is updated to include the current branch name or store number when a store relocates or is renamed.
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 that owns this QR code. |
apiVersion | Optional | Meta Graph API version. Defaults to v18.0. |
Operation
| Field | Required | Description |
qrCodeId | Required | The QR code identifier (the code string returned by qr-code/create). |
prefilledMessage | Required | New prefilled message text. Replaces the current text immediately. Max 512 characters. |
Sample Configuration
{
"resource": "qrcode",
"operation": "update",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"qrCodeId": "4RNL66ENMHZJ7A1",
"prefilledMessage": "Hi! I'd like to know more about your back-to-school offers."
}
Validation Errors
| Error | Cause |
accessToken is required | The accessToken field is empty. |
phoneNumberId is required | No Phone Number ID supplied. |
qrCodeId is required | No QR code identifier provided. |
prefilledMessage is required | No new prefilled message text was provided. |
prefilledMessage too long | The message text exceeds 512 characters. |
100 (Meta) | QR code not found or does not belong to this phone number. |
Output
Success Port
| Field | Type | Description |
code | string | The QR code identifier. |
prefilledMessage | string | The new prefilled message text as stored. |
deepLinkUrl | string | The deep link URL (unchanged from creation). |
status | string | "updated". |
rawResponse | string | Full raw JSON from the Meta Graph API. |
Error Port
| Field | Type | Description |
code | string | The QR code identifier echoed from input. |
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 back-to-school offers.",
"deepLinkUrl": "https://wa.me/qr/4RNL66ENMHZJ7A1",
"status": "updated"
}
Expression Reference
| Value | Expression | Notes |
| Update success | {{ $output.updateQr.status }} | Confirm "updated" before recording the change in the campaign database. |
| New message text | {{ $output.updateQr.prefilledMessage }} | Store the confirmed new text in the QR code inventory record. |
| Deep link (unchanged) | {{ $output.updateQr.deepLinkUrl }} | Confirms the URL has not changed — no asset redistribution needed. |
Node Policies & GuardRails
| Policy Area | Recommendation |
| Credential storage | Store the access token in BizFirst Credentials Manager. |
| Physical materials note | Because the QR image is unchanged, updating the prefilled message on a code used in printed materials changes the user experience without any reprint. Communicate this to marketing teams who manage physical collateral. |
| Audit trail | Log every update with the old and new prefilled message text, the QR code ID, timestamp, and the initiating workflow/user. This is essential for content compliance audits. |
| Character limit | Validate the new prefilled message length before calling this node. Meta rejects messages over 512 characters — validate in a Function node first to avoid wasted API calls. |
| Error port | Connect the error port. A 100 not-found error may indicate the QR code was deleted externally — reconcile the database accordingly. |
Examples
Seasonal Campaign Message Refresh
{
"resource": "qrcode",
"operation": "update",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"qrCodeId": "{{ $input.permanentDisplayQrCode }}",
"prefilledMessage": "Hi! Tell me about your {{ $input.seasonName }} offers."
}
A seasonal content scheduler fires at the start of each season. The workflow retrieves the permanent display QR code ID from the database and updates its prefilled text to the new season message. Marketing teams receive a confirmation notification that the QR codes on all permanent in-store displays now carry the updated seasonal text without needing a reprint.
Compliance Remediation Update
{
"resource": "qrcode",
"operation": "update",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"qrCodeId": "{{ $item.qrCode }}",
"prefilledMessage": "{{ $item.approvedReplacementMessage }}"
}
A content compliance sweep identifies QR codes with non-compliant prefilled text. A SplitInBatches node iterates each offending code and calls this update node with the pre-approved replacement message from the compliance database. Each update is logged to the compliance audit trail with old and new message content.