Feedback Actions
Update From Whatsapp Feedback Action
Explains the WhatsApp feedback action that runs when a WhatsApp message is received. Useful for conversational workflows, reply routing, media handling, and stubsession continuity.
# Overview
When a Whatsapp message is received by the Stubber Platform the stubsession is derived to intelligently route the message to the correct stub.
Then the _update_from_whatsapp feedback action is triggered on the stub.
The _update_from_whatsapp feedback action is used to then further automate anything in the stub that needs to be done when a WhatsApp is received.
The message body of the Whatsapp message will be set to the message of the stubpost. i.e. stubpost.message.
If a contact can be derived from the mobile number of the sender, the posted_by => on_behalf_of will be set to the contact.
All the details of the Whatsapp message will be available in the stubpost.data._incoming_whatsapp_data data path.
# Data Structure
# Feedback Action Data
Example data that is passed to the _update_from_whatsapp feedback action:
"_incoming_whatsapp_data": {
"message": "Hi",
"from": "XXXXXXXXXXXX",
"from_name": "Joe Soap",
"to": "14153121456",
"whatsapp_profile_name": "stubber_public",
"whatsapp_body": {
"from": "XXXXXXXXXXXX",
"id": "wamid.HBgLMjc3MjYwNTAwMzUVAgASGCAwRTlGMzVBQTJDMDY1NzgyRkVCMEM2N0NENzlCNjc5MAA=",
"timestamp": "1734531943",
"text": {
"body": "Hi"
},
"type": "text",
"received_date_time": "2024-12-18T14:25:44.836Z",
"phone_number_id": "XXXXXXXXXXXX",
"to": "14153121456",
"orguuid": "XXXXXXXXXXXXXXX"
}
},
# JSONSchema
The JSONSchema of the stubpost.data._incoming_whatsapp_data is :
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Incoming WhatsApp Data",
"type": "object",
"properties": {
"_incoming_whatsapp_data": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "The content or description of the WhatsApp message."
},
"whatsapp_attachments": {
"type": "array",
"description": "List of attachments included in the WhatsApp message.",
"items": {
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "The name of the file."
},
"originalname": {
"type": "string",
"description": "The original name of the file as uploaded."
},
"fileuuid": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$",
"description": "UUID of the file."
},
"contentType": {
"type": "string",
"description": "The MIME type of the file."
}
},
"required": ["filename", "originalname", "fileuuid", "contentType"],
"additionalProperties": false
}
},
"from": {
"type": "string",
"pattern": "^[0-9]{11,15}$",
"description": "The sender's phone number in international format."
},
"from_name": {
"type": "string",
"description": "The name of the sender."
},
"to": {
"type": "string",
"pattern": "^[0-9]{11,15}$",
"description": "The recipient's phone number in international format."
},
"whatsapp_profile_name": {
"type": "string",
"description": "The WhatsApp profile name of the sender."
},
"whatsapp_body": {
"type": "object",
"properties": {
"from": {
"type": "string",
"pattern": "^[0-9]{11,15}$",
"description": "The sender's phone number in international format."
},
"id": {
"type": "string",
"description": "Unique identifier for the WhatsApp message."
},
"timestamp": {
"type": "string",
"pattern": "^[0-9]+$",
"description": "Unix timestamp when the message was sent."
},
"type": {
"type": "string",
"enum": [
"text",
"image",
"audio",
"video",
"document",
"location",
"contact",
"sticker"
],
"description": "The type of the WhatsApp message."
},
"received_date_time": {
"type": "string",
"format": "date-time",
"description": "The ISO 8601 date-time when the message was received."
},
"phone_number_id": {
"type": "string",
"description": "The ID of the phone number associated with the WhatsApp Business account."
},
"to": {
"type": "string",
"pattern": "^[0-9]{11,15}$",
"description": "The recipient's phone number in international format."
},
"orguuid": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$",
"description": "The UUID of the organization."
},
"text": {
"type": "object",
"properties": {
"body": {
"type": "string",
"description": "The text content of the message."
}
},
"required": ["body"],
"additionalProperties": false
},
"image": {
"type": "object",
"properties": {
"mime_type": {
"type": "string",
"description": "The MIME type of the image."
},
"sha256": {
"type": "string",
"description": "SHA-256 hash of the image."
},
"id": {
"type": "string",
"description": "Identifier for the image."
}
},
"required": ["mime_type", "sha256", "id"],
"additionalProperties": false
},
"audio": {
"type": "object",
"properties": {
"mime_type": {
"type": "string",
"description": "The MIME type of the audio."
},
"sha256": {
"type": "string",
"description": "SHA-256 hash of the audio."
},
"id": {
"type": "string",
"description": "Identifier for the audio."
},
"voice": {
"type": "boolean",
"description": "Indicates if the audio is a voice message."
}
},
"required": ["mime_type", "sha256", "id", "voice"],
"additionalProperties": false
},
"contacts": {
"type": "array",
"description": "List of contact information included in the message.",
"items": {
"type": "object",
"properties": {
"emails": {
"type": "array",
"description": "List of email addresses for the contact.",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "Email address of the contact."
},
"type": {
"type": "string",
"enum": ["Home", "Work", "Other"],
"description": "Type of the email address."
}
},
"required": ["email", "type"],
"additionalProperties": false
}
},
"name": {
"type": "object",
"properties": {
"first_name": {
"type": "string",
"description": "First name of the contact."
},
"last_name": {
"type": "string",
"description": "Last name of the contact."
},
"formatted_name": {
"type": "string",
"description": "Full name of the contact."
}
},
"required": ["first_name", "last_name", "formatted_name"],
"additionalProperties": false
},
"org": {
"type": "object",
"properties": {
"company": {
"type": "string",
"description": "Company where the contact works."
},
"title": {
"type": "string",
"description": "Job title of the contact."
}
},
"required": ["company", "title"],
"additionalProperties": false
},
"phones": {
"type": "array",
"description": "List of phone numbers for the contact.",
"items": {
"type": "object",
"properties": {
"phone": {
"type": "string",
"pattern": "^\\+?[0-9\\s\\-()]{7,20}$",
"description": "Phone number of the contact."
},
"wa_id": {
"type": "string",
"pattern": "^[0-9]{11,15}$",
"description": "WhatsApp ID associated with the phone number."
},
"type": {
"type": "string",
"enum": ["MOBILE", "HOME", "WORK"],
"description": "Type of the phone number."
}
},
"required": ["phone", "wa_id", "type"],
"additionalProperties": false
}
}
},
"required": ["emails", "name", "org", "phones"],
"additionalProperties": false
}
},
"location": {
"type": "object",
"properties": {
"latitude": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude coordinate of the location."
},
"longitude": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude coordinate of the location."
}
},
"required": ["latitude", "longitude"],
"additionalProperties": false
}
},
"required": [
"from",
"id",
"timestamp",
"type",
"received_date_time",
"phone_number_id",
"to",
"orguuid"
],
"allOf": [
{
"if": {
"properties": {
"type": {
"const": "text"
}
}
},
"then": {
"required": ["text"],
"properties": {
"text": {
"$ref": "#/properties/_incoming_whatsapp_data/properties/whatsapp_body/properties/text"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "image"
}
}
},
"then": {
"required": ["image"],
"properties": {
"image": {
"$ref": "#/properties/_incoming_whatsapp_data/properties/whatsapp_body/properties/image"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "audio"
}
}
},
"then": {
"required": ["audio"],
"properties": {
"audio": {
"$ref": "#/properties/_incoming_whatsapp_data/properties/whatsapp_body/properties/audio"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "contact"
}
}
},
"then": {
"required": ["contacts"],
"properties": {
"contacts": {
"$ref": "#/properties/_incoming_whatsapp_data/properties/whatsapp_body/properties/contacts"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "location"
}
}
},
"then": {
"required": ["location"],
"properties": {
"location": {
"$ref": "#/properties/_incoming_whatsapp_data/properties/whatsapp_body/properties/location"
}
}
}
}
],
"additionalProperties": false
}
},
"required": ["message", "from", "from_name", "to", "whatsapp_profile_name", "whatsapp_body"],
"additionalProperties": false
}
},
"required": ["_incoming_whatsapp_data"],
"additionalProperties": false
}