Install · WordPress

Bug reports and feedback from your WordPress site, in one script tag.

Add a WordPress feedback widget and bug report button without a plugin. One script tag through wp_footer, your theme, or a header-and-footer plugin.
Start freeNo credit card required.

Where it goes

In the footer of every page — added with wp_enqueue_script from your child theme, or pasted into a header-and-footer code plugin.

Setup

Adding the widget to WordPress

  1. 01

    Copy your widget key

    From the Widget tab of your project in UserWants. The key begins with uw_pk_ and is public by design: it appears in your page source where any visitor can read it, and the domain allowlist is what makes that safe.

  2. 02

    Pick where the code lives

    If you use a child theme, add it in functions.php with wp_enqueue_script — that survives theme updates and loads it on every page. If you do not, a plugin such as WPCode or Insert Headers and Footers does the same job with no PHP, and you paste the tag into the footer box.

    php
    // functions.php in your child theme
    add_action( 'wp_enqueue_scripts', function () {
      wp_enqueue_script(
        'userwants',
        'https://userwants.app/widget.js',
        array(),
        null,
        true // load in the footer
      );
    } );
    
    add_filter( 'script_loader_tag', function ( $tag, $handle ) {
      if ( 'userwants' !== $handle ) return $tag;
      return str_replace(
        ' src=',
        ' data-userwants-key="uw_pk_..." defer src=',
        $tag
      );
    }, 10, 2 );
  3. 03

    Allow your domain

    Add your site’s hostname under Allowed domains in the Widget tab. Add both the www and non-www form if your site answers on both, and remember that a staging subdomain is a different host that needs its own entry.

  4. 04

    Identify logged-in users, if you have any

    On a membership site or a WooCommerce store you already know who is browsing. Passing the WordPress user id means the reporter is never asked for an email, and every report arrives attached to an account you can look up.

    php
    add_action( 'wp_footer', function () {
      if ( ! is_user_logged_in() ) return;
      $u = wp_get_current_user();
      printf(
        '<script>window.UserWants?.identify(%s);</script>',
        wp_json_encode( array(
          'identifier' => (string) $u->ID,
          'name'       => $u->display_name,
          'email'      => $u->user_email,
        ) )
      );
    } );

Worth knowing

What bites on WordPress

The things that are specific to a CMS, rather than true of every install.
  • Caching and optimisation plugins will try to move it

    WP Rocket, LiteSpeed Cache and Autoptimize all offer to combine, delay or defer third-party scripts. Combining breaks it, because the tag carries the key as an attribute that is lost when the file is inlined. Exclude userwants.app from JS combining.

  • Editing the parent theme is the classic mistake

    The next theme update overwrites functions.php and the widget silently disappears. Use a child theme or a code-snippets plugin instead.

  • It is not a WordPress comment form

    Reports go to your UserWants inbox, not to wp_comments, and nothing is written to your database. There is no plugin to keep updated and no new attack surface on the WordPress side.

FAQ

Questions

Do I need a WordPress plugin to install the widget?
No. It is a plain script tag, so a child theme or any header-and-footer snippet plugin you already use is enough. There is nothing to keep updated on the WordPress side and no database tables are created.
Will it work on WooCommerce or a membership site?
Yes, and those are where it works best. Pass the logged-in user id with identify and every bug report arrives with the account attached, so you know which customer hit the checkout error without asking them.

The full reference — every field the widget collects, the domain allowlist rules and the JavaScript API — is in the widget docs.

Try it on your WordPress site.

Paste the tag, add your domain, and the next report arrives with the screenshot and the JavaScript error already attached.