Sari la conținutul principal
Înapoi la Blog
5 august 2026, de Émile Ré GDPR & conformitate

PostHog caracteristici steaguri în spatele unui banner cookie (fără a rupeGDPR)

Cum să evaluați steagurile caracteristicilor PostHog numai după consimțământul analitic și identificarea() - și de ce modul_cookieless: on_reject este setarea implicită corectă pentru Track 2 atunci când aveți nevoie de steaguri.

Aveți deja PostHog în spatele unui banner cookie conștient de reglementare - Track 2 setupAcum doriți o caracteristică mică a produsului înfășurată de un steag de caracteristică PostHog: Ascunsă atunci când steagul este stins, and also treated as off în timp ce PostHog este încă fără cookie-uri sau vizitatorul este neidentificat. Numai după consimțământul analitic și identify() ar trebui să vină steagul de la PostHog.

Acest ghid de însoțire acoperă alegerea init care face posibil acest lucru, de ce cookie-ul de consimțământ-preferință PostHog scrie este de obicei bine subGDPR's "strict necesar" sculptură, și un model minim de cablare. setup guide.

TL;DR

  • Dacă aveţi nevoie de steaguri după consimţământ, porniţi PostHog în reject → cookieless modul (cookieless_mode: "on_reject"), și optați în mod implicit atunci când analiza nu este deja permisă. not să înceapă în hard cookie-less ("always") atunci când este refuzată analiza – apoi o acceptare ulterioară în aceeași vizită nu poate atașa un ID de utilizator stabil, astfel încât steagurile la nivel de persoană să nu se debloceze niciodată.
  • În timp ce vizitatorul a respins (sau nu a ales încă) analizele, PostHog nu trebuie să continue să urmărească cookie-urile sau ID-ul vizitatorului permanent.
  • PostHog may still store a small opt-in/out preference (__ph_opt_in_out_<token>). Tratați-l ca pe cookie-ul platformei probo_consent: stocare necesară a confidențialității, listați-l ca fiind esențial – nu un tracker de analiză.
  • În aplicația dvs., păstrați caracteristica gated hidden until analytics consent is granted and ați spus PostHog cine este utilizatorul. abia apoi întrebați PostHog dacă steagul este pornit. Dacă consimțământul este lipsit, utilizatorul este anonim sau răspunsul steagului este încă încărcat, tratați-l ca fiind off.
  • Când acceptă: porniți capturarea, apoi identificați-le. Când revocă: clarificați starea locală a PostHog, apoi opriți capturarea din nou (clarificați mai întâi - în caz contrar o acceptare anterioară poate lăsa captura să funcționeze).

De ce nu cookieless_mode: "always" atunci când este negată analiza?

A common Track 2 pattern was:

cookieless_mode: analyticsAllowed ? "on_reject" : "always",

Acest lucru pare mai sigur: dacă snapshot-ul spune că analytics-ul este oprit la init, PostHog nu atinge niciodată stocarea browser-ului pentru întreaga sesiune. accepts mid-session:

  1. Cu "always", identify() este blocat – un ID distinct stabil este tratat ca date cu caracter personal în acest mod.
  2. opt_in_capturing() nu lasă modul fără cookie-uri pentru încărcarea paginii respective.
  3. Steagurile caracteristice care depind de o persoană identificată nu se întorc niciodată în acel flux.

Dacă produsul dvs. are nevoie de semne de consimțământ-conștient (sau de redare a sesiunii, sondaje, profiluri de persoane) după acceptare, "always" la pornirea refuzată este compromisul greșit.

Utilizați întotdeauna on_reject pentru Track 2

Inițializarea după cum urmează (încă numai după probo-ready, încă condusă de imaginea de consimțământ pentru opt_out_capturing_by_default):

const analyticsAllowed = consent.getAll()["analytics"] === true;
posthog.init("<YOUR_POSTHOG_KEY>", {
api_host: "https://us.i.posthog.com", // or your reverse proxy
defaults: "2026-01-30",
cookieless_mode: "on_reject",
opt_out_capturing_by_default: !analyticsAllowed,
person_profiles: "identified_only",
respect_dnt: true,
});

Ce face de fapt posthog-js (verificat în SDK, nu doar docurile): atunci când cookieless_mode este "on_reject" și vizitatorul este optat - inclusiv în așteptare + opt_out_capturing_by_default - persistența pentru identitate și sesiune este dezactivată. Nu există nici un cookie de urmărire distinct_id până când aceștia optează. Când apelează opt_in_capturing(), SDK lasă modul fără gătit și persistența normală este permisă.

Reserve cookieless_mode: "always" for Track 1 (numai vizualizări de pagină agregate, fără identificare, fără steaguri). Aceasta este totuși alegerea potrivită atunci când nu aveți nevoie deloc de caracteristici la nivel de persoană – a se vedea setup guide.

opt_out_capturing() scrie o preferință sub o cheie precum __ph_opt_in_out_<project_token> (cookie sau localStorage, în funcție de configurare). not cookie-ul de identitate analitică. înregistrează numai dacă PostHog ar trebui să capteze.

Același cadru pe care îl utilizați deja pentru cookie-ul probo_consent al platformei: stocarea există pentru a vă aminti și a aplica o alegere de confidențialitate. strictly necessary, astfel încât nu are nevoie de același consimțământ prealabil ca și cookie-urile analitice – atâta timp cât:

Punctul practic pentru integratori: schimbarea Track 2 la întotdeauna "on_reject" nu not Aceasta înseamnă că rejectorii primesc analize fără cookie-uri (dacă activați modul de hash al serverului fără cookie-uri) plus o mică intrare de consimțământ-preferință.

Minimum pattern, aligned with examples/cookie-banner-react/src/lib/posthog.ts:

import posthog from "posthog-js";
import { getConsent } from "@probo/cookie-banner/consent";
const ANALYTICS = "analytics";
const FLAG_KEY = "example-beta-panel";
const DISTINCT_ID = "cookie-banner-example-demo"; // or your logged-in user id
let initialized = false;
let identified = false;
export function configurePosthogFromBanner() {
if (initialized) return;
initialized = true;
const consent = getConsent();
const analyticsAllowed = consent.getAll()[ANALYTICS] === true;
posthog.init("<YOUR_POSTHOG_KEY>", {
api_host: "https://us.i.posthog.com",
defaults: "2026-01-30",
cookieless_mode: "on_reject",
opt_out_capturing_by_default: !analyticsAllowed,
person_profiles: "identified_only",
respect_dnt: true,
});
posthog.onFeatureFlags(() => {
// re-render your UI from isFeatureFlagEnabled()
});
sync(consent.getAll());
consent.subscribe(sync);
}
function sync(data: Record<string, boolean>) {
if (data[ANALYTICS]) {
posthog.opt_in_capturing();
posthog.identify(DISTINCT_ID);
identified = true;
} else {
// reset() clears stored consent — call it before opt_out
posthog.reset();
posthog.opt_out_capturing();
identified = false;
}
}
/** Default-deny: cookieless, pending, or unidentified ⇒ feature hidden. */
export function isFeatureFlagEnabled(key = FLAG_KEY): boolean {
if (
!initialized ||
posthog.get_explicit_consent_status() !== "granted" ||
!identified
) {
return false;
}
return posthog.isFeatureEnabled(key) ?? false;
}

Închideți configurePosthogFromBanner de pe probo-ready exact ca în setup guideNu apelați niciodată identify() înainte de a permite analiza - aceasta ar scrie date cu caracter personal fără o bază legală.

În UI, porniți caracteristica pe isFeatureFlagEnabled() (sau un magazin care se actualizează de la onFeatureFlags).

Creați și vizați steagul în PostHog

  1. Create a boolean caracteristici a căror cheie corespunde codului dvs. (de exemplu example-beta-panel).
  2. Either roll out to 100% of users, or add a release condition: Distinct ID este egal cu șirul pe care îl treceți la identify() (de exemplu cookie-banner-example-demo) la 100%.
  3. Enable Cookieless server hash mode În secțiunea Setări proiect → Web Analytics, dacă vizitatorii sunt respinși, aceștia ar trebui să fie în continuare numărați ca utilizatori unici (aceleași cerințe ca și Track 1 / Track 2 din ghidul de configurare).
  4. Exercitați fluxul: încărcați fără analytics → gated UI ascuns; acceptați analytics → identify rulează → UI apare atunci când steagul este pornit; închideți steagul în PostHog → UI se ascunde după următoarea actualizare / reîncărcare steag.

Atingerea unui ID distinct este necesară numai atunci când doriți ca caracteristica să fie limitată la acea identitate. Pentru demonstrațiile locale, implementarea la 100% este mai simplă.

Working example

Exemplul React trimite întreaga buclă - panoul de stare, steagul cu poartă de consimțământ și un "panoul beta" care se afișează numai atunci când steagul este activat:

Puneți-l pe banner și pe proiectul PostHog, acceptați analizele de pe fila Banner tematic și urmăriți rândurile de steag să se întoarcă.

Putting it together

Need feature flags (or identify / replay) after consent?
├─ No → Track 1: cookieless_mode: "always"
└─ Yes → Track 2: cookieless_mode: "on_reject" always
+ opt_in + identify on grant
+ reset + opt_out on revoke
+ app-level default-deny around isFeatureEnabled

Pentru bootstrap-ul bannerului, cartografierea reglementărilor și gating-ul pentru evenimente personalizate, utilizați Cum să configurați PostHog:GDPR, CCPA și legile globale privind confidențialitateaPentru detalii despre Managerul de consimțământ, consultați Consent Manager API docs.


platforma este platforma de conformitate care livrează, de asemenea, un banner cookie gratuit, fără dependență, cu suport încorporat pentruGDPR, UKGDPR, FADP, CCPA, CPRA, LGPD, PIPEDA, POPIA, PDPA, PIPL, PIPA, APPI, DPDP, LFPDPPP și PDPL. Programează o discuție.


Scris de Émile Ré
Émile Ré scrie despre integrări, engineering workflows și partea tehnică a platformelor de conformitate.
Portret Émile Ré
Primește analize și ghiduri ZebraByte despre cyber security, privacy și compliance.
ZebraByte

Framework-uri gestionate Managed frameworks

Nu găsești framework-ul pe care îl cauți?
Discută cu noi — este posibil să îl putem include în program.
Nu vedeți cadrul pe care îl căutați?
Reach out – este posibil să o susținem deja în program.

SOC 2 Type 1
ISO 27001
ISO 42001
CCPA
GDPR
ISO 27701
HIPAA
FERPA
CASA
SOC 2
Discută cu un expert Discută cu un expert