Tapper
Search docs...
⌘K
SupportDashboard

Consent and cookies

What the monitoring script does in cookie and cookieless mode, the one call that switches it, what your consent banner still controls, and how to verify it on your site.


Tapper runs from a single script on your website. This page covers what that script does in cookie mode and in cookieless mode, the one call that switches between them, what your consent banner's signals still control, and what you need to register in your consent management platform (CMP).

This page is documentation, not legal advice. How you classify Tapper and what consent you collect remain your decisions, together with your own advisers.

The consent call is case-sensitive. Use exactly "GRANTED" or "DENIED", in uppercase. Any other spelling is ignored without an error, so the visitor keeps the mode they were in.

Your integration does not change

Consent handling lives inside the script, not in your integration:

  • The same Monitoring script and Conversion script tags stay exactly where they are.
  • The snippet still calls tapper.init(pk) with your public key.
  • You still report conversions with window.tapper.push(...), unchanged.

One script, one integration. What it is allowed to do underneath depends on your cookie policy and on your own tapper.consent() call.

What Tapper does in each case

This is the one table for every consent case. Tapper has exactly two switches: tapper.consent("GRANTED") and tapper.consent("DENIED"). Nothing else your banner sends changes what Tapper does, with one exception: the Google Consent Mode signal fills the consent fields of the conversion upload to Google (ad_user_data and ad_personalization), and that is all it does.

CaseTapper cookies and storageMonitoringMatcher (on a page with no Tapper cookie)Browser fingerprint (FingerprintJS and the probes)gclid read from Google's click cookie (_gcl_aw/_gcl_dc)Remarketing tags (Google, Meta, TikTok audiences)Conversions
tapper.consent("GRANTED")Yes.On.Runs on the first page of the visit, before the Tapper cookie exists.Yes. If GRANTED arrives mid-visit, it runs once, for the same visitor.Yes.Yes.Recorded and attributed. On a page continued by the no-cookie matcher: recorded, never credited.
tapper.consent("DENIED")No.On, cookieless.Runs on every page.No.No.No.Recorded with its order value, never credited and never uploaded to an ad platform, on every page: a page continued by the no-cookie matcher and a page-content rule's conversion (the rule's value) included. Invalid traffic monitoring continues cookieless.
Consent first, before any Tapper callNo.On, cookieless.Runs on every page.No.No.No.Recorded with its order value, never credited and never uploaded to an ad platform: crediting a conversion captured without cookies is switched off. A page-content rule's conversion (the rule's value) included.
Region-based, visitor inside the EEA or UK, before any Tapper callNo.On, cookieless.Runs on every page.No.No.No.Recorded with its order value, never credited and never uploaded to an ad platform: crediting a conversion captured without cookies is switched off. A page-content rule's conversion (the rule's value) included.
Region-based, visitor outside the EEA and UKYes.On.Runs on the first page of the visit, before the Tapper cookie exists.Yes.Yes.Yes.Recorded and attributed. On a page continued by the no-cookie matcher: recorded, never credited.
Cookie first, no Tapper callYes.On.Runs on the first page of the visit, before the Tapper cookie exists.Yes.Yes.Yes.Recorded and attributed. On a page continued by the no-cookie matcher: recorded, never credited.
Google Consent Mode Reject (a banner signal)Same as the mode's normal row.Same as the mode's normal row.Same as the mode's normal row.Same as the mode's normal row.Same as the mode's normal row.Same as the mode's normal row.Same as the mode's normal row. The upload to Google carries the Reject in its consent fields.

How the matcher works: on any page where Tapper holds no cookie of its own, including the first page of a visit and in every mode, Tapper tries to find the visitor before it creates a new visitor id. Every such page leaves a short-lived note for the next one, valid for 30 minutes after it was last used, so the chain carries every page of a visit, not only the second. It checks, in order: the ad click id in the page the visitor came from, together with the network and the browser; the page the visitor came from (the referrer), together with the network and the browser; then, for a visitor whose IP address changed during the visit (Wi-Fi to mobile data, for example), the same two again without the network, matched on the browser, the screen size and the language; then the IP address together with the browser. A match keeps the same visitor. When two visitors would match the same way, neither is matched: Tapper never guesses. Only when nothing matches is a new visitor created. Monitoring is always on; where there is no cookie it runs cookieless and the matcher links the pages of the visit.

Who gets the matcher: every protected entity that has Recognise visitors without cookies on, for every request that arrives without the Tapper cookie. The setting is under Setup > Website > Monitoring, on the Cookie policy tab, one per protected entity, and on by default. Owners, admins and managers can turn it off; viewers see it but cannot change it. When it is off, none of the matching runs for that protected entity and no page-to-page notes are written. The match uses the page the visitor came from, an earlier ad click, or their IP address together with their browser, looking back up to 30 days. It also applies after tapper.consent("DENIED"), whose conversions are recorded with their order value and never credited or uploaded. A page the matcher recognizes continues the same visitor instead of starting a new one.

In short:

  • A Google Consent Mode Reject in cookie mode does not turn off the remarketing tags or the _gcl_aw/_gcl_dc read. Whether Tapper may write to the device is decided only by your tapper.consent() call and your cookie policy; the Google signal only sets the consent fields of the upload to Google.
  • Conversions on matched cookieless pages are sent. They are recorded under the matched visitor and never credited, because a page recognized only by matching is never the same page load as the ad click. In cookie mode, a matched page that carries its own ad click id is credited like any ad click; in cookieless mode it is recorded and never credited, like every conversion captured without cookies. After tapper.consent("DENIED") a matched page's conversion is recorded the same way, with its order value, never credited.
  • After tapper.consent("DENIED"), conversions of that visitor are recorded with their order value on every page, including a page continued by the no-cookie matcher and a page-content rule's conversion, so no money is lost, but they are never credited and never uploaded to an ad platform. Invalid traffic monitoring continues, cookieless.

What the script does in each mode

The script runs in one of two modes per visitor. The mode comes from the Cookie policy you set for that website, unless your site calls tapper.consent() for that visitor: see Your script's consent policy below. Signals from your consent banner, including Google Consent Mode, never choose the mode.

Cookie modeCookieless mode
Device storageWrites the tsid cookie plus the local and session storage entries described below.Writes nothing to the device: no cookie, no local storage, no session storage, with one exception. When your site calls tapper.consent("DENIED"), Tapper stores that refusal (the decision and its time, never an identifier) so the next page does not ask again.
Cross-session identityYes. The same visitor is recognized across page views and return visits.Yes, for invalid traffic protection. On a page where Tapper holds nothing of its own, it matches the visit before starting a new one (the page the visitor came from, then the ad click, then the network and browser), so the same visitor is recognized across pages and on a return visit without cookies. Its conversions are recorded, never credited (see Conversions below).
Invalid traffic and security signalsCaptured.Partially captured. Page views (the landing page, and later pages of the visit that Tapper matches back to it), events, clicks and the browser tab are still captured, and what every request carries anyway (IP address, user agent, headers) is read in both modes. What does not run: the browser fingerprint checks (canvas, WebGL, audio, WebRTC and the rest, all skipped), the network fingerprint read (JA4/JA4H), and recovery of Google's _gcl_aw/_gcl_dc click-id cookies.
ConversionsRecorded and attributed to the click that brought the visitor in, for as long as that identity is remembered. On a page continued by the no-cookie matcher: recorded, never credited.Still sent with its order value, currency, order id and click id. Nothing is stripped. It is marked as captured without storage, and nothing about it is stored on the device either. It is recorded with that value and never credited to an ad click or uploaded to an ad platform: crediting a conversion captured without cookies is switched off, on the landing page too.
Ad-platform audience scripts served through TapperInjected. A Google Consent Mode refusal of ad storage does not turn them off.Not injected.

Cookieless mode costs attribution, not the conversion record. Tapper does not remove order value, currency, or the click id from a cookieless conversion. Those still ride along, the same as in cookie mode, and the conversion is recorded with its value. What is missing is credit: a conversion captured without cookies is never credited to an ad click, even on the landing page that carries the click id. A visitor who moves to another page or returns with no click id in the URL is still recognized for invalid traffic protection by matching.

NameTypePurposeDuration
tsidCookie.Holds the Tapper visitor identifier, together with the ad click id and any UTM parameters from the click that brought the visitor to your site. Used to attribute conversions to the correct click and to run traffic analysis.1 year.
_tapper_lksdLocal storage.Records which ad click ids have already been seen in this browser, so the same click is not counted twice.Until the visitor clears their browser storage.
tbsidSession storage.Identifies the current browser tab, so activity in one tab is not mixed with another.Until the tab is closed.
tcshSession storage.Written only on a page Tapper continued by matching (see Recognizing visitors without cookies). Holds an opaque handle, never the visitor identifier, so later pages in the same tab continue the same visit without matching again.Until the tab is closed.
_tapper_modeSession storage.Persists the resolved cookie-mode decision for the rest of the current visit, so later page views in the same tab do not have to work it out again. When Google Consent Mode has reported that the visitor refused ad storage, it also carries that refusal (tp_ad_storage: false, a yes or no value, never an identifier), so later pages in the tab start from the same answer.Until the tab is closed.
__tapper_tcidShopify cart attribute.Shopify stores only. The Tapper visitor identifier, and nothing else (no ad click id), written into the visitor's Shopify cart once it holds an item, so a checkout that finds no Tapper cookie can still link the order to the visitor. The leading __ hides it from the buyer at checkout. It is stored by Shopify with the cart, not on the device.As long as Shopify keeps the cart. A tapper.consent("DENIED") in the tab that wrote it clears it.
tcrtSession storage.Shopify stores only. Records which cart already carries the Tapper visitor identifier, so it is not written again on every page.Until the tab is closed.
cookietestCookie.Not ours. Set and deleted by our fingerprinting dependency (FingerprintJS) as part of its device-signal checks. Like the entries above, it is written in cookie mode only.Deleted immediately after it is set.

None of these are written in cookieless mode, except the record of a tapper.consent("DENIED") refusal described above. If your site calls tapper.consent("GRANTED") mid-visit, the script starts writing them and carries the same visitor identity forward, so the click that brought them in is not lost.

The script only does anything at all when it can identify an ad click: from a click id in the page URL, from a value it stored earlier, from a Google click cookie already on the page, or, when it holds nothing of its own, by matching this page once to an earlier page of the same visit or an earlier visit. If none of these finds one, it removes its own cookie and stops. A visitor who never arrives from an ad does not get a tsid.

Register these in your CMP alongside the entry above:

AttributeValue
First-partyYes. Set by JavaScript through document.cookie on your own site.
DomainThe registrable domain of your site, for example .example.com.
Path/
FlagsSecure, SameSite=None, Partitioned
Lifetime1 year from the moment it is first written. It is not extended on later visits while its value is unchanged.

Cookies Tapper reads but does not set

If they are already present, the script reads Google's own _gcl_aw and _gcl_dc cookies to recover the click id. These are set by your Google tags, not by Tapper, and you declare them under Google in your CMP as you already do. The script reads them in cookie mode only; a Google Consent Mode refusal of ad storage does not stop the read, and after tapper.consent("DENIED") they are not read.

Tapper listens only to your site's tapper.consent("GRANTED") and tapper.consent("DENIED") calls. A Google Consent Mode or banner-tool signal never turns Tapper on or off; it is only used for what Tapper hands to ad platforms, above all the conversion upload to Google. Tapper reads consent from two places, and they do different jobs:

  • Door 1, your direct tapper.consent() call, is the only thing that turns Tapper monitoring on or off. It moves the visitor between cookie mode and cookieless mode, in both directions.
  • Door 2, Google Consent Mode, never turns monitoring on or off, in either direction. Tapper records it and applies it to what it hands to, or takes from, ad platforms. The same goes for any other signal your banner publishes.
1
Door 1: call tapper.consent() directly

If your own CMP, cookie banner, or in-house consent flow knows the outcome, tell the script directly. Tapper shows both lines on the Install script and consent tab, under Tell Tapper the visitor's answer, with a copy button each.

window.tapper.consent("GRANTED");
window.tapper.consent("DENIED");

These are the only two values accepted, and they are case-sensitive: exactly "GRANTED" or "DENIED", uppercase. "granted", "Denied", or any other string is ignored; there is no lowercase alias. Call the matching line on every page load as soon as the visitor's decision is known, and again whenever it changes, only ever with their actual choice. A repeated call with the same decision changes nothing.

2
Door 2: Google Consent Mode

If you already run Google Consent Mode through gtag or a CMP that publishes it, Tapper reads it off gtag with no code from you. It does not switch monitoring: a Reject in your banner does not make the visitor cookieless or delete Tapper's storage, and an Accept does not start cookie mode. What it does and does not control:

  • Not ad-platform tags or Google cookies. A denial of ad_storage does not turn off ad-platform audience tags (Google, Meta, TikTok) or the read of Google's own cookies. Only tapper.consent() changes those. A configured default or an implicit value is your site's configuration, not the visitor's answer, so it is never used to decide.
  • The Google Ads upload stamp. ad_user_data and ad_personalization are stamped on the conversions Tapper uploads to Google Ads. See below.

A Reject in your banner alone does not stop Tapper monitoring. Under the Cookie first policy, a visitor who rejects only in your CMP stays in cookie mode: Tapper still writes tsid, _tapper_lksd and tbsid, and invalid traffic protection and attribution keep running. What that Reject changes is the ad-platform side above and the consent sent to Google with the upload. If your banner's Reject must also stop Tapper's storage, call tapper.consent("DENIED") from it. The same holds the other way: under Region-based or Consent first, an Accept in your banner alone does not start cookie mode; call tapper.consent("GRANTED") from it.

The Google Ads upload stamp

Separately from monitoring, Tapper reads ad_user_data and ad_personalization from Google Consent Mode and stamps them on the conversions Tapper uploads to Google Ads. This is the consent status Google requires on every upload for EEA and UK visitors. A visitor who denied them in your banner is uploaded marked as denied. The stamp comes from those two keys, not from ad_storage. If Tapper holds no consent signal for a visitor, that field is uploaded as unspecified, unless Tapper has confirmed the visitor is outside the EEA and UK, in which case it is uploaded as granted. That confirmed non-EEA and non-UK case is a statement about jurisdiction, not about a choice the visitor made.

The order is your call, then policy, then region: a tapper.consent() call from your site always wins; below that, your script's policy decides what every other visitor gets, including a visitor who answered only in your banner; region only matters inside the Region-based policy. A tapper.consent("DENIED") always applies, whatever the policy: no policy can override it. Google Consent Mode and other banner signals are not part of this order: they never move a visitor between modes, under any policy.

You set the policy yourself. In the sidebar, open Setup, then Website. If your workspace has more than one protected entity, first pick the one for this website with the switcher under the workspace name. In the list of areas on the left, click Monitoring. It has three tabs:

  • Cookie policy: the policy, in the row When to set the cookie, and the Recognise visitors without cookies switch.
  • Install script and consent: the monitoring script, the two consent snippets and the conversion script.
  • Conversions: your conversion pages.

Owners, admins and managers can change the policy. Viewers see it but cannot change it. Once you save, your script uses the new policy from the next visit.

There are three policies, and the control describes each one in the app:

PolicyWhat it does
Region-basedVisitors in the EEA and the UK get no Tapper cookie or storage until your site calls tapper.consent("GRANTED"). Until then they are still recognized across pages and on a return visit without cookies, for invalid traffic protection, unless you turn off Recognise visitors without cookies. Everyone else gets cookie mode unless your site calls tapper.consent("DENIED"). Your banner does not change this.
Cookie firstEvery visitor gets cookie mode unless your site calls tapper.consent("DENIED"). A Reject in your banner does not change this.
Consent firstNo visitor gets a Tapper cookie or storage until your site calls tapper.consent("GRANTED"). Until then visitors are still recognized across pages and on a return visit without cookies, for invalid traffic protection, unless you turn off Recognise visitors without cookies. An Accept in your banner does not change this.

Under every policy, a Google Consent Mode denial of ad_storage does not turn off ad-platform tags or the Google cookie read; its ad_user_data and ad_personalization answer still rides on the Google upload.

The line under the control always tells you what the selected policy does. If it starts with Default., nobody has chosen a policy for this website and you are on the one Tapper applies until someone does. This page does not say which policy applies to you: it is a setting you control.

Recognizing visitors without cookies

On any page where Tapper has no cookie of its own, under every policy, Tapper matches the visit once before it starts a new one: first the page the visitor came from, then the ad click, then the network and browser. A match continues the same visitor; no match starts a new one. This covers:

  • Consent first, and Region-based for visitors in the EEA and the UK, before your site calls tapper.consent("GRANTED"), including the first page of a visit.
  • A visitor after your site called tapper.consent("DENIED").
  • Cookie first and Region-based outside the EEA and the UK, on the first page of a visit, or when the cookie was cleared, expired, or deleted by the browser.

The match stores nothing on the device in cookieless mode. In cookie mode, a matched page with its own ad click is credited like any ad click and a page recognized only by matching (no click id) is recorded, never credited; in cookieless mode every conversion is recorded, never credited. If your site calls tapper.consent("GRANTED") mid-visit, Tapper switches to its cookie and keeps the same visitor.

To turn the matching off for a protected entity, turn off Recognise visitors without cookies on the Cookie policy tab.

EEA, UK and elsewhere under the Region-based policy

  • A tapper.consent("DENIED") applies everywhere in the world, not only in the EEA and UK.
  • With the Region-based policy active and no tapper.consent() call:
    • Visitors outside the EEA and UK get cookie mode, with full attribution.
    • Visitors inside the EEA and UK get cookieless mode, with invalid traffic protection only, until your site calls tapper.consent("GRANTED"). An Accept in your banner alone does not change this.
    • An unresolved location is treated the same as EEA and UK for this decision, because that is the only direction that cannot produce a claim Tapper does not hold.
  • The Consent first and Cookie first policies do not vary by region. See Your script's consent policy above.

Example: firing the call from Google Tag Manager

If you want your banner to switch Tapper monitoring, wire it to Door 1. To do that through GTM instead of your CMP's own script:

<!-- Custom HTML tag, triggered on your CMP's own "consent updated" event -->
<script>
  (function () {
    if (typeof window.tapper === "undefined") return;
    // Replace this with however your CMP exposes the visitor's choice
    var granted = yourCmp.getConsentState("advertising") === true;
    window.tapper.consent(granted ? "GRANTED" : "DENIED");
  })();
</script>

Fire this tag on your CMP's consent-update event, not on page load. The same rule that applies to Google Consent Mode applies here: only an actual choice should reach tapper.consent(), not a configured default.

If you already run Google Consent Mode correctly, it needs no code to reach Tapper's ad-platform and upload handling: the script reads it directly off gtag. It does not switch monitoring, so wire the call above if your banner should.

Verifying it is working

Use this checklist to confirm each mode is doing what you expect for your site. Land on the page from an ad click (or add a click id such as gclid to the URL), because the script does nothing without one.

  1. Open your browser's DevTools Network tab and reload the page.
  2. Find the request the monitoring script makes to users.ping (or users.registerTab on a returning visit) and inspect its response JSON. It reports whether the visitor resolved as EEA or UK, which cookie policy your script is on, and that the consent gate is live.
  3. Cookie mode (Cookie first with no tapper.consent("DENIED"), Region-based outside the EEA and UK, or any policy after tapper.consent("GRANTED")): the response carries the visitor's identifiers and the browser sets the tsid cookie plus _tapper_lksd (local storage) and tbsid (session storage). Check for them in the Application panel, under Cookies, Local Storage and Session Storage.
  4. Reject in your banner only (Google Consent Mode denies ad_storage, no tapper.consent() call): on Cookie first, tsid, _tapper_lksd and tbsid are still there. That is expected: the banner does not switch monitoring. What changes: _tapper_mode in session storage shows "tp_ad_storage":false, the recorded refusal. Ad-platform audience tags from Tapper are still added.
  5. Cookieless mode (tapper.consent("DENIED") called, or Region-based in the EEA or UK, or Consent first, with no tapper.consent("GRANTED")): none of tsid, _tapper_lksd or tbsid appear after the request. This confirms that cookieless mode is active.
  6. Call tapper.consent("DENIED") from the console in cookie mode: tsid, _tapper_lksd and tbsid are removed. Then call tapper.consent("GRANTED") and confirm the cookie and storage entries appear again.

Declaring Tapper in your CMP

Add the entries above to your cookie inventory so your banner reflects what actually runs on your site.

Invalid traffic and security signals are commonly classified as necessary or security in CMP inventories, because they exist to protect the site and the advertiser rather than to profile the visitor. Attribution and measurement storage is commonly classified as marketing or statistics.

Tapper cannot make that classification for you. The tsid cookie carries both a traffic-analysis identifier and click attribution data in a single entry, so where it belongs in your inventory depends on your own assessment and your advisers. Classify it, then make sure your banner matches.

When your site calls tapper.consent("DENIED"), the script:

  • Deletes the tsid cookie and the local and session storage entries above, and clears the Tapper visitor identifier it wrote into a Shopify cart from the same tab.
  • Stops attribution for that visitor from then on.
  • Keeps invalid traffic protection running.
  • Applies the withdrawal immediately, without a page reload.

A Reject reported only through Google Consent Mode is not a withdrawal from Tapper monitoring. Tapper records it, its ad_user_data and ad_personalization answer reaches Google on the upload stamp, and nothing else changes: ad-platform tags, the Google cookie read and Tapper's own storage stay in place.

Nothing on this page requires a change to your tags to keep working. If your site calls tapper.consent() mid-visit, the script switches modes without a page reload; a change reported through Google Consent Mode updates the ad-platform side the same way, without changing the mode.