When to Use
- Product demonstrations: A sales workflow sends a 30-second product demo video to a lead who expressed interest, replacing the need for a scheduled call and increasing conversion rates.
- How-to guides on demand: A customer support workflow sends an instructional video when a user asks how to set up a device, reducing repeat contacts to the support team.
- Order fulfilment video proof: A logistics workflow sends a short clip of the packed parcel to the customer before dispatch, building trust in premium or fragile-item deliveries.
- Property virtual tours: A real estate workflow sends a 60-second walkthrough video to interested buyers immediately after they enquire, without scheduling a call.
- Training content delivery: An HR onboarding workflow sends welcome and orientation video clips to new employees on their first day via WhatsApp for easy mobile access.
Configuration
Connection
| Field | Required | Description |
accessToken | Required | Permanent System User access token. Store in BizFirst Credentials Manager. |
phoneNumberId | Required | Numeric string ID of the sending WhatsApp Business phone number. |
apiVersion | Optional | Meta Graph API version. Defaults to v18.0. |
Operation
| Field | Required | Description |
to | Required | Recipient's phone number with country code, no + prefix (e.g. 14155552671). |
mediaUrl | Required* | Publicly accessible HTTPS URL to the video file. Supported formats: MP4, 3GPP. Maximum size: 16 MB. |
mediaId | Required* | ID of a previously uploaded video from media/upload. Use instead of mediaUrl for repeated sends or private files. |
caption | Optional | Text caption displayed below the video. Maximum 1024 characters. |
* Provide either mediaUrl or mediaId — exactly one is required.
File size: WhatsApp imposes a 16 MB limit on video messages. For longer videos, host on a streaming platform and send a link via message/sendText with previewUrl: true to generate a rich preview card instead.
Sample Configuration
{
"resource": "message",
"operation": "sendVideo",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"to": "{{ $input.customerPhone }}",
"mediaUrl": "https://cdn.example.com/tutorials/{{ $input.productModel }}-setup.mp4",
"caption": "Setup guide for your {{ $input.productModel }}. Follow the steps shown and reply DONE when complete."
}
Validation Errors
| Error | Cause |
accessToken is required | The accessToken field is empty. |
phoneNumberId is required | The phoneNumberId field is empty. |
to is required | The to field is empty. |
Either mediaId or mediaUrl is required | Both mediaId and mediaUrl are empty. |
131053 (Meta) | Video download failed — URL inaccessible or returned non-200. |
131052 (Meta) | Unsupported video format or file exceeds 16 MB. |
131047 (Meta) | 24-hour window expired. Use a template with a video header component. |
Output
Success Port
| Field | Type | Description |
messageId | string | Unique WhatsApp message ID (wamid). |
phoneNumberId | string | The sending phone number ID. |
to | string | The recipient phone number. |
status | string | "sent" on success. |
errorCode | string | Empty on success. |
errorMessage | string | Empty on success. |
rawResponse | string | Full raw JSON from the Meta API. |
Error Port
| Field | Type | Description |
status | string | "failed" or "error". |
errorCode | string | Meta error code or BizFirst validation code. |
errorMessage | string | Human-readable error description. |
rawResponse | string | Raw API error response. |
Sample Output
{
"messageId": "wamid.HBgLMTQxNTU1NTI2NzEVAgARGBIzRTI4QUY4NjhFMEI4NDMAA",
"phoneNumberId": "123456789012345",
"to": "14155552671",
"status": "sent",
"errorCode": null,
"errorMessage": null,
"rawResponse": "{\"messaging_product\":\"whatsapp\",\"contacts\":[{\"input\":\"14155552671\",\"wa_id\":\"14155552671\"}],\"messages\":[{\"id\":\"wamid.HBgLMTQxNTU1NTI2NzEVAgARGBIzRTI4QUY4NjhFMEI4NDMAA\"}]}"
}
Expression Reference
| Value | Expression | Notes |
| Message ID | {{ $output.sendVid.messageId }} | Retain to react to or delete the video message. |
| Recipient | {{ $output.sendVid.to }} | Use for audit trail logging. |
| Status | {{ $output.sendVid.status }} | Branch on outcome in an IfCondition node. |
| Error detail | {{ $output.sendVid.errorMessage }} | Log on the error port for failure diagnostics. |
Node Policies & GuardRails
| Policy Area | Recommendation |
| Credential storage | Store the access token in BizFirst Credentials Manager. Never inline in configuration. |
| File size and format | Only MP4 (H.264 video, AAC audio) and 3GPP are supported. Maximum 16 MB. Pre-validate file size in a Function node before calling this operation to fail fast with a clear error. |
| CDN and URL stability | Use a CDN-hosted URL with no authentication requirement. Avoid signed URLs that expire in under 30 seconds — Meta's servers may take a few seconds to reach the URL after the API call. |
| 24-hour window | Video messages are free-form and subject to the 24-hour customer service window. Outside this window, use an approved template with a video header. |
| Bandwidth considerations | Video messages consume significant mobile data. For users on metered connections, consider sending a thumbnail image with a link instead of a direct video for non-critical content. |
| Error port | Always wire the error port. Large files and CDN restrictions are the most common failure modes for video messages. |
Examples
Product Demo on Enquiry
{
"resource": "message",
"operation": "sendVideo",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"to": "{{ $input.leadPhone }}",
"mediaId": "{{ $output.uploadDemo.mediaId }}",
"caption": "See {{ $input.productName }} in action! This 60-second demo shows all key features. Reply INTERESTED to speak with our team."
}
The demo video is uploaded once at workflow start using media/upload. The mediaId is reused for every lead, avoiding repeated uploads and ensuring consistent delivery speed.
Setup Tutorial on Support Request
{
"resource": "message",
"operation": "sendVideo",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"to": "{{ $input.customerPhone }}",
"mediaUrl": "https://cdn.example.com/support/{{ $input.issueType }}-guide.mp4",
"caption": "Step-by-step guide for: {{ $input.issueType }}\n\nIf this doesn't help, reply AGENT to speak with support."
}
A support triage workflow matches the customer's issue category to a library of tutorial videos and sends the relevant one. The URL pattern allows the workflow to select the correct video dynamically from the issue type.