planningcenter / planningcenter/developers
Groups: expose group membership change history (joins and leaves over time)
Nobody has claimed this yet.
- Dominant language
- No language data
- Stars
- 100
- Forks
- 12
- PR merge metrics
- No merged PRs in 30d
Description
Related Product
Groups
Is your feature request related to a problem? Please describe.
The Groups API can tell me who is in a group right now, but not how that group
changed over time. When someone leaves a group, the Membership record is
destroyed and the fact that they were ever there goes with it.
Checked against https://api.planningcenteronline.com/groups/v2/open_api/2023-07-10:
- The
Membershipschema carries exactly two attributes:joined_atandrole.
There is noleft_at,ended_at,removed_ator equivalent. - None of the 90 documented paths is a membership history, stats or turnover
endpoint. - The strings
left_at,ended_at,removedandturnoverdo not appear
anywhere in the spec.
I can confirm the record is genuinely gone rather than hidden: summing
memberships_count across groups matches the number of Membership rows I can
retrieve, so a departed member is not simply filtered out of my results.
What makes this one frustrating is that Planning Center already computes this
data and shows it to churches. The Groups Reports page
(groups.planningcenteronline.com/reports) renders a 90-day turnover health
stat and a Group Membership over time chart that rises and falls across the
year. Those figures are server-rendered into the page — there is no API behind
them I can reach.
Why it matters: someone leaving a group is one of the clearest pastoral signals a
church has, and there is a real difference between going quiet and telling us
they are leaving. Today the API can only support the first. A church can see
that attendance stopped; it cannot see that the person formally left, or when.
Describe the solution you'd like
A read-only endpoint exposing per-person group membership changes:
GET /groups/v2/groups/{group_id}/membership_changes
and/or an org-wide GET /groups/v2/membership_changes
Each record carrying:
person_idgroup_idaction—joinedorleftoccurred_atroleat the time of the change (member / leader), so leadership transitions
are visible too
With the usual JSON:API conventions: pagination, order, where[] filtering on
group and date range, and include=person. Readable under the existing Groups
scope.
Historical backfill would make this far more valuable than
subscribe-from-today. A church connecting an integration should be able to chart
the last year, not begin accumulating from scratch — particularly since the
Reports UI proves the history is already there.
Secondary ask, if per-person change records cannot be exposed: either
- a
left_at/ended_atattribute retained onMembershipfor ended
memberships, or - a per-group membership count history — date plus member count per period —
which is what the Group Membership over time chart is already built from.
Option 2 would at least make trend reporting possible, though it cannot support
a join/leave feed or any follow-up trigger.
Describe alternatives you've considered
-
Polling
/groups/v2/membershipsand diffing client-side. This is what I
do today. It works, but every integrator independently rebuilds the same
snapshot store, it only produces history from the day the church connects,
and it misses anything that happens between polls. -
Comparing
memberships_countto detect churn. Cheaper than a full walk,
but structurally blind to count-preserving churn: one person joins as another
leaves, the count is identical, and nothing appears to have changed. In an
active group that is a common shape, not an edge case. -
Webhook-driven diffing. Closer to real time, but it cannot backfill —
a church gets history only from the day the subscription starts, and anything
that happened before the integration existed is unrecoverable. -
Deriving departure from absence. Inferring that someone left because they
stopped appearing in attendance. This conflates the two cases the church most
needs to tell apart, and it produces false positives for anyone who is simply
travelling or unwell.
Additional context
This is the Groups counterpart to #1497, which asked the same thing for People
lists and was closed on 2026-09-15 as taken under consideration. #1234 received
the clarifying answer that the API only exposes non-deleted resources, which is
consistent with what I see here — this request is specifically that ended
memberships, or a record of their ending, become retrievable.
Happy to give more detail on the use case if it helps.
I have..
- Reviewed the documentation found at https://developer.planning.center/docs
- Searched for previous issues asking for this feature request
- Removed all private information from this issue (credentials, tokens, emails, phone numbers, etc.)
- Reviewed my issue for completeness
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the Groups API OpenAPI specification at the referenced 2023-07-10 URL and the existing membership paths, then compare the requested history with the Reports page behavior. Done means an agreed, documented way to retrieve historical joins and leaves or an explicitly chosen fallback, including pagination, filtering, roles, and backfill expectations.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- openapi
- Domain
- api, backend-api-design
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 32/100