Skip to Content
GuidesInstalling the tracker

Installing the tracker

How to get the Warm AI tracking code live on your site, whichever platform you use.

You need one thing before you start: your tracking ID, a UUID that looks like aeec6fcf-7138-4742-ac4e-0adc0221c737. Find it in your dashboard at warmai.uk : it is shown in the install panel when you add a site, and on the API keys page when you open the key for that site.

Your tracking ID is locked to the domain it was issued for. Events from any other domain are rejected, so use the ID that matches the site you are adding it to.

Subdomains are covered. An ID issued for acme.com also works on www.acme.com, blog.acme.com and app.acme.com. You do not need a separate ID for each. localhost and *.local are accepted too, so you can test before going live.

There are two ways to install, and they give you identical tracking: paste the script directly into your site, or use our Google Tag Manager template. Pick one, not both.


Method 1: Direct script

Paste this into your site’s <head>, as high up as possible so it loads before page content. Replace YOUR_TRACKING_ID with your own ID.

<!-- Session analytics --> <script> (function(id){ window.pulse=window.pulse||function(){(pulse.q=pulse.q||[]).push(arguments)}; var s=document.createElement('script');s.async=1; s.src='https://cdn.menoinfra.com/p/'+id+'.js'; document.head.appendChild(s); })('YOUR_TRACKING_ID'); // Optional: if you don't run a CMP (Cookiebot/OneTrust/Transcend/GTM), // uncomment one of these to control firing: // pulse('consent','grant'); // grant analytics consent // pulse('consent','revoke'); // deny analytics consent </script>

The rest of this section covers where that snippet goes on each platform. Jump to yours.

WordPress

The easiest route is an SEO plugin, since most WordPress sites already have one.

Yoast SEO WP Admin → Yoast SEO → Settings → Site Connections → “Other code in <head>” → paste → Save.

Rank Math WP Admin → Rank Math → General Settings → Headers & Footers → “Header Code” → paste → Save.

Elementor Elementor → Site Settings → Custom Code → Add New → set Location to <head> → paste → Save & Publish.

Theme editor (developer route) Open header.php in your theme and paste the snippet just before </head>. Use a child theme, otherwise a theme update will wipe it.

If you use a caching plugin, clear the cache after pasting. WP Rocket, W3 Total Cache and LiteSpeed all serve stale HTML until you do. Some of them also defer or rewrite scripts as async, which can break the tracker. Exclude scripts from cdn.menoinfra.com from those rules.

Webflow

Project Settings → Custom Code → Head Code → paste → Save Changes, then re-publish your site. The change does not go live until you publish.

Squarespace

Settings → Advanced → Code Injection → Header → paste → Save. Requires a Business plan or higher.

Shopify

Online Store → Themes → the ”…” menu on your live theme → Edit code. Open layout/theme.liquid, find </head>, paste the snippet immediately before it, then Save.

Wix

Site Dashboard → Settings → Custom Code (under Advanced) → Add Custom Code → set “Place Code In” to Head and “Apply to” to All Pages → paste → Save. Requires a paid plan.

Framer

Site Settings (the gear icon, top right) → General → Custom Code → Start of <head> tag → paste → Save → Publish.

Custom HTML or a hand-rolled site

Paste the snippet inside <head>...</head> on every page. Put it in your template, partial or layout file so it lives in one place rather than being copied per page.

  • React / Next.js: use next/head, or react-helmet.
  • Vue / Nuxt: use the head config in nuxt.config.

Method 2: Google Tag Manager

Use this if you would rather manage your tags in GTM than edit your site. It gives you exactly the same tracking as the direct script, person-level included.

Already using the older Warm AI GTM template? Replace it. Versions before 2.0.0 sent data to an endpoint that no longer exists, so a site tracked only through the old template has been recording nothing. Import the current template, re-create your tag, and delete the old one.

The template is not in the GTM Community Template Gallery, so import it by hand. It takes about a minute.

  1. Download template.tpl from the GitHub repository.
  2. In GTM, open Templates, and in the Tag Templates panel click New.
  3. In the template editor, open the three-dot menu and choose Import.
  4. Select the downloaded template.tpl and save.
  5. Create a tag from the template, paste your Tracking ID, and set the trigger to All Pages. Fire it as early as you can.
  6. Submit and publish the container.

That is the whole configuration. The template injects your per-domain tracker and everything else, including session handling and consent detection, happens inside it. There is no second consent check to add in GTM.

Prefer the template over a Custom HTML tag. A Custom HTML tag containing a third-party script can attract the attention of malware scanners, which in turn can cause problems with Google Ads. The template avoids that. If you do use Custom HTML, paste the snippet from Method 1 exactly as it appears.


Before you go live

Company-level identification always fires.

Person-level identification depends on where the visitor is:

  • Outside the EU, EEA and UK, it fires immediately. No consent manager is needed. Person-level matching is geofenced to US visitors anyway, so for most customers this is the case that matters.
  • Inside the EU, EEA or UK, it is gated on consent. The tracker looks for a consent manager and only fires once that manager signals consent. CookieYes (free for small sites), Cookiebot, OneTrust, Transcend, Klaro and GTM consent mode v2 are auto-detected. If no consent manager is found on the page, person-level identification is skipped for those visitors, and it stays skipped even if you later grant consent through the manual pulse('consent','grant') call, because that call does not emit the event the gate listens for.

So: if your traffic is mostly US, you do not need a consent manager to get person-level. If you serve EU, EEA or UK visitors, you need one for person-level to work on them, and you need one anyway for the usual legal reasons.

Update your privacy policy

Disclose visitor identification before going live. Most regulators (the UK ICO, EU data protection authorities, and CCPA) treat company-level IP lookup as low risk, but person-level identification needs an explicit mention. See the Cookies & Consent guide for the sub-processor list and the visitor opt-out paths you need to surface.

Remove any existing RB2B script

If you previously trialled or subscribed to RB2B directly, remove their script from your site. Running both causes a race on page load that stops our person-level identification firing, and you would be paying for identifications twice. Look for a script tag containing ddwl4m2hdecbv.cloudfront.net or reb2b and delete it.

A note on DNT and GPC

Do Not Track and Global Privacy Control are not honored. Both are non-binding browser signals under UK GDPR, EU ePrivacy and CCPA, and honoring them would diverge from upstream sub-processor behaviour. Consent driven by your CMP is the supported opt-out path.


Verify the install

Visit your own site in a browser, then check the dashboard. Within about 30 seconds you should see a new session appear, and (if you are on a business network) an identified company.

To confirm the script itself is loading, open browser devtools → Network and look for cdn.menoinfra.com/p/<your-id>.js. It should return 200.


Troubleshooting install issues

The script tag is on the page but nothing loads. Check the ID in the snippet matches the one in your dashboard, and that it is the ID issued for this domain. A tracking ID used on a domain it was not issued for is rejected.

Smart quotes. Rich-text editors, and some WordPress admin fields, silently convert ' and " into typographic quotes, which breaks the JavaScript. Paste into a plain-text editor first and confirm the quotes are straight, or paste into a field explicitly meant for code.

WP Rocket and other optimisers. Script deferral, delayed JavaScript execution and “combine JS” features can all prevent the tracker running. Exclude cdn.menoinfra.com from those rules.

Cloudflare Rocket Loader. Rocket Loader rewrites script execution order and is a common cause of a tracker that loads but never fires. Turn it off, or exclude the snippet.

Content Security Policy. If your site sets a CSP header, it must allow cdn.menoinfra.com in script-src and t.menoinfra.com (where the tracker sends its events) in connect-src. A blocked request shows up as a CSP violation in the browser console.

Consent manager blocking it. If your CMP is configured to block unclassified scripts before consent, the tracker will not fire until a visitor accepts. That is expected behaviour, not a fault.

Sessions appear but no companies are identified. This is usually traffic, not installation. Residential broadband and mobile IPs rarely resolve to a business. Check from an office network, and confirm you still have identification quota left under Billing.

Still stuck? Contact support@getwarmai.com with your domain and tracking ID.


  • Quick Start, the five-minute version of this page
  • Tracking, the technical reference: what the script stores, the events it sends and the pulse command API
  • Cookies & Consent, CMP setup and jurisdiction requirements
Last updated on