ConsentOverview

Consent Management

Signal provides comprehensive consent management that integrates with your Consent Management Platform (CMP), enforces consent rules per-integration before delivery, and passes the correct consent signals to each vendor API.

  1. Capture — Datafly.js reads consent state from your CMP’s cookie or storage location.
  2. Attach — Two views of the consent state are attached to every event payload:
    • context.consent.categories — the customer’s CMP-specific codes (e.g. statistics, C0002).
    • context.consent.canonical — Signal’s fixed vocabulary, mapped from those codes.
  3. Enforce — The pipeline engine filters integrations based on consent before delivery.
  4. Translate — Vendor blueprints reference consent through context.consent.canonical.<purpose>, so the same blueprint works for any CMP.
  5. Audit — Every filtering decision is logged.

The two views: categories vs canonical

Signal emits both views on every event so blueprints stay portable across CMPs:

{
  "context": {
    "consent": {
      "categories": {
        "necessary": true,
        "preferences": true,
        "statistics": false,
        "marketing": false
      },
      "canonical": {
        "essential": true,
        "functional": true,
        "analytics": false,
        "marketing": false
      }
    }
  }
}
ViewKeysUse it when
categoriesThe customer’s CMP codes verbatim (e.g. Cookiebot’s statistics, OneTrust’s C0002).Custom blueprints that intentionally tie to one CMP, or when surfacing the raw signal in audit/UI.
canonicalA fixed vocabulary of essential, functional, analytics, marketing, personalization.Vendor blueprints that ship with Signal. References stay valid no matter which CMP the customer uses.

See Canonical Categories for the full vocabulary, classification guidance, and migration notes.

Supported CMPs

Signal supports reading consent from any CMP, with first-class auto-seeding for the most common ones:

CMPCookie / StorageAuto-seeded categories
CookiebotCookieConsent (cookie)necessary, preferences, statistics, marketing
OneTrustOptanonConsent (cookie)C0001, C0002, C0003, C0004
Didomididomi_token (cookie)Configured per deployment
Osanoosano_consentmanager (cookie)Configured per deployment
IAB TCF v2.0euconsent-v2 (cookie)Configured per deployment
CustomAny cookie or localStorage keyConfigured per deployment

When you select a known CMP in Settings → Consent, Signal pre-populates the standard categories and their canonical classifications. You can override these or add custom categories at any time.

Signal’s parser handles five formats so you rarely need transformation logic in your CMP integration:

  1. JSON object — {"necessary":true,"marketing":false}
  2. JS object literal (Cookiebot’s native shape) — {stamp:'abc==',necessary:true,...}
  3. Colon-delimited, comma-separated — essential:1,functional:1,analytics:0,marketing:0
  4. URL query string (OneTrust) — groups=C0001:1,C0002:1,C0003:0,C0004:0
  5. Semicolon-delimited key=valueanalytics=1;marketing=0;functional=1

URL-encoding and double-encoding are handled transparently.

Consent enforcement happens at two stages:

  1. At ingestion — before any vendor-side identifier sync runs, Signal checks the visitor’s recorded consent against each sync’s required category (default marketing). Denied vendors are silently omitted so the browser never fires the corresponding match-pixel redirect. See Identity.
  2. At delivery — before events reach each vendor’s API. Each integration can have a consent category gate; events without the required consent are filtered and never delivered.

Both stages honour the pipeline’s consent_mode: explicit (GDPR, absent → denied) or implicit (CCPA, absent → granted).

⚠️

Vendor-side identifier syncs trigger ePrivacy / PECR cookie-consent obligations even though Signal stores the resulting ID server-side. The browser → vendor redirect causes the vendor to read/write cookies on the vendor’s domain, which is exactly what ePrivacy regulates. Server-side storage location does not remove the consent requirement. The gating described above is on by default and should remain enabled for any pipeline handling UK/EU traffic.

Vendor blueprints reference consent through the canonical view:

# GA4 blueprint — works for Cookiebot, OneTrust, Didomi, anything
- target: "@root.consent.ad_user_data"
  source: "context.consent.canonical.marketing"
  transform:
    type: value_map
    map:
      "true": GRANTED
      "false": DENIED

The customer chooses how their CMP’s categories map to Signal’s canonical vocabulary in Settings → Consent. Once that mapping is set, every blueprint that references canonical.marketing (Meta CAPI, Google Ads, TikTok, GA4 …) reads the right value automatically.

Vendor-Specific Rules

In addition to the pipeline-level consent gate, each delivery layer applies vendor-specific consent enforcement. The blueprint determines the exact behaviour; the table below shows the typical defaults shipped with Signal:

VendorWhen canonical.marketing deniedAction
Meta CAPIdeniedStrip PII (email, phone, fbp, fbc, IP, UA). Set data_processing_options=['LDU'].
Google Adsany stateInclude Consent Mode v2 params. Google handles modelling internally.
GA4any stateInclude ad_user_data and ad_personalization in payload.
TikTokdeniedStrip PII (email, phone, ttp, ttclid, IP, UA). Set limited_data_use=true.
Microsoft UETdeniedSuppress event entirely (UET does not support degraded delivery).

Every consent filtering decision is recorded in the consent_filtered_events table:

FieldDescription
pipeline_idWhich pipeline the event was processed through
integration_idWhich integration was blocked
consent_categoryThe consent category that was denied
event_typeThe type of event (page, track, etc.)
event_nameThe specific event name
anonymous_id_hashSHA256 hash of the anonymous ID (privacy-safe)
filtered_atTimestamp of the filtering decision

This provides a complete audit trail for compliance reviews without storing PII.

Configuration

  1. Go to Settings → Consent.
  2. Click Add Provider and pick your CMP (or Custom).
  3. Cookie name, storage type, and standard categories are pre-populated for known CMPs.
  4. Each category has a Canonical Category dropdown — set it to one of essential, functional, analytics, marketing, personalization. Leave blank for unclassified categories (they still appear under categories but not under canonical).

Each integration attached to a pipeline can have a consent category:

  1. Go to Pipelines → [Your Pipeline] → Integrations.
  2. Click an integration.
  3. Set the Consent Category (typically marketing, analytics, or functional — these refer to the canonical vocabulary).
  4. Set the Consent Mode (“Explicit” for GDPR, “Implicit” for CCPA).

Events without the required consent for that category will be filtered before delivery.

Whenever the user updates consent (CMP banner, preferences page), call:

datafly.refreshConsent();

This is cheap and idempotent — modules diff internally. The next event the SDK sends carries the new state.