Embedded support calls inside your widget.
Escalate a support chat to a video + screen-share call inline. Attach the recording to the ticket. Keep the customer inside your product instead of a Zoom URL.
The problem
Support teams need to escalate a chat to a video + screen-share call inline, attach the recording to the ticket, and surface a single transcript link back to the agent — without sending the customer to a separate Zoom URL that breaks the brand and the workflow.
How LevelChat fits
Render the LevelChat Web SDK inside your support widget. Start a room when the customer accepts the call, share screen on either side, and POST the recording.ready webhook payload to your ticket system. No per-seat license — you pay for the meeting minutes you actually use.
Reference architecture
Support widget (browser) Agent dashboard
│ │
└──────────── LevelChat SFU ─────────────────────┘
│
▼
recording.ready webhook
│
▼
Your CRM / ticket system
(Intercom / Zendesk / …)Integration snippet
Real code against published packages — no phantom imports.
'use client';
import { LevelChatProvider, useLocalParticipant, useRoom, VideoTile } from '@levelchat/web-react';
export default function SupportCall({ token, ticketId }: { token: string; ticketId: string }) {
return (
<LevelChatProvider token={token}>
<CallSurface ticketId={ticketId} />
</LevelChatProvider>
);
}
function CallSurface({ ticketId }: { ticketId: string }) {
const { participants, room } = useRoom();
const { toggleScreen } = useLocalParticipant();
React.useEffect(() => {
if (!room) return;
void room.record({
compose: 'grid',
format: { output: 'mp4_h264' }, // h264 plays everywhere; agents review on phone
webhook: `/api/tickets/${ticketId}/recording`,
});
}, [room, ticketId]);
return (
<div className="grid grid-cols-2 gap-2">
{participants.map((p) => <VideoTile key={p.id} participant={p} />)}
<button onClick={toggleScreen}>Share screen</button>
</div>
);
}Common questions for this vertical
Does the widget need a separate sign-in for the customer?
No. Mint a guest token on your support backend tied to the ticket id — the customer joins by clicking a button inside the widget. No account creation, no Zoom-style waiting room friction.
Can the recording be searchable?
Today recordings ship as mp4/HLS; full-text search on transcripts is on the roadmap (Preview). The webhook payload includes a presigned download URL you can pipe through any transcription service (we use Deepgram in our reference implementation).
How does the agent know when the customer joins?
Subscribe to participant.joined and participant.left webhooks for the room. The agent dashboard renders a "customer waiting" banner the moment the join event fires; agents can pre-stage the screen they want to share before accepting.