CookieFort
Pricing
Agency partners
Compliance test
CookieFort

The simple CMP for marketing teams who want to stay compliant without sacrificing conversions.

Solution
  • Dashboard
  • Integrations
  • Agency partners
Company
  • About
  • Contact
  • Blog
  • FAQ
Legal
  • Legal notice
  • Privacy policy
  • Terms of sale & use
  • DPA
  • Cookie settings

© 2026 CookieFort. All rights reserved. CMP · Proof of consent · Made in Europe

GDPR COMPLIANTISO 27001

CookieFort CMP Documentation

CMP at a glance

Getting started

Installation
Retrieve the scriptIntegrate the snippetPublish & verify

Configuration

Script blocking
Google Consent Mode v2
Banner that meets Consent Mode requirements
Google Tag Gateway
Consent widget
Ad pixels (Meta, TikTok, LinkedIn, Pinterest)
Multi-country customization
Automatic cookie detection & “unknown cookies”
Run the scanCategorize unknown cookiesAdd to widgetExceptions & reportingFinalize & apply

Advanced

Proof of consent
Visits & billing
Daily stats cron
Table of contents
CMP at a glance

Getting started

InstallationRetrieve the scriptIntegrate the snippetPublish & verify

Configuration

Script blocking
Google Consent Mode v2
Banner that meets Consent Mode requirements
Google Tag Gateway
Consent widget
Ad pixels (Meta, TikTok, LinkedIn, Pinterest)
Multi-country customization
Automatic cookie detection & “unknown cookies”Run the scanCategorize unknown cookiesAdd to widgetExceptions & reportingFinalize & apply

Advanced

Proof of consent
Visits & billing
Daily stats cron

CMP at a glance

CookieFort helps you collect consent choices and properly activate/deactivate your marketing & analytics scripts, while keeping proof evidence you can export.

Widget loader

Paste as the first script in <head> (or before </body>).

widget-loader.html
<script src="https://cookiefort.com/api/v1/widget.js?id=YOUR_PROPERTY_ID" async></script>

Public API

Endpoints used by the widget and dashboard integrations.

api-endpoints.http
# Widget config
GET /api/v1/config/{propertyId}

# Widget ingest
POST /api/v1/visit
POST /api/v1/consent

Section 1

Installation

Installation flow

Get the widget script, embed it, then verify detection.

GA4 + widget snippet

Example copied from dashboard Step 2 (replace IDs with your property).

installation-snippet.html
<!-- Google tag (gtag.js) — GA4 config applied by widget after consent -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
</script>
<script src="https://cookiefort.com/api/v1/widget.js?id=YOUR_PROPERTY_ID" async></script>
1

Retrieve the script

  • In the dashboard, open your site page (or property) and find the “Integrations” section.
  • In step 1, choose GTM, GA4, or Matomo and enter the identifier (GTM-…, G-…, or for Matomo the server URL and site ID). Matomo is injected by the widget: the visit is measured on page view without cookies, and Matomo cookies are set only after analytics consent. No Google Consent Mode.
2

Integrate the snippet

  • Click “Get script”: widget-only snippet (GTM, Matomo, or GA4 Basic) or gtag + widget (GA4 Advanced; no manual gtag('config') in HTML — the widget applies it after consent).
  • Copy the integration script shown.

data-category

data-category.html
<script src="https://example.com/tag.js" data-category="ANALYTICS"></script>
3

Publish & verify

  • Paste it into your site: preferably in <head>, or near the end of <body> depending on your CMS.
  • Publish and reload a page on your site: the widget should execute and communicate with the dashboard.
  • Go back to the dashboard and check the integration status (widget detected / green check).
  • If detection does not work: confirm the script loads correctly (no console errors) and use the integration refresh control.

Section 2

Script blocking

The CMP activates/deactivates tags based on consent categories. Use the data-category attribute to associate each script with a category.

script-blocking.html
<script type="text/javascript" data-category="MARKETING" src="https://example.com/pixel.js"></script>

Section 3

Google Consent Mode v2

  • Consent Mode turns on when you choose GTM or GA4 in step 1. It is not a way to meet a regulatory requirement: it tells Google tags the visitor’s consent state.
  • Google documentation: Set up consent mode and consent mode for developers.
  • Basic: Google tags do not load before the visitor chooses. No data is sent to Google until they accept.
  • Advanced (default): Google tags load before the choice and stay gated. While the state is denied, they send cookieless pings.
  • If a Consent Mode signal is missing on a Google tag, contact CookieFort support first (cmp@cookiefort.com, Contact page). Google support asks for proof of that contact before it answers.
  • Support sends a first reply within 4 business days. That reply is a step toward a fix, not only an acknowledgement.

Section 3b

Banner that meets Consent Mode requirements

  • Every label is set in the dashboard, without HTML or JavaScript.
  • When Consent Mode is used without TCF, the dashboard recommends the Google template. Use the Google Consent Mode template fills the message in French and English.
  • The template says data is collected for advertising personalization and analytics, keeps the Accept button, and shows business.safety.google/privacy inside the banner.
  • You can limit the banner to the EEA. Outside that area it stays hidden and consent is granted, including when Data Transmission Controls or Global Consent Defaults deny measurement for every region.

Section 3c

Google Tag Gateway

  • Google Tag Gateway (GTG) can inject the script through a one-click CDN. You then no longer control load order: the tag may run before the widget’s consent default. That is a late consent signal.
  • Google documentation: Google tag gateway.
  • To check enrollment, open the Google tag settings in GTM, then the Google Ads or GA4 account. One-click enrollment can be turned on outside the page. CookieFort does not detect it for you.
  • If debug mode reports a late consent signal and the tag is enrolled: reordering scripts is not enough. Switch to Consent Mode Advanced (U+C) and, as needed, turn on Data Transmission Controls and Global Consent Defaults. You can also move tags into a GTM container deployed through GTG, or set up GTG manually so you control the import order.
  • For a GTG-enrolled tag, Advanced is the recommended mechanism: it does not depend on blocking the script before the choice, and it stays compatible with a manually configured GTG.

Section 4

Consent widget

The widget shows the banner (and its configuration view) and records user choices. In Advanced, Google tags may already be loaded and gated by Consent Mode. In Basic, they start only after an analytics or marketing choice.

If you disable the floating “Manage cookies” button, add a footer/menu link to /#cookiefort-manage-cookies (legacy: /#kookitrust-manage-cookies) so users can reopen preferences.

reopen-preferences.html
/#cookiefort-manage-cookies

Section 4a

Ad pixels (Meta, TikTok, LinkedIn, Pinterest)

  • In step 1 (Installation), enable “Use social network pixels” and enter the IDs you need: Meta Pixel, TikTok Pixel, LinkedIn Insight Tag, Pinterest Tag.
  • Pixels load widget-only — they are not included in the step-2 installation snippet.
  • Rule: no ad scripts before explicit consent; pixels start only after marketing consent is granted (or equivalent per user choice).
  • If the user withdraws marketing and saves, the widget revokes platform consent (Meta/TikTok) and removes LinkedIn/Pinterest scripts where applicable.
  • GTM coexistence: if the same pixels already run in your GTM container, avoid enabling them in the widget too to prevent double loading.
  • V1: PageView on activation; no advanced events (Lead, Purchase, etc.) in this version.

Section 4b

Multi-country customization

  • In the Privacy accordion (step 1), enable “Multi-regulation privacy links”.
  • Enter optional URLs for Switzerland (CH), United Kingdom (GB), Australia (AU), and United States (US). Each field accepts an http or https URL.
  • The widget reads browser locale (document.documentElement.lang, then navigator.language) and shows the matching country link when set.
  • If the country is not covered or the country URL is empty, the global privacy link (privacyUrl) is shown — historical fallback behavior.
  • This is URL routing to the right policy page, not automatic legal analysis per jurisdiction.

Section 5

Automatic cookie detection & “unknown cookies”

Scanning & mapping

Run the scan, categorize unknown cookies, then apply the updates to the widget.

Run the scan

  • Open the “Automatic cookie detection” screen.
  • Click “Start scan” and wait until the scan completes.

Categorize unknown cookies

  • In the “Unknown” area, look for cookies CookieFort cannot map to your current base.
  • For each unknown cookie: set “Retention (days)” between 1 and 395.
  • Then choose the consent category (Essential / Analytics / Marketing / Social / Preferences).

Add to widget

  • Click “Add” to apply the mapping to the widget (this updates the widget configuration from the dashboard).

Exceptions & reporting

  • If you need an exception: use “Ignore” only exceptionally (expected GDPR behavior).
  • If you want to enrich the base: use “Report” to send the cookie to the team.

Finalize & apply

  • When all unknown cookies are handled, use the global “Save to my configuration” button (if shown).
  • Finally, click “Apply to widget” to activate the updated configuration.
  • If retention is invalid, the error shows as a tooltip (no layout height shift).

Section 6

Proof of consent

Proof of consent

The dashboard stores a modal snapshot you can export.

The dashboard stores consent proofs: modal version, browser info, and a modal snapshot. Each row is one recorded decision (accept all, reject all, or customized choices). Export this log as CSV from “Consents”. Billing is based on the number of visits (browser session), not the number of decisions.

Section 7

Visits & billing

A visit is an active browser session on your site: it starts when the page loads and ends when the tab or browser is closed. On first arrival, the visitor must make a consent choice; each new page load counts as a new visit. If the visitor accepted or customized preferences, their visitor ID is reused across visits; if they refused, a new ID is assigned on each visit. Changing preferences during the same browser session does not create an additional visit. Visits are counted on the site covered by your subscription over the current billing period. Mini, Starter, Growth, and Pro tiers include a monthly quota, a 7-day free trial, and overage billed in blocks. See the Pricing page and FAQ for details.

See also Pricing and FAQ.

Are you an agency? See the Partner agency program chapter.

Section 8

Daily stats cron

  • Entry point: GET /api/cron/daily-stats (or POST) with secret via Authorization: Bearer, x-cron-secret, or ?secret=.
  • Recommended frequency: once a day in UTC (preferably early morning) to aggregate D-1.
  • Health check: GET /api/cron/daily-stats?health=1 to compare latest aggregated date vs expected date.
  • Backfill: ?backfill=7 (or N) to recompute previous days with idempotent behavior.
  • Local smoke test: npm run cron:daily-stats:smoke (uses APP_URL and CRON_SECRET from .env).
  • Scheduler wiring: plug either Vercel Cron or a Linux/external cron pinger to this endpoint.
cron-endpoints.http
GET /api/cron/daily-stats
Authorization: Bearer $CRON_SECRET

GET /api/cron/daily-stats?health=1
GET /api/cron/daily-stats?backfill=7
Want the CMP running on a real site? Create a dashboard account and test the integration.
Get started