Skip to content

fix(analytics): consent gate, label plumbing, IP scrub, engagement dashboards - #318

Merged
fworks-tech merged 2 commits into
mainfrom
fix/analytics-engagement-dashboards
Sep 26, 2026
Merged

fworks-tech merged 2 commits into
mainfrom
fix/analytics-engagement-dashboards

Conversation

@fworks-tech

Copy link
Copy Markdown
Owner

What

Four verified analytics defects fixed:

  1. Consent leak — Vercel track() fired unconditionally even after user declined. Now all three emitters (Vercel, PostHog, self-hosted) share one getConsent() !== 'declined' gate.

  2. Dropped CTA labels — usePageTracking and TrackedButton sent data-track-label, but analytics.ts forwarded only path/value to self-hosted store. Plumbed l through PendingEvent → TrackedEvent → ingest validation (capped 200 chars).

  3. Raw IP in logs — Ingest endpoint logged the raw proxied IP in 3 places while tracking.ts claimed "no IPs are stored". IP still used for rate-limit key; only log payloads changed.

  4. Collected-but-invisible data — browsers, scroll_depth and quiz funnel were aggregated but never rendered. Added getEngagement() reading existing daily counters (zero new collection) plus three panels on /admin/analytics (browsers via reused DevicePie, scroll/quiz via new FunnelChart).

Why

  • GDPR/consent compliance (items 1, 3)
  • Data integrity for CTA segmentation (item 2)
  • Visibility into signals already collected (item 4)

How

  • src/lib/analytics.ts: consent gate + label forward
  • src/lib/tracking.ts: PendingEvent.l
  • src/lib/tracking-store.ts: TrackedEvent.l, scroll:* mirror counters, exported BROWSER_KEYS/SCROLL_THRESHOLDS, new getEngagement()
  • src/app/api/analytics/event/route.ts: validate l, remove IP from logs
  • src/components/admin/AdminCharts.tsx: new FunnelChart
  • src/app/admin/analytics/page.tsx: three new panels
  • Tests: 4 new regression tests, extended existing admin page test

Validation

  • lint clean
  • typecheck clean
  • 737/737 unit tests pass
  • next build clean

…shboards

- Gate Vercel Analytics behind same consent check as PostHog/self-hosted
- Plumb cta_click label through self-hosted tracker (PendingEvent.l)
- Remove raw proxied IP from analytics ingest logs (rate-limit key only)
- Surface browsers, scroll_depth funnel, quiz funnel on /admin/analytics
- Add getEngagement() reading existing daily counters (zero new collection)
- Export BROWSER_KEYS, SCROLL_THRESHOLDS for shared use
- Add FunnelChart component (reuses existing bar chart pattern)
- 4 new regression tests + extended existing admin test
- Move BROWSER_KEYS to tracking-store.ts as single source of truth
- tracking.ts imports from tracking-store.ts (implicit sync via detector output)
- Add ScrollDepthMap type alias for getEngagement return type
@fworks-tech
fworks-tech merged commit bbda0bf into main Sep 26, 2026
5 checks passed
@fworks-tech
fworks-tech deleted the fix/analytics-engagement-dashboards branch September 26, 2026 22:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant