Leads & Forms
Two ways to collect structured information inside a conversation, instead of sending someone to a separate page they won't come back from.
Lead collection
Add structured forms to the conversation
Find Collect leads under Convert
Lead capture is a capability of the selected Concierge and sits with the other conversion tools.
Enable and configure lead collection
Open Collect leads, turn it on, and choose which visitor details the form should require.
| Collect leads | Custom forms | |
|---|---|---|
| Fields | Fixed: name, email, phone | Anything you define |
| Purpose | Identity capture | Structured intake |
| Plan | Free and up | Starter and up |
| Count | One per agent | Many per agent |
Both render as a real form inside the widget — not a chat message asking the visitor to type their email and hope they format it correctly.
Collect leads
Enable the Collect leads module on an agent. It's included on every plan, Free included.
Configure it in the module's settings card:
| Setting | Notes |
|---|---|
| When to use | Free text telling the agent when to offer the form. |
| Fields | Each of name / email / phone is independently enabled and required. |
| Title, Submit label | Widget copy. |
| Success message | Shown after submission. |
| Dismiss message | Shown if the visitor closes the form without submitting. |
The agent decides when to offer it, guided by your When to use text. Good triggers are specific: "Offer the form when someone asks about wholesale pricing, requests a callback, or asks a question we cannot answer without knowing their account."
Every submission with an email resolves to a Contact, so the lead joins up with any tickets that person later raises.
Custom forms
Custom forms are for structured intake where the fields are yours: a warranty claim, a booking request, a bug report, a quote request. Available from Starter.
Define as many as you need per agent. Each form has:
| Property | Notes |
|---|---|
| Name | The action key the model calls, e.g. warranty_claim. Lowercase, underscores. |
| Title | Heading shown in the widget. |
| When to use | When the agent should offer this form rather than another. |
| Enabled | Off keeps it defined but unofferable. |
| Fields | See below. |
| Submit label, Success message, Dismiss message | Widget copy. |
Field types
text · email · phone · textarea · number · select
Each field has a stable name (the key stored on every submission), a label, a required flag, an optional placeholder, and — for select — a list of value/label options.
The field name is what downstream automations map against, so pick it once and leave it alone. Renaming a field splits your submission history across two keys.
What a submission carries
Submissions record the form name, the values, the conversation they came from, and the agent. Through the Integration API and Zapier, values are returned both nested under values and flattened onto the top level — so email is a mappable field in a Zap rather than something buried inside one opaque blob.
Automating on submissions
Both surfaces emit events you can subscribe to with webhooks or Zapier:
| Event | Fires when |
|---|---|
lead.created | A visitor submits the Collect leads form. |
form.submitted | A visitor submits any custom form. |
Typical wiring: lead.created → create a CRM record and notify sales in Slack. form.submitted filtered to warranty_claim → open a row in a tracking sheet and email the ops team.
You can also push leads in from elsewhere with POST /api/v1/leads. That path runs the same field rules, contact resolution, and event emission as the widget, so an imported lead behaves identically to one collected in chat.
Best practices
- Require the fewest fields you can act on. Every required field costs you completions. Email alone is usually enough to follow up.
- Ask for email in at least one form. It's the only field that creates a contact.
- Give each custom form a distinct "when to use". If two forms sound alike, the agent will pick between them badly — and so would a person.
- Prefer
selectovertextfor anything you'll filter on later. Free text is unqueryable in every downstream tool. - Don't rebuild the lead form as a custom form. Collect leads is on Free, resolves contacts, and has its own event.
Troubleshooting
| Symptom | What to check |
|---|---|
| The form is never offered | Module enabled? Form enabled? Is "when to use" specific enough for the agent to recognise the moment? |
| Submissions have no contact | The submission had no email — contacts are keyed on email. |
| A Zap can't see a field | Confirm the field's stable name; flattened keys use it verbatim. |
| Custom forms unavailable | Starter and up. Collect leads is on Free. |
Next steps
- Contacts — where every emailed submission lands.
- Webhooks — subscribe to
lead.createdandform.submitted. - Zapier — the same two events with no code.
- Integration API — read submissions, create leads.