> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pivolio.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pivolio.com/_mcp/server.

# Consent rules

Every event carries a consent snapshot — the four Google Consent Mode v2
categories as they stood when the event fired. Each destination decides, on its
own, which of those categories it requires before it will forward anything.

This is a **per-destination** control on purpose. The consent basis you rely on
for one ad platform is not necessarily the basis you rely on for another, and
one legal review shouldn't force you to loosen every integration at once.

## The four categories

* **`ad_user_data`** — permission to send the visitor's data to an ad platform.
* **`ad_storage`** — permission to store and read advertising identifiers.
* **`ad_personalization`** — permission to use the data for personalized ads.
* **`analytics`** — permission for analytics storage.

## Enforcement

Each destination has an **enforcement toggle** plus a switch per required
category.

* **Enforcement on** (the default) — if the event's consent snapshot **denies**
  any required category, the send is skipped.
* **Enforcement off** — consent is recorded on the event but never blocks a
  send. You are then relying on some other basis for the transfer.

The required categories default to **`ad_user_data` and `ad_storage`**. Those
are the two that describe what a conversions API actually does: it takes user
data and sends it to an advertiser's platform. `ad_personalization` and
`analytics` are available but not required by default.

> **Note**
>
> **Unset is not denied.** Only an explicit denial gates a send. A visitor who has
> never interacted with your consent banner has no denial recorded, so events flow
> — which is why your banner's default state, not Pivolio's, decides what happens
> to first-page-view traffic.

## What a gated send looks like

A gated event is recorded with a delivery status of **`skipped`**. In the
dashboard it appears in the destination's delivery breakdown and in the Live
Debugger next to the event, alongside genuinely unmapped events.

Two consequences worth internalizing:

* **Skipped is not a failure.** It doesn't count against your success rate,
  doesn't retry, and doesn't raise an error. A destination can be perfectly
  healthy and delivering almost nothing.
* **The event is still tracked, stored and reported.** Consent gating stops the
  outbound send, not the collection. Your Pivolio reporting still shows the
  conversion; the ad platform just never hears about it.

If a destination's delivered count collapsed after a consent-banner change,
`skipped` is the first number to look at.

## Consent also shapes the payload

Separately from destination gating, the browser SDK trims what it collects
based on the same categories:

* `ad_storage` denied — the event is not sent at all.
* `ad_user_data` denied — PII traits are stripped before the event leaves.
* `ad_personalization` denied — ad click IDs are stripped.

So an event that arrives at a destination under partial consent may be missing
the identifiers that make it matchable. It will be delivered and it will match
poorly. That shows up as a falling match quality score rather than as an error.

## Choosing a setting

* **Regulated market, cookie banner in place** — leave enforcement on with the
  defaults. Denied traffic gets skipped and your reports still count it.
* **Adding `ad_personalization` as required** — reasonable if your legal basis
  ties conversion uploads to personalized advertising. Expect delivered volume
  to drop, since banners commonly get partial grants.
* **Turning enforcement off** — only with a documented basis. Nothing in Pivolio
  will stop you; nothing in Pivolio will defend you either.

## Related

* [Destinations overview](/documentation/destinations/overview)
* [Event mappings](/documentation/destinations/event-mappings)
* [Troubleshooting](/documentation/destinations/troubleshooting-delivery) — telling `skipped` apart from
  `suppressed`.