You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Timer reach metric: attach audience_size to timer_started events #107
Measure timer reach — how many meeting participants the timer serves — instead of only counting operator starts. A class with 20 people where the teacher starts the timer 15 times currently looks identical to 15 solo web starts.
Proposed client change
In apps/zoom-app/src/components/LiveTab.jsx, attach the meeting headcount to the timer_started event:
Import the existing hook: import useZoomParticipants from '../hooks/useZoomParticipants';
Call it alongside the other hooks: const { participants: meetingParticipants, restricted: participantsRestricted } = useZoomParticipants();
Full diff is in ~/workspace/goals/hone-my-tech-products-and-services/files/timer-reach-audience-size.patch (Jarvis workspace).
Privacy
Count only — participant names never leave the device. The property is omitted (not zeroed) when:
the web version (no Zoom SDK), or
the participant list is withheld (non-host/co-host), where the list may contain only self.
Analytics treats missing as reach of 1 (the operator), which is a defensible lower bound.
Analytics side (already done)
Daily/weekly traffic report (traffic_report.py): new "Timer reach" line = sum of per-meeting max audience_size per day (grouped by zoom_meeting_id, falling back to distinct_id; 15 starts in one class count once). Shows n/a until the client ships.
Count at START, not at mount.useZoomParticipants() fetches the participant list once, when the component mounts, and never refreshes it. LiveTab mounts when the app opens, so a count taken from the hook misses everyone who joined later, and audience_size comes out too low. Instead, call getZoomParticipants() (apps/zoom-app/src/utils/zoomSdk.js) inside the idle callback that sends timer_started. Leave the property out when restricted is true or the list is empty. This also avoids a third mount-time fetch alongside SpeakerInput and StageSpeakerPicker.
The patch in the Jarvis workspace isn't in this repo. The change described in this issue, adjusted as above, is the spec.
AC-4, the PostHog "Timer reach (daily)" insight, can only be checked after a production release.
The non-host case needs a second Zoom account that isn't host or co-host, so it's a human step in the Zoom run.
Activity
ShuhaoZQGG commentedon Nov 11, 2026
Notes for the plan:
useZoomParticipants()fetches the participant list once, when the component mounts, and never refreshes it.LiveTabmounts when the app opens, so a count taken from the hook misses everyone who joined later, andaudience_sizecomes out too low. Instead, callgetZoomParticipants()(apps/zoom-app/src/utils/zoomSdk.js) inside the idle callback that sendstimer_started. Leave the property out whenrestrictedis true or the list is empty. This also avoids a third mount-time fetch alongsideSpeakerInputandStageSpeakerPicker.test(#107): oracle for AC-1…AC-5
feat(analytics): attach audience_size to timer_started in the Zoom app
test(zoom-client): review timer-core and timer-sounds against #107's …
fix(#107): keep timer-core status draft until it actually runs
test(zoom-client): verify timer-core on 2e965b6 (#107)
Merge pull request #138 from SimplicityApp/factory/107-timer-reach-au…