When the AI assistant hands a conversation to people, it is usually a lead or a problem worth tracking. This recipe sends the customer's contact and the conversation to your CRM at that moment, through Make, n8n or Zapier, without code. It uses a webhook (see Webhooks) and the rule your platform already has, Handoff to a team → notify the team (see Automation rules).
1. Get an address that receives the data
Create a scenario or workflow that starts with a webhook and copy its address:
- Make: a new scenario, module Webhooks > Custom webhook, Add, copy the address. Webhooks work on the free plan.
- n8n: a new workflow, node Webhook, method POST, copy the Production URL and activate the workflow.
- Zapier: a new Zap, trigger Webhooks by Zapier > Catch Hook, copy the address. Webhooks by Zapier is a premium app and needs a paid Zapier plan.
2. Add the webhook in the panel
In the panel, Admin > Webhooks > New webhook: give it a name such as CRM, paste the address and set a secret. The panel asks for at least one event: tick conversation.assigned, then save. The webhook will also send that event, so step 4 starts with a filter.
3. Send it on every handoff
Open Admin > Automations, tab Conversation update, rule Handoff to a team → notify the team. Add the action Trigger webhook, pick the CRM webhook and type an event name, for example handoff.to_team. Save the rule.
The rule runs when a conversation moves to a team: when the assistant hands it over, and also when an agent moves it to another team. Then your scenario receives one request.
Before you map fields, send one real handoff: write to your chat and ask for a person. Make and Zapier learn the fields from the first request they receive.
4. Create the lead in your CRM
First let only handoffs through: right after the webhook add a filter that continues when event equals handoff.to_team (in Make a filter on the route, in n8n an If node, in Zapier Filter by Zapier). Then add the CRM step and fill it from the request:
| CRM field | Take from the request |
|---|---|
| Name | payload.conversation.contact.first_name and last_name |
payload.conversation.contact.email |
|
| Phone | payload.conversation.contact.phone_number |
| Title or subject | payload.conversation.subject, empty in chats; Conversation # with reference_number reads better |
| Note or description | payload.conversation.last_message: the last message in the conversation |
| Source | payload.conversation.inbox_name, for example the name of your website chat or Telegram bot |
| Link | https:// + your support address + /inboxes/all/conversation/ + payload.conversation.uuid |
Ready modules for the CRM step:
- Kommo: create a lead with a contact.
- Bitrix24: add a lead.
- HubSpot: create or update a contact, then a deal or a ticket.
- Pipedrive: create a person, then a lead.
The link opens the conversation for agents who may see all conversations, such as admins.
What the request contains
{
"event": "handoff.to_team",
"timestamp": "2026-10-09T15:20:11Z",
"payload": {
"actor_id": 3,
"conversation": {
"uuid": "6b0d8b1e-5b1f-4a53-9f8e-0c9d3a1d2e44",
"reference_number": "1423",
"subject": "",
"inbox_name": "Website chat",
"assigned_team_id": 1,
"last_message": "Can someone call me about the Basic plan?",
"contact": {
"first_name": "Maria", "last_name": "Rossi",
"email": "maria@example.com", "phone_number": "+3725550000"
}
}
}
}
The conversation object has more fields than shown here, the same as in other webhook events.
Good to know
- The request carries the last message, not a summary of the whole conversation. To read the conversation, follow the link; in the panel, agents can ask the AI for a summary (see AI helpers for agents).
- Every request is signed with your secret in the
X-Support-Signatureheader. n8n and Make can check it (see Webhooks). In Zapier keep the hook address private: it is the key to your scenario. - A request that fails is not repeated. If your scenario was off, those handoffs did not reach the CRM.