GHL API + WhatsApp: Video attachments silently failed (Status 200 OK but only text arrives)

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:

  1. 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.

  2. I have tried multiple GHL API approaches, all yielding the same result (text arrives, video stripped):

    • Attempt A: Sending direct public URL in the attachments array via POST /conversations/messages.

    • Attempt B (The main attempt in the workflow below): Uploading the clean binary file to GHL Media Library first (POST /medias/upload-file with contentType: video/mp4), getting a valid fileId, and then sending that fileId in the attachments array via POST /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)

Instead of pushing the message via API, use n8n to call a GHL Inbound Webhook that triggers a GHL internal workflow. Inside that GHL workflow, use the native “Send WhatsApp Message” action and map the video URL from your webhook data.​

GHL’s internal engine handles the media handshake with Meta much better than the raw public API does. Just ensure you pass the Cloudinary URL directly to the webhook (skip the “Upload to GHL” step completely) and verify the file is under 16MB.