> ## Documentation Index
> Fetch the complete documentation index at: https://cal.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow webhooks

> Add a Send webhook step to a workflow to POST a signed booking payload to your own URL a set time before an event starts or after it ends.

The **Send webhook** step lets a workflow call your own system at a set time around a booking, the same way an email or SMS reminder step reaches an attendee. When the reminder is due, Cal.com sends a `POST` request with the booking payload to the URL you configure.

> [!NOTE]
>
> Send webhook steps only run on timed triggers: **Before event starts** and **After event ends**. If you change the trigger to anything else, the editor flags the step and asks you to change the trigger or remove the step.

## Add a Send webhook step

**1. Set a timed trigger**

Open a workflow from **Workflows** and select the trigger card. Choose **Before event starts** or **After event ends**, set how long before or after the event the webhook should be sent, and pick the booking links the workflow is active on.

**2. Insert the step**

Click **+** on the canvas where you want the step and choose **Send webhook**.

![The workflow canvas with the add step menu open, listing Send email, Send SMS / WhatsApp, Cal.ai Phone Agent call, Send webhook with the description POST a signed booking payload to your URL, Lead enrichment, Paths, Filter and Delay](https://mintcdn.com/calcom/A5nsPZgGHnR4oGt5/images/workflow-webhooks/insert-menu-send-webhook.png?fit=max\&auto=format\&n=A5nsPZgGHnR4oGt5\&q=85\&s=7f1a6ae075d8c7ad3b6baa2f9c42447b)

**3. Enter the webhook URL**

In **Webhook URL**, enter the `http://` or `https://` address that should receive the request. The URL is checked when you save, using the same rules as [webhook subscriptions](https://cal.com/docs/developing/guides/automation/webhooks.md#creating-a-webhook-subscription), so private, internal and other blocked addresses are rejected.

**4. Add a signing secret (optional)**

In **Signing secret**, enter a secret your endpoint can use to verify that requests come from Cal.com.

![The Webhook settings drawer for a Send webhook step, with the Webhook URL set to https://hooks.example.com/cal/reminders, a masked Signing secret, and the step showing hooks.example.com on the canvas behind it](https://mintcdn.com/calcom/A5nsPZgGHnR4oGt5/images/workflow-webhooks/send-webhook-step-settings.png?fit=max\&auto=format\&n=A5nsPZgGHnR4oGt5\&q=85\&s=548544bcd9f1f38384b12da704357a08)

**5. Save the workflow**

Click **Done**, then **Save**. The webhook is scheduled for each booking the workflow applies to.

## Manage the signing secret

The signing secret is write-only. After you save, the editor never shows it again and instead says **A secret is saved. Enter a new one to replace it.**

* Leave the field empty to keep the saved secret.
* Enter a new value to replace it.
* Click **Remove secret** to delete it when you save. Click **Undo** before saving to keep it.

## What your endpoint receives

Each request is a JSON `POST` with these headers:

| Header | Value |
| - | - |
| `X-Cal-Signature-256` | An HMAC-SHA256 hex digest of the request body, created with your signing secret. Without a secret, the value is `no-secret-provided`. |
| `X-Cal-Webhook-Version` | The payload version, `2021-10-20`. |

The body uses the same booking payload as [webhook subscriptions](https://cal.com/docs/developing/guides/automation/webhooks.md#webhook-variable-list), with `triggerEvent` set to `WORKFLOW_REMINDER`. The `payload` object also includes:

| Field | Description |
| - | - |
| `workflowId` | The workflow that sent the webhook |
| `workflowStepId` | The Send webhook step that sent it |
| `reminderId` | A unique ID for this reminder |
| `reminderOffsetMinutes` | How many minutes before or after the event the step is set to run |
| `scheduledFor` | When the reminder was scheduled to be sent |

The booking details are read when the webhook is sent, so edits made after the booking was created are included. Webhooks aren't sent for bookings that have been cancelled or rejected, or for a before-event reminder that would arrive after the event has started.

> [!TIP]
>
> To check a request's signature, follow the steps in [Verifying the authenticity of the received payload](https://cal.com/docs/developing/guides/automation/webhooks.md#verifying-the-authenticity-of-the-received-payload) using the step's signing secret.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.