I’m trying to send a dynamic product video (MP4) to a lead via GoHighLevel (LeadConnector) WhatsApp API using n8n.
The issue is that the GHL API returns a successful response (200 OK, messageId created), and the text part of the message is delivered to the WhatsApp client on the phone, but the video attachment is completely missing (it’s a silent failure).
My troubleshooting steps so far:
-
I ensure the video is perfectly formatted for WhatsApp using Cloudinary before attempting to send (forcing H.264 codec, AAC audio, MP4 container, and low bitrate using
q_auto,w_720). The file is small (~3MB) and plays fine in a browser. -
I have tried multiple GHL API approaches, all yielding the same result (text arrives, video stripped):
-
Attempt A: Sending direct public URL in the
attachmentsarray viaPOST /conversations/messages. -
Attempt B (The main attempt in the workflow below): Uploading the clean binary file to GHL Media Library first (
POST /medias/upload-filewithcontentType: video/mp4), getting a validfileId, and then sending thatfileIdin theattachmentsarray viaPOST /conversations/messages. -
Attempt C: Uploading to Conversation context (
POST /conversations/messages/upload) and using the resulting ID.
-
I suspect GHL/Twilio is sanitizing the message and stripping the video attachment without throwing an error. Has anyone successfully sent video via GHL API recently?
Please share your workflow
[
{
"id": "descargar-video-demo",
"name": "Download Clean Video",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
1000,
300
],
"parameters": {
"method": "GET",
"url": "={{ $('Upload an asset from file data').item.json.secure_url.replace('/upload/', '/upload/vc_h264,ac_aac,q_auto,w_720,c_limit,f_mp4/') }}",
"responseFormat": "file",
"outputFieldName": "data"
}
},
{
"id": "subir-ghl-demo",
"name": "Upload to GHL Media",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
1220,
300
],
"parameters": {
"method": "POST",
"url": "https://services.leadconnectorhq.com/medias/upload-file",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "highLevelOAuth2Api",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Version",
"value": "2021-07-28"
}
]
},
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"parameterType": "formBinaryData",
"name": "file",
"inputDataFieldName": "data"
},
{
"name": "name",
"value": "video_whatsapp.mp4"
},
{
"name": "contentType",
"value": "video/mp4"
}
]
}
}
},
{
"id": "enviar-wa-demo",
"name": "Send WhatsApp Message",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
1440,
300
],
"parameters": {
"method": "POST",
"url": "https://services.leadconnectorhq.com/conversations/messages",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "highLevelOAuth2Api",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Version",
"value": "2021-04-15"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"type\": \"WhatsApp\",\n \"contactId\": \"{{ $('Acumulador').item.json.contact_id }}\",\n \"message\": \"🎥 Here is the video:\",\n \"attachments\": [\n \"{{ $('Upload to GHL Media').item.json.fileId }}\"\n ]\n}",
"options": {}
}
}
]
Share the output returned by the last node
There is NO error message from the n8n node or the API. The node executes successfully (green checkmark). The API returns a standard success message like:
{
“conversationId”: “GU7xLhqkQql2167”,
“messageId”: “Zw8912js8912ks”,
“msg”: “Message queued successfully.”
}
Information on your n8n setup
- n8n version: 1.123.4
- Database (default: SQLite): SQLite (Default)
- n8n EXECUTIONS_PROCESS setting (default: own, main): default
- Running n8n via (Docker, npm, n8n cloud, desktop app): Docker (via Easypanel)
- Operating system: Linux (Ubuntu/Debian)