> ## Documentation Index
> Fetch the complete documentation index at: https://knowledge.flowella.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Configure webhooks salientes de Flowella para reenviar eventos de WhatsApp a sus sistemas en tiempo real, con reintentos y firmas para verificar el origen.

<Frame>
  <img src="https://mintcdn.com/flowella/PuGNWwHHg6Nlq3MM/images/Screenshots/flowella-webhooks.png?fit=max&auto=format&n=PuGNWwHHg6Nlq3MM&q=85&s=6b4378754549ac127c02626ed49d468d" alt="Flowella outbound webhooks" width="2774" height="1686" data-path="images/Screenshots/flowella-webhooks.png" />
</Frame>

Los Webhooks permiten a Flowella enviar eventos a sus propios sistemas en tiempo real - por ejemplo, notificar a su CRM cuando se entrega un mensaje WhatsApp, o iniciar un trabajo en segundo plano cuando falla la sincronización de un formulario HubSpot. Esta página cubre la pantalla dentro de la aplicación **Configuración → Webhooks**.

Para ver los esquemas de carga útil de cada evento, consulta [Webhooks reference](/es/api-reference/webhooks).

## Quién puede gestionar webhooks

Sólo los roles **Owner** y **Admin** pueden ver Ajustes → Webhooks. Otros roles no tienen acceso.

## Añadir un punto final de webhooks

<Steps>
  <Step title="Abra Ajustes → Webhooks">
    Desde la navegación de la izquierda, vaya a **Configuración → Webhooks**.
  </Step>

  <Step title="Haga clic en Añadir punto final">
    Introduzca la URL HTTPS pública a la que Flowella debe enviar los eventos. No se acepta HTTP (sin TLS).
  </Step>

  <Step title="Elige a qué eventos suscribirte">
    Elija uno o más tipos de eventos - por ejemplo, `message.delivered`, `template.approved`, `flow.sync.failed`. La lista completa de eventos se encuentra en [Webhooks reference](/es/api-reference/webhooks). Puede suscribirse a todos los eventos con una sola casilla de verificación.
  </Step>

  <Step title="Copiar el secreto de firma">
    Flowella muestra el secreto de firma **una vez** al final del flujo de creación. Guárdalo en un almacén seguro - lo usarás para verificar la firma HMAC en cada solicitud entrante.
  </Step>

  <Step title="Enviar un evento de prueba">
    Utilice el botón **Enviar prueba** para disparar un evento sintético en su endpoint. El registro de entrega registra el resultado para que pueda confirmar que su manejador está conectado antes de ir en vivo.
  </Step>
</Steps>

## Firma y verificación

Cada solicitud de webhook incluye una cabecera `X-Flowella-Signature` con una firma HMAC-SHA256 del cuerpo de la solicitud sin procesar, calculada con el secreto de firma de tu endpoint. Verifíquelo antes de confiar en la carga útil:

<CodeGroup>
  ```js Node.js theme={null}
  import crypto from "crypto";

  function verify(rawBody, signature, secret) {
    const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
    return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
  }
  ```

  ```python Python theme={null}
  import hmac, hashlib

  def verify(raw_body: bytes, signature: str, secret: str) -> bool:
      expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
      return hmac.compare_digest(expected, signature)
  ```

  ```ruby Ruby theme={null}
  require "openssl"

  def verify(raw_body, signature, secret)
    expected = OpenSSL::HMAC.hexdigest("sha256", secret, raw_body)
    Rack::Utils.secure_compare(expected, signature)
  end
  ```

  ```php PHP theme={null}
  function verify(string $rawBody, string $signature, string $secret): bool {
      $expected = hash_hmac('sha256', $rawBody, $secret);
      return hash_equals($expected, $signature);
  }
  ```
</CodeGroup>

La solicitud también incluye:

* `X-Flowella-Timestamp` - la marca de tiempo Unix en el momento del envío. Rechaza las peticiones en las que la marca de tiempo esté más de 5 minutos en el pasado o en el futuro para evitar ataques de repetición.
* `X-Flowella-Event` - el tipo de evento (por ejemplo, `message.delivered`).
* `X-Flowella-Delivery` - un ID de entrega único, útil para la deduplicación.

## Reintentos y back-off

Si su punto final devuelve un código de estado no 2xx (o se agota el tiempo de espera después de 10 segundos), Flowella reintenta con retroceso exponencial:

\| Intento | Retraso después de | anterior | --- | --- | | 1 (inicial) | - | | 2 30 segundos | 3 2 minutos | 4 10 minutos | 5 1 hora | 6 horas | 7 (final) 24 horas

Tras 7 intentos fallidos, la entrega se marca como **fallida** y se cancela. El endpoint **no** se desactiva automáticamente - puede seguir recibiendo futuros eventos en el mismo endpoint.

Si fallan 100 entregas consecutivas, Flowella **auto-pausa** el endpoint y envía una notificación `WEBHOOK_PAUSED`. Reanúdela desde el menú de la fila una vez que haya solucionado el problema subyacente.

## Registro de entregas

Cada fila de punto final se expande en un registro de entregas que muestra los últimos 7 días de intentos:

* Tipo de evento e ID
* Estado\*\* - correcto, fallido, reintento
* Número de intentos
* Código y duración de la respuesta
* **Cuerpo de la respuesta** (primer 1 KB)
* Enviado a

Haga clic en cualquier entrega para ver la solicitud y la respuesta completas, o para **redistribuirla** manualmente.

## Gestión de puntos finales

Desde el menú de la fila de puntos finales puede:

* **Editar** - cambiar la URL o las suscripciones a eventos. (El secreto de firma permanece igual).
* **Rotar secreto** - generar un nuevo secreto de firma. El antiguo secreto deja de funcionar inmediatamente, así que coordine el cambio con su gestor.
* **Pausar** - detener temporalmente las entregas sin perder la configuración.
* Reanudar\*\* - volver a activar un punto final en pausa.
* **Borrar** - eliminar el punto final y su historial de entregas.

## Preguntas comunes

<AccordionGroup>
  <Accordion title="¿Puedo tener más de un punto final?">
    Sí, no hay un límite estricto. La mayoría de las organizaciones tienen de 1 a 3 puntos finales (producción, preparación y un sumidero de registro interno). Mantén el recuento bajo para que los eventos se distribuyan de forma predecible.
  </Accordion>

  <Accordion title="¿Cuál es la diferencia entre los webhooks y la API?">
    La API es **pull** - tu código pide el estado a Flowella. Webhooks son **push** - Flowella le dice a su código cuando cambia el estado. Utiliza webhooks para cualquier cosa que de otro modo sondearías.
  </Accordion>

  <Accordion title="¿Incluyen los webhooks datos sensibles?">
    Las cargas útiles de los webhooks incluyen identificadores de conversación, números de teléfono de contacto, contenido de mensajes y nombres de plantillas. Trate el secreto y la URL del endpoint como sensibles. Restrinja su endpoint para que acepte POST del rango de IP de Flowella si su infraestructura lo permite.
  </Accordion>

  <Accordion title="¿Cómo pruebo los webhooks localmente?">
    Utilice una herramienta de túnel (ngrok, Cloudflare Tunnel) para exponer su punto final localhost a una URL HTTPS pública y, a continuación, apunte un **punto final de prueba** a él. No pongas una URL de túnel en tu endpoint de producción - caducan.
  </Accordion>
</AccordionGroup>

## Relacionados

<CardGroup cols={2}>
  <Card title="Referencia de webhooks" icon="webhook" href="/es/api-reference/webhooks">
    Tipos de eventos, esquemas de carga útil y cabeceras.
  </Card>

  <Card title="Claves API" icon="key" href="/es/settings/api-keys">
    La otra mitad de la integración programática.
  </Card>

  <Card title="Introducción a la API" icon="code" href="/es/api-reference/introduction">
    Errores, límites de velocidad y paginación.
  </Card>

  <Card title="Eventos de notificación" icon="bell" href="/es/app/notification-events">
    Los mismos eventos enviados al feed de la aplicación y al correo electrónico.
  </Card>
</CardGroup>
