Demographics β
Demographics is a read-only report that summarizes your active member roll across the dimensions you typically care about β age distribution, gender split, member type breakdown, geographic spread. No template setup, no submissions. The data refreshes whenever you load the page.

What you see β
The page has four main panels:
1. Age distribution β
A bar chart of active members grouped into age bands:
- Under 12 (children)
- 13β17 (youth)
- 18β24 (young adults)
- 25β34
- 35β44
- 45β54
- 55β64
- 65+
- Unknown (members with no DOB on file)
The Unknown band is worth tracking β if it's a big slice, your data is missing values that your real demographics would otherwise reveal.
2. Gender split β
A donut chart showing male / female / other / unknown.
3. Member type β
A breakdown by the member type column on each profile β Visitor, Member, Leader, etc. Whatever values your member-types table contains will appear here.
4. Geographic distribution β
A bar chart by country (or by state/city, depending on your filter scope) showing where your members live. Pairs nicely with the map module if you want spatial views.
Filters β
The top filter bar narrows every panel at once:
- Date range β by member registration date.
- Org unit β limit to a branch / center / cell.
- Member type β focus on visitors only, or leaders only.
- Status β active, lost, or both.
Filter state lives in the URL β share a link to a specific view by copy-pasting.
What's the data source? β
Demographics reads directly from the members table. There's no separate stored snapshot β each panel queries live.
| Panel | Source field |
|---|---|
| Age | date_of_birth |
| Gender | gender |
| Member type | member_type_id joined to member_types |
| Geographic | country / state_id / city |
This means data quality matters. The more profile fields you keep up to date, the more useful demographics becomes.
Exporting β
Each panel has an export action β CSV with the raw counts. The chart itself can be exported as PNG for slides.
Cross-tab views β
Beyond the standalone panels, the cross-tab tab lets you slice one dimension by another. Common cross-tabs:
- Age Γ gender β how does our 25-34 cohort split by gender?
- Member type Γ org unit β which branch has the most leaders?
- Status Γ member type β of our lost members, how many were visitors who never returned vs former active members?
Trends over time β
The trends tab shows how each demographic has changed over the last 12 months. Useful for spotting drift β we're skewing younger / older / more international.
Permissions β
| Action | Admin | Shepherd | Member |
|---|---|---|---|
| View demographics | yes | scoped to unit | no |
| Export | yes | scoped | no |
Shepherds see only the members in their assigned units, so a shepherd-level demographics view is necessarily smaller than the org-wide view.
Limitations and known gaps β
- We don't yet have race or ethnicity fields β by default these vary too much by jurisdiction to ship out of the box. Add a custom field if you need it.
- Age uses date-of-birth at the time you view, not at the time of registration. Reporting "demographics last year" shows ages as they are today, not as they were a year ago. We're considering an as-of timestamp option.
- Geographic data is country/state/city only β no neighborhood-level breakdown unless you add a custom field.
Common questions β
Why is "Unknown" age so big? Most likely your bulk import didn't include DOB. Backfill from your old system or ask members to update their profiles.
Can I see demographics for a single Sunday's attendees rather than the full roll? That cross-cut (member demographics Γ attendance) is on the roadmap. For now, the demographics page is members-based.
Is the data real-time? Yes β each load runs fresh queries against the database.
Next steps β
- Member profile β the source of demographic data.
- Custom fields β extend demographics with church-specific dimensions.
- Reports overview β manual-submission reports, complementary to this auto-generated view.