# Inbound webhook

Start a workflow when another system sends a request to its own URL, and map the fields it sends into workflow variables.

Updated Oct 28, 2026. Source: https://smallbusinesschatbot.com/docs/workflows/triggers/inbound-webhook

## What this does

In Small Business Chatbot, each **Inbound Webhook** trigger has its own web address. When another system sends a POST request to it, the workflow starts a run with the request's data.

- **Label in the app:** Inbound Webhook
- **Fires:** When a POST request reaches the trigger's URL while the workflow is published
- **Carries:** The request body, or the fields your mapping rules pick, as `{{trigger.…}}`
- **Settings:** **Webhook URL**, **Capture incoming sample requests**, **Mapping reference**, **Mapping rules**

## Settings

![The Inbound Webhook trigger's webhook URL with Copy URL and Regenerate URL buttons](https://smallbusinesschatbot.com/static/images/docs/integrations/inbound-webhooks-endpoint-2026-10-28.webp)
*Workflows › Inbound Webhook, October 2026*

### Webhook URL

The address to send requests to, in the form `https://smallbusinesschatbot.com/workflow/webhooks/` followed by a random id. **Copy URL** copies it. **Regenerate URL** makes a new id and clears the samples and **Mapping reference**; the old address stops working once you click **Save workflow**. The URL is the only key: anyone who has it can start the workflow.

### Capture incoming sample requests

Ticked by default. Keeps the last 20 requests on the trigger. Click **Fetch sample requests** to list them, newest first.

### Mapping reference

A note for yourself, such as a sample's id. **Use latest sample** fills in the newest sample's id.

### Mapping rules

Each rule copies one value from the request into the workflow. **Add mapping rule** adds one, and **Remove rule** deletes it.

| Field | What it does | Example |
|---|---|---|
| **Source path** | Where the value is in the request, with dots between levels. Numbers step into lists. | `customer.email`, `value.0.action` |
| **Target path** | Where it lands under `trigger` | `lead.email` |
| **Default value** | Used when the source path isn't in the request | `unknown@example.com` |

## When it fires

- Only while the workflow is published. Send test requests after you publish, and expect them to start real runs.
- Only for POST requests. A request to a draft workflow's URL, or an old URL, gets a "not found" reply.
- A request whose `Idempotency-Key` or `X-Idempotency-Key` header this workflow has seen before returns the first run instead of starting a second one.

## What it carries

Without mapping rules, `trigger` is the request body:

| The request sends | It arrives as |
|---|---|
| A JSON object | Each field at `trigger.<field>`, such as `{{trigger.customer.email}}` |
| A JSON list or single value | `trigger.value` |
| Form fields | Each field at `trigger.<field>` |
| Plain text | `trigger.raw_body`, or the fields when the text is a JSON object |

With mapping rules, `trigger` holds only the target paths. A rule with **Target path** `lead.email` gives `{{trigger.lead.email}}`. The whole request body is still there, at `{{data.trigger_raw.<field>}}`.

Put every value in the request body. The run and the sample list receive the body, without headers or the query string.

> **Tip:** Map the person's details to `contact.email`, `contact.phone` and `contact.first_name`. The run then has a contact: it shows in the **Contact** column under **Executions**, and **Stop workflows when contact replies** and **Only enrol each contact once** can match it.

## The reply

| Result | Reply |
|---|---|
| Run started | `200` with `execution_id`, `workflow_id` and `trigger_node_id` |
| Repeat of an `Idempotency-Key` | `200` with the first run's `execution_id` and `"idempotency_reused": true` |
| Workflow not published, or URL regenerated | `404`, "Webhook endpoint was not found" |
| Account without workflow access | `403` |
| 100 runs already in progress | `409`, "Workflow execution limit reached" |

## Example

A form tool sends:

```json Request body
{ "name": "Jordan", "email": "jordan@example.com", "service": "Drain cleaning" }
```

With no mapping rules, a **Send Email** step can use `{{trigger.email}}` in **To** and `{{trigger.service}}` in **Subject**.

## Used in

- [Inbound webhooks](https://smallbusinesschatbot.com/docs/integrations/automation/inbound-webhooks): connect a form or another tool step by step.
- [Triggers](https://smallbusinesschatbot.com/docs/user-guides/workflows/triggers): how to pick a trigger.
- [HTTP request](https://smallbusinesschatbot.com/docs/integrations/automation/http-request): send data the other way.
