# Member figures

**Summary:** Member figures count owners, accepted places for shared access and valid pending invitations on active subscriptions. People can count more than once.

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

<a id="three-counting-queries"></a>
## Three counting queries

`processAndSaveMemberSummary` saves the following values in `MemberSummary`:

| Report category | Saved field and predicate |
| --- | --- |
| **Main members** | `groupOwners`: count subscription records with status Active. No distinct payer condition. |
| **Invited members** | `groupMembers`: count accepted product-seat records joined to Active subscriptions. |
| **Inviteted members (pending)** | `pendingGroupMembers`: count unaccepted seats with `expiresAt > NOW()` on Active subscriptions. |

Accepted seats have no invitation-expiry condition. Neither accepted nor pending seats require recent login activity.

Each query has a tenant condition. For seat counts, it uses the tenant of the subscription’s owner.

A person can own several subscriptions or hold several product seats. Each qualifying record counts, even when the member ID repeats.

For example, one subscription with four accepted seats and two pending invitations contributes seven to Total. Those seven records can include the same person more than once.

The writer also calculates registered and distinct-member figures, but this report selects the three ownership/seat categories above.

Source: [member-summary writer](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/services/stats-store.service.ts#L231).

<a id="paid-classification"></a>
## Paid classification

Paid uses the corresponding `payingGroupOwners`, `payingGroupMembers` and `payingPendingGroupMembers` fields. These add `MemberPackage.currentPrice > 0` to the same predicates.

The test uses the subscription’s current price. It does not query successful payments, the product’s recurring price or the plan’s base price.

A free introductory period on a positive-price plan can therefore differ between this report and Subscription figures. Compare current subscription price with saved base plan price before treating the difference as an error.

Source: [selected fields](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/repositories/member-summary.repository.ts#L125).

<a id="snapshot-and-display-calculation"></a>
## Snapshot and display calculation

`getHistoricalMemberData` selects the tenant’s latest non-deleted summary timestamp in each reporting period, bounded by the requested range. It returns one value for each of the three categories; daily snapshots are not added together.

Weeks start Monday. Daily windows end yesterday, while longer periods can include the unfinished current period marked \*. All time is capped at 550 periods and starts no earlier than the available history.

The page defaults to All, Weekly and the last 12 weeks. Changing period resets the range.

Details draws three stacked categories. Total adds all returned categories even if a Details category is hidden. Hover totals and percentages use only visible categories.

The shared chart retains hidden-series state by position. Hiding the first category can hide Total after switching views; restore all categories first.

Sources: [historical selection](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/api-server/src/modules/stats/repositories/member-summary.repository.ts#L35), [timeline boundaries](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/app/%28admin%29/admin/%28panel%29/analytics/statistics/utils/timeline/resolveTimelineWindow.ts#L53), and [chart totals](https://github.com/subrite/subrite-crm/blob/6cd1850569be3b1702ca736a19320c7626efb7bc/frontend/src/ui/StatsView/index.tsx#L450).

<a id="diagnose-count-differences"></a>
## Diagnose count differences

| Symptom | Check and interpretation |
| --- | --- |
| Total exceeds unique people | Compare subscription and seat IDs with distinct member IDs; duplicates across records are expected. |
| An accepted recipient remains counted | Check Active subscription status. Login recency and invitation expiry are not accepted-seat filters. |
| Pending count fell | Check acceptance, invitation expiry and subscription status at the snapshot time. |
| Paid differs from Subscription figures | Compare current subscription price with base plan price; the filters use different amounts. |
| Empty chart | Check saved summaries and the response; zeros, missing data and request failure can all render empty. |

The sidebar needs analytics access and the insights feature. The historical-members endpoint separately requires Dashboard READ.

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

Source checked on 28 September 2026 at `6cd1850569be3b1702ca736a19320c7626efb7bc`. Prior owner-session checks confirmed labels, including the pending-label typo, and switching to Monthly.

Ordinary-role access, legend behavior, snapshot freshness and production totals were not tested. Use [Member figures in Administrators](https://www.subrite.no/administrators/insights-members?md=true) for graph interpretation and controls.

## Related pages

- [Member figures](https://www.subrite.no/administrators/insights-members?md=true): Member figures count owners, accepted places for shared access and valid pending invitations on active subscriptions. People can count more than once.
