What’s captured
The loader keeps the last 40 events in memory on your page. Nothing is sent while the visitor just browses: the events go to the desk only with a message they write (or, for one event, to word a nudge).
Each snapshot also carries the current page (URL and title), the user agent, viewport size, language and time zone.
Some details on what counts:
- The widget’s own traffic (the chat frame, uploads) is never recorded.
- A successful non-GET request (a 2xx save) or a form
submitclears the page’s problem, so a visitor who recovered isn’t “stuck”. - Time with the tab hidden doesn’t count toward “stuck”.
- A triple click that selects text isn’t a rage click, and clicks in text fields, selects, canvases, media and the widget itself are ignored.
Report your app’s own errors
When something fails for a reason your app can name, tell the widget. The message joins the timeline, so the AI and your agents can explain it in your words (“Your CSV import failed on row 42.”).messageis required, masked like everything else, and cut to 300 characters.codeis optional: letters, digits,_,.and-, up to 60 characters. It’s for your team. Agents see it in the timeline and in issue drafts; the AI answering visitors never gets it.- It does nothing with
data-capture="off"or beforeJunDesk.consent(true), and it never throws.
Masking
Everything is masked in the browser before it leaves, and again on the desk with the same rules. Query values are removed from every URL. Emails, tokens, keys, password-like values and card-like numbers become placeholders such as[email] and [token]. Request and response bodies, storage and typed values are never read. Consent and privacy has the full table.
Where agents see it
Open a conversation in the Inbox. The side panel has a Browser section:- Page, Browser (like “Chrome 141 on Windows”), Screen and Locale from the latest message;
- What happened: a timeline of events from the conversation’s recent messages (up to 100, newest first, duplicates merged), with a ⚠ count of issues;
- Errors only hides navigation and keeps errors, failed requests and rage clicks.
How the AI uses it
When a message carries debug context, the AI’s prompt includes it as plain lines, oldest first, in the visitor’s time zone:- use it only when it explains the customer’s problem, and ignore it otherwise;
- say plainly what failed and when (“your request to /api/billing failed with a server error (500) at 14:02”), without guessing the cause or promising a fix;
- treat “The app reported an error” lines as your app’s own words, and never repeat masked placeholders like
[email].
flag_problem
When debug context is present, the AI gets a built-in tool, flag_problem, with one argument: a one-line summary for engineers. The AI is told to call it first when an error or failed request explains the problem, then tell the customer what failed and that the team has it.
After that answer, the desk hands the conversation to your team:
- the customer sees “I’ve passed this to the team with the technical details. They’ll follow up right here.”;
- your team gets an internal brief that starts with “Bug flagged by the AI:” and the summary, and quotes the failing request or error.
flag_problem and handoff are built-in names. An actions/*.yaml file can’t use them.Proactive nudges
When something really breaks on the page, the widget can offer help before the visitor asks: “Looks like the usage chart didn’t load. Want a hand?” Turn it on or off with Chat widget → Behaviour → Proactive help → Offer help when something breaks. It’s on by default. A nudge is offered for:- JavaScript errors and app errors from
reportError(); - rage clicks and “stuck” moments;
- requests that got no response from your own site, failed with a 5xx, or failed on a non-GET (a GET that returns 404 doesn’t nudge on its own).
- The loader waits about a second for a burst of errors to settle, then sends the one masked event and the page to the desk.
- The AI words a single line from it. The same failure on the same page gets the same line for a day, so it’s one AI call per day, not per visitor. If the AI is off, over its monthly cap or slow, the visitor sees “Looks like something went wrong on this page. Want a hand?”
- A visitor sees at most one nudge per page load, never while the chat is open, and none before consent.
- With the round button (chat window, greeting card off) it’s a small card above the button; the greeting card and the island show it themselves. Clicking it opens a chat that starts with that line.
- Nudges are only offered on allowed websites, and
data-capture="off"turns them off.
/pricing) live in the same Proactive help card. They don’t depend on debug capture.
Try it
Chat widget → Install → Open demo page opens a test page with a “Pay invoice” button that fails with a 500, a “Show usage chart” button that throws, and an “Export CSV” button that does nothing however often you click it. Click them, then ask “why can’t I pay my invoice?” in the chat.Consent and privacy
What’s stored, what’s never captured.
Issues
File a GitHub or Linear issue from the chat.