c.l.cladDocs

The session lifecycle

boot, identify, update, shutdown, and destroy — the full lifecycle of a chat session.

A Support Chat session moves through a predictable set of phases. After the script loads, it goes from not_initialized to loading and then ready. Calling boot() transitions it through booting into either an anonymous or an authenticated session, depending on whether you supplied a user.

Once live, the realtime connection may move between reconnecting and disconnected as network conditions change — this is handled for you automatically. Calling shutdown() ends the session (shutdown), and destroy() tears the widget down entirely (destroyed).

You can read the current phase at any time via chat.state.

boot(options?)

Creates or resumes a session. With no user, the session is anonymous. With a user, you should supply a tokenProvider (see Identity verification).

await chat.boot({
  user: {
    id: currentUser.id,
    email: currentUser.email,
    name: currentUser.name,
  },
  company: {
    id: currentOrg.id,
    name: currentOrg.name,
    plan: currentOrg.plan,
  },
  tokenProvider: () =>
    fetch("/api/support-chat-token").then((r) => r.text()),
});
  • Idempotent for the same identity.
  • Calling boot() with a different identified user throws — call shutdown() first, or use identify().

identify(options)

Upgrades an anonymous session to an authenticated user (and merges anonymous history when possible). See Anonymous → authenticated upgrade.

update(options)

Refreshes user/company traits and ephemeral page context. Safe to call on SPA route changes; it never creates duplicate users and is rate‑limited.

await chat.update({
  user: { id: "user_123", traits: { role: "admin" } },
  company: { id: "org_456", plan: "enterprise" },
  context: { currentPage: "billing", accountHealth: "red" },
});

shutdown(options?)

Call on logout. Clears user‑specific state and closes the realtime connection. Pass { clearStorage: true } to also remove anonymous/session identifiers — important on shared computers so a previous user's conversations don't linger.

await chat.shutdown({ clearStorage: true });

destroy()

Removes the iframe, listeners, and timers. Persistent storage is left intact unless you previously called shutdown({ clearStorage: true }).

await chat.destroy();