Webhooks
Get a signed message at your URL when things happen.
Owners & adminsDevelopers
- Open Team → Integrations → Webhooks.
- Paste the URL from Zapier, Make, n8n or your own server (https).
- Tick the events to send and click Add webhook.
- Click Send test to check it's reachable.
Events
order.paid, order.refunded, seat.cancelled, seat.transferred, seat.substituted, checkin.created, event.created, event.published, cohort.at_risk, cohort.cancelled, certificate.issued, waitlist.offered.
Message and signature
POST https://your-url
EnrollClass-Event: order.paid
EnrollClass-Signature: t=1792519272,v1=<hex>
{ "id": "whd_…", "type": "order.paid", "createdAt": "…", "organizationId": "org_…", "data": { "order": { … }, "event": { … }, "seats": [ … ] } }To verify, compute HMAC-SHA256 of <t>.<raw body> with the webhook's signing secret (shown under Signing secret and recent deliveries) and compare with v1. Reject timestamps older than 5 minutes.
import crypto from "node:crypto";
const [t, v1] = header.split(",").map((p) => p.split("=")[1]);
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));TIP Failed deliveries are retried after 10 seconds, 1 minute and 5 minutes. Recent deliveries and errors are listed under each webhook; Pause stops sending without deleting it.