Install the tracker

One script tag on every page, or a Custom HTML tag in Google Tag Manager. The site's setup screen hands it to you with both ids filled in and verifies the first event on its own.

Updated October 26, 2026

One script tag in the <head> of every page, carrying your workspace id and your site id, or the same tag as a Custom HTML tag in Google Tag Manager. A site's own screen stays a setup view until its first event lands, then opens as your monitor. Any event does it; a paid click is not needed.

The setup screen

A site you have just added has a domain and has never received an event. Its root URL in the app shows the setup screen instead of an empty monitor: the locator reads Setup, the title reads Connect followed by the site's domain, and the lede asks you to drop the one-line snippet and keep the screen open.

An owner or an admin also sees "Wrong address? Change it", a link to the site settings. A domain correction needs no re-install: the snippet carries the workspace id and the site id, never the domain. A member does not see the link, because the settings page is not theirs to edit.

Below the header, one panel holds two bands in this order: "Install the snippet" and "Verify ingestion".

The snippet

The "Install the snippet" band shows the tag with both ids already filled in, a copy button, and a switch with two tabs: "Directly on the site" and "Google Tag Manager". This is the direct variant, with placeholders where the screen puts your real ids:

<script async
  src="https://cdn.intelligenceads.io/sdk/tracker.latest.js"
  data-organization-id="YOUR_ORGANIZATION_ID"
  data-site-id="YOUR_SITE_ID"></script>

Put it in the <head> of every page. It loads with async and sets no cookie. YOUR_ORGANIZATION_ID and YOUR_SITE_ID are the only two things that change. Both are UUIDs, and Site settings lists them as Workspace ID and Site ID, each with its own copy control.

AttributeRequiredWhat it carries
data-organization-idyesYour workspace id. The attribute keeps the older name.
data-site-idyesThe id of the site the events belong to.
data-api-endpointnoThe address events are posted to. Unset, it is the collector. Leave it unset.

Each value can also come from a global window.iadsConfig object with organization_id, site_id and api_endpoint keys, or from the query string of the src; the tag's data-* attributes win. When either id is missing, the tracker prints a warning in the browser console and sends nothing.

The src is tracker.latest.js, the current build. No screen offers a pinned version or an integrity hash.

Google Tag Manager

The band's second tab. Add a Custom HTML tag with this snippet on the Initialization – All Pages trigger, then publish the container:

<script async
  src="https://cdn.intelligenceads.io/sdk/tracker.latest.js?organization_id=YOUR_ORGANIZATION_ID&site_id=YOUR_SITE_ID"></script>

Tag Manager drops data-* attributes, so this variant carries the same two ids in the query string of the src.

Install one variant, not both. A page that loads the tag twice still sends each event once.

Verification

The "Verify ingestion" band waits. It reads "Waiting for your first event" beside a pulsing dot, with "Polling every 10s" and how many seconds ago the last check ran. The moment the site has received an event, the band reads "Ingestion verified" and "First event received" with how long ago, then "opening your dashboard…", and the same URL becomes the monitor. There is no button to press and no second place to look.

Any event type counts, so one page view from your own browser on the live site is enough.

For an owner or an admin the snippet is also in Site settings, on the Installation tab, at any time: "Tracking snippet" holds the same switch and tag under "Install method", and "Verification" shows the site's status, then the type of the last event, the host it came from and when, or "Nothing received yet." before the first one. A member is sent back to the site from Site settings, so in the app a member finds the snippet only on the setup screen.

What the tracker sends

Three events are automatic:

EventWhen it is sent
page_viewOnce the document is ready, and again on every pushState, replaceState and popstate that changes the URL, a query string or a hash included, so a single-page app's route changes count and a framework rewriting the same URL does not.
scrollWhen the reader reaches 25, 50, 75 and 100 percent of the page. Once per mark per page view, so up to four.
clickWhen a link to another host is clicked: its destination and up to 120 characters of its text.

Two more are calls your own code makes, conversion and consent_update; the tracking API page covers both. The Events screen counts every one of the five.

Every event carries the page's URL, path, host and title; the referrer, the first referrer of the session and, after a route change, the previous path; the click ids and UTM parameters present on the current URL (gclid, fbclid, ttclid, msclkid, gbraid, wbraid, li_fat_id, oppref, utm_source, utm_medium, utm_campaign, utm_content, utm_term, utm_id, utm_source_platform, utm_creative_format, utm_marketing_tactic), which is what Tag your ad links is about; the screen and viewport sizes, the device pixel ratio, the language, the timezone offset and the user agent; the session id and the visitor id; the client's timestamp and a random event id; the tracker's name and version; and, when your page sets window.__iads_custom_props, that object as custom_props.

The address each event comes from is what the app shows as a connection, with its location, operator and attributes (VPN, proxy, Tor, relay, hosting, anycast, mobile, satellite), stated as attributes, never as a judgment. Events are timed by the tracker's clock and by ours. A Content-Security-Policy has to allow cdn.intelligenceads.io in script-src and collector.intelligenceads.io in connect-src. A page served from localhost or 127.0.0.1 posts to a local address instead, so verify on the deployed site.

What it stores in the browser

No cookie, on any visit. Three first-party keys in the browser's own storage are the whole footprint:

KeyWhereWhat it is
iads_visitor_idlocalStorageA random id telling repeat visits from the same browser apart. It lasts until the visitor clears their storage.
iads_session_<date>sessionStorageA random id grouping one browsing session's events. A new one starts each calendar day and when the tab or window closes.
iads_referrer_initialsessionStorageThe first referrer seen in the session, so later page views keep reporting how the visitor arrived.

When sessionStorage is blocked, a session id held in memory keeps one page load's events together; when localStorage is blocked, events go out without a visitor id. A visitor is a browser, never a person: the id is random and belongs to one browser on one device. Privacy, retention and erasure has the rest.

What is dropped

Two site settings decide what a site accepts, both on the Data collection tab of Site settings. When "Accept incoming events" is off, events are dropped. When "Only accept matched hosts" is on and the page's host is not in the site's host list, events are dropped. A drop is your own setting, not an error, and the tag still looks fine on the page. A change to either setting takes effect within a minute.

Your plan never drops an event: every event is accepted and kept, on every plan. The allowance governs what the screens may read back, which Plans and billing explains.

An event whose site id matches no site marks nothing as receiving: the setup screen keeps waiting while the tag looks fine.

Causes of a silent site

In order of likelihood:

  1. The tag is on a staging copy, not the live site. View the source of the URL real visitors hit and search for intelligenceads.
  2. A cache is still serving the old page. Purge your site and CDN caches after adding the tag, then reload.
  3. The ids do not match this site. They must be the exact values the app shows for this site; an id that matches no site marks nothing as receiving.
  4. A content policy is blocking it: cdn.intelligenceads.io belongs in script-src, collector.intelligenceads.io in connect-src.
  5. A site setting dropped it: "Accept incoming events" is off, or "Only accept matched hosts" is on and the host is not listed.
  6. The install is fine and the traffic is not paid yet. The setup screen unlocks on any event; the lenses are scoped to paid arrivals and fill when a click arrives with a click id or a paid medium. Tag your ad links says what a readable click carries.

What the setup screen does not do

  • It is not a place of its own: the screen lives at the site's URL and the monitor replaces it there. No welcome step, no separate page, no button to press.
  • It does not make you re-install after a domain correction. The ids belong to the site, not to its address.
  • The tracker sets no cookie, and it reads no consent platform: gtag('consent', …) and the TCF string are invisible to it. Your banner's choice reaches the product only through the consent_update call, and that call gates nothing on our side.

Questions

Where do I find my workspace and site ids?
On the site's setup screen, already pasted into the snippet. An owner or an admin also finds the same snippet at any time in Site settings, on the Installation tab, under Tracking snippet; in the app, a member sees it only on the setup screen.
Does the tracker work with a single-page app?
Yes. Every client-side route change is recorded as a page view with no extra code; a navigation that leaves the URL as it was sends nothing.
Do I need a paid click to finish the install?
No. Any event marks the site as receiving, and one page view from your own browser on the live site is enough. The screens fill once clicks arrive carrying a click id or a paid UTM medium.
I corrected the domain in the site settings. Do I re-install?
No. The snippet carries the workspace id and the site id, never the domain, so the tag you already placed keeps working.
Does the tracker set a cookie?
No, on any visit. It keeps three first-party keys in the browser's own storage, listed under What it stores in the browser, and nothing else.