Portal Community

When to Use

User experience impact: Sending a read receipt changes the message status icon for the sender from grey double ticks (delivered) to blue double ticks (read). Only call this operation when the message has actually been processed or is actively being handled — misleading read receipts reduce customer trust.

Configuration

Connection

FieldRequiredDescription
accessTokenRequiredPermanent System User access token. Store in BizFirst Credentials Manager.
phoneNumberIdRequiredNumeric string ID of the receiving WhatsApp Business phone number (the number that received the message).
apiVersionOptionalMeta Graph API version. Defaults to v18.0.

Operation

FieldRequiredDescription
messageIdRequiredThe WhatsApp message ID (wamid) of the inbound message to mark as read. Obtained from the webhook payload at entry[0].changes[0].value.messages[0].id.

Sample Configuration

{
  "resource": "message",
  "operation": "markAsRead",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "messageId": "{{ $input.inboundMessageId }}"
}

Validation Errors

ErrorCause
accessToken is requiredThe accessToken field is empty.
phoneNumberId is requiredThe phoneNumberId field is empty.
messageId is requiredThe messageId field is empty.
131026 (Meta)The message ID is invalid or does not belong to this phone number's conversations.
131047 (Meta)The message is too old to mark as read (typically beyond 24 hours).

Output

Success Port

FieldTypeDescription
messageIdstringThe message ID that was marked as read (echoed from input).
statusstring"read" on success.
errorCodestringEmpty on success.
errorMessagestringEmpty on success.
rawResponsestringFull raw JSON from the Meta API. The API returns { "success": true } on success.

Error Port

FieldTypeDescription
messageIdstringThe message ID that failed to be marked as read.
statusstring"failed" or "error".
errorCodestringMeta error code or BizFirst validation code.
errorMessagestringHuman-readable error description.
rawResponsestringRaw API error response.

Sample Output

{
  "messageId": "wamid.HBgLMTQxNTU1NTI2NzEVAgASGBI0QzM4NjhGQTExMjQ3RDMAA",
  "status": "read",
  "errorCode": null,
  "errorMessage": null,
  "rawResponse": "{\"success\":true}"
}

Expression Reference

ValueExpressionNotes
Message ID{{ $output.markRead.messageId }}Echoed from input. Useful for chaining to confirm which message was marked.
Status{{ $output.markRead.status }}"read" on success. Use to confirm before proceeding with reply generation.
Error code{{ $output.markRead.errorCode }}Log on the error port for diagnostics.
Raw API result{{ $output.markRead.rawResponse }}Contains { "success": true } on a successful call.

Node Policies & GuardRails

Policy AreaRecommendation
Credential storageStore the access token in BizFirst Credentials Manager. Never inline in configuration.
TimingCall this operation as early as possible in the inbound message processing workflow — ideally as the very first node after the WebhookTrigger. Delayed read receipts may cause customers to believe their message was not received.
Message ID sourceThe messageId must be the wamid from the inbound webhook event, not a wamid from a previously sent outbound message. Marking an outbound message as read is a no-op and may return an error.
Do not misleadOnly call this operation when the message has been genuinely received and queued for processing. Do not mark messages as read from an unrelated automated batch if the content has not been examined.
Error handlingmarkAsRead failures are non-critical. Route errors to a logging node rather than a customer-facing error flow. The main workflow should proceed regardless of whether the read receipt was successfully sent.
IdempotencyCalling markAsRead multiple times on the same message ID is safe — the API is idempotent and returns success without error on duplicate calls.

Examples

Immediate Acknowledgement on Webhook Trigger

{
  "resource": "message",
  "operation": "markAsRead",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "messageId": "{{ $trigger.entry[0].changes[0].value.messages[0].id }}"
}

This node is the first step in every inbound WhatsApp workflow after the WebhookTrigger. It immediately marks the customer's message as read (blue double ticks) before any processing logic runs. The 5-10ms API call provides a near-instant UX signal even when the full response takes several seconds to generate.

Agent Assignment Acknowledgement

{
  "resource": "message",
  "operation": "markAsRead",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "messageId": "{{ $input.customerMessageId }}"
}

A CRM webhook fires when an agent opens a WhatsApp ticket. The workflow marks the original customer message as read at that moment, accurately reflecting that a human has reviewed the message. The customerMessageId is stored in the ticket record when the inbound message is first received.