Sanitization boundaries, visible replay data, prohibited event data, and access controls
Journey events and Session Replay have different privacy boundaries:
username), stable user/guest IDs and admin/zQA flags as restricted-access PostHog person properties. See Identity and zQA Filters. This does not authorize sending email or profile payloads in arbitrary event metadata.Do not assume event sanitization protects replay content. They are separate mechanisms.
The event sanitizer removes sensitive or content-bearing keys, including passwords, secrets, tokens, authorization headers, cookies, messages, bodies, content, email, phone, links/URLs, descriptions, transcripts, Offers, and Agreements.
It also:
{
onboardingStep: "profile",
authMethod: "google",
result: "success",
durationMs: 1240,
errorCode: "confirmation_expired",
linkCount: 3
}
Only the trusted identity path may send email and username as person properties. The browser event sanitizer also rejects reserved PostHog controls ($set, $identify-style keys) and identity/admin/zQA fields, including nested attempts. The server inserts a non-PII identity-flags snapshot after that boundary. Raw guest access cookies, passwords, auth tokens and one-time codes are prohibited in every analytics identity path.
Person enrichment is best-effort and does not backfill old profiles automatically. Limit project access, review retention and deletion procedures for person data, and update user-facing privacy disclosures before broad use. Email is personal data even when sent as a person property rather than an event property.
Before replay capture, Zooly strips query parameters whose keys look sensitive, including token, secret, password, authorization, auth, code, email, OTP, key, and signature. The same sanitizer is applied to current URL, referrer, pathname, and replay request names.
This protects URL secrets; it does not remove matching text already rendered in the DOM.
The current temporary product policy records automatically and explicitly disables global masking and blocking, including for input and password fields. The consent component renders no banner or floating settings button. Anyone with Replay access may see all rendered content. Treat this as a controlled, high-risk configuration and do not broaden access.
SDK options currently override remote project masking with fully visible text, attributes, images, and form values. This behavior applies in every environment once the code and PostHog token are deployed.
The V2 consent model remains in code, but hasFullSessionReplayConsent() currently returns true regardless of stored preference. Re-enabling an interactive consent policy requires changing that gate and restoring a user-visible decision path.
Before long-term Production use, define explicit selectors for payment, credentials, documents, and other sensitive surfaces, restore password masking, and restore a consent/revocation UX. The event pipeline can continue independently even when replay is disabled.