Connect Boei with 1000+ other services like CRM systems and email marketing tools using webhooks.
How to get there: Go to Setup → Website widget in the top menu → click your widget → click on a channel → scroll to its Webhook setting.
When a customer submits a form or interacts with your widget, Boei can send that data to other services:
For an AI Agent, configure webhook delivery under Setup → AI Agent → Notifications. Each notification rule can send at one of two moments:
Both moments send the same common conversation fields. A form submission also includes a separate form object so values entered by the visitor are not mixed with information inferred from the conversation. A chat end includes summary, closed_at and how the chat went instead. The conversation itself comes last, so the details of what happened are at the top of the message.
Use thread_id to match events for the same conversation, visitor_id to match a browser visitor on the same website, and contact.id to match a known contact. visitor_id can be empty when no visitor is linked. These IDs do not grant access to messages. The old load_key field has been removed. Update integrations that used it to use thread_id for conversations.
Every top-level field is always there. When there is nothing to send, for example a chat that did not start on one of your pages, the field is empty rather than missing, so a field you picked in Zapier keeps working. Inside the conversation it works the other way round: a message only carries attachments when the visitor actually uploaded something.
{
"event": "form_submitted",
"event_id": "unique-delivery-id",
"thread_id": "conversation-id",
"inbox_url": "https://app.boei.help/inbox?message=conversation-id",
"visitor_id": "visitor-id",
"created_at": "2026-09-24T10:05:00.000000Z",
"conversation_started_at": "2026-09-24T10:00:00.000000Z",
"chatbot_id": "chatbot-id",
"is_test": true,
"website": "example.com",
"page": {
"url": "https://example.com/pages/shipping",
"title": "Shipping"
},
"title": "Question about a late order",
"form": {
"id": 451,
"name": "Get in touch",
"fields": {
"name": "Jane Doe",
"email": "jane@example.com",
"order_number": "123"
}
},
"contact": {
"id": "contact-id",
"url": "https://app.boei.help/contacts/contact-id"
},
"customer_info": {
"locale": "en"
},
"conversation": [
{
"id": 42,
"role": "user",
"content": "I need help with order 123",
"created_at": "2026-09-24T10:01:00.000000Z",
"attachments": [
{
"file_name": "receipt.pdf",
"mime_type": "application/pdf",
"file_size": 12345,
"url": "https://app.boei.help/a/987?signature=..."
}
]
}
]
}
A few of these are worth knowing about:
A chat end adds three more, which Boei works out once the conversation is over: category (such as support or sales), health_score from 0 to 100, and resolution, which says whether the chat was resolved, handed off or abandoned, with how sure Boei is about that.
Preview submissions are sent normally so you can test the complete integration. They include is_test: true, which you can use to route them to a test ticket or filter them out.
One thing worth knowing: when Boei reports a delivery as successful, it means the address accepted the message, not that anything was done with it. A website homepage accepts our message too and then throws it away. Use Send test (below) and then check whether the record actually appeared on the other side.
event_id is stable for the same logical event, including queue retries. Submitting the same form again in the same conversation with exactly the same values also produces the same ID. Use it to prevent duplicate processing in your receiving system. Boei retries temporary webhook failures. If delivery still fails, Boei adds a team-only internal system message to the conversation so the problem is visible in the inbox but never included in later webhook conversations.
Use created_at when you want to know when to act, and conversation_started_at when you want to know how long the visitor was around. On a chat end, closed_at is the same moment as created_at.
If a delivery has to be retried, the timestamps stay exactly the same, so a retry is not mistaken for a second event.
All dates use the same UTC format Boei has always used, for example 2026-09-24T10:05:00.000000Z.
File sizes in attachments are in bytes, so 12345 is roughly 12 KB.
You do not have to hold a chat and wait for it to close to see whether your webhook works.
Boei sends one example message right away and tells you what happened: the response code, how long it took, and a warning when the address answered with a web page instead of an endpoint.
That warning matters. A common mistake is pasting your own website address into the webhook field. Your website politely accepts our message and then throws it away, so nothing ever looks broken while no data arrives. If you see that warning, you need the address your other tool gave you, such as the one from Webhooks by Zapier.
The test message is marked is_test: true, so you can filter it out on the other side.
A note on what "delivered" means: it means the address accepted our message. Whether the other tool then did something useful with it is something only you can check, by looking for the record on that side.
Connect Boei to other apps using services like:
Different widgets send different data. Here are examples:
{
"timestamp": "2021-05-16T17:43:44.034777Z",
"name": "John Doe",
"email": "john@example.com",
"phone": "+1234567890",
"message": "I have a question about...",
"page_title": "Contact Us",
"page_url": "yoursite.com/contact"
}
{
"timestamp": "2021-05-16T17:43:44.034777Z",
"gdpr_checked": "true",
"name": "Jane Smith",
"email": "jane@example.com",
"page_title": "Home",
"page_url": "yoursite.com"
}
{
"timestamp": "2021-05-16T17:39:35.500695Z",
"feedback": "5/5",
"comment": "Great service!",
"page_title": "Thank You",
"page_url": "yoursite.com/thanks"
}
Use webhooks to connect Boei with:
After setting up:
Boei also offers direct integrations: