Get started

Install the tracker. Then tag your ads.

One script tag puts it on your site — that part takes a minute. What your ad links carry is what decides how much the product can tell you, and that is step three below.

Free plan · no credit card
1

Drop the snippet

Add a site in the app and its setup screen hands you this tag with your two ids already filled in. Copy it into the <head> of every page you advertise on. It loads async, so it never blocks your page from rendering.

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

YOUR_ORGANIZATION_ID and YOUR_SITE_ID are the only two things you substitute. They are on your site’s setup screen the moment you add the site, already pasted into a copy-ready snippet — you never have to type them. Nothing else in the tag changes, and the ids bind to the site, not to its address: renaming your domain needs no re-install.

Through Google Tag Manager

Add it as a Custom HTML tag on the Initialization – All Pages trigger, then publish the container. Tag Manager re-creates the script element it injects and drops data-* attributes along the way, so this variant carries the same two ids as query parameters instead.

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

Load a page and watch it verify

Your site’s own screen in the app stays a setup view until its first event lands. It checks every ten seconds, and the moment one arrives it replaces itself with your monitor — there is no button to press and no second place to look.

Any event will do it. A single page view from your own browser on the live site is enough to prove the tag is wired; you do not need a paid click to finish the install.

3

Tag your ads

Every lens in the product is scoped to paid arrivals. A session counts as paid when the URL it landed on carries a click ID, or a paid medium naming a platform. Everything else is stored and simply not shown.

A click ID

Deterministic — the parameter’s presence proves the platform, so nothing has to be inferred.

  • gclid Google
  • fbclid Meta
  • ttclid TikTok
  • msclkid Microsoft

Google Ads and Microsoft Advertising append theirs on their own when auto-tagging is on — for those two there is nothing to do.

Or a paid medium

A utm_medium from the list below establishes that the click was bought. Only then is utm_source read, for the platform name.

cpcppcpaidpaidsearchpaid_searchpaidsocialpaid_socialsponsoreddisplayaffiliate

Sources are matched loosely, because marketers tag loosely: adwords and googleads both read as Google, fb and ig as Meta, bing as Microsoft. LinkedIn and X are named too.

  • A paid medium whose source names no platform we know is still paid. It lands as other_paid rather than disappearing from your totals.
  • A paid click with no utm_campaign still counts. It gets no row on the campaigns table — there is no “(untagged)” line to rank — but it is in your site and network totals and it reads as Untagged on the monitor. Missing tagging costs you a name, never a number.
  • Attribution is worked out when you read, not when the event is written. Fix a broken utm_medium today and yesterday’s clicks are re-read under the corrected rule — there is nothing to reprocess.
Optional

Two things only your site knows.

The tag reads the request and the page. Whether a visitor converted, and what they chose on your cookie banner, are facts only your own code holds — each is one call.

Conversions

Call it when a visitor completes a goal — from your page code or a Tag Manager tag on the event you already push.

window.iads('conversion', { type: 'primary' });
  • type is the whole required payload, and it is a tier rather than a free-form goal name: primary for the outcome you buy ads for, secondary for a step toward it. Any other value drops the call, so nothing is sent.
  • On a session a primary outranks a secondary, so a started form never reads back as a completed sale.
  • The call also accepts value, currency and an opaque id. They are recorded and kept, and no screen reads them yet — send them if you want them in your history, not because you will see them tomorrow.

The banner choice

Call it from your banner’s own button handlers, every time a visitor decides or changes their mind.

window.iads('consent_update', {
  analytics: true,
  marketing: false,
  action: 'custom',
});
  • Real booleans. Anything that is not a strict true or false — including the string 'true' — is recorded as unknown, never as denied. action is accept_all, reject_all or custom.
  • Visitors then shows how many browsers reported a choice at all, and how many granted or denied. A browser’s own page carries its latest choice; a session’s page carries the choice that was in force when that visit started, which is rarely the same thing.
  • It records what the visitor chose on your banner. It never gates our collection — the legal basis for that sits with you, the site owner.

Both calls can run before the tag has finished loading, if you define the queue stub first. Queued calls flush in order the moment the tracker is ready.

window.iads = window.iads || function () {
  (window.iads.q = window.iads.q || []).push(arguments);
};

What the tag doesn’t do.

Four things you might reasonably expect, and don’t get. We would rather you read them here than discover them on the Monday.

It doesn’t read Consent Mode

gtag('consent', …) and the IAB TCF string are invisible to the tracker. There is no automatic hook into a consent platform: if you want your banner’s choice recorded here, the call above is what bridges it, and you map the values yourself.

It doesn’t import your ad accounts

This product sees clicks arriving — never spend, never bids, never campaign state. There is no cost column and no return-on-ad-spend, because nothing here has ever seen what you paid.

It doesn’t set a cookie

Not one, on any visit — and no third-party cookie, no ad-network sync. Three first-party keys in the browser’s own storage, listed below, are the whole footprint. What your banner has to say about them stays your call: the storage is written on your site, for your purposes.

It doesn’t grade what it finds

A datacenter ASN, a VPN exit, a privacy relay: each is stated as a fact, in the same ink as home broadband, with no score beside it.

What it stores

Three keys, and no cookies.

All first-party, all in the visitor’s own browser storage, all clearable by them at any time from their browser settings.

iads_visitor_id

A random identifier distinguishing repeat visits from the same browser on the same device.

localStorage · Until the visitor clears their browser storage — no automatic expiry is set.

iads_session_<date>

A random identifier grouping the page views of one browsing session together.

sessionStorage · Cleared when the tab or window session ends; a new key is minted each calendar day.

iads_referrer_initial

The first referrer seen in the session, so later page views keep reporting how the visitor arrived.

sessionStorage · Same as the session identifier.

None of it is shared with an advertising network, and the visitor identifier is scoped to one browser on one device — it is never used to link the same person across browsers, devices or unrelated sites. The full detail is in the cookie policy and the privacy policy.

Nothing showing up? Six causes, in order.

Five of them are the install, and the sixth is not a fault at all.

  1. 1It is on a staging copy, not the live site. View the source of the URL real visitors hit and search for intelligenceads. If it is not there, the tag never shipped.
  2. 2A cache is still serving the old page. Purge your site and CDN caches after adding the tag, then reload. This is the usual one on WordPress.
  3. 3The ids do not match this site. They must be the exact values the app shows for this site. An event whose site id resolves to nothing is accepted and stored, but it never marks the site as receiving — so the setup screen waits forever while the tag looks fine.
  4. 4It is in the body, not the head. Or, in Tag Manager, on the wrong trigger — it has to be Initialization – All Pages, not a page-view trigger that fires later.
  5. 5A content policy is blocking it. The tag loads from cdn.intelligenceads.io and posts to collector.intelligenceads.io. A strict CSP has to allow both — the first in script-src, the second in connect-src.
  6. 6The install is fine, and the traffic is not paid yet. The setup screen unlocks on any event; the lenses fill when a click arrives carrying one of the signals in step 3. A correctly installed tag on an untagged campaign is a silent dashboard, and it is the most common one.

Still nothing after real traffic has run? support@intelligenceads.io, with your site URL — we’ll look at it with you.

Install first, worry about the meter never

Everything your site sends is ingested and kept, on every plan — the event allowance never governs what gets written down, and nothing is ever deleted to make room. Free covers one site, 10,000 events a month and a seven-day window; past the allowance that month’s tail waits, unread, until an upgrade reveals it. On a paid plan nothing is held back at all: the overflow is billed, and collection and reading both carry on. See the plans.

See where your ad budget really works. Then put more there.

Free plan, no credit card, no trial timer. Install in under 5 minutes — drop a script, load a page, and watch your first observations arrive.

Start free
We observe sessions, not people · No PII fields at ingest · EU-hosted (Paris)