Skip to main content

Cadence Analytics — how this works

In the app: /cadence/analytics

How it works

Every step actually sent by the cadence walker (an OutboxMessage row keyed cadence:<enrollmentId>:<stepIndex>, status sent) becomes one fact. An open/reply/meeting/opt-out attributes to the LATEST step sent to that lead at or before it happened — last-touch, the same cumulative posture the walker's own step-condition signals already use, made step-precise. The whole-sequence row combines every step; the per-step table breaks the same facts down by stepIndex.

Data source

src/lib/cadence/cadenceAnalyticsRepo.ts (the OutboxMessage/Event/Reply/Appointment/Suppression loader) + src/lib/cadence/cadenceStepFactsJoin.ts (the pure attribution) + src/lib/cadence/cadenceAnalytics.ts (the rate/funnel aggregators).

Troubleshooting

A step you know was sent shows no outcomes? Opens/replies/meetings only count if their timestamp is AT OR AFTER that step's send — an outcome that lands before any step was sent (a data anomaly) is dropped, not mis-attributed to the wrong step. Opt-out is read from the ONE Suppression store, matched back to the lead by email/phone/LinkedIn URN (Suppression carries no leadId by design).

Who can see this: admin, setter