Webhook events

Email activity

Sends, replies, categorization, and bounces.

Sends, replies, categorization, and bounces.

These pages are payload reference. For setup, verification, and retries, follow Webhook integration.

Examples use placeholder UUIDs. Live deliveries use real ids from your account.

email.sent

An outbound campaign email was sent. data.email is the lead recipient address for CRM matching. Includes the shared lead identity block, outbound body_text, and step_number when the scheduler persisted it.

{
  "id": "00000000-0000-4000-8000-0000000000aa",
  "type": "email.sent",
  "occurred_at": "2026-06-25T12:00:00.000Z",
  "data": {
    "campaign_id": "22222222-2222-4222-8222-222222222222",
    "campaign_name": "Example campaign",
    "lead_id": "00000000-0000-4000-8000-000000000001",
    "email": "lead@example.com",
    "mailbox_id": "00000000-0000-4000-8000-000000000004",
    "mailbox_email": "sender@example.com",
    "first_name": "Casey",
    "last_name": "Reed",
    "full_name": "Casey Reed",
    "company_name": "Wasatch Corridor",
    "title": "VP Sales",
    "website": "https://wasatch.example",
    "linkedin_url": "https://linkedin.com/in/casey-reed",
    "custom_fields": {
      "title": "VP Sales",
      "region": "west"
    },
    "enrollment_id": "00000000-0000-4000-8000-000000000002",
    "message_job_id": "00000000-0000-4000-8000-000000000003",
    "provider_message_id": "test-provider-message-id",
    "sent_at": "2026-06-25T12:00:00.000Z",
    "subject": "Example outbound subject (test)",
    "body_text": "Hi Casey — quick check-in for next week.",
    "step_number": 1,
    "node_id": "00000000-0000-4000-8000-000000000003",
    "flow_node_id": "email-1"
  }
}

reply.received

An inbound reply was received on a campaign thread (before categorization completes). data.from_email is the reply sender; data.email is the matched lead. data.body_text is the plain-text display body (quoted history stripped).

{
  "id": "00000000-0000-4000-8000-0000000000aa",
  "type": "reply.received",
  "occurred_at": "2026-06-25T12:00:00.000Z",
  "data": {
    "thread_id": "00000000-0000-4000-8000-000000000005",
    "email_message_id": "00000000-0000-4000-8000-000000000006",
    "campaign_id": "22222222-2222-4222-8222-222222222222",
    "campaign_name": "Example campaign",
    "lead_id": "00000000-0000-4000-8000-000000000001",
    "email": "lead@example.com",
    "mailbox_id": "00000000-0000-4000-8000-000000000004",
    "mailbox_email": "sender@example.com",
    "first_name": "Casey",
    "last_name": "Reed",
    "full_name": "Casey Reed",
    "company_name": "Wasatch Corridor",
    "title": "VP Sales",
    "website": "https://wasatch.example",
    "linkedin_url": "https://linkedin.com/in/casey-reed",
    "custom_fields": {
      "title": "VP Sales",
      "region": "west"
    },
    "enrollment_id": "00000000-0000-4000-8000-000000000002",
    "from_email": "lead@example.com",
    "subject": "Re: Example outbound subject (test)",
    "body_text": "Thursday works — send a hold.",
    "received_at": "2026-06-25T12:00:00.000Z"
  }
}

reply.categorized

A thread reply category was assigned, changed, or cleared (manual, AI, system, or OOO). Includes the same lead identity block as send/reply.

{
  "id": "00000000-0000-4000-8000-0000000000aa",
  "type": "reply.categorized",
  "occurred_at": "2026-06-25T12:00:00.000Z",
  "data": {
    "thread_id": "00000000-0000-4000-8000-000000000005",
    "email_message_id": "00000000-0000-4000-8000-000000000006",
    "campaign_id": "22222222-2222-4222-8222-222222222222",
    "campaign_name": "Example campaign",
    "lead_id": "00000000-0000-4000-8000-000000000001",
    "email": "lead@example.com",
    "mailbox_id": "00000000-0000-4000-8000-000000000004",
    "mailbox_email": "sender@example.com",
    "first_name": "Casey",
    "last_name": "Reed",
    "full_name": "Casey Reed",
    "company_name": "Wasatch Corridor",
    "title": "VP Sales",
    "website": "https://wasatch.example",
    "linkedin_url": "https://linkedin.com/in/casey-reed",
    "custom_fields": {
      "title": "VP Sales",
      "region": "west"
    },
    "enrollment_id": "00000000-0000-4000-8000-000000000002",
    "category": "Interested",
    "previous_category": null,
    "category_source": "ai",
    "from_email": "lead@example.com",
    "subject": "Re: Example outbound subject (test)"
  }
}

bounce.detected

A hard or soft bounce was detected for a sent message. data.email is the matched lead; candidate_emails remains for diagnostics. reason is severity plus the SMTP code when present. A hard bounce that writes the block list also emits blocklist.entry_added.

{
  "id": "00000000-0000-4000-8000-0000000000aa",
  "type": "bounce.detected",
  "occurred_at": "2026-06-25T12:00:00.000Z",
  "data": {
    "campaign_id": "22222222-2222-4222-8222-222222222222",
    "campaign_name": "Example campaign",
    "lead_id": "00000000-0000-4000-8000-000000000001",
    "email": "lead@example.com",
    "mailbox_id": "00000000-0000-4000-8000-000000000004",
    "mailbox_email": "sender@example.com",
    "first_name": "Casey",
    "last_name": "Reed",
    "full_name": "Casey Reed",
    "company_name": "Wasatch Corridor",
    "title": "VP Sales",
    "website": "https://wasatch.example",
    "linkedin_url": "https://linkedin.com/in/casey-reed",
    "custom_fields": {
      "title": "VP Sales",
      "region": "west"
    },
    "enrollment_id": "00000000-0000-4000-8000-000000000002",
    "message_job_id": "00000000-0000-4000-8000-000000000003",
    "severity": "hard",
    "code": "550",
    "reason": "hard 550",
    "bounce_message_id": "test-bounce-message-id",
    "bounce_uid": 42,
    "candidate_emails": [
      "lead@example.com"
    ],
    "matched_job_count": 1
  }
}