Cookie Policy
This page reports what storage and tracking actually exist after codebase inspection — not a template list of invented cookies.
Updated for Phase 8: optional analytics may load only after consent. Without analytics env config, accept still no-ops safely.
Summary
Marketing site: no first-party advertising cookies. Optional analytics (Plausible when configured) loads only after you accept in the consent banner.
Product web app: essential localStorage only (auth token, theme preference, quick-add shortcuts).
Consent preference is stored in localStorage key expenu_marketing_consent so we remember your choice.
Baseline inspection findings
marketing · localStorage · expenu_marketing_consent · essential: Stores Accept/Reject for optional analytics consent. (evidence: apps/marketing/src/analytics/consent-storage.ts)
marketing · third_party_script · plausible · non_essential: Optional Plausible analytics — loads only after consent when PUBLIC_ANALYTICS_PROVIDER=plausible and domain are set. (evidence: apps/marketing/src/analytics/plausible.ts)
product_web · localStorage · expenu_access_token · essential: JWT access token for authenticated API calls. (evidence: apps/web/src/lib/api.ts)
product_web · localStorage · expenu_theme · essential: UI theme preference (light/dark) and boot flash prevention. (evidence: apps/web/src/lib/theme.ts; apps/web/index.html boot script)
product_web · localStorage · expenu_quick_adds · essential: Local quick-add shortcuts for transaction entry UX. (evidence: apps/web/src/lib/quickAdds.ts)
Essential / necessary storage
expenu_access_token — product app sign-in (apps/web).
expenu_theme — product theme preference.
expenu_quick_adds — product quick-add shortcuts.
expenu_marketing_consent — remembers Accept/Reject for analytics on this marketing site.
Optional analytics
When PUBLIC_ANALYTICS_PROVIDER=plausible and a public domain are configured, accepting consent loads the Plausible script. Rejecting prevents initialization.
If analytics is not configured, the consent UI still works; tracking calls no-op and no third-party script is injected.
Optional analytics is consent-gated. Scripts do not load until Accept. Reject keeps a noop provider. Missing analytics config never breaks the site — tracking no-ops.
How to change your choice
Use Cookie settings in the site footer, or revisit this policy after clearing site data.
Clearing browser site data removes consent memory and product localStorage keys.
Questions
Use /contact for privacy questions. Related: /privacy and /data-protection.