Start a live chat conversation from a company website
A visitor on a company website opens the chat widget and sends a message, establishing an anonymous real-time connection and creating a conversation — without any platform account.
When this happens: Visitor clicks the widget launcher and sends a message.
How it works
- EasyCRM opens
https://www.acme.example(a page with the installed snippet). - EasyCRM loads the widget loader script; the launcher appears bottom-right.
- Clicks the launcher; the chat frame opens showing the configured greeting.
- Calls
BootstrapAsync: validates the page's origin against Allowed Origins, checks the honeypot and the per-IP rate limit, finds no existing valid resume token, and creates a newVisitorSessionwith a temporary identifier and a visitor hub token. - Types Do you ship to Moldova? and sends it.
- EasyCRM checks length and rate limit, creates the
Conversation(FR-25 inbound pipeline) and the firstMessage(Inbound,Customer), and routes it (FR-24) or applies out-of-hours/no-operator behavior. - EasyCRM shows a connecting… state in the widget until an operator or the AI responds.
Other paths
Visitor identifies before messaging
When the identification form is set to *Before first message*, the form appears before the composer is enabled.
If something goes wrong
Origin not allowed
At step 4 the page's origin is not in Allowed Origins. BootstrapAsync throws EasyCrm:LiveChat:OriginNotAllowed; the widget shows nothing usable and the event is logged for the widget's error list.
Rate limited
Too many new sessions from the same IP within a minute. EasyCRM shows a generic please try again shortly message; no session is created.
Honeypot tripped
The hidden honeypot field is non-empty (automated traffic). EasyCRM returns a normal-shaped success response with no session actually created, so the bot cannot tell it was rejected.
Good to know
- The widget's real-time channel is dedicated to visitors and never accepts the staff hub token, or vice versa.
- A Live Chat conversation never has a messaging-window expiry (
CustomerWindowExpiresAtis always NULL).