GuíaPlan Ultimate

Configurar webhooks

Envía a tu propio sistema actualizaciones en tiempo real sobre citas, clientes, facturas y más, y verifica que cada petición procede de Softalon.

5 min de lecturaRol: Super administrador o superiorIntegraciones y desarrolladoresActualizado el 25 de octubre de 2026

Un webhook envía una petición HTTP a una URL que eliges cada vez que ocurre algo en tu salón, por ejemplo cuando se crea una cita o se actualiza un cliente. Úsalo para mantener otro sistema sincronizado con Softalon.

Antes de empezar

  • Tu salón tiene el plan Ultimate.
  • Tienes el rol de Super administrador o Propietario.
  • Tienes una URL que acepta peticiones POST con un cuerpo JSON, que empieza por https:// o http://.

Crear un webhook

  1. 1

    Paso 1 de 4

    Abrir Webhooks

    Ve a Configuración › Desarrolladores › Webhooks y haz clic en Crear webhook.

  2. 2

    Paso 2 de 4

    Introducir el destino

    Rellena la URL de destino, por ejemplo https://example.com/webhook, y opcionalmente una Descripción para reconocerlo más adelante.

  3. 3

    Paso 3 de 4

    Elegir los temas

    En Temas, selecciona los eventos que quieres. La pestaña Todos los temas muestra todos los temas disponibles, y Temas seleccionados muestra los que has elegido. Tu URL solo recibe los temas que seleccionas.

  4. 4

    Paso 4 de 4

    Guardar

    Haz clic en Crear webhook.

    Verás:

    Webhook creado, y el webhook aparece en la tabla con su interruptor de estado activado.

Temas

Los temas se llaman resource.action. Estos son los disponibles:

ÁreaTemas
Miembros del equiposalons/member.created, .updated, .deleted
Ubicacioneslocations/location.created, .updated, .deleted
Serviciosservices/service.created, .updated, .deleted
Clientesclients/client.created, .updated, .deleted, .birthday, .lapsed
Códigos de inicio de sesión de clientesclients/session_request.code_generated
Citasbooking/appointment.created, .updated, .deleted, .upcoming, .started
Conversacionesconversations/conversation.created, .updated, .deleted
Facturasfinances/invoice.created, .updated, .deleted

Para saber qué significa cada disparador, consulta Los disparadores de automatizaciones explicados.

Qué envía Softalon

Cada evento es una petición POST con un cuerpo JSON:

{
  "topic": "booking/appointment.created",
  "event": {
    "id": "...",
    "type": "booking/appointment.created",
    "resource": "booking/appointment",
    "resourceId": "...",
    "salonId": "...",
    "data": {
      "object": { "...": "the full object" },
      "previousAttributes": { "...": "changed fields, for updates" }
    }
  }
}

La petición tiene estas cabeceras:

CabeceraValor
X-Webhook-Signaturesha256= seguido de la firma
X-Webhook-TopicEl tema, por ejemplo booking/appointment.created
X-Webhook-Endpoint-IdEl ID de tu webhook
X-Webhook-Delivery-IdEl ID de esta entrega. Se mantiene igual cuando se reintenta una entrega.
User-AgentSoftalon API

Verificar la firma

Cada webhook tiene un secreto. Softalon firma el cuerpo de la petición con él mediante HMAC-SHA256 y envía el resultado en hexadecimal en X-Webhook-Signature. Calcula el mismo valor a partir del cuerpo sin procesar de la petición y compáralos. Si no coinciden, ignora la petición.

const crypto = require("crypto");

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

Para gestionar el secreto, usa los botones de la columna Secreto:

  • El botón del ojo muestra el secreto completo, y el botón de copiar lo copia.
  • El botón de regenerar crea un secreto nuevo al instante. El secreto anterior deja de funcionar inmediatamente, así que actualiza tu sistema al mismo tiempo.

Entregas y reintentos

  • Tu URL debe responder con un código de estado 2xx en 10 segundos. Cualquier otra respuesta cuenta como un fallo.
  • Una entrega fallida se reintenta, hasta 5 intentos en total. Las esperas entre intentos aumentan: unos 30 segundos, 1 minuto, 2 minutos y 4 minutos.
  • Usa X-Webhook-Delivery-Id para ignorar una entrega que ya has procesado.

Cada entrega tiene uno de estos estados:

EstadoQué significa
pendingEsperando a enviarse.
deliveredTu URL respondió con un estado 2xx.
failedEl último intento falló. Si quedan intentos, se reintenta.
exhaustedLos 5 intentos fallaron. No se volverá a intentar.

La aplicación aún no muestra un registro de entregas. Puedes consultar las entregas a través de la API en GET /v1/salons/:salonId/webhook-endpoints/:webhookEndpointId/deliveries. Consulta Crear una aplicación de API.

Si las últimas 5 entregas a un webhook se agotan, Softalon desactiva el webhook. Arregla tu endpoint y vuelve a activar el interruptor de estado. Los eventos que ocurren mientras un webhook está desactivado no se envían después.

Editar, pausar o eliminar un webhook

  • Pausar: desactiva el interruptor de la columna Estado.
  • Editar: abre el menú de la fila y elige Actualizar.
  • Eliminar: abre el menú de la fila y elige Eliminar.

Los webhooks solo envían mientras tu salón tiene una suscripción activa, en prueba o vencida en un plan que incluye webhooks.

Preguntas frecuentes

Cada entrega se envía por separado y se reintenta con su propio calendario, así que no confíes en el orden en que llegan las peticiones. Usa las marcas de tiempo del propio objeto.