---
title: "Outbound webhooks"
description: "Send a payload to your own systems when something happens in a custom."
slug: "en/customs/automation/outbound-webhooks"
url: "https://docs.custom.one/en/customs/automation/outbound-webhooks/"
capability: "integrations"
published_at: "2026-10-26T04:38:41.922Z"
---
An outbound webhook posts to a URL you control whenever something you've chosen
happens. It's the usual way people connect Custom One to a CRM, an internal tool,
or an automation platform.

:::note[Two different things share this word]
This page is about sending information **out**. Bringing people **in** from
another tool is a different feature with a different setup — see
[Bringing people in](/en/customs/people/bring-people-in/).
:::

## Where to set one up

| Where | Covers |
|---|---|
| **Integrations → Webhooks** | the custom you choose — and lists the webhooks of all your customs |
| A custom's **Automation** tab | that custom — on Outreach customs, and in beta on Quiz customs |

Both are views of the same thing: a webhook you add in Automation shows up in
Integrations → Webhooks, and the other way round.

## What you need

A URL that accepts a POST request, starting with `https://`. Every automation
platform gives you one — in Make it's a custom webhook trigger, in Zapier a Catch
Hook, in n8n a Webhook node. If you're sending to your own application, it's
whatever endpoint you've built.

## Setting one up

1. Open **Integrations → Webhooks** and click **New webhook** — or, in a custom,
   open **Automation** and click **New automation**.
2. In Integrations, choose the custom. Paste your URL.
3. Choose which events should trigger it.
4. Save it (**Create webhook**, or **Turn on** in Automation), then click
   **Test**: it sends a sample lead, as the first event the webhook listens for,
   so you can map the fields. **Test webhook sent** means we sent it — check that
   your tool received it.

A webhook works as soon as it is saved — it doesn't wait for you to publish. One
webhook can listen for several events, and you can have several webhooks.

## The events you can choose

| Event | Fires when | `event` in the payload |
|---|---|---|
| **Quiz completed** | someone finishes answering | `diagnostic.submitted` |
| **Video ready** | their video has finished processing | `diagnostic.completed` |
| **Lead started the video** | they pressed play on their video | `lead.video_started` |
| **Lead watched the video** | they watched past the point that counts as watched | `lead.video_watched` |
| **Lead clicked the CTA** | they clicked the button under their video | `lead.cta_clicked` |
| **Confirmation email sent** | the **Instant reply** email went out | `email.confirmation_sent` |
| **Result email sent** | the **Video delivery** email went out | `email.result_sent` |
| **Result SMS sent** | the **Delivery SMS** went out | `sms.result_sent` |
| **Lead marked as purchased** | you marked the lead as purchased, through the API | `lead.purchased` |

On an Outreach custom, the Automation tab leaves out **Quiz completed** and
**Confirmation email sent**: there is no quiz to complete.

**Lead marked as purchased** is a marker for tracking your own sales. You set it
on a lead through the [API](/en/developers/api-reference/); Custom One never sets
it and does nothing with it. Neither screen offers it: only a webhook created
through the API can listen for it.

### Three of these fire once and only once

**Lead started the video**, **Lead watched the video** and **Lead clicked the
CTA** each fire at most once per person, no matter how many times they reload the
page or press play again.

That's deliberate: it makes them a genuine engagement signal rather than a count
of interactions. If you need every interaction, these events are the wrong
source.

### Quiz completed and Video ready are not the same moment

**Quiz completed** fires as soon as someone finishes answering. **Video ready**
fires when their video has finished being made, which is later.

If you're sending someone their result, listen for *Video ready* — reacting to
*Quiz completed* means acting before there's anything to send.

## When something doesn't arrive

- **Check the event, not the webhook.** Most "it isn't firing" turns out to be a
  webhook listening for an event that didn't happen — waiting on *Video ready*
  for a custom where no video is produced, for instance.
- **Check your endpoint accepts POST** and answers within 10 seconds. An endpoint
  that takes longer looks like a failure from this side.
- **Look for Stopped automatically** in Integrations → Webhooks, or **We
  stopped this automation** in Automation. After ten failed deliveries in a row we
  switch the webhook off and email the workspace owners. Events that happen while
  it is off aren't queued. Fix the destination, then switch it back on.
- **Go through your own custom** rather than waiting for a real visitor. It's the
  fastest way to produce a real event.