WordPress
WordPress hides <head> behind theme templates, so adding Statable means either using a header-injection plugin or pasting a snippet into a child theme. Either takes about a minute.
This guide covers single-site, multisite, and WooCommerce. Works on classic and block (FSE) themes, WordPress 6.x, and PHP 7.4+.
Install
Option 1: Header-injection plugin (recommended)
Use WPCode – Insert Headers and Footers + Custom Code Snippets by WPCode (formerly Insert Headers and Footers by WPBeginner). Free, in the official Plugin Directory, 3M+ active installs.
- In WordPress admin, go to Plugins → Add New.
- Search "WPCode" or "Insert Headers and Footers", click Install Now, then Activate.
- Go to Code Snippets → Header & Footer.
- Paste the snippet below into the Header box, replacing
YOUR_SITE_ID:
- Click Save Changes.
This survives theme switches and updates, and works with most caching plugins out of the box.
Legacy menu path
On older WPCode 1.x installs (or with "Headers & Footers mode" enabled in WPCode → Settings), the panel lives at Settings → Header & Footer instead.
Option 2: Manual edit (child theme)
If you'd rather not install another plugin, add the snippet directly. Always edit a child theme, never the parent, so updates don't overwrite your changes. Block themes (FSE) support functions.php too, even though theme.json handles styling.
In wp-content/themes/your-child-theme/functions.php:
<?php
add_action('wp_head', function () {
?>
<script defer src="https://statable.com/js/YOUR_SITE_ID/s.js"></script>
<?php
}, 5);
Priority 5 runs after wp_enqueue_scripts (priority 1) but before print_emoji_detection_script (7), wp_print_styles (8), and wp_print_head_scripts (9). The tag lands near the top of <head>, ahead of most third-party output.
Tracking custom events
Attach event handlers via wp_add_inline_script against a registered "dummy" handle:
<?php
add_action('wp_enqueue_scripts', function () {
wp_register_script('statable-events', '', [], null, true);
wp_enqueue_script('statable-events');
wp_add_inline_script('statable-events', "
document.addEventListener('submit', function (e) {
if (e.target.matches('.contact-form')) {
window.statable && window.statable.t('Contact Form Submitted');
}
});
");
});
The empty src is the canonical pattern. WordPress 5.7+ also exposes wp_print_inline_script_tag() if you'd rather skip the dummy handle and print a tag directly.
WooCommerce: track purchases
Tested against WooCommerce 9.x with HPOS (High-Performance Order Storage) enabled. wc_get_order(), $order->get_total(), and $order->get_currency() are HPOS-compatible.
<?php
add_action('woocommerce_thankyou', function ($order_id) {
if (! $order_id) return;
$order = wc_get_order($order_id);
if (! $order) return;
?>
<script>
window.statable && window.statable.t('Purchase', {
revenue: <?php echo esc_js($order->get_total()); ?>,
currency: '<?php echo esc_js($order->get_currency()); ?>'
});
</script>
<?php
});
$order->get_currency() returns the currency the order was placed in, not the active store currency. Useful if you run a multi-currency store.
Multisite networks
Each subsite needs its own Site ID. Add the snippet per-site:
- Header-injection plugin. Install on each subsite separately. Each instance keeps its own settings.
- Child-theme
functions.php. Branch onget_current_blog_id()to pick the right Site ID per subsite.
Verify it's working
- Open Statable Realtime in your dashboard.
- Visit any page on your WordPress site. Use an incognito window if your own browser is opted out.
- See Verify installation for full verification.
Common pitfalls
- Caching and optimisation plugins. WP Rocket, LiteSpeed Cache, FlyingPress, W3 Total Cache, and Cloudflare APO can defer, combine, or minify scripts in ways that break
data-id. Addstatable.com/js/YOUR_SITE_ID/s.jsto the plugin's "Excluded JavaScript Files" / "Exclude from Minify" / "Exclude from Combine" lists. WP Rocket: Settings → WP Rocket → File Optimization → Excluded JavaScript Files. - Editing a parent theme. Theme updates erase your changes. Use a child theme or a plugin.
- Google Tag Manager already installed. Don't load Statable both directly and through GTM. Pick one. See Google Tag Manager.
- Multilingual plugins (Polylang, WPML). One Site ID covers all languages. The script reports the page URL, so per-language reports work via URL filters in the dashboard.
- Admin Bar pageviews. Logged-in admin sessions are still tracked. To exclude yourself, run
localStorage.setItem('analytics_ignore', 'true')once in your browser console. See Verify installation.
See also: Install the tracking script, Custom events, JavaScript API.
Ready to take control of your web analytics? Try Statable free for 30 days. No credit card required, full feature access, built for GDPR. Start your free trial or view a live demo.

