Skip to content

What gets stored, and why for Next.js

Markdown
Loading…

Every field of a stored consent record, what it proves, and what is deliberately left out. A page to send to your legal team.

Each consent decision becomes one row: who decided (by a random id), when, what they saw, what they chose, and where. Nothing about what the visitor was browsing is stored. This page lists every field so you can check it against your own privacy notice.

One row per decision

ColumnWhat it shows
Visitorconsent_id, a random id kept in the visitor's consent cookie. It is not derived from anything about the visitor.
Whendecided_at, by the visitor's clock, and received_at, by your server's. Keeping both shows a record that was delayed, retried or replayed.
What they sawtaxonomy_hash, a fingerprint of the categories shown, plus regulation, sdk_version and domain.
What they chosegranted and denied, the category ids, and action: accept all, reject all, accept selected, or save.
Wheresource: the banner, the preferences dialog, the opt-out dialog, or your own code.
Signalsgpc: whether the browser sent Global Privacy Control. region: the region the SDK detected, when region detection is on.

A visitor who changes their mind adds a row; earlier rows are kept, so the history is complete. The visitor's current choice is their latest row.

Every stored column

FieldTypePersonal dataMeaning
recordIdstringnoId of the decision.
consentIdstringpseudonymousRandom id of the visitor. Use it to find or delete their records.
decidedAtstringnoWhen the visitor decided, by their device's clock.
receivedAtstringnoWhen the server received the record, by the server's clock.
grantedstring[]noCategories the visitor granted.
deniedstring[]noCategories the visitor denied.
regulation"GDPR" | "CCPA" | "DEFAULT"noThe regulation the banner applied.
regionstring | nullcoarse locationRegion the SDK detected, when region detection is on.
domainstringnoThe site's hostname.
taxonomyHashstringnoFingerprint of the category list the visitor was shown.
action"accept_all" | "reject_all" | "accept_selected" | "save"noWhat the visitor did.
source"banner" | "preferences" | "optout" | "api"noWhere they decided.
sdkVersionstring | nullnoVersion of the SDK that sent the record.
gpcboolean | nullnoWhether the browser sent Global Privacy Control.
ipstring | nullyesEmpty unless you turn on ipAddress; then truncated or hashed, never raw.

Deliberately not stored

  • The IP address, unless you turn on ipAddress. Then it is truncated to its network (the last part of an IPv4 address, or all but the first three groups of IPv6, removed) or replaced by a keyed hash. A raw address is never an option.
  • Page URLs, referrers, user agents and cookies. The record is about the consent, not the browsing.
  • Fields the backend does not know. A newer SDK may send more; they are dropped, never stored.

Server logs say what happened ("deleted 2 records"), never who it happened to: no consent id, no payload, no address.

What the SDK sends

FieldTypePersonal dataMeaning
recordIdstringnoId of this decision. The same decision always has the same id, so a retry is stored once.
consentIdstringpseudonymousRandom id of the visitor, kept in their consent cookie.
categoriesRecord<string, boolean>noEach category id, and whether the visitor granted it.
regulation"GDPR" | "CCPA" | "DEFAULT"noThe regulation the banner applied.
domainstringnoHostname of the site where the visitor decided.
decidedAtstringnoWhen the visitor decided, in UTC. Not when the record was sent.
taxonomyHashstringnoFingerprint of the category list the visitor was shown.
action"accept_all" | "reject_all" | "accept_selected" | "save"noWhat the visitor did.
source"banner" | "preferences" | "optout" | "api"noWhere the visitor decided. api is a call from the site's own code.
regionstringcoarse locationRegion the SDK detected, like US-CA. Sent only with region detection on.
sdkVersionstringnoVersion of @cookieyes/core that sent the record.
gpcbooleannoWhether the browser sent the Global Privacy Control signal.

Good to know

  • decided_at comes from the visitor's device and can be wrong if its clock is. received_at is your server's and is what retention counts from.
  • The same decision sent twice is stored once: its record_id is the key. A different decision under a known record_id is refused and the first one kept.
  • Whether a record is enough for your obligations is a question for your own legal advice.

Next steps

On this page