Web chat
See what visitors do in the chat, in your own analytics
The chat widget on your site reports what happens in it to your page. You decide where that goes: Google Tag Manager, Google Analytics, or nowhere. We add no tracking script and set no cookie of our own for this.
Two ways to receive them
Every event is pushed to window.dataLayer when your page has one, and also sent as a browser event named sautidesk:widget on window. A page with neither is fine: the widget checks, and a missing or broken data layer never reaches the chat.
// Google Tag Manager: create a Custom Event trigger named
// widget_opened (or a regular expression such as ^widget_), then read
// widget_key_hash, theme, corner, has_attachment, answered and reason
// as Data Layer Variables.
window.dataLayer.push({
event: "widget_message_sent",
widget_key_hash: "d108dc302ec8",
theme: "system",
corner: "bottom-right",
has_attachment: false,
});// No tag manager? Listen on window and send to Google Analytics yourself.
window.addEventListener("sautidesk:widget", function (e) {
var d = e.detail; // { event: "widget_opened", widget_key_hash: "...", ... }
var name = d.event; // widget_loaded, widget_opened, ...
delete d.event;
gtag("event", name, d); // GA4
});The events
| Event | When it fires | Extra field |
|---|---|---|
widget_loaded | The widget has loaded on the page. Fires once per page. | None |
widget_opened | The visitor opened the chat box. | None |
widget_closed | The visitor closed it. | None |
widget_details_submitted | The visitor answered the card that asks how to reach them. The details themselves are never in the event. | None |
widget_message_sent | A message was delivered to your team. | has_attachment |
widget_attachment_sent | A message that carried at least one file was delivered. | None |
widget_call_offered | The chat showed a call button. Fires once per page. Calling needs a voice number and an agent online with the SautiDesk phone open; without both there is no button, so the event does not fire. | None |
widget_call_started | The visitor pressed Call and the call began to connect. | None |
widget_call_failed | The call could not connect. | reason |
widget_call_ended | A call ended, by either side. | answered |
widget_away_shown | The chat told the visitor that nobody is on right now. Fires once per page. | None |
The fields
Every event carries widget_key_hash, theme and corner. Some carry one more, as listed above.
widget_key_hash: A short fingerprint of your widget key, so you can tell widgets apart. It is the first 12 characters of the SHA-256 of sautidesk-widget: followed by your key. The key itself is never sent.theme: light, dark or system.corner: bottom-right or bottom-left.has_attachment: true or false. On widget_message_sent only.answered: true if the call was picked up before it ended. On widget_call_ended only.reason: A short code such as mic_denied, register_timeout, answer_timeout, ice_failed, declined or error. On widget_call_failed only.
What is never in an event
No name, email address or phone number. No message text and no file name. No token, and not your widget key. An event says that something happened and never what was said. The widget enforces this with a fixed list of fields, so nothing else can be added by mistake.
Consent and switching it off
The events are not behind a cookie banner of ours because they carry nothing about a person. What your analytics does with them is governed by your own consent settings: if your tag manager waits for consent before sending, the chat events wait too.
To turn the events off, add data-desk-events="off" to the widget script tag. The chat works the same without them.
Looking for numbers inside SautiDesk instead? The Web chat report in Reports shows chats opened, conversations, first reply time, attachments and calls for any date range.