Kadens logoKadens logoKadens
  • Scopri
  • Prezzi
AccediInizia subito
Kadens logoKadens logoKadens

Insegnamento

  1. Primi passi
  2. Accademia
  3. Certificati
  4. Apprendimento
  5. Corsi

Denaro

  1. Abbonamenti
  2. Finanze
  3. Biglietti

Agenda

  1. Eventi
  2. Lavoro

Persone

  1. Comunità
  2. Newsletter
  3. Formulari
  4. Candidature
  5. Comunità

Piattaforma

  1. Il mio sito
  2. Scopri
  3. Account

Sviluppatori

  1. Panoramica
  2. Chiavi API e permessi
  3. Widget per siti web
  4. Webhook
  5. Assistenti IA (MCP)
  6. API REST
Non trovi quello che cerchi?Cerca di nuovo··Parla con noi
Kadens logoKadens logoKadens

Dove i ballerini si connettono, imparano e crescono

Prodotti

  • Scopri
  • Corsi
  • Eventi
  • Comunità
  • Mentoring

Per le aziende

  • Kadens per insegnare
  • Kadens per eventi
  • Kadens per i moduli
  • Kadens per i certificati
  • Crea il tuo sito
  • Prezzi
  • Prenota una demo dal vivo

Risorse

  • Centro assistenza
  • Novità
  • Sviluppatori
  • Supporto

Azienda

  • Contatto
  • Instagram
  • Politica di privacy
  • Condizioni d'uso
  • Politica sui cookie
Centro assistenzaContatto
Esplora la documentazione · Webhook

Insegnamento

  1. Primi passi
  2. Accademia
  3. Certificati
  4. Apprendimento
  5. Corsi

Denaro

  1. Abbonamenti
  2. Finanze
  3. Biglietti

Agenda

  1. Eventi
  2. Lavoro

Persone

  1. Comunità
  2. Newsletter
  3. Formulari
  4. Candidature
  5. Comunità

Piattaforma

  1. Il mio sito
  2. Scopri
  3. Account

Sviluppatori

  1. Panoramica
  2. Chiavi API e permessi
  3. Widget per siti web
  4. Webhook
  5. Assistenti IA (MCP)
  6. API REST
  1. Centro assistenza
  2. Sviluppatori
  3. Webhook per sviluppatori

Webhook per sviluppatori

Kadens invia una richiesta HTTPS al tuo endpoint ogni volta che succede qualcosa nel tuo account. Ogni richiesta è firmata, ritentata finché non riesce ed elencata nel registro delle consegne.

·9 min
In questa pagina
  1. Cosa sono i webhook
  2. Guida rapida
  3. Prova senza un server
  4. Corpo della richiesta
  5. Verifica delle firme
  6. Gestisci gli eventi in modo sicuro
  7. Nuovi tentativi e limiti
  8. Dati personali
  9. Gestisci gli endpoint
  10. Catalogo degli eventi
  11. Risoluzione dei problemi
  12. E adesso?

Cosa sono i webhook

Un webhook è un messaggio che Kadens invia a un indirizzo web che scegli tu ogni volta che succede qualcosa nel tuo account: un ordine viene pagato, un biglietto viene emesso, qualcuno effettua il check-in. Il tuo sistema lo riceve e fa il resto, per esempio aggiungendo l'acquirente alla tua mailing list o aggiornando un foglio di calcolo.

Cosa ti serve

  • Un indirizzo HTTPS pubblico che accetta richieste POST. Non hai ancora un server? Il ricevitore di test te ne dà uno con un clic.
  • Accesso a Integrazioni nella tua dashboard Kadens.

Usi Zapier, Make, n8n o codice tuo? Possono creare e rimuovere endpoint per te con una chiave API, tramite l'API REST.

Leggi info sui REST hook

Guida rapida

  1. 1

    Aggiungi un endpoint

    Apri Webhook nella tua dashboard, scegli Aggiungi endpoint, incolla il tuo indirizzo HTTPS e scegli gli eventi che deve ricevere. Copia il segreto di firma: viene mostrato una sola volta.
  2. 2

    Invia un evento di prova

    Nella pagina dell'endpoint, scegli Invia evento di prova. Kadens invia un evento di esempio, firmato come uno reale, con livemode impostato su false e ogni id contrassegnato come id di prova.
  3. 3

    Verifica la firma

    Prima di fidarti del corpo della richiesta, verifica la sua firma sul tuo server con il segreto di firma. Copia il codice per il tuo linguaggio da Verifica delle firme.
  4. 4

    Rispondi con uno stato 2xx

    Rispondi con qualsiasi stato 2xx non appena l'evento è stato salvato. Qualsiasi altra risposta, o nessuna risposta, conta come un errore e la consegna viene ritentata.
Configuralo ora
Accedi e apri Webhook per aggiungere il tuo primo endpoint.
Apri Webhook

Prova senza un server

Kadens può ospitare un ricevitore di test per te. Scegli Prova con un ricevitore di test nella pagina Webhook: Kadens crea un indirizzo di test privato, collega un endpoint che riceve ogni evento e gli invia un evento di prova. Ogni richiesta appare nella pagina di quell'endpoint entro pochi secondi, con le sue intestazioni, il suo corpo e se la firma corrispondeva.

Il ricevitore di test conserva le ultime 50 richieste per 7 giorni, e i primi 64 KB di ogni corpo.

Guarda arrivare un webhook firmato
Accedi, apri Webhook e scegli Prova con un ricevitore di test.
Apri Webhook

Corpo della richiesta

Ogni evento arriva nella stessa busta JSON, versione 2026-10-01. L'evento vero e proprio è in data.

CampoTipoDescrizione
idstringId univoco dell'evento, che inizia con evt_. Lo stesso valore arriva nell'intestazione webhook-id e resta identico a ogni ritentativo, reinvio e replay.
typestringIl tipo di evento, per esempio order.paid. Il catalogo degli eventi li elenca tutti.
versionstringLa versione del contratto seguita dal payload. Oggi è 2026-10-01.
occurred_atstringQuando è successo, come data e ora in formato ISO 8601.
account{ id, name }L'account Kadens a cui appartiene l'evento: il suo id e il suo nome.
subject.typestringIl tipo di record a cui si riferisce l'evento, per esempio order, booking o subscription.
subject.idstringL'id di quel record. Ogni evento sullo stesso record porta lo stesso id.
subject.sequenceinteger | nullUn numero che cresce a ogni modifica dello stesso record, così puoi capire quale evento è più recente. null quando il record non ha un ordine di modifiche.
correlation_idstring | nullCollega eventi che derivano dalla stessa azione, quando ce n'è una. Altrimenti null.
livemodebooleantrue per l'attività reale. false per gli eventi di prova, i cui id sono anch'essi contrassegnati come id di prova.
dataobjectL'evento vero e proprio. I suoi campi dipendono dal tipo: apri un esempio nel catalogo degli eventi.
Un corpo di richiesta 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"
          }
        }
      ]
    }
  }
}

Verifica delle firme

Le richieste seguono la specifica Standard Webhooks, quindi le librerie ufficiali le verificano senza codice specifico di Kadens. Verifica sempre il corpo grezzo.

IntestazioneDescrizione
webhook-idUnico per evento. Usalo per ignorare una richiesta già elaborata.
webhook-timestampSecondi Unix in cui la richiesta è stata firmata. Rifiuta le richieste più vecchie di 300 secondi.
webhook-signatureUna o più firme v1 separate da spazi. Per 24 ore dopo aver rigenerato un segreto, firmano sia il vecchio sia il nuovo.
Mantieni privato il segreto di firma
Ogni endpoint ha il proprio segreto di firma, che inizia con whsec_. Conservalo in una variabile d'ambiente, mai nel tuo codice o in un repository.
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);
    }
});

Gestisci gli eventi in modo sicuro

Lo stesso evento può arrivare due volte, in ritardo o fuori ordine. Tre abitudini rendono sicuro il tuo ricevitore.

Elabora ogni evento una sola volta

Salva l'intestazione webhook-id di ogni evento che gestisci. Se lo stesso arriva di nuovo dopo un ritentativo, un reinvio o un replay, rispondi 2xx e saltalo.

Metti gli eventi in ordine

Un ritentativo può far arrivare un evento più vecchio dopo uno più nuovo. Quando subject.sequence è impostato, conserva il valore più alto che hai gestito per ogni subject.id e ignora qualsiasi valore inferiore.

Rispondi prima, lavora dopo

Rispondi 2xx non appena l'evento è salvato in modo sicuro, poi svolgi il lavoro lento in background. Una risposta che impiega più di 10 secondi conta come un errore e viene ritentata.

Nuovi tentativi e limiti

Rispondi con uno stato 2xx per confermare una consegna. Qualsiasi altro stato, o nessuna risposta, conta come errore.

Una consegna non riuscita viene ritentata altre 10 volte con intervalli crescenti, per circa 3 giorni. Puoi anche reinviarla o riprodurre un intervallo di tempo dalla dashboard.

Se il tuo endpoint risponde 410 Gone, viene disabilitato subito e non riceve più nulla finché non lo riattivi.

Un endpoint che fallisce per 5 giorni senza un solo successo viene disattivato, e ricevi una notifica.

Gli eventi e le consegne sono conservati per 30 giorni.

Ogni account può avere fino a 10 endpoint propri. Gli endpoint creati da Zapier, Make o n8n non contano per questo limite e hanno un proprio massimo di 50.

Quando avviene ogni ritentativo

Nuovo tentativoQuando
Ritentativo 130 secondi dopo il tentativo precedente
Ritentativo 22 minuti dopo il tentativo precedente
Ritentativo 310 minuti dopo il tentativo precedente
Ritentativo 430 minuti dopo il tentativo precedente
Ritentativo 51 ora dopo il tentativo precedente
Ritentativo 63 ore dopo il tentativo precedente
Ritentativo 76 ore dopo il tentativo precedente
Ritentativo 812 ore dopo il tentativo precedente
Ritentativo 924 ore dopo il tentativo precedente
Ritentativo 1024 ore dopo il tentativo precedente

Dati personali

Nomi e indirizzi email di acquirenti, titolari di biglietti e partecipanti sono dati personali. Per impostazione predefinita Kadens rimuove questi campi dai dati prima dell'invio, così l'endpoint riceve l'evento senza di essi.

Per riceverli, modifica l'endpoint e attiva Includi dati personali. Una volta che i dati lasciano Kadens, proteggerli dal tuo lato è tua responsabilità.

Gestisci gli endpoint

AzioneDescrizione
Rigenera segretoCrea un nuovo segreto di firma. Il vecchio continua a firmare per 24 ore, così puoi aggiornare il tuo server senza perdere nessun evento.
ReinviaInvia di nuovo ogni evento di un intervallo di date che l'endpoint ha perso o non è riuscito a ricevere, fino a 30 giorni indietro.
Invia di nuovoInvia di nuovo una consegna, dal registro delle consegne dell'endpoint.
Invia evento di provaInvia un esempio di qualsiasi tipo di evento solo a questo endpoint, contrassegnato come test.
Disattiva / AttivaFerma le consegne finché non riattivi l'endpoint. Dopo averlo riattivato, esegui il replay dell'intervallo che ha perso.

Un endpoint che fallisce per 5 giorni senza un solo successo viene disabilitato automaticamente, e ne vieni avvisato.

Catalogo degli eventi

Iscrivi un endpoint agli eventi di cui ha bisogno. Ognuno mostra i dati che contiene.

Ordini

order.paid

Un ordine è stato pagato.

Dati di esempio
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

Un ordine è stato rimborsato, in tutto o in parte.

Dati di esempio
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 acquirente ha iniziato un checkout e se ne è andato senza pagare.

Dati di esempio
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"
}

Biglietti

ticket.issued

Un biglietto è stato emesso al suo titolare.

Dati di esempio
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

Un biglietto è passato a un altro titolare.

Dati di esempio
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

Un biglietto è stato annullato.

Dati di esempio
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"
}

Partecipanti

attendee.registered

Un partecipante è stato registrato a un evento.

Dati di esempio
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

È stato fatto il check-in di un partecipante all'ingresso.

Dati di esempio
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

Un check-in è stato annullato.

Dati di esempio
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 titolare di biglietto non ha effettuato il check in prima della fine della sessione.

Dati di esempio
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"
}

Eventi

event.ended

Uno dei tuoi eventi è terminato.

Dati di esempio
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"
}

Prenotazioni

booking.confirmed

Una prenotazione per una sessione è stata confermata.

Dati di esempio
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

Una richiesta di prenotazione è stata rifiutata.

Dati di esempio
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

Una prenotazione è stata annullata o è scaduta.

Dati di esempio
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

Una prenotazione è stata spostata a un'altra sessione.

Dati di esempio
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 partecipante prenotato non ha effettuato il check in prima della fine della sessione.

Dati di esempio
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

Una sessione programmata è stata annullata.

Dati di esempio
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

Una sessione programmata è stata spostata a un altro orario.

Dati di esempio
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 pacchetto lezioni ha raggiunto la soglia minima di crediti.

Dati di esempio
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"
}

Iscrizioni

enrollment.created

Uno studente è stato iscritto a un corso.

Dati di esempio
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

L'iscrizione di uno studente a un corso è terminata.

Dati di esempio
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

Uno studente è stato spostato a un'altra edizione del corso.

Dati di esempio
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

Uno studente ha completato una lezione del tuo corso.

Dati di esempio
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

Uno studente ha completato il tuo corso.

Dati di esempio
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"
}

Abbonamenti

subscription.created

Un cliente si è abbonato a un piano.

Dati di esempio
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

Un abbonamento è stato rinnovato e il pagamento è andato a buon fine.

Dati di esempio
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

Il pagamento di un abbonamento non è riuscito.

Dati di esempio
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

Un abbonamento è stato annullato.

Dati di esempio
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

Un abbonamento annullato è stato riattivato.

Dati di esempio
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 è passato a un altro piano.

Dati di esempio
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

Un abbonamento è terminato e l'accesso è stato interrotto.

Dati di esempio
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 prova gratuita di un abbonato termina tra pochi giorni.

Dati di esempio
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"
}

Certificati

certificate.issued

Un certificato è stato emesso al suo titolare.

Dati di esempio
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

Un certificato è stato revocato.

Dati di esempio
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"
}

Versamenti

payout.paid

Un versamento è arrivato sul tuo conto bancario.

Dati di esempio
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 versamento non è riuscito e il denaro non è stato trasferito.

Dati di esempio
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"
}

Contatti

lead.captured

È stato acquisito un nuovo lead.

Dati di esempio
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

È stato inviato un modulo.

Dati di esempio
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

Hai approvato, rifiutato o messo in lista d'attesa una candidatura.

Dati di esempio
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 può ora vedere i risultati del suo esame.

Dati di esempio
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

Qualcuno ha iniziato a seguirti.

Dati di esempio
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 membro si è unito a una delle tue comunità.

Dati di esempio
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 membro ha lasciato una delle tue comunità.

Dati di esempio
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

Un’automazione ha raggiunto un passaggio di invio webhook per un contatto.

Dati di esempio
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

Qualcuno ha lasciato una recensione.

Dati di esempio
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

Hai risposto alla richiesta di feedback di uno studente.

Dati di esempio
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"
}

Premi

reward.expiring

Una ricompensa che hai dato a qualcuno sta per scadere.

Dati di esempio
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"
  }
}

Automazioni

automation.step_reached

Una sequenza ha raggiunto un passaggio webhook per una persona.

Dati di esempio
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"
}

Webhook

webhook.test

Un evento di prova che hai inviato da Kadens.

Dati di esempio
JSON
1
2
3
{
  "message": "This is a test event sent from Kadens."
}

Risoluzione dei problemi

Non arriva nulla

Controlla che l'endpoint sia attivo e iscritto all'evento, e che il suo indirizzo sia pubblico e usi HTTPS. Poi invia un evento di prova e apri la consegna per vedere cosa ha risposto il tuo server.

La firma non corrisponde mai

Verifica contro il corpo grezzo della richiesta, prima di qualsiasi parsing JSON. Usa il segreto di questo endpoint e controlla l'orologio del tuo server: le richieste più vecchie di 300 secondi vengono rifiutate.

Lo stesso evento arriva due volte

È normale dopo un ritentativo, un reinvio o un replay. Salta qualsiasi webhook-id che hai già gestito.

L'endpoint è stato disabilitato

Ha fallito per 5 giorni senza un successo, ha risposto 410 Gone, oppure qualcuno lo ha disabilitato. Correggi il server, riattiva l'endpoint ed esegui il replay dell'intervallo che ha perso.

Mancano nomi o indirizzi email

I dati personali vengono rimossi a meno che l'endpoint non li includa. Vedi Dati personali sopra.

E adesso?

Apri nella dashboard

È stato utile?

Precedente
Widget per siti web
Successivo
Assistenti IA (MCP)

In questa pagina

  1. Cosa sono i webhook
  2. Guida rapida
  3. Prova senza un server
  4. Corpo della richiesta
  5. Verifica delle firme
  6. Gestisci gli eventi in modo sicuro
  7. Nuovi tentativi e limiti
  8. Dati personali
  9. Gestisci gli endpoint
  10. Catalogo degli eventi
  11. Risoluzione dei problemi
  12. E adesso?