Kadens logoKadens logoKadens
  • Descubrir
  • Precios
Iniciar sesiónComenzar
Kadens logoKadens logoKadens

Enseñanza

  1. Primeros pasos
  2. Academia
  3. Certificados
  4. Aprendizaje
  5. Cursos

Dinero

  1. Suscripciones
  2. Finanzas
  3. Entradas

Agenda

  1. Eventos
  2. Trabajo

Personas

  1. Comunidad
  2. Mailing
  3. Formularios
  4. Solicitudes
  5. Comunidades

Plataforma

  1. Mi sitio
  2. Descubrir
  3. Cuenta

Desarrolladores

  1. Resumen
  2. Claves API y permisos
  3. Widgets para sitios web
  4. Webhooks
  5. Asistentes de IA (MCP)
  6. API REST
¿No encuentras lo que buscas?Busca de nuevo··Habla con nosotros
Kadens logoKadens logoKadens

Tu éxito es nuestra misión. Kadens ayuda a los profesionales del movimiento a darse a conocer, gestionar su día a día y crecer con confianza. Todo en un solo sitio.

Producto

  • Descubrir
  • Cursos
  • Eventos
  • Comunidades
  • Mentoría

Para negocios

  • Kadens para enseñar
  • Kadens para eventos
  • Kadens para formularios
  • Kadens para certificados
  • Crea tu sitio
  • Precios
  • Reserva una demo en directo

Recursos

  • Centro de ayuda
  • Novedades
  • Desarrolladores
  • Soporte

Empresa

  • Contacto
  • Instagram
  • Política de privacidad
  • Condiciones de servicio
  • Política de cookies
Centro de ayudaContacto
Explorar la documentación · Webhooks

Enseñanza

  1. Primeros pasos
  2. Academia
  3. Certificados
  4. Aprendizaje
  5. Cursos

Dinero

  1. Suscripciones
  2. Finanzas
  3. Entradas

Agenda

  1. Eventos
  2. Trabajo

Personas

  1. Comunidad
  2. Mailing
  3. Formularios
  4. Solicitudes
  5. Comunidades

Plataforma

  1. Mi sitio
  2. Descubrir
  3. Cuenta

Desarrolladores

  1. Resumen
  2. Claves API y permisos
  3. Widgets para sitios web
  4. Webhooks
  5. Asistentes de IA (MCP)
  6. API REST
  1. Centro de ayuda
  2. Desarrolladores
  3. Webhooks para desarrolladores

Webhooks para desarrolladores

Kadens envía una petición HTTPS a tu endpoint cada vez que ocurre algo en tu cuenta. Cada petición va firmada, se reintenta hasta que funciona y aparece en tu registro de entregas.

·9 min
En esta página
  1. Qué son los webhooks
  2. Guía rápida
  3. Prueba sin servidor
  4. Cuerpo de la petición
  5. Verificar firmas
  6. Gestiona eventos de forma segura
  7. Reintentos y límites
  8. Datos personales
  9. Gestiona endpoints
  10. Catálogo de eventos
  11. Solución de problemas
  12. ¿Y ahora qué?

Qué son los webhooks

Un webhook es un mensaje que Kadens envía a una dirección web que elijas cada vez que ocurre algo en tu cuenta: se paga un pedido, se emite una entrada, alguien hace check-in. Tu sistema lo recibe y hace el resto, por ejemplo añadiendo al comprador a tu lista de correo o actualizando una hoja de cálculo.

Qué necesitas

  • Una dirección HTTPS pública que acepte peticiones POST. ¿Aún no tienes servidor? El receptor de pruebas te da uno con un clic.
  • Acceso a Integraciones en tu panel de Kadens.

¿Usas Zapier, Make, n8n o tu propio código? Pueden crear y eliminar endpoints por ti con una clave API, a través de la API REST.

Leer sobre REST hooks

Guía rápida

  1. 1

    Añade un endpoint

    Abre Webhooks en tu panel, elige Añadir endpoint, pega tu dirección HTTPS y elige los eventos que debe recibir. Copia el secreto de firma: solo se muestra una vez.
  2. 2

    Envía un evento de prueba

    En la página del endpoint, elige Enviar evento de prueba. Kadens envía un evento de muestra, firmado como uno real, con livemode en false y todos los id marcados como id de prueba.
  3. 3

    Verifica la firma

    Antes de confiar en el cuerpo, comprueba su firma en tu servidor con el secreto de firma. Copia el código de tu lenguaje en Verificar firmas.
  4. 4

    Responde con un estado 2xx

    Responde con cualquier estado 2xx en cuanto se guarde el evento. Cualquier otra respuesta, o ninguna, cuenta como fallo y la entrega se reintenta.
Configúralo ahora
Inicia sesión y abre Webhooks para añadir tu primer endpoint.
Abrir Webhooks

Prueba sin servidor

Kadens puede alojar un receptor de pruebas por ti. Elige Probar con un receptor de pruebas en la página de Webhooks: Kadens crea una dirección de prueba privada, conecta un endpoint que recibe todos los eventos y le envía un evento de prueba. Cada petición aparece en la página de ese endpoint en segundos, con sus cabeceras, su cuerpo y si la firma coincidió.

El receptor de pruebas guarda las últimas 50 peticiones durante 7 días, y los primeros 64 KB de cada cuerpo.

Observa llegar un webhook firmado
Inicia sesión, abre Webhooks y elige Probar con un receptor de pruebas.
Abrir Webhooks

Cuerpo de la petición

Todos los eventos llegan en el mismo sobre JSON, versión 2026-10-01. El evento en sí va en data.

CampoTipoDescripción
idstringId único del evento, que empieza por evt_. El mismo valor llega en la cabecera webhook-id y se mantiene igual en cada reintento, reenvío y repetición.
typestringEl tipo de evento, por ejemplo order.paid. El catálogo de eventos los enumera todos.
versionstringLa versión del contrato que sigue el payload. Hoy es 2026-10-01.
occurred_atstringCuándo ocurrió, como fecha y hora ISO 8601.
account{ id, name }La cuenta de Kadens a la que pertenece el evento: su id y su nombre.
subject.typestringEl tipo de registro sobre el que trata el evento, por ejemplo order, booking o subscription.
subject.idstringEl id de ese registro. Todos los eventos sobre el mismo registro llevan el mismo id.
subject.sequenceinteger | nullUn número que crece con cada cambio del mismo registro, para que puedas saber qué evento es más reciente. null cuando el registro no tiene un orden de cambios.
correlation_idstring | nullEnlaza eventos que vienen de la misma acción, cuando la hay. En caso contrario, null.
livemodebooleantrue para actividad real. false para eventos de prueba, cuyos id también están marcados como id de prueba.
dataobjectEl evento en sí. Sus campos dependen del tipo: abre una muestra en el catálogo de eventos.
Un cuerpo de petición completo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{
  "id": "evt_2f8a1c7e9b3d4e5fa6c7d8e9f0a1b2c3",
  "type": "order.paid",
  "version": "2026-10-01",
  "occurred_at": "2026-10-01T10:00:00Z",
  "account": {
    "id": "ent_1a0f",
    "name": "Barcelona Salsa Studio"
  },
  "subject": {
    "type": "order",
    "id": "ord_91ac04",
    "sequence": 2
  },
  "correlation_id": null,
  "livemode": true,
  "data": {
    "order": {
      "id": "ord_91ac04",
      "status": "paid",
      "created_at": "2026-10-01T09:58:02Z",
      "paid_at": "2026-10-01T10:00:00Z",
      "event": {
        "id": "evt_7f3c2a",
        "name": "Salsa Congress Barcelona 2026"
      },
      "totals": {
        "gross": {
          "amount": 12000,
          "currency": "EUR"
        },
        "fees": {
          "amount": 600,
          "currency": "EUR"
        },
        "net": {
          "amount": 11400,
          "currency": "EUR"
        },
        "tax": {
          "amount": 2083,
          "currency": "EUR"
        }
      },
      "buyer": {
        "entity_id": "ent_5b21",
        "name": "Lucia Martin",
        "email": "lucia@example.com"
      },
      "lines": [
        {
          "ticket_type_id": "tt_full_pass",
          "name": "Full pass",
          "quantity": 1,
          "unit_price": {
            "amount": 12000,
            "currency": "EUR"
          }
        }
      ]
    }
  }
}

Verificar firmas

Las peticiones siguen la especificación Standard Webhooks, así que las bibliotecas oficiales las verifican sin código propio de Kadens. Verifica siempre sobre el cuerpo sin procesar.

CabeceraDescripción
webhook-idÚnico por evento. Úsalo para ignorar una petición que ya procesaste.
webhook-timestampSegundos Unix en que se firmó la petición. Rechaza las peticiones con más de 300 segundos de antigüedad.
webhook-signatureUna o más firmas v1 separadas por espacios. Durante 24 horas después de rotar un secreto, firman tanto el antiguo como el nuevo.
Mantén el secreto de firma privado
Cada endpoint tiene su propio secreto de firma, que empieza por whsec_. Guárdalo en una variable de entorno, nunca en tu código ni en un repositorio.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// npm install standardwebhooks
import { Webhook } from 'standardwebhooks';

const wh = new Webhook(process.env.KADENS_WEBHOOK_SECRET);

// Use the RAW request body, exactly as received (not re-serialized JSON).
app.post('/webhooks/kadens', express.raw({ type: 'application/json' }), (req, res) => {
    try {
        const event = wh.verify(req.body.toString('utf8'), req.headers);
        // event.type, event.data
        res.sendStatus(200);
    } catch {
        res.sendStatus(400);
    }
});

Gestiona eventos de forma segura

El mismo evento puede llegar dos veces, tarde o desordenado. Tres hábitos hacen seguro tu receptor.

Procesa cada evento una sola vez

Guarda el webhook-id de cada evento que gestiones. Si el mismo vuelve a llegar tras un reintento, un reenvío o una repetición, responde 2xx y omítelo.

Ordena los eventos

Un reintento puede hacer que un evento antiguo llegue después de uno más reciente. Cuando subject.sequence está definido, conserva el más alto que hayas gestionado para cada subject.id e ignora cualquiera inferior.

Responde primero, trabaja después

Responde 2xx en cuanto el evento esté guardado de forma segura, y haz el trabajo lento en segundo plano. Una respuesta que tarde más de 10 segundos cuenta como fallo y se reintenta.

Reintentos y límites

Responde con cualquier estado 2xx para confirmar una entrega. Cualquier otro estado, o no responder, cuenta como fallo.

Una entrega fallida se reintenta 10 veces más con esperas cada vez mayores, durante unos 3 días. También puedes reenviarla o reproducir un intervalo de tiempo desde tu panel.

Si tu endpoint responde 410 Gone, se desactiva de inmediato y no recibe nada más hasta que lo actives.

Un endpoint que falla durante 5 días sin un solo éxito se desactiva, y te avisamos.

Los eventos y las entregas se guardan durante 30 días.

Cada cuenta puede tener hasta 10 endpoints propios. Los endpoints que crean Zapier, Make o n8n no cuentan para ese límite y tienen su propio máximo de 50.

Cuándo ocurre cada reintento

ReintentoCuándo
Reintento 130 segundos después del intento anterior
Reintento 22 minutos después del intento anterior
Reintento 310 minutos después del intento anterior
Reintento 430 minutos después del intento anterior
Reintento 51 hora después del intento anterior
Reintento 63 horas después del intento anterior
Reintento 76 horas después del intento anterior
Reintento 812 horas después del intento anterior
Reintento 924 horas después del intento anterior
Reintento 1024 horas después del intento anterior

Datos personales

Los nombres y direcciones de correo de compradores, poseedores de entradas y asistentes son datos personales. Por defecto Kadens elimina esos campos de los datos antes de enviarlos, así que el endpoint recibe el evento sin ellos.

Para recibirlos, edita el endpoint y activa Incluir datos personales. Una vez que los datos salen de Kadens, protegerlos de tu lado es tu responsabilidad.

Gestiona endpoints

AcciónDescripción
Rotar secretoCrea un nuevo secreto de firma. El antiguo sigue firmando durante 24 horas, para que puedas actualizar tu servidor sin perder ningún evento.
ReenviarVuelve a enviar todos los eventos de un rango de fechas que el endpoint no recibió o no pudo recibir, hasta 30 días atrás.
Volver a enviarVuelve a enviar una entrega, desde el registro de entregas del endpoint.
Enviar evento de pruebaEnvía una muestra de cualquier tipo de evento solo a este endpoint, marcada como prueba.
Desactivar / ActivarDetiene las entregas hasta que vuelvas a activar el endpoint. Después de activarlo, repite el rango que se perdió.

Un endpoint que falla durante 5 días sin un solo éxito se desactiva automáticamente, y se te notifica.

Catálogo de eventos

Suscribe un endpoint a los eventos que necesita. Cada uno muestra los datos que lleva.

Pedidos

order.paid

Se ha pagado un pedido.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{
  "order": {
    "id": "ord_91ac04",
    "status": "paid",
    "created_at": "2026-10-01T09:58:02Z",
    "paid_at": "2026-10-01T10:00:00Z",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "totals": {
      "gross": {
        "amount": 12000,
        "currency": "EUR"
      },
      "fees": {
        "amount": 600,
        "currency": "EUR"
      },
      "net": {
        "amount": 11400,
        "currency": "EUR"
      },
      "tax": {
        "amount": 2083,
        "currency": "EUR"
      }
    },
    "buyer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "lines": [
      {
        "ticket_type_id": "tt_full_pass",
        "name": "Full pass",
        "quantity": 1,
        "unit_price": {
          "amount": 12000,
          "currency": "EUR"
        }
      }
    ]
  }
}
order.refunded

Se ha reembolsado un pedido, total o parcialmente.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
  "order": {
    "id": "ord_91ac04",
    "status": "refunded",
    "created_at": "2026-10-01T09:58:02Z",
    "paid_at": "2026-10-01T10:00:00Z",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "totals": {
      "gross": {
        "amount": 12000,
        "currency": "EUR"
      },
      "fees": {
        "amount": 600,
        "currency": "EUR"
      },
      "net": {
        "amount": 11400,
        "currency": "EUR"
      },
      "tax": {
        "amount": 2083,
        "currency": "EUR"
      }
    },
    "buyer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "lines": [
      {
        "ticket_type_id": "tt_full_pass",
        "name": "Full pass",
        "quantity": 1,
        "unit_price": {
          "amount": 12000,
          "currency": "EUR"
        }
      }
    ]
  },
  "refund": {
    "id": "ref_0c7d",
    "amount": {
      "amount": 12000,
      "currency": "EUR"
    },
    "refunded_at": "2026-10-03T08:12:40Z"
  }
}
checkout.abandoned

Un comprador empezó una compra y se fue sin pagar.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "checkout": {
    "id": "pin_3c8e21",
    "item": {
      "kind": "course",
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "buyer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "amount": {
      "amount": 9900,
      "currency": "EUR"
    },
    "started_at": "2026-10-01T09:40:00Z"
  },
  "abandoned_at": "2026-10-01T10:40:00Z"
}

Entradas

ticket.issued

Se ha emitido una entrada a su titular.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "ticket": {
    "id": "tkt_33d0e1",
    "order_id": "ord_91ac04",
    "status": "active",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "ticket_type": {
      "id": "tt_full_pass",
      "name": "Full pass"
    },
    "holder": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "issued_at": "2026-10-01T10:00:01Z"
  }
}
ticket.reassigned

Una entrada ha pasado a otro titular.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "ticket": {
    "id": "tkt_33d0e1",
    "order_id": "ord_91ac04",
    "status": "active",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "ticket_type": {
      "id": "tt_full_pass",
      "name": "Full pass"
    },
    "holder": {
      "entity_id": "ent_8e40",
      "name": "Marco Rossi",
      "email": "marco@example.com"
    },
    "issued_at": "2026-10-01T10:00:01Z"
  },
  "previous_holder": {
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com"
  },
  "reassigned_at": "2026-10-02T17:30:00Z"
}
ticket.canceled

Se ha cancelado una entrada.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "ticket": {
    "id": "tkt_33d0e1",
    "order_id": "ord_91ac04",
    "status": "canceled",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "ticket_type": {
      "id": "tt_full_pass",
      "name": "Full pass"
    },
    "holder": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "issued_at": "2026-10-01T10:00:01Z"
  },
  "canceled_at": "2026-10-04T12:00:00Z"
}

Asistentes

attendee.registered

Se ha registrado un asistente en un evento.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "attendee": {
    "ticket_id": "tkt_33d0e1",
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    }
  },
  "registered_at": "2026-10-01T10:05:00Z"
}
attendee.checked_in

Se ha registrado la llegada de un asistente en la puerta.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "attendee": {
    "ticket_id": "tkt_33d0e1",
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    }
  },
  "checked_in_at": "2026-10-10T19:02:11Z"
}
attendee.check_in_reverted

Se ha deshecho un registro de llegada.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "attendee": {
    "ticket_id": "tkt_33d0e1",
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    }
  },
  "reverted_at": "2026-10-10T19:04:30Z"
}
attendee.no_show

Un titular de entrada no hizo el check in antes de terminar la sesión.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "attendee": {
    "ticket_id": "tkt_33d0e1",
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    }
  },
  "finalized_at": "2026-10-10T23:30:00Z"
}

Eventos

event.ended

Uno de tus eventos terminó.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "edition": {
    "id": "eed_2b71",
    "name": "Salsa Congress Barcelona 2026",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona"
    },
    "starts_at": "2026-10-09T16:00:00Z",
    "ends_at": "2026-10-11T22:00:00Z",
    "timezone": "Europe/Madrid"
  },
  "ended_at": "2026-10-11T22:00:00Z"
}

Reservas

booking.confirmed

Se confirmó una reserva para una sesión.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "reserved",
    "session": {
      "id": "ses_62f1a8",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-08T17:00:00Z",
      "ends_at": "2026-10-08T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "confirmed_at": "2026-10-01T10:00:00Z"
}
booking.declined

Se rechazó una solicitud de reserva.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "cancelled",
    "session": {
      "id": "ses_62f1a8",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-08T17:00:00Z",
      "ends_at": "2026-10-08T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "declined_at": "2026-10-01T10:00:00Z"
}
booking.canceled

Se canceló una reserva o caducó.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "cancelled",
    "session": {
      "id": "ses_62f1a8",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-08T17:00:00Z",
      "ends_at": "2026-10-08T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "reason": "canceled",
  "canceled_at": "2026-10-03T09:12:00Z"
}
booking.moved

Se movió una reserva a otra sesión.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "reserved",
    "session": {
      "id": "ses_7b90d2",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-15T17:00:00Z",
      "ends_at": "2026-10-15T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "previous_session": {
    "id": "ses_62f1a8",
    "status": "scheduled",
    "program": {
      "id": "prg_0c4e",
      "name": "Contemporary Technique, Level 2"
    },
    "starts_at": "2026-10-08T17:00:00Z",
    "ends_at": "2026-10-08T18:30:00Z",
    "timezone": "Europe/Madrid",
    "location": {
      "delivery_mode": "in_person",
      "room": {
        "id": "room_a1",
        "name": "Studio A"
      }
    }
  },
  "moved_at": "2026-10-04T11:40:00Z"
}
booking.no_show

Un asistente reservado no hizo el check in antes de que terminara la sesión.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "reserved",
    "session": {
      "id": "ses_62f1a8",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-08T17:00:00Z",
      "ends_at": "2026-10-08T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "finalized_at": "2026-10-08T19:30:00Z"
}
session.canceled

Se canceló una sesión programada.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "session": {
    "id": "ses_62f1a8",
    "status": "cancelled",
    "program": {
      "id": "prg_0c4e",
      "name": "Contemporary Technique, Level 2"
    },
    "starts_at": "2026-10-08T17:00:00Z",
    "ends_at": "2026-10-08T18:30:00Z",
    "timezone": "Europe/Madrid",
    "location": {
      "delivery_mode": "in_person",
      "room": {
        "id": "room_a1",
        "name": "Studio A"
      }
    }
  },
  "cancellation_reason": "Teacher unwell",
  "canceled_at": "2026-10-07T08:00:00Z"
}
session.rescheduled

Se cambió la hora de una sesión programada.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "session": {
    "id": "ses_62f1a8",
    "status": "scheduled",
    "program": {
      "id": "prg_0c4e",
      "name": "Contemporary Technique, Level 2"
    },
    "starts_at": "2026-10-08T18:00:00Z",
    "ends_at": "2026-10-08T19:30:00Z",
    "timezone": "Europe/Madrid",
    "location": {
      "delivery_mode": "in_person",
      "room": {
        "id": "room_a1",
        "name": "Studio A"
      }
    }
  },
  "previous_starts_at": "2026-10-08T17:00:00Z",
  "previous_ends_at": "2026-10-08T18:30:00Z",
  "rescheduled_at": "2026-10-06T15:20:00Z"
}
pack.credits_low

Un bono de clases llegó a su umbral bajo de créditos.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "pack": {
    "id": "pkp_1e90",
    "product": {
      "id": "pck_10cls",
      "name": "10 class pack"
    },
    "holder": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "credits_remaining": 2,
    "credits_total": 10,
    "expires_at": "2027-01-31T23:59:59Z"
  },
  "threshold": 2,
  "crossed_at": "2026-10-08T17:00:05Z"
}

Inscripciones

enrollment.created

Se inscribió a un estudiante en un curso.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_4b1e",
      "name": "January 2027",
      "starts_at": "2027-01-11T18:00:00Z",
      "ends_at": "2027-03-29T20:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "enrolled_at": "2026-12-02T10:15:00Z"
}
enrollment.ended

Terminó la inscripción de un estudiante en un curso.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_4b1e",
      "name": "January 2027",
      "starts_at": "2027-01-11T18:00:00Z",
      "ends_at": "2027-03-29T20:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "ended_at": "2027-02-02T10:15:00Z"
}
enrollment.moved

Se movió a un estudiante a otra edición del curso.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_7d02",
      "name": "April 2027",
      "starts_at": "2027-04-12T17:00:00Z",
      "ends_at": "2027-06-28T19:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "previous_edition": {
    "id": "ced_4b1e",
    "name": "January 2027",
    "starts_at": "2027-01-11T18:00:00Z",
    "ends_at": "2027-03-29T20:00:00Z",
    "timezone": "Europe/Madrid"
  },
  "moved_at": "2026-12-20T09:00:00Z"
}
lesson.completed

Un estudiante completó una lección de tu curso.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_4b1e",
      "name": "January 2027",
      "starts_at": "2027-01-11T18:00:00Z",
      "ends_at": "2027-03-29T20:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "lesson": {
    "id": "itm_2f81",
    "name": "Basic step and timing"
  },
  "completed_at": "2026-12-05T19:40:00Z"
}
course.completed

Un estudiante completó tu curso.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_4b1e",
      "name": "January 2027",
      "starts_at": "2027-01-11T18:00:00Z",
      "ends_at": "2027-03-29T20:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "completed_at": "2027-03-29T20:10:00Z"
}

Suscripciones

subscription.created

Un cliente se suscribió a un plan.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "active",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  }
}
subscription.renewed

Se renovó una suscripción y se cobró su pago.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "active",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-11-01T00:00:00Z",
    "current_period_end": "2026-12-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "invoice": {
    "id": "in_1Q2w3E",
    "amount": {
      "amount": 4900,
      "currency": "EUR"
    }
  },
  "renewed_at": "2026-11-01T00:04:12Z"
}
subscription.payment_failed

Falló el pago de una suscripción.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "past_due",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "access_ends_at": "2026-11-08T00:04:12Z",
  "failure_code": "card_declined",
  "failed_at": "2026-11-01T00:04:12Z"
}
subscription.canceled

Se canceló una suscripción.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "active",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": true,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "cancel_at_period_end": true,
  "ends_at": "2026-11-01T00:00:00Z",
  "canceled_at": "2026-10-15T09:30:00Z"
}
subscription.reactivated

Se reactivó una suscripción cancelada.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "active",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "reactivated_at": "2026-10-20T18:00:00Z"
}
subscription.plan_changed

Un cliente cambió a otro plan.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
  "subscription": {
    "id": "sub_8f01bc",
    "status": "active",
    "plan": {
      "id": "plan_9b22",
      "name": "Full bundle"
    },
    "price": {
      "id": "price_5d6e",
      "amount": {
        "amount": 8900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "previous_subscription_ids": [
    "sub_4d2e9a"
  ],
  "credit_applied": {
    "amount": 2450,
    "currency": "EUR"
  },
  "next_billing_at": "2026-11-15T00:00:00Z",
  "changed_at": "2026-10-15T12:00:00Z"
}
subscription.ended

Terminó una suscripción y se cortó su acceso.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "canceled",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": "2026-11-01T00:00:00Z",
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "reason": "cancellation_requested",
  "ended_at": "2026-11-01T00:00:00Z"
}
subscription.trial_ending

La prueba gratuita de un suscriptor termina en unos días.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "trialing",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "trial_ends_at": "2026-10-15T00:00:00Z"
}

Certificados

certificate.issued

Se emitió un certificado a su titular.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  "certificate": {
    "id": "icrt_4d19b2",
    "number": "KD-2026-000142",
    "status": "active",
    "certificate": {
      "id": "crt_7a02",
      "name": "Contemporary Foundations"
    },
    "template": {
      "id": "tpl_31c8",
      "name": "2026 cohort"
    },
    "recipient": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "issued_at": "2026-10-01T10:00:00Z",
    "expires_at": null,
    "revoked_at": null,
    "verification_url": "https://kadens.io/verify-certificate/KD-2026-000142"
  }
}
certificate.revoked

Se revocó un certificado.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
  "certificate": {
    "id": "icrt_4d19b2",
    "number": "KD-2026-000142",
    "status": "revoked",
    "certificate": {
      "id": "crt_7a02",
      "name": "Contemporary Foundations"
    },
    "template": {
      "id": "tpl_31c8",
      "name": "2026 cohort"
    },
    "recipient": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "issued_at": "2026-10-01T10:00:00Z",
    "expires_at": null,
    "revoked_at": "2026-11-12T08:30:00Z",
    "verification_url": "https://kadens.io/verify-certificate/KD-2026-000142"
  },
  "reason": "Issued to the wrong student",
  "revoked_at": "2026-11-12T08:30:00Z"
}

Pagos

payout.paid

Un pago llegó a tu cuenta bancaria.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
{
  "payout": {
    "id": "po_1Q2w3E4r",
    "status": "paid",
    "amount": {
      "amount": 113400,
      "currency": "EUR"
    },
    "arrival_date": "2026-10-06T00:00:00Z"
  },
  "paid_at": "2026-10-06T06:14:09Z"
}
payout.failed

Un pago falló y el dinero no se movió.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
  "payout": {
    "id": "po_1Q2w3E4r",
    "status": "failed",
    "amount": {
      "amount": 113400,
      "currency": "EUR"
    },
    "arrival_date": "2026-10-06T00:00:00Z"
  },
  "failure": {
    "code": "account_closed",
    "message": "The bank account has been closed."
  },
  "failed_at": "2026-10-06T06:14:09Z"
}

Contactos

lead.captured

Se captó un nuevo lead.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  "lead": {
    "id": "lead_4a90",
    "audience_id": "aud_12f0",
    "email": "lucia@example.com",
    "first_name": "Lucia",
    "last_name": "Martin",
    "consent_at": "2026-10-01T09:12:00Z",
    "source": {
      "site_id": "site_77a1",
      "page_id": "page_home",
      "block_id": "blk_newsletter",
      "url": "https://salsa.example.com/"
    }
  },
  "captured_at": "2026-10-01T09:12:00Z"
}
form.submitted

Se envió un formulario.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
  "submission": {
    "id": "sub_61c2",
    "form": {
      "id": "frm_0d3e",
      "title": "Audition application",
      "type": "application"
    },
    "target": {
      "scope": "course",
      "id": "crs_19ab"
    },
    "submitter": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "answers": [
      {
        "field_id": "b2c1e8f0-3a4d-4c5e-9f60-1a2b3c4d5e6f",
        "label": "Dance experience",
        "type": "textarea",
        "value": "Five years of salsa",
        "display": "Five years of salsa"
      },
      {
        "field_id": "c3d2f9a1-4b5e-4d6f-8a71-2b3c4d5e6f70",
        "label": "Preferred role",
        "type": "select",
        "value": "follower",
        "display": "Follower"
      }
    ],
    "submitted_at": "2026-10-02T11:40:00Z"
  }
}
application.decided

Aprobaste, rechazaste o pusiste en lista de espera una solicitud.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "submission": {
    "id": "sub_61c2",
    "form": {
      "id": "frm_0d3e",
      "title": "Audition application",
      "type": "application"
    },
    "target": {
      "scope": "course",
      "id": "crs_19ab"
    },
    "submitter": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "submitted_at": "2026-10-02T11:40:00Z"
  },
  "decision": "approved",
  "decided_at": "2026-10-06T09:00:00Z"
}
exam.results_released

Un candidato ya puede ver los resultados de su examen.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
  "submission": {
    "id": "sub_61c2",
    "form": {
      "id": "frm_0d3e",
      "title": "Audition application",
      "type": "exam"
    },
    "target": {
      "scope": "course",
      "id": "crs_19ab"
    },
    "submitter": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "submitted_at": "2026-10-02T11:40:00Z"
  },
  "result": {
    "passed": true,
    "score_percent": 86
  },
  "released_at": "2026-10-09T12:00:00Z"
}
follower.added

Alguien empezó a seguirte.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
{
  "follower": {
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com"
  },
  "followed_at": "2026-10-01T08:00:00Z"
}
community.member.joined

Un miembro se unió a una de tus comunidades.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
{
  "membership": {
    "member": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "source": "ticket_holder"
  },
  "joined_at": "2026-10-01T10:00:02Z"
}
community.member.left

Un miembro dejó una de tus comunidades.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
{
  "membership": {
    "member": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "source": "ticket_holder"
  },
  "reason": "ticket_released",
  "left_at": "2026-10-05T08:00:00Z"
}
channel_automation.webhook

Una automatización llegó a un paso de envío de webhook para un contacto.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "automation": {
    "id": "aut_2c81f0",
    "step_id": "step_send_webhook",
    "run_id": "run_8e41d7"
  },
  "contact": {
    "id": "con_51a9e2",
    "entity_id": null,
    "username": "lucia.dances",
    "email": "lucia@example.com",
    "tag_ids": [
      "tag_vip"
    ]
  },
  "channel": {
    "type": "instagram",
    "account_id": "cha_7d02b1"
  },
  "fired_at": "2026-10-01T10:00:00Z"
}

Feedback

review.submitted

Alguien dejó una reseña.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "review": {
    "id": "rev_8d02",
    "rating": 5,
    "comment": "Clear, patient and fun.",
    "target": {
      "kind": "course",
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "author": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "submitted_at": "2026-10-12T20:15:00Z"
}
feedback.completed

Respondiste la solicitud de feedback de un estudiante.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "request": {
    "id": "fbr_51a7",
    "offering": {
      "id": "mnt_33c0",
      "name": "Video feedback on your solo"
    },
    "student": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "completed_at": "2026-10-14T10:30:00Z"
}

Recompensas

reward.expiring

Una recompensa que le diste a alguien caduca pronto.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "reward": {
    "id": "grw_0a4f",
    "name": "Free drop-in class",
    "kind": "free_class",
    "holder": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "expires_at": "2026-11-01T00:00:00Z"
  }
}

Automatizaciones

automation.step_reached

Una secuencia llegó a un paso de webhook para una persona.

Datos de ejemplo
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "automation": {
    "id": "aut_3c81"
  },
  "run": {
    "id": "run_9d42"
  },
  "step": {
    "id": "s_hotlead",
    "key": "hot_lead"
  },
  "person": {
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com"
  },
  "reached_at": "2026-10-03T08:15:00Z"
}

Webhooks

webhook.test

Un evento de prueba que enviaste desde Kadens.

Datos de ejemplo
JSON
1
2
3
{
  "message": "This is a test event sent from Kadens."
}

Solución de problemas

No llega nada

Comprueba que el endpoint está activado y suscrito al evento, y que su dirección es pública y usa HTTPS. Después envía un evento de prueba y abre la entrega para ver qué respondió tu servidor.

La firma nunca coincide

Verifica contra el cuerpo de la petición sin procesar, antes de cualquier análisis JSON. Usa el secreto de este endpoint y comprueba el reloj de tu servidor: las peticiones más antiguas de 300 segundos se rechazan.

El mismo evento llega dos veces

Es normal tras un reintento, un reenvío o una repetición. Omite cualquier webhook-id que ya hayas gestionado.

El endpoint se desactivó

Falló durante 5 días sin un éxito, respondió 410 Gone, o alguien lo desactivó. Arregla el servidor, activa el endpoint y repite el rango que se perdió.

Faltan nombres o direcciones de correo

Los datos personales se eliminan a menos que el endpoint los incluya. Consulta Datos personales más arriba.

¿Y ahora qué?

Abrir en el panel

¿Te ha resultado útil?

Anterior
Widgets para sitios web
Siguiente
Asistentes de IA (MCP)

En esta página

  1. Qué son los webhooks
  2. Guía rápida
  3. Prueba sin servidor
  4. Cuerpo de la petición
  5. Verificar firmas
  6. Gestiona eventos de forma segura
  7. Reintentos y límites
  8. Datos personales
  9. Gestiona endpoints
  10. Catálogo de eventos
  11. Solución de problemas
  12. ¿Y ahora qué?