Integraciones

Envía las respuestas de un formulario mediante webhooks

Los webhooks son la forma general que tiene YeetForm de enviar los datos de las respuestas a cualquier lugar: tu propio backend, un trabajo de sincronización con una base de datos u otra plataforma de integración. Añade un endpoint HTTPS en la pestaña Integraciones de un formulario y YeetForm envía por POST un payload JSON firmado con cada nueva respuesta, con un secreto que puedes verificar mediante HMAC-SHA256. Los envíos fallidos se reintentan automáticamente. Esta página cubre el formato exacto de la firma, la estructura del payload y el calendario de reintentos, para que puedas construir un receptor con confianza.

Configuración

1.

Añade un endpoint

En la pestaña Integraciones del formulario, pega la URL de tu endpoint HTTPS en Webhooks y haz clic en Add webhook. YeetForm genera un secreto de firma (whsec_...) para ese endpoint.

2.

Verifica la firma

Cada envío incluye una cabecera X-YeetForm-Signature: t=<unix ts>,v1=<hex hmac-sha256 de `${t}.${body}`>. Verifícala contra el cuerpo sin procesar de la petición antes de fiarte del payload.

import { createHmac, timingSafeEqual } from "crypto";

function verify(secret, signatureHeader, rawBody) {
  const [tPart, v1Part] = signatureHeader.split(",");
  const timestamp = tPart.split("=")[1];
  const signature = v1Part.split("=")[1];

  const expected = createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`)
    .digest("hex");

  const a = Buffer.from(signature, "hex");
  const b = Buffer.from(expected, "hex");
  if (a.length !== b.length) return false;
  return timingSafeEqual(a, b);
}
3.

Lee el payload

Los POST se disparan en response.created (y en webhook.test para el botón de prueba manual), con el id del formulario, el id de la respuesta, el recuento de respuestas y las respuestas indexadas por el id del campo, además de un array fields con la etiqueta de cada campo.

{
  "event": "response.created",
  "form_id": "<uuid>",
  "form_title": "Customer Feedback",
  "response_id": "<uuid>",
  "response_count": 42,
  "answers": { "fld_x": "..." },
  "fields": [{ "id": "fld_x", "label": "Your name", "type": "text" }],
  "submitted_at": "2026-09-13T12:00:00.000Z"
}
4.

Gestiona los reintentos

Una respuesta que no sea 2xx (o un timeout) provoca un reintento: de inmediato, luego a los 30 segundos y luego a los 5 minutos, 3 intentos en total antes de que YeetForm marque el envío como fallido. No se siguen las redirecciones, así que apunta la URL directamente a tu endpoint.

Consejos

  • →Las etiquetas de los campos van incluidas en el array fields del payload (id, label, type), así que no necesitas fijar ids de campo en tu sistema.
  • →Cada respuesta lleva un response_id estable: úsalo como clave de idempotencia, ya que un envío reenviado reutiliza el mismo id.
  • →Un envío fallido se reintenta hasta 3 veces en total (de inmediato, 30 s, 5 min) antes de marcarse como fallido: hace falta una respuesta 2xx para que cuente como éxito, y no se siguen las redirecciones.

Crea tu formulario con IA en segundos

Empieza gratis

Preguntas frecuentes

¿Qué dispara un webhook?+
response.created se dispara con cada nueva respuesta; webhook.test se dispara cuando haces clic en el botón de prueba de la integración, para que verifiques tu endpoint antes de pasar a producción.
¿Cómo sé que una petición viene realmente de YeetForm?+
Verifica la cabecera X-YeetForm-Signature contra el secreto de tu endpoint usando HMAC-SHA256 sobre `${timestamp}.${rawBody}`: mira el fragmento de verificación de arriba.
¿Qué pasa si mi endpoint está caído?+
YeetForm reintenta hasta 3 veces en total: de inmediato, a los 30 segundos y luego a los 5 minutos. Si fallan las tres, el envío se marca como fallido y no se vuelve a intentar.
¿Puedo añadir cabeceras personalizadas?+
Sí: al configurar el webhook puedes definir cabeceras personalizadas. Se combinan, pero las cabeceras propias de YeetForm, Content-Type y X-YeetForm-*, siempre prevalecen en caso de conflicto.