Docs
Install the widget
Add the JavaScript widget to any website, WordPress or site builder, with CSP guidance.
Standard installation
Paste this before the closing </body> tag on every page where the widget should appear. Replace the key with the one shown in Settings → Widget.
<script
async
src="https://ext0.com/sdk/v1/feedback-widget.min.js"
data-workspace="pub_YOUR_PUBLIC_WORKSPACE_KEY"
></script>
The data-workspace key is public. It identifies your workspace but cannot read private boards or perform staff actions, so it is safe in page source.
Allowed domains
In Settings → Widget → Allowed domains, add every origin that embeds the widget, such as https://example.com and https://app.example.com. The widget refuses to initialize on other origins. http://localhost origins are only allowed when development mode is turned on for the workspace.
WordPress
- In WordPress admin, open your theme's footer-scripts option or a "header and footer code" plugin of your choice.
- Paste the snippet into the footer (before
</body>) area and save. - Clear any page cache, then reload your site and look for the launcher.
Block themes: add a Custom HTML block to the footer template part and paste the snippet there.
Site builders and tag managers
Most site builders have a "custom code" or "code injection" setting — paste the snippet into the footer or end of body field. With a tag manager, create a custom HTML tag that fires on all pages; the async script is safe to inject after page load.
Single-page applications
Include the snippet once in your HTML shell. The widget persists across client-side route changes. To open it from your own UI use window.FeedbackWidget.open('feedback') — see the SDK reference.
Content Security Policy
If your site sends a CSP header, allow the widget origin for scripts, frames and connections:
Content-Security-Policy:
script-src 'self' https://ext0.com;
frame-src https://ext0.com;
connect-src 'self' https://ext0.com;
On our side, the widget iframe sends a frame-ancestors policy built from your workspace's allowed domains, so the panel can only be framed by sites you approve.
Troubleshooting
- No launcher appears: check the browser console, confirm the key, and confirm your origin is in Allowed domains.
- Panel is blank: a CSP
frame-srcrule is usually blocking the iframe. - Launcher hidden behind other elements: raise the z-index in Settings → Widget.