CookieFort
Pricing
Agency partners
Get started
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
  • 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
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
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 or GA4 and enter your ID (GTM-… or G-…).
2

Integrate the snippet

  • Click “Get script”: widget-only snippet (GTM) or gtag + widget (GA4; 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

  • By default, CookieFort uses Consent Mode Advanced: Google tags load earlier, gated by Consent Mode signals (denied by default, unless opt-out is enabled).
  • Basic mode (optional in step 1) loads Google tags (GTM or gtag) only after analytics and/or marketing consent.
  • The “analytics before choice” opt-out is only available in Advanced. In Basic, defaults stay denied until an explicit choice.

Section 4

Consent widget

The widget shows the banner (and its configuration view) and records user choices. After activation, scripts start only after explicit consent.

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