Describe the problem/error/question
When I try publish workflows with Whatsapp Trigger Node it fails mutliple times with Error: Workflow could not be published:
(#2200) Callback verification failed with the following errors: curl_errno = 56; curl_error = CONNECT tunnel failed, response 429; HTTP Status Code = 429; HTTP Message = Too Many Requests
Eventually it does succeed. This error also affects my Whatsapp Flows, as data is only exchanged intermittently, because I guess most data is blocked by throttling.
Here is the workflow:
{
“nodes”: [
{
“parameters”: {
“updates”: [
“messages”
],
“options”: {
“messageStatusUpdates”: [
“all”
]
}
},
“type”: “n8n-nodes-base.whatsAppTrigger”,
“typeVersion”: 1,
“position”: [
96,
-592
],
“id”: “9ab9fd24-6c16-4ebf-9a6c-2e73d9a87742”,
“name”: “WhatsApp Trigger”,
“webhookId”: “d68e0638-f8da-4f78-9c3a-8de498f4fe31”,
“credentials”: {
“whatsAppTriggerApi”: {
“id”: “qWVxbPXJkVeC5wGY”,
“name”: “WhatsApp OAuth - Whapp”
}
},
“onError”: “continueRegularOutput”
},
{
“parameters”: {
“httpMethod”: “POST”,
“path”: “donation-flow”,
“responseMode”: “responseNode”,
“options”: {}
},
“type”: “n8n-nodes-base.webhook”,
“typeVersion”: 2.1,
“position”: [
112,
-336
],
“id”: “9bf817cf-2c8d-411b-962c-b554ba94c297”,
“name”: “Webhook”,
“webhookId”: “ec10d621-b166-43a7-9e2e-d95b83ab0871”
},
{
“parameters”: {
“respondWith”: “text”,
“responseBody”: “={{ $json.data }}”,
“options”: {}
},
“type”: “n8n-nodes-base.respondToWebhook”,
“typeVersion”: 1.4,
“position”: [
944,
-336
],
“id”: “3500cf5c-0f91-42f2-b64e-c815b913b681”,
“name”: “Respond to Webhook”
},
{
“parameters”: {
“method”: “POST”,
“url”: “https://aitomate.co.za/aitomate_demos_whatsapp/whatsapp-flow-decrypt.php”,
“sendHeaders”: true,
“headerParameters”: {
“parameters”: [
{
“name”: “Content-Type”,
“value”: “application/json”
}
]
},
“sendBody”: true,
“bodyParameters”: {
“parameters”: [
{
“name”: “encrypted_flow_data”,
“value”: “={{ $json.body.encrypted_flow_data }}”
},
{
“name”: “encrypted_aes_key”,
“value”: “={{ $json.body.encrypted_aes_key }}”
},
{
“name”: “initial_vector”,
“value”: “={{ $json.body.initial_vector }}”
},
{
“name”: “screen_name”,
“value”: “DETAILS”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.3,
“position”: [
304,
-336
],
“id”: “8ef4945f-dd8f-4c5e-8cd2-2b3825d1e441”,
“name”: “HTTP Request9”
},
{
“parameters”: {
“content”: “Decrypt incoming data from Whatsapp Flow”,
“height”: 80,
“width”: 176
},
“type”: “n8n-nodes-base.stickyNote”,
“typeVersion”: 1,
“position”: [
256,
-432
],
“id”: “406db72f-4fe6-40b5-9c1b-58b85fbf6810”,
“name”: “Sticky Note40”
},
{
“parameters”: {
“content”: “Encrypt response to be sent to Whatsapp Flow”,
“height”: 80,
“width”: 176
},
“type”: “n8n-nodes-base.stickyNote”,
“typeVersion”: 1,
“position”: [
720,
-432
],
“id”: “88d21505-ebaf-4b62-8cd3-2eb6936b85f3”,
“name”: “Sticky Note41”
},
{
“parameters”: {
“method”: “POST”,
“url”: “https://aitomate.co.za/aitomate_demos_whatsapp/whatsapp-flow-encrypt.php”,
“sendHeaders”: true,
“headerParameters”: {
“parameters”: [
{
“name”: “Content-Type”,
“value”: “application/json”
}
]
},
“sendBody”: true,
“bodyParameters”: {
“parameters”: [
{
“name”: “encrypted_flow_data”,
“value”: “={{ $(‘Webhook’).item.json.body.encrypted_flow_data }}”
},
{
“name”: “encrypted_aes_key”,
“value”: “={{ $(‘Webhook’).item.json.body.encrypted_aes_key }}”
},
{
“name”: “initial_vector”,
“value”: “={{ $(‘Webhook’).item.json.body.initial_vector }}”
},
{
“name”: “screen_name”,
“value”: “={{ $json.next_screen_name }}”
},
{
“name”: “amount”,
“value”: “={{ $json.decrypted_payload.data.amount }}”
},
{
“name”: “payment_interval”,
“value”: “={{ $json.decrypted_payload.data.payment_interval }}”
},
{
“name”: “payment_method”,
“value”: “={{ $json.decrypted_payload.data.payment_method }}”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.3,
“position”: [
768,
-336
],
“id”: “c8d5df79-8aec-426a-98d4-4ff5002dd8a2”,
“name”: “HTTP Request11”
},
{
“parameters”: {
“jsCode”: “// Get current screen\nconst currentScreen = $json.decrypted_payload?.screen;\n\n// Default value (optional safety)\nlet next_screen_name = null;\n\n// Screen routing logic\nif (currentScreen === ‘DONATION’) {\n next_screen_name = ‘DETAILS’;\n} else if (currentScreen === ‘DETAILS’) {\n next_screen_name = ‘SUMMARY’;\n} else if (currentScreen === ‘SUMMARY’) {\n next_screen_name = ‘COMPLETE’;\n}\n\n// Return updated JSON\nreturn [\n {\n json: {\n …$json,\n next_screen_name\n }\n }\n];\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
608,
-336
],
“id”: “a84f0b01-704e-4e0a-8761-faf4e090b941”,
“name”: “Code in JavaScript3”
},
{
“parameters”: {
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “strict”,
“version”: 3
},
“conditions”: [
{
“id”: “ce81d51a-f892-46e5-8da7-305c3e0c8b78”,
“leftValue”: “={{ $json.decrypted_payload.action }}”,
“rightValue”: “ping”,
“operator”: {
“type”: “string”,
“operation”: “equals”,
“name”: “filter.operator.equals”
}
}
],
“combinator”: “and”
},
“options”: {}
},
“type”: “n8n-nodes-base.if”,
“typeVersion”: 2.3,
“position”: [
448,
-336
],
“id”: “aa6be20d-199f-4999-8005-a8194f394638”,
“name”: “If31”
},
{
“parameters”: {
“method”: “POST”,
“url”: “https://aitomate.co.za/aitomate_demos_whatsapp/whatsapp-flow-encrypt-health-check.php”,
“sendHeaders”: true,
“headerParameters”: {
“parameters”: [
{
“name”: “Content-Type”,
“value”: “application/json”
}
]
},
“sendBody”: true,
“bodyParameters”: {
“parameters”: [
{
“name”: “decrypted_aes_key”,
“value”: “={{ $json.aes_key_base64 }}”
},
{
“name”: “initial_vector”,
“value”: “={{ $json.initial_vector_base64 }}”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.3,
“position”: [
688,
-560
],
“id”: “aa3a8f3a-bbce-4c66-a4ac-88559c903f84”,
“name”: “HTTP Request34”
},
{
“parameters”: {
“content”: “Used for Running Health Check on End Point”,
“height”: 80
},
“type”: “n8n-nodes-base.stickyNote”,
“typeVersion”: 1,
“position”: [
592,
-640
],
“id”: “31864aef-226b-4e64-adfc-a0510b1432f5”,
“name”: “Sticky Note99”
}
],
“connections”: {
“WhatsApp Trigger”: {
“main”: [
]
},
“Webhook”: {
“main”: [
[
{
“node”: “HTTP Request9”,
“type”: “main”,
“index”: 0
}
]
]
},
“HTTP Request9”: {
“main”: [
[
{
“node”: “If31”,
“type”: “main”,
“index”: 0
}
]
]
},
“HTTP Request11”: {
“main”: [
[
{
“node”: “Respond to Webhook”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code in JavaScript3”: {
“main”: [
[
{
“node”: “HTTP Request11”,
“type”: “main”,
“index”: 0
}
]
]
},
“If31”: {
“main”: [
[
{
“node”: “HTTP Request34”,
“type”: “main”,
“index”: 0
}
],
[
{
“node”: “Code in JavaScript3”,
“type”: “main”,
“index”: 0
}
]
]
},
“HTTP Request34”: {
“main”: [
[
{
“node”: “Respond to Webhook”,
“type”: “main”,
“index”: 0
}
]
]
}
},
“pinData”: {},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “245fe68e11b4cc3302473c67f456d11e2883ba1a19da36931944225207f4cf8f”
}
}
Information on my n8n setup
- n8n version: 2.6.4
- Database (default: SQLite): SQLite
- n8n EXECUTIONS_PROCESS setting (default: own, main): main
- Running n8n via (Docker, npm, n8n cloud, desktop app): docker
- Operating system: Alpine Linux v3.22