User Journey Tracking
Instrument flows to answer: "Why did users fail to complete their intended task?"
Core Principle
Every event should include intent context:
| Field | Example | Why |
|-------|---------|-----|
| job_name | "checkout" | Which user goal |
| job_step | "payment" | Where in the journey |
| job_progress | "3/4 steps" | How far they got |
Friction Signals
Detect when users are struggling:
| Signal | Detection | Indicates | |--------|-----------|-----------| | Rage clicks | 3+ clicks on same element within 1s | UI unresponsive | | Retry exhaustion | 3+ retries of same action | Persistent failure | | Quick abandonment | Exit within 5s of error | Lost trust | | Form thrashing | Repeated focus/blur on same field | Confusion | | Back loops | 3+ backs without progress | Lost/confused |
Key Events
| Event | When |
|-------|------|
| journey.started | User begins multi-step flow |
| journey.step_complete | User advances to next step |
| journey.friction | Friction signal detected |
| journey.success | User completes goal |
| journey.abandoned | User exits without completing |
Anti-Patterns
- Tracking steps without job context (can't correlate)
- Missing friction signals (only see drop-off, not why)
- Not tracking "success with friction" (silent failures)
- High-cardinality step names (use patterns, not IDs)
Implementation
Use Read tool to load references/user-focused-observability.md for detailed patterns.
Related
skills/instrumentation-planning- JTBD frameworkskills/error-tracking- Enriching errors with journey contextreferences/jtbd.md- Jobs-to-be-Done methodology