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

# Calling website form leads back

> The agent calls whoever filled in your website form, seconds after they submit it.

## What it does

An agent built from the **Lead Callback (Speed-to-Lead)** template comes with a
webhook URL. You paste it into your website form. From then on, every
submission ends in a phone call to that person - usually before they have
closed the tab.

The URL carries its own token, so it works with tools that cannot send an HTTP
header (Elementor, WordPress plugins, Webflow).

## Where to find the URL

Easiest: **Integrations** → **Custom** tab → **Leads from forms**. The wizard
asks for the agent, calling hours and the phone field, lets you check a
sample submission without calling anyone, and then shows the URL. It works
for any agent: when the flow has no **Lead webhook** node, the wizard adds
one ([Custom integrations](/en/integrations/custom#leads-from-forms)).

The URL is also in the agent editor → **Integrations** tab → **Lead sources**
section. It looks like this:

```
https://your-domain/api/v1/public/lead/<id>?t=<token>
```

<Warning>
  The URL is a key: anyone who has it can trigger a call. Do not publish it in
  page source your visitors can read - paste it server-side or into your form
  tool's configuration.
</Warning>

## Connecting the usual tools

| Tool | Where to paste it |
| - | - |
| Elementor Pro | Form → Actions After Submit → **Webhook** → Webhook URL |
| WPForms / CF7 (with a webhook plugin) | Form settings → Webhook URL, method POST |
| Webflow | Site settings → Integrations → Form webhook |
| Tally / Typeform | Integrations → Webhooks |
| Zapier / Make | **Webhooks → POST** step, JSON body ([ready templates](/en/integrations/leads/make-zapier)) |
| Your own backend | `POST` any JSON containing a phone number |

## What it accepts

Anything. The payload is flattened and the phone number is looked up by field
name (`phone`, `phone_number`, `telefon`, `tel`, `mobile`…), and by the shape of
the value when the name is unusual. If your form calls the field something else,
put its name in **Phone field name**.

Numbers are normalized to international format: `600 123 456`, `0600123456`,
`0048600123456` and `+48 600-123-456` all reach the same call. **Country code**
decides what a national number gets prefixed with.

The other form fields become conversation variables (`{{first_name}}`,
`{{budget}}`…) and spreadsheet columns if Google Sheets is switched on.

## Calling hours

A submission that arrives outside the configured hours is **not dropped** - the
call is scheduled for the next opening. The default is Mon-Fri, 9:00-20:00,
Europe/Warsaw.

If every outbound channel is busy at that moment, the lead waits and is retried
every minute for roughly ten minutes.

If the account is out of credit, the lead is **not dropped** either: it waits
and is retried every five minutes for an hour. A top-up within that hour is
enough for the agent to call. Only after the hour does the lead become **Not
called** (see [The Leads list](#the-leads-list)).

## Duplicate submissions

The same number submitted again within 10 minutes (by default) is skipped -
double-clicking Submit does not mean two phone calls.

## Do not call list

A number on your organization's **Do not call** list is never called, also
not from a form. The submission gets `200 {"status":"do_not_call"}` and no
call is placed or scheduled. How numbers get onto the list (by hand, from a
CSV, by the agent during a call and by an SMS `STOP`) is described in
[Contacts](/en/features/contacts#the-do-not-call-list).

## Limits

Every submission is a paid call, and the URL is often visible in the page
source. So each agent's URL accepts at most:

| Limit | Value |
| - | - |
| Submissions from one IP address | 10 per 10 minutes |
| Submissions to one agent | 20 per 10 minutes and 150 per day |
| Calls waiting for the agent (outside hours, busy channels) | 50 |

Above a limit the URL answers `429` with a `Retry-After` header and a
`detail` like `{"code": "lead_rate_limited", "message": "...", "retry_after": 600}`
(`lead_queue_full` when too many calls are waiting). The account owner gets
an e-mail about it, at most once a day per agent. Google Ads lead forms
share these limits; Facebook Lead Ads, signed by Meta, only have the limit on
waiting calls.

If your real traffic is higher, write to us and we will raise the limit. If
you do not expect that many submissions, someone may have copied the URL:
switch the webhook off in the agent's settings and let us know.

## The Leads list

**Observe** → **Leads** shows every submission an agent was asked to call
back (website form, Google Ads, Facebook Lead Ads, missed call, new CRM
contact) and what became of it:

| Status | Meaning |
| - | - |
| Waiting | outside hours, busy channels or no credit; shows when the next try is |
| Dialled | the call went out; the link opens the call |
| Answered | the conversation happened |
| Not answered | nobody picked up, or voicemail did |
| Not called | after every try: no credit, busy channels, source switched off, dialling error |
| Do not call | the number is on the Do not call list |
| Refused (limit) | over a lead limit, or too many calls waiting |

Duplicate submissions are not listed separately. Submissions refused by a
limit are kept up to 50 per agent per day, so a copied URL cannot fill the
list. Leads are deleted together with transcripts when you set a retention
period under **Privacy**.

When a lead becomes **Not called** or **Refused (limit)**, a notification
appears in the bell (at most one per hour per agent) and webhooks with the
`lead.dropped` event switched on receive its details
([Webhooks](/en/integrations/webhooks)).

## Responses

| Code | Meaning |
| - | - |
| `200 {"status":"calling"}` | dialling now |
| `200 {"status":"scheduled"}` | outside hours, no free channel or no credit - scheduled |
| `200 {"status":"duplicate"}` | this number was accepted a moment ago |
| `200 {"status":"do_not_call"}` | the number is on the Do not call list - no call |
| `400` | no dialable phone number in the submission |
| `401` | wrong or missing token in the URL |
| `403` | the webhook is switched off in the agent's settings |
| `429` | over a limit (see [Limits](#limits)); wait as long as `Retry-After` says |

## Test it

Without calling: the **Test** step of the lead wizard shows which number and
fields we read from a pasted submission and when the agent would call.

A real lead (the agent will call the number given):

```bash theme={null}
curl -X POST "https://your-domain/api/v1/public/lead/<id>?t=<token>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Jane Doe", "phone": "600123456", "email": "jane@company.com"}'
```

## After the call

Every call can be written to a Google Sheet, and a campaign can call a sheet's
rows on a schedule. Putting those together - a form that fills a sheet and a
campaign that works it - is described in
[The lead loop](/en/integrations/leads/callback-loop).


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