Event Types
Reference of every webhook event Aura emits
Event Types
Aura emits 15 webhook events across three resources: leads, calls, and payments. Every event follows the pattern {resource}.{action}.
This page is regenerated from the canonical event registry in apps/api/src/lib/webhook-events.ts. If you see drift between the docs and a live payload, trust the live payload and open an issue.
Envelope
Every event ships with the same envelope:
{
"event": "call.booked",
"created_at": "2026-05-12T14:30:00.000Z",
"organization_id": "org_abc123",
"data": { /* resource-specific, see below */ }
}| Field | Type | Description |
|---|---|---|
event | string | One of the event types in the table below |
created_at | string (ISO 8601) | When the event was emitted, UTC |
organization_id | string | The org the event belongs to |
data | object | Resource payload — shape depends on event |
For signing, retries, and SSRF rules, see the Webhooks Overview.
All Events
Lead events
| Event | Fires when | Payload shape |
|---|---|---|
lead.created | A new lead is created from any channel — booking-link funnel, form submission, or POST /v1/leads. Delivered in the envelope shape below (UTM under data.source). Zapier users who want the flat, top-level-UTM payload should trigger on lead.captured instead (see the Zapier guide). | LeadWebhookData |
lead.updated | An existing lead's contact info, metadata, or attribution changes | LeadWebhookData |
lead.status_changed | No longer offered. Sent only when a lead is archived through the API | LeadWebhookData |
lead.deleted | A lead is removed from Aura. An admin deleted it, or the person asked us to erase their data. Use it to remove the person from your own tools. | LeadDeletedWebhookData |
Call events
| Event | Fires when | Payload shape |
|---|---|---|
call.booked | A guest completes a booking and a call is created | CallWebhookData |
call.updated | A call's scheduled time, closer, status, or attribution changes | CallWebhookData |
call.started | The Notetaker joins the meeting and recording begins | CallWebhookData |
call.completed | The call ends and outcome is finalised (won / lost / no-show) | CallWebhookData |
call.cancelled | A booked call is cancelled. Arrives flat, not in the envelope | call.cancelled payload |
call.canceled | Deprecated: takes no new subscriptions. Existing ones still receive every cancel; subscribe to call.cancelled instead | CallWebhookData |
call.rescheduled | A scheduled call moves to a different time | CallWebhookData |
call.closer_reassigned | An admin swaps the host on a booked upcoming call | CallCloserReassignedWebhookData |
call.no_show | A scheduled call is marked as no-show | CallWebhookData |
call.analysis_completed | The AI review of a call finishes (minutes to hours after call.completed) | CallAnalysisWebhookData |
Payment events
| Event | Fires when | Payload shape |
|---|---|---|
payment.succeeded | A Stripe payment for a deal succeeds | PaymentWebhookData |
payment.failed | A Stripe payment for a deal fails | PaymentWebhookData |
payment.refunded | A previously-succeeded payment is refunded | PaymentWebhookData |
Example payloads
call.booked
{
"event": "call.booked",
"created_at": "2026-05-12T14:30:00.000Z",
"organization_id": "org_abc123",
"data": {
"id": "call_def456",
"lead_id": "lead_ghi789",
"closer_id": "user_jkl012",
"booking_link_id": "bl_mno345",
"scheduled_at": "2026-05-13T10:00:00.000Z",
"duration": 30,
"status": "scheduled",
"conferencing_url": "https://meet.google.com/abc-defg-hij",
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring-2026",
"utm_term": null,
"utm_content": "demo-cta",
"referral": null,
"guest_rsvp_status": null,
"guest_rsvp_confirmed_at": null,
"created_at": "2026-05-12T14:30:00.000Z",
"updated_at": "2026-05-12T14:30:00.000Z"
}
}lead.created
{
"event": "lead.created",
"created_at": "2026-05-12T14:29:55.000Z",
"organization_id": "org_abc123",
"data": {
"id": "lead_ghi789",
"name": "Jane Doe",
"email": "jane@example.com",
"phone": "+14155551234",
"company": "Acme Inc",
"status": "interested",
"pipeline_stage": "interested",
"timezone": "America/New_York",
"source": {
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring-2026",
"utm_term": null,
"utm_content": "demo-cta",
"referrer": "https://acme.com/book"
},
"consent": [
{
"id": "6f1b2c3d-0000-4000-8000-000000000001",
"kind": "custom",
"label": "I agree to receive appointment reminder texts from Acme Inc.",
"disclosure": null,
"agreed": true,
"state": "granted",
"at": "2026-05-12T14:29:50.000Z",
"granted_at": null,
"phone": "+14155551234",
"source": "booking_form",
"links": [
{ "text": "SMS Terms", "url": "https://acme.com/sms-terms" }
]
}
],
"created_at": "2026-05-12T14:29:55.000Z",
"updated_at": "2026-05-12T14:29:55.000Z"
}
}consent lists each consent box and what the person chose. Before you text
them:
- An empty
consentlist means no consent is on file. That is not the same asdeclined, but it is still not a yes. Treat it as no consent. agreedis false when they agreed for a different number.phonesays which number that was.- Consent can change after this webhook is sent, for example when the person
replies STOP. Read the lead again with
GET /v1/leads/:idright before you text them. - A box they did not tick is only recorded once they finish the form.
See the payload reference for every field.
lead.deleted
{
"event": "lead.deleted",
"created_at": "2026-05-12T16:00:05.000Z",
"organization_id": "org_abc123",
"data": {
"id": "lead_xyz789",
"event": "lead.deleted",
"org_id": "org_abc123",
"timestamp": "2026-05-12T16:00:05.000Z",
"aura_version": "1.15.1",
"lead_id": "lead_xyz789",
"full_name": "Jane Doe",
"email": "jane@example.com",
"phone": "+15551234567",
"consent": [],
"consent_summary": null,
"reason": "deleted",
"deleted_at": "2026-05-12T16:00:00.000Z"
}
}We send this once the lead is gone, not when someone asks to delete it. If the lead has a meeting coming up, we cancel the meeting and tell the guest first. We remove the lead at least an hour later, usually within two hours. It can take up to a day if a calendar is slow to confirm the cancel. If the person books again before then, we keep the lead and send nothing.
reason is erased when the person asked us to erase their data. Then
full_name, email and phone are null and consent is empty, so
nothing about the person leaves Aura. Match the person by lead_id.
call.closer_reassigned
{
"event": "call.closer_reassigned",
"created_at": "2026-05-12T15:00:00.000Z",
"organization_id": "org_abc123",
"data": {
"call_id": "call_def456",
"previous_closer_id": "user_jkl012",
"previous_closer_name": "Alice Chen",
"new_closer_id": "user_pqr678",
"new_closer_name": "Bob Martinez",
"scheduled_at": "2026-05-13T10:00:00.000Z",
"conferencing_link": "https://meet.google.com/xyz-abcd-efg",
"new_event_id": "evt_stu901",
"booking_link_id": "bl_mno345",
"reassigned_by_user_id": "user_admin_001",
"old_event_orphaned": false
}
}payment.succeeded
{
"event": "payment.succeeded",
"created_at": "2026-05-13T11:15:00.000Z",
"organization_id": "org_abc123",
"data": {
"id": "pay_vwx234",
"lead_id": "lead_ghi789",
"call_id": "call_def456",
"amount": 500000,
"currency": "usd",
"status": "succeeded",
"payment_date": "2026-05-13T11:15:00.000Z",
"created_at": "2026-05-13T11:15:00.000Z"
}
}Amounts on payment events are in the currency's smallest unit (e.g. cents for USD), matching Stripe's convention.
Field-level reference
See Payload Reference for the full shape of each data object.
Next steps
- Webhooks Overview — setup, signing, and retries
- Payload Reference — every field on every payload
- Zapier — no-code alternative if you don't want to host a receiver