Install · WordPress
Bug reports and feedback from your WordPress site, in one script tag.
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
- 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.
- 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 ); - 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.
- 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.
phpadd_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
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.