# Call Cancelled Webhook

Webhook event triggered when a call is cancelled in iClosed.io.

## Overview

The Call Cancelled webhook is triggered whenever a previously booked call is cancelled in your iClosed.io account. This event provides complete details about the cancelled call, including cancellation information, who cancelled it, and when the cancellation occurred.

## Event Details

| Property | Value |
|  --- | --- |
| **Event Type** | `callCancelled` |
| **Trigger** | When a call is cancelled by either the invitee or the host |
| **Payload** | Complete call information with cancellation details |


## Webhook Payload

The HTTP body is a single JSON object (not an array). It contains detailed information about the cancelled call:

```json
{
  "event_type": {
    "uuid": 2,
    "kind": "Round Robin",
    "slug": "strategy-call",
    "name": "Strategy intro call",
    "duration": 30,
    "durationUnit": "MINUTES",
    "owner": {
      "type": "closer"
    },
    "type": "STRATEGY_EVENT"
  },
  "event": {
    "uuid": 168,
    "closerId": 5,
    "closerName": "Jamie Alvarez ",
    "closerEmail": "jamie.alvarez@example.com",
    "closerTimezone": "Asia/Karachi",
    "assigned_to": {
      "1": "Jamie Alvarez "
    },
    "extended_assigned_to": {
      "1": {
        "name": "Jamie Alvarez ",
        "email": "jamie.alvarez@example.com",
        "primary": true
      }
    },
    "utc_start_time": "2026-04-17T04:00:00.000Z",
    "utc_end_time": "2026-04-17T04:30:00.000Z",
    "start_time": "2026-04-17T04:00:00.000Z",
    "start_time_pretty": "09:00AM - Friday, April 17, 2026",
    "invitee_start_time": "2026-04-17T04:00:00.000Z",
    "invitee_start_time_pretty": "09:00AM - Friday, April 17, 2026",
    "end_time": "2026-04-17T04:30:00.000Z",
    "end_time_pretty": "09:30AM - Friday, April 17, 2026",
    "invitee_end_time": "2026-04-17T04:30:00.000Z",
    "invitee_end_time_pretty": "09:30AM - Friday, April 17, 2026",
    "created_at": "2026-04-09T09:29:17.078Z",
    "location": "+1 415 555 0192",
    "location_type": "phone",
    "eventLink": "https://app.iclosed.io/e/acme/strategy-call",
    "callPreviewId": "call_esiPJQAfxjJw",
    "type": "STRATEGY_CALL",
    "canceled": true,
    "canceler_name": "Jamie Alvarez (workspace admin)",
    "cancel_reason": "Stakeholder could not join; rescheduling internally.",
    "canceled_at": "2026-04-09T09:29:17.078Z",
    "old_start_time": null,
    "setter": {
      "name": "Riley Chen",
      "firstName": "Riley",
      "lastName": "Chen",
      "email": "riley.chen@example.com",
      "setBy": {
        "firstName": "Riley",
        "lastName": "Chen",
        "email": "riley.chen@example.com"
      }
    }
  },
  "contactFields": {
    "contact-short-text": "This is Short Text Field",
    "contact-long-text": "This is the long-text custom field value for the contact.",
    "multiple_select_color": "Red",
    "rating": 3,
    "user": {
      "id": 5,
      "firstName": "Jamie Alvarez",
      "lastName": "Alvarez",
      "email": "jamie.alvarez@example.com"
    },
    "number-1": 128,
    "contact-checkbox": "Option a",
    "date-and-time": "2026-04-08T19:00:00.000Z",
    "contact-radio-button": "Option 1",
    "custom-number": 76,
    "contact-url": "https://iclosed.io",
    "single select ": "red",
    "call_outcome": "NO_SALE",
    "no_sale_reason": "ADMIN_CANCELLED"
  },
  "invitee": {
    "uuid": 239,
    "previewUrl": "https://app.iclosed.io/app/global-data/contacts?preview=contact_We1Ztdhvcii0",
    "referrer_url": "https://app.iclosed.io/e/acme/strategy-call",
    "ip_address": "::1",
    "callPreviewId": "call_esiPJQAfxjJw",
    "first_name": "Morgan",
    "last_name": "Lee",
    "name": "Morgan Lee",
    "email": "morgan.lee@example.com",
    "text_reminder_number": "+1 415 555 0192",
    "timezone": "Asia/Karachi",
    "created_at": "2026-04-09T09:29:17.078Z",
    "is_reschedule": true,
    "reschedule_reason": "Need to move the call after finance review on Tuesday.",
    "reschedule_by": "Jamie Alvarez (workspace admin)",
    "canceled": false,
    "canceler_name": "Jamie Alvarez (workspace admin)",
    "cancel_reason": "Stakeholder could not join; rescheduling internally.",
    "canceled_at": "2026-04-09T09:29:17.039Z"
  },
  "questions_and_answers": [
    {
      "question": "Email Address",
      "answer": "morgan.lee@example.com"
    },
    {
      "question": "Phone Number",
      "answer": "+1 415 555 0192"
    },
    {
      "question": "Full Name",
      "answer": "Morgan Lee"
    },
    {
      "question": "Goals for the next 90 days",
      "answer": "We need to cut demo no-shows by half this quarter."
    },
    {
      "question": "Check box",
      "answer": "1, 3"
    },
    {
      "question": "Internal reference code"
    },
    {
      "question": "Date and Time",
      "answer": "2026-04-10T09:14:00.000Z"
    },
    {
      "question": "Team size (people)"
    },
    {
      "question": "New Multi Select",
      "answer": "b"
    },
    {
      "question": "Disqualify",
      "answer": "No"
    }
  ],
  "questions_and_responses": {
    "1_question": "Email Address",
    "1_response": "morgan.lee@example.com",
    "2_question": "Phone Number",
    "2_response": "+1 415 555 0192",
    "3_question": "Full Name",
    "3_response": "Morgan Lee",
    "4_question": "Goals for the next 90 days",
    "4_response": "We need to cut demo no-shows by half this quarter.",
    "5_question": "Check box",
    "5_response": "1, 3",
    "6_question": "Internal reference code",
    "6_response": 123,
    "7_question": "Date and Time",
    "7_response": "2026-04-10T09:14:00.000Z",
    "8_question": "Team size (people)",
    "8_response": 123,
    "9_question": "New Multi Select",
    "9_response": "b",
    "10_question": "Disqualify",
    "10_response": "No",
    "Email Address": "morgan.lee@example.com",
    "Phone Number": "+1 415 555 0192",
    "Full Name": "Morgan Lee",
    "Goals for the next 90 days": "We need to cut demo no-shows by half this quarter.",
    "Check box": "1, 3",
    "Internal reference code": 123,
    "Date and Time": "2026-04-10T09:14:00.000Z",
    "Team size (people)": 123,
    "New Multi Select": "b",
    "Disqualify": "No"
  },
  "tracking": {
    "first_utm_term": "strategy consultation",
    "first_utm_source": "google",
    "first_utm_medium": "cpc",
    "first_utm_content": "hero_cta_variant_b",
    "first_utm_campaign": "q2_2026_demo_requests",
    "utm_term": "sales scheduling software",
    "utm_source": "linkedin",
    "utm_medium": "paid_social",
    "utm_content": "carousel_ad_3",
    "utm_campaign": "b2b_outbound_apr",
    "utmKey_0": "gclid",
    "utmValue_0": "EAIaIQobChMIexampleValue123",
    "utmKey_1": "li_fat_id",
    "utmValue_1": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "utmKey_2": "referrer_domain",
    "utmValue_2": "newsletter.partner.io",
    "utmKey_3": "landing_path",
    "utmValue_3": "/events/strategy-call",
    "utmKey_4": "experiment_id",
    "utmValue_4": "exp_booking_flow_v2"
  },
  "call_booked_from": null,
  "hookType": "Call cancelled"
}
```

## Key Differences from Call Booked

| Field | Description |
|  --- | --- |
| `canceled` | `true` on `event` when the call is cancelled; `invitee.canceled` may still be `false` while cancellation fields are populated (see payload) |
| `canceler_name` | Name of the person who cancelled the call |
| `cancel_reason` | Optional reason provided for the cancellation |
| `canceled_at` | Timestamp when the cancellation occurred |
| `hookType` | Set to `"Call cancelled"` to distinguish from booking events |


## Key Fields Explained

### Event Type Information

The `event_type` object contains configuration details of the original event type:

| Field | Description |
|  --- | --- |
| `uuid` | Unique identifier for the event type |
| `kind` | Booking strategy (e.g., `"Round Robin"`, `"Direct Assignment"`) |
| `slug` | URL-friendly event name |
| `name` | Display name of the event |
| `duration` | Original call duration |
| `owner.type` | Type of owner (`closer`, `setter`, etc.) |


### Event Details

The `event` object contains information about the cancelled call:

| Field | Description |
|  --- | --- |
| `uuid` | Unique call identifier (same as when booked) |
| `canceled` | Set to `true` indicating cancellation |
| `canceler_name` | Who cancelled the call |
| `cancel_reason` | Reason for cancellation (if provided) |
| `canceled_at` | When the cancellation occurred |
| `assigned_to` | Who was originally assigned |
| `start_time` / `end_time` | Original scheduled times |
| `type` | Call type (`STRATEGY_CALL`, `DISCOVERY_CALL`, etc.) |


### Invitee Information

The `invitee` object contains the invitee record at cancellation time (cancellation may be driven by a host workflow, so flags can look mixed—always read `hookType` together with `event` / `invitee` fields):

| Field | Description |
|  --- | --- |
| `canceled` | May be `true` or `false` depending on who cancelled and how the event was recorded; use with `canceler_name` / `cancel_reason` / `canceled_at` |
| `canceler_name` | Name of the actor recorded on the cancellation |
| `cancel_reason` | Reason text when provided |
| `canceled_at` | When the cancellation was recorded for this payload |
| `previewUrl` | Link to view the contact in iClosed.io |
| `name` | Full name of the invitee |
| `email` | Invitee's email address |
| `text_reminder_number` | Phone number for SMS reminders |


### Questions and Responses

| Field | Description |
|  --- | --- |
| `questions_and_answers` | Original booking form responses in array format |
| `questions_and_responses` | Object format of the same responses |


### Tracking Information

The `tracking` object contains the original UTM parameters and attribution data preserved from the original booking.

## Cancellation Reasons

Common cancellation reasons include schedule conflicts, no longer interested, technical issues, rescheduling requests, emergencies, weather, and health-related issues.

## Use Cases

This webhook is useful for:

- **CRM Updates** – Mark opportunities as cancelled in your CRM
- **Calendar Management** – Remove cancelled events from calendars
- **Team Notifications** – Alert team members about cancellations
- **Analytics Tracking** – Monitor cancellation rates and reasons
- **Follow-up Automation** – Trigger rescheduling workflows
- **Reporting** – Track cancellation patterns and team performance
- **Customer Service** – Proactively reach out to cancelled prospects
- **Resource Management** – Free up team member availability


## Response Requirements

Your webhook endpoint should:

- Return a `2xx` status code to acknowledge receipt
- Respond within **5 seconds** to avoid retries
- Handle duplicate events (idempotency)
- Log the call `uuid` and cancellation details for debugging
- Process cancellation reasons for analytics


## Best Practices

1. **Cancellation Tracking** – Use `canceler_name` to identify who cancelled
2. **Reason Analysis** – Monitor `cancel_reason` for patterns and improvements
3. **Timing Analysis** – Use `canceled_at` to track cancellation timing
4. **Follow-up Strategy** – Implement different follow-up flows based on who cancelled
5. **Availability Management** – Update team member availability immediately
6. **Customer Communication** – Send appropriate cancellation confirmations
7. **Rescheduling Offers** – Automatically offer alternative times when appropriate
8. **Data Preservation** – Keep original booking data for analysis


## Cancellation Workflows

### When Invitee Cancels

- Send cancellation confirmation
- Offer rescheduling options
- Update lead status in CRM
- Notify assigned team member
- Trigger follow-up sequence


### When Host Cancels

- Send apology and explanation
- Offer immediate rescheduling
- Provide alternative contact options
- Update internal systems
- Track cancellation reasons for process improvement