# Logged-in member figures

**Summary:** Logged in members adds daily counts of users with recorded activity. The same person can count on several days, platforms or devices.

- Role: [Technical Support](https://www.subrite.no/technical-support)
- Source: https://www.subrite.no/technical-support/insights-logged-in-members
- Updated: 2026-09-28
- Markdown index: https://www.subrite.no/technical-support/llms.txt

The [administrator guide](https://www.subrite.no/administrators/insights-logged-in-members?md=true) explains the graphs and date controls.

<a id="card-counts-and-subscription-qualification"></a>
## Card counts and subscription qualification

Signal selects distinct non-null `user_id` values from any recorded event within the tenant and daily time window. Empty IDs are removed during aggregation. **All** counts these IDs; anonymous activity and explicit login-attempt totals are outside this measure. [Signal selection](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/signal-api/src/modules/analytics/analytics.service.ts#L181-L223).

**With subscription** maps numeric user IDs to tenant members in batches of 500. It counts distinct member IDs whose effective active owner or sharing subscription count exceeds zero. This uses subscription state when the summary runs, including active shared access, rather than state at the event time. [Daily card writer](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L1897-L1943).

The API adds saved daily counts over inclusive dates, excluding deleted summary rows. One user active on 3 days contributes 3 to **All**. To reconcile **With subscription**, inspect the user-to-member mapping and effective subscription status at processing time. [Card aggregation](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/repositories/logged-in-user-summary.repository.ts#L35-L54).

<a id="platform-and-device-classification"></a>
## Platform and device classification

Graphs select page views and custom podcast events. Signal groups each user's rows by URL, event type and event name, taking `MAX(user_agent)` per group. Mixed-device activity within that group can therefore retain only one user agent. [Graph event selection](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/signal-api/src/modules/analytics/analytics.service.ts#L226-L316).

Classification applies in this order:

1. Event names starting with `podcast_` become **Podcast**, even without a valid URL.
2. URL paths containing `/podkaster` or `/podcasts` become **Podcast**.
3. Hosts starting with `minside.` or paths containing `/account` become **Mypage**.
4. Remaining page views with valid URLs become **Website and app**.

Other events and invalid URLs are excluded, except the podcast events handled first. User agents matching `Mobile`, `Android`, `iPhone` or `iPad` become **Mobile**; all others, including missing values, become **Desktop**. For a misclassified count, compare the grouped URL, event name and retained user agent with these rules. [Classifier](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L2110-L2155).

The writer counts distinct user IDs separately for each day, platform and device. The browser sums these counts across dates. One desktop user visiting 2 platforms contributes 2 to the device column and 1 to that day's **All**. [Category writer](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L2032-L2062); [Graph aggregation](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/app/%28admin%29/admin/%28panel%29/analytics/statistics/logged-in-users/ContentTypeVisitsChart.tsx#L29-L79).

<a id="dates-stored-summaries-and-freshness"></a>
## Dates, stored summaries and freshness

UI presets use Oslo calendar dates: **Last 7 days** sends today minus 6 through today. **Last 30 days** uses minus 29. Explicit `fromDate` and `toDate` override presets when both are present. Bare API requests default to today minus 7 through today, an 8-date range. Reproduce discrepancies using the exact dates sent by the UI. [UI dates](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/app/%28admin%29/admin/%28panel%29/analytics/statistics/logged-in-users/LoggedInUsersWrapper.tsx#L13-L66); [API dates](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats.services.ts#L1656-L1697).

Both writers initially process today and the preceding 7 days. Later runs start after their last completed-day checkpoint and include today. Today remains open for recalculation; previously checkpointed days are not routinely revisited. Raw windows use Oslo day boundaries, while stored `dataDate` holds the Oslo calendar date. [Card processing](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L1852-L1898); [Checkpoints and graph processing](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L1950-L2030).

Raw pagination uses 1,000 users per page, capped at 100 pages for cards and 200 for graphs. Incomplete pagination throws before that day's summary is written. Check cursor errors and the relevant checkpoint when one report component stops advancing. [Card pagination](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L1974-L1988); [Graph pagination](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L2093-L2107); [Completion checks](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L2170-L2211).

Card processing writes explicit zero counts for an empty day. Graph processing only updates categories returned by its query. Source inspection suggests an existing category row can remain when recalculation returns no users for that category. Test this with controlled data before attributing stale counts to that behavior. [Empty card day](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L1900-L1910); [Graph upsert](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/repositories/content-type-visit-summary.repository.ts#L19-L32).

<a id="display-and-access-diagnostics"></a>
## Display and access diagnostics

- If cards and graphs differ, compare their event selections and daily category counts before comparing totals.
- If a device tooltip shows 100%, it is the sole series at that horizontal category. Platform **Details** percentages divide each visible device count by the visible total within that platform. [Tooltip denominator](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/ui/StatsView/index.tsx#L182-L246).
- **Total** adds both platform device series, including hidden ones. If switching from **Details** leaves it blank, restore both legend entries and retry. Shared visibility state persists across the switch; this behavior has not been replayed for this report. [Total calculation](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/ui/StatsView/index.tsx#L337-L375); [Visibility state](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/ui/StatsView/index.tsx#L450-L472).
- Zero cards or an empty graph can come from missing API response data. Check both responses and saved daily rows before concluding there was no activity. [Response defaults](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/app/%28admin%29/admin/%28panel%29/analytics/statistics/logged-in-users/LoggedInUsersWrapper.tsx#L64-L76).
- If the page opens but data access fails, inspect READ Dashboard authorization on both endpoints. The Insights menu also has its own feature and Analytics gates. [Endpoint permissions](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/controllers/stats.controller.ts#L540-L570).

<a id="verification-limits"></a>
## Verification limits

Source checked on 28 September 2026 at commit `6cd1850`; existing UI observations are from 27 September. Numeric reconciliation, mixed-device fixtures, recalculation behavior and ordinary-role access were not tested in this revision.

## Related pages

- [Logged-in member figures](https://www.subrite.no/administrators/insights-logged-in-members?md=true): Logged in members adds daily counts of users with recorded activity. The same person can count on several days, platforms or devices.
