Integraciones por webhook — Zapier · Make · n8n
Excucha expone un endpoint genérico para que dispares envíos de encuestas por WhatsApp desde cualquier sistema (CRM, POS, ticketing) — sin necesidad de instalar nada.
Setup
- Entra a Configuración → Canales → WhatsApp en tu panel de Excucha.
- Conecta tu número de WhatsApp (escanea el QR con tu teléfono).
- En el bloque "Webhook para integraciones" copia la URL completa. Se ve así:
https://excucha.com/api/v1/webhooks/whatsapp-send/123/aBcDeF1234567890XyZ
Esa URL contiene tu empresa_id y un secret único. No la compartas públicamente. Si crees que se filtró, usa el botón "Rotar secret" para invalidarla.
Schema del request
Método: POST
Content-Type: application/json
Body:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
telefono | string | sí | Número en formato E.164 (+57XXXXXXXXXX). Incluir el + y código de país. |
encuesta_id | int | sí | ID de la encuesta a enviar (ver listado en /encuestas) |
contacto_nombre | string | no | Reemplaza la variable {nombre} en la plantilla |
contacto_email | string | no | Para guardar el contacto en tu base |
envio_id_externo | string | no | Identificador único de tu sistema (para idempotencia). Si reintentas el mismo envio_id_externo, no se duplica el envío. |
metadata | object | no | Datos extra que quedan guardados en la respuesta |
Header opcional pero recomendado:
X-Signature: hmac_sha256(body, secret) — firma HMAC del body con tu secret. Si la incluyes, Excucha verifica que el request no fue manipulado.
Respuestas:
| Código | Significado |
|---|---|
202 | Envío encolado. Devuelve {envio_id, status} |
202 con duplicate:true | Ya existía un envío con ese envio_id_externo — se devuelve el envio_id original |
400 | Body inválido (revisar campos requeridos / formato E.164) |
401 | Secret incorrecto en la URL |
403 | Header X-Signature presente pero HMAC inválido |
404 | encuesta_id no existe en tu cuenta |
409 | Tu sesión de WhatsApp no está conectada — re-conecta el número en el panel |
429 | Alcanzaste el límite mensual de envíos de tu plan |
Zapier
- Crea un nuevo Zap. Elige el trigger (ej. "Freshdesk → Ticket Closed").
- Como Action elige Webhooks by Zapier → POST.
- Configura:
- URL: tu URL de Excucha
- Payload Type: JSON
- Data:
telefono→ mapea el campo de teléfono del trigger (asegúrate que llegue en E.164)encuesta_id→ un valor fijo (ej.12)contacto_nombre→ mapea el nombre del clienteenvio_id_externo→ mapea el ID del ticket (para evitar duplicados si Zapier reintenta)
- Test. Deberías ver
status: queueden la respuesta.
Make (ex Integromat)
- Nuevo escenario. Elige tu trigger (ej. "Shopify → Watch Orders").
- Agrega módulo HTTP → Make a request.
- Configura:
- URL: tu URL de Excucha
- Method:
POST - Headers:
Content-Type: application/json - Body type:
Raw, content typeJSON (application/json) - Request content:
{ "telefono": "{{1.customer.phone}}", "encuesta_id": 12, "contacto_nombre": "{{1.customer.first_name}}", "envio_id_externo": "shopify-{{1.id}}" }
n8n
- Nuevo workflow. Elige tu trigger.
- Agrega nodo HTTP Request.
- Configura:
- Method:
POST - URL: tu URL de Excucha
- Authentication: None
- Send Body: ON, Body Content Type: JSON
- Body Parameters:
telefono(expression) —={{ $json.customer.phone }}encuesta_id(number) —12contacto_nombre(expression) —={{ $json.customer.name }}envio_id_externo(expression) —={{ $json.id }}
- Method:
Con HMAC (recomendado)
Antes del nodo HTTP, agrega un nodo Crypto para firmar el body:
- Action:
HMAC - Type:
SHA256 - Value: el body JSON serializado
- Secret: tu secret de Excucha
Luego en HTTP Request agrega header X-Signature: ={{ $node["Crypto"].json.hmac }}.
Ejemplos cURL
Disparo simple:
curl -X POST https://excucha.com/api/v1/webhooks/whatsapp-send/123/SECRET \
-H "Content-Type: application/json" \
-d '{
"telefono": "+573001234567",
"encuesta_id": 12,
"contacto_nombre": "Juan Pérez",
"envio_id_externo": "ticket-9999"
}'
Con HMAC (Python):
import hashlib, hmac, json, requests
secret = "tu-secret-aqui"
body = json.dumps({"telefono": "+573001234567", "encuesta_id": 12})
sig = hmac.new(secret.encode(), body.encode(), hashlib.sha256).hexdigest()
r = requests.post(
"https://excucha.com/api/v1/webhooks/whatsapp-send/123/" + secret,
data=body,
headers={"Content-Type": "application/json", "X-Signature": sig}
)
print(r.status_code, r.json())
Troubleshooting
- 401 invalid_secret → revisa que copiaste la URL completa del panel; si rotaste el secret, actualiza la URL en tu integración
- 409 session_not_connected → tu WhatsApp se desconectó. Entra al panel y re-escanea el QR
- 429 monthly_limit_reached → alcanzaste el límite de tu plan; haz upgrade o espera al próximo ciclo
- Llega tarde / no llega → revisa el listado en
/configuracion/canales/whatsapp(próximamente dashboard de envíos) o contacta soporte con elenvio_id
Best practices
- Usa siempre
envio_id_externocon un ID único de tu sistema. Esto evita duplicados si tu integración reintenta. - Firma con HMAC en producción. El secret en la URL es necesario, pero HMAC añade integridad del payload.
- Throttle del lado tuyo si vas a disparar lotes grandes — Excucha limita a 1 msg/s por número.