JSVanilla JS

Feedback widget
for Vanilla JS.

One script tag. No framework. No build step. Works on plain HTML pages.

For static sites, classic server-rendered apps, WordPress themes, or anywhere a build step would be overkill. Drop two script tags into your HTML and the widget appears.

~12kb
gzipped
0
config
MIT
license
Install1 step
> index.html· html
<!doctype html>
<html lang='en'>
  <body>
    <!-- your page -->

    <script src='https://unpkg.com/@usero/sdk'></script>
    <script>
      Usero.initUseroFeedbackWidget({
        clientId: 'YOUR_CLIENT_ID',
      })
    </script>
  </body>
</html>

Replace YOUR_CLIENT_ID with the id from your Usero dashboard.

Built for Vanilla JS

Why teams shipping with Vanilla JS pick Usero.

No build step required

Paste two script tags. No npm, no bundler, no toolchain. Works in any HTML page on any host.

CDN-served, immutable URLs

unpkg and jsDelivr both serve the IIFE bundle automatically. Pin a version and it never changes underneath you.

No framework tax

The vanilla build never imports React. Plain HTML pages pay zero framework overhead.

Works inside CMSs

WordPress, Ghost, Webflow, Squarespace, any platform that lets you paste raw HTML. The widget installs the same way.

Canny still requires an account dance and a 200kb iframe. Usero is a 12kb script with no iframe and no auth bridge.
vs Canny script

Verify

Confirm it's working.

  1. Load the page in your browser with the script tags in place.

  2. Confirm the feedback bubble appears in the bottom-right corner.

  3. Click it and check the panel opens over your page.

  4. Submit a test message and confirm the row appears in your Usero inbox.

  5. Open the console and check there are no "Usero is not defined" errors.

Troubleshooting

Common problems, Vanilla JS edition.

The console says "Usero is not defined".

Your init script runs before the SDK script has loaded. Put the <script src> tag before the inline init script, and place both just before </body>, or add defer to the SDK script tag.

The bubble does not appear on a server-rendered page.

Make sure the init runs after the DOM is ready. If you put the snippet in the <head>, wrap the init in a DOMContentLoaded listener or move both script tags to the end of <body>.

Two or more bubbles appear.

The init ran more than once. If your site loads partials or pages over AJAX, the snippet is being re-included on each fragment. Include it once on the full-page shell, not in every partial.

Nothing happens and the inbox stays empty.

Check the clientId in the init call matches the id in your Usero Settings, with no stray quotes or whitespace. A wrong id silently drops submissions.

It works locally but not on the live CDN-hosted page.

Pin a version in the script src (for example https://unpkg.com/@usero/sdk@latest) and confirm the URL returns 200 in the Network tab. A blocked or 404 script means the global never loads.

FAQ

Quick answers, Vanilla JS edition.

Does it work without a bundler?

Yes. The script tag installs a global Usero object on window. Call Usero.initUseroFeedbackWidget(...) from any script.

Can I self-host the script?

Yes. Download the IIFE bundle from unpkg or npm and serve it from your own domain.

Does it work in WordPress or Ghost themes?

Yes. Paste the script tags into your theme footer or a "code injection" field. Every page picks up the widget.

What if my page loads scripts deferred?

The widget tolerates deferred and async loading. It boots whenever the script finishes parsing.

Ship a feedback widget in your Vanilla JS app today.

Free tier. No credit card. Two-minute install. Cancel by deleting two lines of code.

Get started free