An auditor that reads the whole page.

A headless browser opens your site and reads what a visitor never sees: every network request, inline script, iframe and shadow DOM. Each item is matched against a shared database; below 85 percent confidence it waits for your review.

Station 1 · Scanner

Last scan: Found: 5 items Next scheduled: weekly

Total Items
5
Auto-Classified
2
Needs Review
1
Confirmed
2

All 5 Auto-Classified 2 Classified 2 Needs Review 1 Ignored 0 Scan History

Example scanner results for a site with five detected items
ProviderItem / URLTypeCategoryConfidenceStatus
Google Tag Manager googletagmanager.com/gtag/js?id=G-XXXX Script Analytics & Performance 98% confirmed
Meta Pixel connect.facebook.net/en_US/fbevents.js Script Marketing & Advertising 96% auto
Hotjar static.hotjar.com/c/hotjar-0000000.js Script Analytics & Performance 91% auto
example.com example.com/assets/app.js Script Strictly Necessary 100% confirmed
(unknown) cdn.example-vendor.net/t.js Script (unset) 41% needs review

None selected Apply category Ignore selected

Illustrative. Real vendor hosts; representative rows and counts.

Scheduled weekly or daily by plan, on demand from the portal, or by API.

Start free trial

Whose rules apply, decided on the server.

On every request, the server picks the law: your site’s country by default, read from your sitemap and page language, or each visitor’s location when you switch it on. Where laws overlap, the strictest value is kept for each dimension.

Station 3 · Compliance engine

Where your site is from

Country
India
How we know
sitemap
Page language tag
en
Sitemap
https://example.com/sitemap.xml
Last checked
2026-10-03 05:30
Which rules visitors see
Resolution under your country’s rules
Visitor from Rules applied Model GPC
Mumbai DPDPA opt-in recorded
Munich DPDPA opt-in recorded
San Jose DPDPA opt-in recorded
Montréal DPDPA opt-in recorded
São Paulo DPDPA opt-in recorded
Resolution under visitor-location rules
Visitor from Rules applied Model GPC
Mumbai DPDPA opt-in recorded
Munich GDPR + ePrivacy opt-in pre-set deny, recorded
San Jose CCPA/CPRA opt-out auto opt-out, recorded
Montréal PIPEDA + Quebec’s Law 25 opt-in recorded
São Paulo LGPD opt-in recorded

Order of precedence

  1. Global Privacy Control signal
  2. Visitor location, when enabled
  3. Site origin (the default)

Illustrative. Example site; the engine’s own resolutions.

A Global Privacy Control signal is read first and written into every receipt; what it does depends on the law applied.

How CookieGate handles each regulation

Consent before cookies. Literally.

The tag loads first in the head. Three surfaces hold what follows: the markup you rewrite, the runtime interceptor, and an optional service worker on your own domain. Nothing non-essential is requested until the visitor decides.

<script src="https://api.cookiegate.io/api/v1/public/sdk/<site-key>.js"
        data-cg-sw="/cookiegate-sw.js"></script>

Select the code to copy it.

First in <head>, no async or defer. data-cg-sw is optional (surface 3).

A page with a notice-only banner

Request log of a page with a notice-only banner
t (ms) request sets
0 /
118 googletagmanager.com/gtag/js _ga
162 connect.facebook.net/en_US/fbevents.js _fbp
241 static.hotjar.com/c/hotjar-*.js _hjSession
380 banner shown
1,840 visitor clicks Reject

Three cookies were set before the answer, the first 1.7 s before it.

Illustrative. Hosts are real; timings are representative.

Station 4 · Enforcement

The same page with CookieGate

Request log of the same page with CookieGate, after the visitor rejects
t (ms) method request status purpose
0 GET api.cookiegate.io/api/v1/public/sdk/<site-key>.js 200 sdk
12 --- googletagmanager.com/gtag/js?id=G-XXXX held analytics
12 --- connect.facebook.net/en_US/fbevents.js held marketing
13 --- static.hotjar.com/c/hotjar-*.js held analytics
380 banner shown
worker any later request to a held host 204
Wait here: rows below are after the decision
1,840 visitor presses Reject Optional
cookies _ga deleted

Cookies set on earlier visits by held tags are deleted.

Illustrative. Hosts are real; timings are representative.

Surface 1 · The markup you rewrite

The tag above stops a tracker running, not the browser requesting it: a src downloads at once, carrying the visitor’s IP address. Rewrite the tag and there is nothing to fetch until the visitor consents to its data-cg-purpose category.

<!-- Before: fetched at once, even though it will not run -->
<script src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"></script>

<!-- After: nothing is requested until the visitor consents to analytics -->
<script type="text/plain"
        data-cg-src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"
        data-cg-purpose="analytics"></script>

<!-- Works for pixels and embeds too -->
<img    data-cg-src="https://example.com/pixel.gif" data-cg-purpose="marketing" width="1" height="1" alt="">
<iframe data-cg-src="https://www.youtube.com/embed/VIDEO_ID" data-cg-purpose="marketing"></iframe>

Select the code to copy it.

Surface 2 · The runtime interceptor

Inside the page the SDK watches for anything added after load. Tags that match a known provider are held under their category; unknown scripts are held or allowed by your setting.

Watched after load

  • script tags
  • iframes
  • pixels
  • cookie writes
  • fetch calls
  • XHR calls

Surface 3 · The service worker on your own domain

Browsers refuse a worker from another origin, so the file lives on your domain. It answers held tracker requests with an empty 204 and honours live consent, including expiry. It never touches navigations or first-party requests.

A worker takes control only after it has installed, so it cannot cover a visitor’s first-ever page load; it complements the markup, it does not replace it.

Set up the service worker (three steps)
# 1. Download the worker file and host it at your web root:
curl -o cookiegate-sw.js https://api.cookiegate.io/api/v1/public/sdk/cookiegate-sw.js
#    serve it as https://your-site.com/cookiegate-sw.js

<!-- 2. Add data-cg-sw to your existing CookieGate tag: -->
<script src="https://api.cookiegate.io/api/v1/public/sdk/<site-key>.js"
        data-cg-sw="/cookiegate-sw.js"></script>

<!-- 3. Verify: DevTools > Application > Service Workers shows the worker,
     and blocked tracker requests return an empty 204. -->

Select the code to copy it.

What each surface covers

What each enforcement surface covers, where it runs, and what it cannot cover
Surface Covers Runs Cannot
Markupthe request itself; nothing is fetchedin your HTMLtags you did not rewrite
Interceptorscripts, iframes, pixels, cookie writes, fetch and XHR added at runtimein the page, from the first byte of the taga request made before the SDK runs
Service workerany later request to a held host, answered 204; live consent, including expiryon your domain, after first installa visitor’s first-ever page load

Also sent with the decision: Google Consent Mode v2 signals.

See how it holds

A ledger, not a logfile.

Each decision becomes a receipt, chained to the one before and signed with a key held on CookieGate’s servers, with the law frozen as it stood. Edit a record and its hash fails; rewrite the hash and the signature fails.

Station 5 · Evidence ledger

receipt_number
CR-1791033460882-6c0282e4
timestamp
regulation_applied
ccpa
consent_action
gpc_opt_out
consent_hash
fcd26e52a63e3047…
data_hash
c2182ae765ef9913… SHA-256 of the record
signature
6efcdf844cd01514… HMAC-SHA256, server key
prev data_hash
031457a534d6230c… the chain link
  1. 2026-10-03T13:16:02Z gdpr custom hash 0314 prev 37ac . Receipt 2, GDPR, custom, 3 October 2026 13:16 UTC, chained to receipt 1. Opens the sample receipt file.
  2. 2026-10-03T13:14:25Z dpdpa reject_all hash 37ac prev GENESIS . Receipt 1, DPDPA, reject all, 3 October 2026 13:14 UTC, the first receipt in the chain. Opens the sample receipt file.

Illustrative. Synthetic records; live hashes print in full.

GET /api/v1/public/consent/verify/7bea9e8b-d67a-4b97-a30f-ff0bcba18042
signatureValid: true
the record and the chain both check
contentHashValid: false
the record was altered
chainSignatureValid: false
the chain was broken or re-signed
The Banner Log: proof the banner was shown
Banner Log excerpt: when a banner was shown, the rules applied, the language and the Global Privacy Control signal
When Event Rules applied Language GPC
2026-10-04 09:07Banner shownGDPRENNo
2026-10-04 08:51No banner requirednoneENNo
2026-10-03 19:44Banner shownGDPRENYes

Illustrative. Synthetic rows; country and page columns omitted.

Requests with deadlines. Banners in 86 languages.

A public form takes each request, verified by a one-time code; no account needed. Each law shows its own set of the thirteen types, with CookieGate’s response window computed on arrival. Assign, respond and close, every step logged.

Station 6 · Rights and reach

Illustrative. Fields and copy as the SDK renders them.

Request types shown and the response window CookieGate applies, per regulation
Regulation Types shown Window
gdpr 830 days
eprivacy 830 days
uk_gdpr 830 days
ccpa 645 days
lgpd 715 days
dpdpa 530 days
popia 530 days
pipeda 330 days
pdpa 730 days
appi 430 days
pipl 915 days

The window is the one CookieGate applies and prints on the request’s confirmation. Statutory periods differ by law.

Translations: strings per language and their status
Language Strings Status
Hindi44 / 44verified
Tamil44 / 44verified
Bengali41 / 44auto-translated
Malayalam44 / 44verified

Banners in 86 languages, including all 22 scheduled Indian languages.

Illustrative. Translation rows are representative.

The thirteen request types:

  • Access
  • Correction
  • Erasure
  • Portability
  • Objection
  • Nomination
  • Grievance
  • Restriction
  • Withdraw consent
  • Opt out of sale
  • Opt out of sharing
  • Limit sensitive data
  • Automated decisions

Start free trial

See it hold the line on your own site.

Every paid plan starts with a 15-day trial. A founder or an engineer reads every message.

We respond within one business day.

15 days. Card required. Nothing is charged before day 15.

Starter ₹2,499 a month. Professional ₹7,499 a month. Enterprise by conversation.