Before you start
An installed widget
Run this list on the staging embed before it goes to production.
Set it up well
A webcall agent runs in the visitor’s browser, so what it knows and how it is found depend on the page as much as on the prompt.- Paste the snippet before the closing
</body>tag. It loads the widget script itself, so it does not block the page. Keep the default bottom-right position unless your page has something there; move it withwidgetPosition(configuration). - Pass page context, such as the product a visitor is viewing, through
variablesso the agent can refer to it, and make the agent’s first message say what it can help with. - Match the widget to your brand under Appearance in Web widget overview, or with
data-ringgstyling on a 2.0 version. - Some visitors can’t or won’t talk: see Chat mode for chat-first embeds and a prompt written for reading.
Security
- The snippet uses the agent’s webcall public key, never your workspace API key (why).
variableshold no passwords, internal tokens or personal data. Anyone can read them in the page source.- Analytics handlers treat
callIdand any user identifiers according to your privacy policy.
Allowed clients
Add each origin the widget runs on, and nothing you don’t own, for example:
Ringg checks each entry when you add it and shows the reason inline if it refuses one. Add staging separately so you can test a new CDN version or CSP change there first.
CSP setup
If your site sends a Content Security Policy, allow jsDelivr:Version pinning
Ship the exact version you tested, the same string inloadAgentsCdn and in your CSP:
latest follows the 1.0 line and moves when a new 1.0 release is published. Components and data-ringg styling need a 2.0.0-beta version.
Browser QA
- The trigger sits where you expect at desktop, tablet and mobile widths.
- Voice mode asks for the microphone and handles both allow and deny. A call that won’t start is usually a denied microphone or a page not served over HTTPS.
- A test call connects, the agent is audible, and the call ends cleanly.
- With
defaultTab: "text", chat sends and receives messages. If the widget opens in the wrong mode, checkdefaultTabandhideTabSelectorin the deployedloadAgentobject. - Components render real data: no
${{…}}visible, required inputs block submit, Send to agent locks the component. - Open a link and Page event buttons work, and their listeners survive client-side navigation.
- Widget events fire once per action, including after client-side navigation.
- No blocked CDN, CSP or mixed-content errors in the console or network panel.
Launch day
- The deployed
agentIdis the agent you tested, and every production origin is under Allowed clients. - The snippet uses the current webcall key, the pinned CDN version, the right bundle for the page, and the intended
defaultTab,variablesand styling. - The production CSP headers are tested on the live page, not only in staging.
- One real conversation: start and end a call or chat, submit a rating, confirm your event handlers received the payloads, then find the call in Logs under call type Webcall.
Troubleshooting
Works on staging, not on production
Works on staging, not on production
The production origin is missing from Allowed clients, or the production CSP pins a different version than the loader.
jQuery's $ is undefined after the widget loads
jQuery's $ is undefined after the widget loads
The page loads
dv-agent.es.js as a plain <script>. The dashboard snippet does this by default. Switch to dv-agent.umd.js and update the CSP path.Every embed stopped working at once
Every embed stopped working at once
The webcall key was rotated. Copy the new snippet from Install & domains and redeploy.
Next steps
Review conversations in Logs
Each web conversation’s transcript and analysis, under call type Webcall.
Read Analytics
Totals and trends across every conversation.