The measurement layer behind milestones and account health. It sends a page view whenever the active screen changes and a heartbeat every 30 seconds while the person is genuinely working. One session per browser tab, rotated after 30 minutes idle so a lunch break does not read as a long session. It records the record in focus by name — a customer, job or estimate — so 'which client did they spend the most time on' can be answered.
Also called: active time tracking · who's actually using it · session tracking · heartbeat
- 1Mounted once in the app shell; it renders nothing and never blocks the UI.
- 2A heartbeat fires only when the tab is visible AND there has been mouse, key, scroll or touch activity in the last two minutes.
- 3Events batch and flush every 30 seconds, and on tab hide or page unload via a send-beacon so the final slice is not lost.
- 4The first view of a session flushes immediately so 'signed in just now' is live.
- 5Device class is derived from viewport width: phone, tablet or desktop.
- 6Failures are dropped silently.
. The component header defines active time against the obvious cheat: a heartbeat counts only while the tab is visible and the person has moved — 'that's "active time", not "left a tab open".' The 30-minute session rotation exists 'so a lunch break doesn't read as a 90-minute session'. Focus labels are names only, 'never ids'.
- Login counts said nothing about real engagement.
- Idle tabs inflated every previous notion of time in product.
- Nobody could attribute time to a specific customer or job.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →