PostHog caracteristici steaguri în spatele unui banner cookie (fără a rupe GDPR)
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 identificarea() ar trebui să vină 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 sub sculptarea "strict necesară" a GDPR ș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 ("întotdeauna") atunci când analiza este refuzată - 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 Tratați-l ca pe cookie-ul probo_consent al platformei: 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: "întotdeauna" 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:
Cu "always", identify() este blocat - un ID distinct stabil este tratat ca date cu caracter personal în acest mod.
opt_in_capturing() nu lasă modul fără cookie-uri pentru încărcarea paginii respective. Rămâneți fără cookie-uri până la o încărcare completă cu consimțământul deja acordat.
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 sesiune de redare, sondaje, profiluri de persoană) după acceptare, "întotdeauna" la boot negat este compromisul greșit.
Utilizați întotdeauna on_reject pentru Track 2
Inițializarea după cum urmează (încă numai după ce platforma este gata, încă condusă de snapshot-ul 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): când modul cookieless_mode este „on_reject” și vizitatorul este dezactivat – inclusiv pending + opt_out_capturing_by_default – persistența pentru identitate și sesiune este dezactivată.
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.
__ph_opt_in_out_* stocarea consimțământului necesar
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:
păstrați scopul restrâns (numai statul de consimțământ),
listați-l în politica dvs. de cookie / inventar ca fiind esențial,
Nu o utilizați în scopuri de profilare sau publicitate.
Punctul practic pentru integratori: trecerea de la 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ță.
Wire consent → identify → flags
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;
}
Așezați configurareaPosthogFromBanner de pe platformă - gata 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 la isFeatureFlagEnabled() (sau un magazin care se actualizează de la onFeatureFlags).
Creați și vizați steagul în PostHog
Create a boolean caracteristici a căror cheie se potrivește cu codul dvs. (de exemplu, panoul beta).
Either roll out to 100% of users, or add a release condition: Distinct ID este egal cu șirul pe care îl treceți la identificare() (de exemplu, cookie-banner-example-demo) la 100%.
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).
Exercitați fluxul: încărcați fără analiză → Gated UI ascuns; acceptați analiza → identificați rulează → UI apare atunci când steagul este pornit; opriț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:
Wiring: src/lib/posthog.ts
Env: PUBLIC_POSTHOG_FEATURE_FLAG, PUBLIC_POSTHOG_DEMO_DISTINCT_ID (see .env.example)
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 pentru GDPR, UKGDPR, FADP, CCPA, CPRA, LGPD, PIPEDA, POPIA, PDPA, PIPL, PIPA, APPI, DPDP, LFPDPPP și PDPL. Programează o discuție.