Observe-only co-browse in 15 minutes
Observe-only co-browse is the pattern most teams want first: the agent sees what the customer sees, in real time, and nothing the agent types or clicks can reach the visitor’s page. This guide stands up exactly that posture, end to end, in about 15 minutes. It is the laser-focused counterpart to From support widget to resolution. That guide assumes your web-chat stack is already embedded and runs the full support loop around it; this one assumes nothing beyond a public page and gets one observe-only session live. When you later want the agent to highlight, scroll, or fill fields, the consent model and guided-control packets are covered in Co-browse: live screen assistance.When to co-browse vs observe
Reach for observe-only when the diagnostic value is in what the visitor sees right now: a checkout that renders differently than your staging env, a form abandoned midway, an error message the visitor can’t describe. Because the capture is the page’s DOM (not a pixel stream), an observe-only session on a public page is low-risk by construction: the visitor’s own browser redacts inputs before anything is published, off-screen content is never transmitted, and the agent has no input path into the page at all. Observe-first is a viable default posture, not just a fallback:- It is the platform default. A session starts observe-only unless the visitor explicitly grants more;
controldefaults tofalseon the start call, and an agent request can never exceed the visitor’s grant. - It never escalates silently. An observe-only session cannot be upgraded to guided control mid-session. If the agent needs to fill a field, the visitor re-starts the session with
control: trueand consent is re-confirmed. - It works on any public page the widget is on. No authenticated area, no screen-share plugin, no share link.
Pick the session shape
Three dials define a session, and the defaults are the right first answer:- Duration. Join tokens expire after 30 minutes (
expires_inon the join response); a reconnecting agent re-mints by calling join again, which is idempotent on a live session. The session itself stays open until either side ends it, so a long troubleshooting conversation doesn’t drop the mirror at the token boundary. - Capture granularity. The visitor’s browser publishes DOM snapshots of the page they are on, plus incremental mutations between snapshots. There is no pixel stream and no off-screen capture: the agent’s mirror is exactly the visible DOM of the current page.
- Input masking. The default policy masks every
<input>,<textarea>, and<select>value, blockstel,email, andccfields by type, and always blocks password and card-number/CVC fields no matter what you configure. For an observe-first rollout, keep the defaults: the agent sees layout, labels, and validation states, which is what “see what the customer sees” actually needs.
Wire the widget callback
A session can only exist on a page that carries the widget, and consent is collected synchronously by the widget at start time: the visitor taps the co-browse action inside the conversation, and that same request starts the session. There is no separate consent handshake to build. Put the widget on the pages your visitors use (if support-widget-to-resolution is your roadmap, this snippet is the piece of it you need today):- The agent asks in the open conversation: “Can I see what you’re looking at?”
- The visitor taps the co-browse action in the widget. That tap is the consent capture and the session start in one synchronous step; the widget calls the start endpoint with its own visitor token and the chosen consent ceiling (
controlomitted, i.e. observe-only, unless the visitor grants more). - The session is stamped on the conversation and fans out to your Inbox in real time.
./widget subpath of the web SDK (@devotel-orbit/web).
Security controls
Everything below is enforced at capture time, in the visitor’s browser, before a packet is published; the server never sees an un-redacted DOM.- Snapshot masking. Every DOM snapshot and every mutation packet passes through your privacy policy before upload. Masked values travel as mask placeholders, so the interval at which snapshots upload only controls how fresh the mirror is, never what it contains. Tighten content with masking, not cadence.
- Regions that are never mirrored. Password fields and card-number/CVC fields are always excluded, and you can add regions two ways:
block_selectorsin the privacy policy (viaPUT /api/v1/cobrowse/privacyor the dashboard panel), or thedata-cobrowse-blockattribute on any element. A blocked subtree is neither published nor targetable. - Origins. A session can only start from an origin where your widget is installed and enabled; the same allowed-origins list that governs the chat widget governs co-browse, because the widget is the only entry point. Review it in the native chat widget channel config (see its Privacy & GDPR section) and in Settings → Channels → Native chat (dashboard reference).
- Scoped tokens. The agent’s join token is bound to exactly one room and expires after 30 minutes; it cannot be replayed against another tenant, thread, or session.
- Revocation. The visitor can end the session at any time from the widget; the mirror stops immediately. Ending from either side is terminal: the visitor re-initiates if the agent needs back in, which re-confirms consent.
The workflow
With the widget live and the policy confirmed, a session is two moves:- Visitor starts. The visitor taps co-browse in the widget while the conversation is open. The Inbox conversation is flagged Co-browse available.
- Agent joins. Open the conversation in the Inbox and join. The flag flips to Co-browse live with the per-session consent indicator, and the agent’s browser renders the visitor’s page mirror, observe-only.
See also
- Co-browse: live screen assistance — the full consent model, guided-control packets, and the privacy policy reference
- From support widget to resolution — the full-stack web-chat install this guide borrows the widget snippet from
- Native chat widget channel config — allowed origins and the Privacy & GDPR section
- Settings → Channels → Native chat — the dashboard panel for widget and masking settings
- Co-browse API reference — session, privacy, and control record shapes and error codes
- Web SDK
./widgetsubpath (@devotel-orbit/web) — programmatic widget embed