Analytics funnel counts booking-flow friction events as real CTA engagement #4

Open
opened 2026-10-15 23:55:59 -04:00 by jfraeys · 0 comments
Owner

The Overview panel's CTA clicks (7/30 days) stat and the Funnel's Clicked a CTA stage (AnalyticsOverview/AnalyticsFunnel in internal/storage/storage.go) count every cta_click row regardless of name — including booking-flow friction events (booking-reschedule-link-expired, booking-availability-load-error, booking-slot-conflict, booking-submit-error) fired by trackBookingEdge in booking-form.js. An expired link or a slot conflict isn't real engagement, so these numbers currently overstate it.

The admin panel's What "Clicked a CTA" is made of (30 days) table (admin-analytics.js) already lists these distinctly from real data-track-cta clicks — the breakdown exists, the aggregate stats just don't use it.

Fix, once the breakdown shows this is actually noisy in practice: exclude booking-*-prefixed event names from analyticsOverviewStmt's CTA-click sum and analyticsFunnelStmt's engaged-session count — or, more robustly, give analytics_events a real boolean/column distinguishing "real interaction" from "operational/friction event" instead of relying on a naming-convention prefix (nothing stops a future real CTA id from starting with booking-).

See docs/future_additions.md ("Analytics Funnel Purity").

The Overview panel's `CTA clicks (7/30 days)` stat and the Funnel's `Clicked a CTA` stage (`AnalyticsOverview`/`AnalyticsFunnel` in `internal/storage/storage.go`) count every `cta_click` row regardless of name — including booking-flow friction events (`booking-reschedule-link-expired`, `booking-availability-load-error`, `booking-slot-conflict`, `booking-submit-error`) fired by `trackBookingEdge` in `booking-form.js`. An expired link or a slot conflict isn't real engagement, so these numbers currently overstate it. The admin panel's `What "Clicked a CTA" is made of (30 days)` table (`admin-analytics.js`) already lists these distinctly from real `data-track-cta` clicks — the breakdown exists, the aggregate stats just don't use it. Fix, once the breakdown shows this is actually noisy in practice: exclude `booking-*`-prefixed event names from `analyticsOverviewStmt`'s CTA-click sum and `analyticsFunnelStmt`'s engaged-session count — or, more robustly, give `analytics_events` a real boolean/column distinguishing "real interaction" from "operational/friction event" instead of relying on a naming-convention prefix (nothing stops a future real CTA id from starting with `booking-`). See `docs/future_additions.md` ("Analytics Funnel Purity").
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jfraeys/coaching-site#4
No description provided.