Planning Center Groups Data Model

This document provides complete documentation of the Planning Center Groups data model in Parable, including all tables, fields, and relationships.

Overview

The Groups module contains 18 entity tables and 6 relationship tables supporting small groups, classes, teams, group events, attendance tracking, and enrollment management.

Query Requirements

Schema Prefix

IMPORTANT: All tables in the Planning Center Groups module are in the planning_center schema. You MUST prefix all table names with planning_center. in your queries. ✅ CORRECT: SELECT * FROM planning_center.groups_groups ❌ INCORRECT: SELECT * FROM groups_groups

Row Level Security (RLS)

This database uses Row Level Security (RLS) to automatically filter data based on:
  • tenant_organization_id: You only see data for your current organization
  • system_status: You only see ‘active’ records by default
DO NOT add these filters to your WHERE clause - they are applied automatically:
  • WHERE tenant_organization_id = 1 (unnecessary)
  • WHERE system_status = 'active' (unnecessary)
The RLS policies ensure you only access data you’re authorized to see, making these filters redundant and potentially causing performance issues.

Core Tables Overview

Primary Entity Tables

  • groups_groups - Small groups, classes, and teams
  • groups_people - People who can join groups
  • groups_memberships - Connections between people and groups
  • groups_events - Group meetings and gatherings
  • groups_attendances - Event attendance records
  • groups_group_types - Categories for organizing groups
  • groups_locations - Physical meeting places
  • groups_enrollments - Sign-up and registration management

Supporting Entity Tables

  • groups_campuses - Campus locations
  • groups_campus_groups - Links between campuses and groups
  • groups_event_notes - Notes for events
  • groups_group_applications - Applications to join groups
  • groups_organizations - Organization settings
  • groups_owners - Group ownership information
  • groups_resources - Group resources
  • groups_tags - Labels for group characteristics
  • groups_tag_groups - Tag groupings

Relationship Tables

  • groups_group_relationships - Links groups to other entities
  • groups_membership_relationships - Links memberships to related entities
  • groups_event_relationships - Links events to related entities
  • groups_attendance_relationships - Links attendances to related entities
  • groups_enrollment_relationships - Links enrollments to related entities
  • groups_group_application_relationships - Links applications to related entities

Table Definitions

groups_groups

Small groups, classes, teams, and other group entities.
ColumnTypeDescription
idUUIDInternal unique identifier
group_idVARCHAR(64)Planning Center group ID
archived_atTIMESTAMPWhen group was archived (NULL = active)
contact_emailVARCHAR(255)Group contact email
created_atTIMESTAMPWhen group was created
descriptionTEXTGroup description
events_visibilityVARCHAR(255)Event visibility setting
header_imageJSONBGroup header image data
leaders_can_search_people_databaseBOOLEANLeader permission setting
location_type_preferenceVARCHAR(255)‘physical’, ‘virtual’, or ‘hybrid’
memberships_countINTEGERCurrent member count
nameVARCHAR(255)Group name
public_church_center_web_urlVARCHAR(2048)Public group URL
scheduleVARCHAR(255)Meeting schedule description
virtual_location_urlVARCHAR(2048)Online meeting URL
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status: ‘active’, ‘transferring’, ‘stale’
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_people

People who can participate in groups.
ColumnTypeDescription
idUUIDInternal unique identifier
person_idVARCHAR(64)Planning Center person ID
permissionsVARCHAR(50)Person’s permission level
created_atTIMESTAMPWhen person was added to Groups
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_memberships

Connections between people and groups with roles.
ColumnTypeDescription
idUUIDInternal unique identifier
membership_idVARCHAR(64)Planning Center membership ID
joined_atTIMESTAMPWhen person joined group
roleVARCHAR(255)‘member’ or ‘leader’
group_idVARCHAR(64)Associated group ID (direct reference)
person_idVARCHAR(64)Associated person ID (direct reference)
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable
Note: This table uses direct ID columns for performance optimization.

groups_events

Group meetings, gatherings, and activities.
ColumnTypeDescription
idUUIDInternal unique identifier
event_idVARCHAR(64)Planning Center event ID
attendance_requests_enabledBOOLEANRequesting attendance responses
automated_reminder_enabledBOOLEANAuto-reminders enabled
canceledBOOLEANCancellation status
canceled_atTIMESTAMPWhen event was canceled
descriptionTEXTEvent description
ends_atTIMESTAMPEvent end time
location_type_preferenceVARCHAR(255)‘physical’ or ‘virtual’
multi_dayBOOLEANSpans multiple days
nameVARCHAR(255)Event name
reminders_sentBOOLEANReminders have been sent
reminders_sent_atTIMESTAMPWhen reminders were sent
repeatingBOOLEANRecurring event
starts_atTIMESTAMPEvent start time
virtual_location_urlVARCHAR(2048)Online meeting URL
visitors_countINTEGERNumber of visitors
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_attendances

Records of who attended which events.
ColumnTypeDescription
idUUIDInternal unique identifier
attendance_idVARCHAR(64)Planning Center attendance ID
attendedBOOLEANWhether person attended
roleVARCHAR(255)Person’s role at event
person_idVARCHAR(64)Associated person ID (direct reference)
event_idVARCHAR(64)Associated event ID (direct reference)
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_group_types

Categories for organizing and configuring groups.
ColumnTypeDescription
idUUIDInternal unique identifier
group_type_idVARCHAR(64)Planning Center group type ID
church_center_visibleBOOLEANVisible in Church Center
church_center_map_visibleBOOLEANShow on Church Center map
colorVARCHAR(32)Display color
default_group_settingsJSONBDefault settings for groups of this type
descriptionTEXTType description
nameTEXTType name
positionINTEGERSort order
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_locations

Physical locations where groups meet.
ColumnTypeDescription
idUUIDInternal unique identifier
location_idVARCHAR(64)Planning Center location ID
display_preferenceVARCHAR(100)How to display location
full_formatted_addressVARCHAR(500)Complete address
latitudeDOUBLE PRECISIONGPS latitude
longitudeDOUBLE PRECISIONGPS longitude
nameVARCHAR(255)Location name
radiusINTEGERCoverage radius
strategyVARCHAR(100)Location strategy
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_enrollments

Group enrollment and registration management.
ColumnTypeDescription
idUUIDInternal unique identifier
enrollment_idVARCHAR(64)Planning Center enrollment ID
auto_closedBOOLEANAutomatically closed
auto_closed_reasonTEXTWhy auto-closed
date_limitTEXTEnrollment deadline
date_limit_reachedBOOLEANPast deadline
member_limitINTEGERMaximum members allowed
member_limit_reachedBOOLEANAt capacity
statusTEXTEnrollment status
strategyTEXTEnrollment strategy
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_tags

Labels for categorizing and filtering groups.
ColumnTypeDescription
idUUIDInternal unique identifier
tag_idVARCHAR(64)Planning Center tag ID
nameVARCHAR(255)Tag name
positionINTEGERSort order
tag_group_idVARCHAR(64)Parent tag group (direct reference)
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_tag_groups

Groupings for organizing tags.
ColumnTypeDescription
idUUIDInternal unique identifier
tag_group_idVARCHAR(64)Planning Center tag group ID
display_publiclyBOOLEANShow publicly
facetVARCHAR(255)Facet type
multiple_options_enabledBOOLEANAllow multiple selections
nameVARCHAR(255)Group name
positionINTEGERSort order
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_campuses

Campus locations for multi-site organizations.
ColumnTypeDescription
idUUIDInternal unique identifier
campus_idVARCHAR(64)Planning Center campus ID
nameVARCHAR(255)Campus name
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_group_applications

Applications to join groups requiring approval.
ColumnTypeDescription
idUUIDInternal unique identifier
group_application_idVARCHAR(64)Planning Center application ID
applied_atTIMESTAMPWhen application was submitted
messageTEXTApplication message
statusVARCHAR(100)Application status
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_event_notes

Notes and annotations for events.
ColumnTypeDescription
idUUIDInternal unique identifier
event_note_idVARCHAR(64)Planning Center event note ID
event_idVARCHAR(64)Associated event ID (direct reference)
bodyTEXTNote content
annotatable_idVARCHAR(64)ID of annotated entity
owner_idVARCHAR(64)Note owner ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_organizations

Organization configuration and settings.
ColumnTypeDescription
idUUIDInternal unique identifier
organization_idVARCHAR(64)Planning Center organization ID
nameVARCHAR(255)Organization name
time_zoneVARCHAR(255)Organization time zone
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_owners

Group ownership and management information.
ColumnTypeDescription
idUUIDInternal unique identifier
owner_idVARCHAR(64)Planning Center owner ID
avatar_urlVARCHAR(2048)Owner avatar image URL
first_nameVARCHAR(255)Owner first name
last_nameVARCHAR(255)Owner last name
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_resources

Resources associated with group types.
ColumnTypeDescription
idUUIDInternal unique identifier
resource_idVARCHAR(64)Planning Center resource ID
group_type_idVARCHAR(64)Associated group type ID
descriptionVARCHAR(255)Resource description
last_updatedTIMESTAMPWhen resource was last updated
nameVARCHAR(255)Resource name
typeVARCHAR(50)Resource type
visibilityVARCHAR(50)Resource visibility
created_by_idVARCHAR(64)Creator ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

groups_campus_groups

Links between campuses and groups.
ColumnTypeDescription
idUUIDInternal unique identifier
group_idVARCHAR(64)Associated group ID (direct reference)
campus_idVARCHAR(64)Associated campus ID (direct reference)
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

Relationship Tables

groups_group_relationships

Links groups to related entities like types, locations, and tags.
ColumnTypeDescription
idUUIDInternal unique identifier
group_idVARCHAR(64)Group ID
relationship_typeVARCHAR(50)Type of relationship
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update
Common relationship types:
  • GroupType - Links to groups_group_types
  • Location - Links to groups_locations
  • Tag - Links to groups_tags
  • Enrollment - Links to groups_enrollments
  • Campus - Links to groups_campuses

groups_membership_relationships

Links memberships to additional related entities.
ColumnTypeDescription
idUUIDInternal unique identifier
membership_idVARCHAR(64)Membership ID
relationship_typeVARCHAR(50)Type of relationship
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update

groups_event_relationships

Links events to groups and locations.
ColumnTypeDescription
idUUIDInternal unique identifier
event_idVARCHAR(64)Event ID
relationship_typeVARCHAR(50)Type of relationship
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update
Common relationship types:
  • Group - Links to groups_groups
  • Location - Links to groups_locations

groups_attendance_relationships

Links attendance records to events and people.
ColumnTypeDescription
idUUIDInternal unique identifier
attendance_idVARCHAR(64)Attendance ID
relationship_typeVARCHAR(50)Type of relationship
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update
Common relationship types:
  • Event - Links to groups_events
  • Person - Links to groups_people

groups_enrollment_relationships

Links enrollments to related entities.
ColumnTypeDescription
idUUIDInternal unique identifier
enrollment_idVARCHAR(64)Enrollment ID
relationship_typeVARCHAR(50)Type of relationship
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update

System Fields

All tables include these system fields for data management:
  • tenant_organization_id - Multi-tenant organization identifier
  • system_status - Data lifecycle status:
    • transferring - Being imported from Planning Center
    • active - Current active data
    • stale - Marked for removal
  • system_created_at - When record was created in Parable
  • system_updated_at - When record was last updated in Parable

Common Query Patterns

Finding a Person’s Groups

SELECT
    g.name as group_name,
    g.description,
    m.role,
    m.joined_at
FROM planning_center.groups_memberships m
JOIN planning_center.groups_groups g
    ON m.group_id = g.group_id
WHERE m.person_id = 'PERSON_ID'
    AND g.archived_at IS NULL
ORDER BY m.joined_at DESC;

Getting Group Members with Roles

SELECT
    g.name as group_name,
    p.first_name,
    p.last_name,
    m.role,
    m.joined_at
FROM planning_center.groups_groups g
JOIN planning_center.groups_memberships m
    ON g.group_id = m.group_id
JOIN planning_center.groups_people p
    ON m.person_id = p.person_id
WHERE g.group_id = 'GROUP_ID'
ORDER BY m.role DESC, m.joined_at;

Finding Events for a Group

SELECT
    e.name as event_name,
    e.starts_at,
    e.ends_at,
    e.location_type_preference,
    e.canceled
FROM planning_center.groups_events e
JOIN planning_center.groups_event_relationships er
    ON e.event_id = er.event_id
    AND er.relationship_type = 'Group'
WHERE er.relationship_id = 'GROUP_ID'
    AND e.starts_at >= CURRENT_DATE
ORDER BY e.starts_at;

Tracking Event Attendance

SELECT
    e.name as event_name,
    e.starts_at,
    COUNT(CASE WHEN a.attended = true THEN 1 END) as attended_count,
    COUNT(DISTINCT ar.relationship_id) as total_invited
FROM planning_center.groups_events e
LEFT JOIN planning_center.groups_attendance_relationships ar
    ON e.event_id = ar.relationship_id
    AND ar.relationship_type = 'Event'
LEFT JOIN planning_center.groups_attendances a
    ON ar.attendance_id = a.attendance_id
GROUP BY e.event_id, e.name, e.starts_at
ORDER BY e.starts_at DESC;

Groups by Type

SELECT
    gt.name as group_type,
    COUNT(DISTINCT g.group_id) as group_count,
    SUM(g.memberships_count) as total_members
FROM planning_center.groups_group_types gt
LEFT JOIN planning_center.groups_group_relationships gr
    ON gt.group_type_id = gr.relationship_id
    AND gr.relationship_type = 'GroupType'
LEFT JOIN planning_center.groups_groups g
    ON gr.group_id = g.group_id
    AND g.archived_at IS NULL
GROUP BY gt.group_type_id, gt.name
ORDER BY gt.position;

Data Integrity Rules

  1. Schema Qualification: Always use planning_center. prefix for all table references
  2. Row Level Security: RLS automatically handles multi-tenancy and status filtering - do not add manual filters
  3. Monetary Values: Group event fees or donations stored in cents should be divided by 100.0 for display
  4. Archived Groups: Use archived_at IS NULL or archived_at comparisons to control visibility instead of checking system_status
  5. Direct ID Columns: Core tables such as groups_groups and groups_memberships expose direct IDs for performance-sensitive joins

Common Mistakes to Avoid

  1. Missing Schema Prefix
    • FROM groups_groups
    • FROM planning_center.groups_groups
  2. Adding Redundant RLS Filters
    • WHERE tenant_organization_id = 1 AND system_status = 'active'
    • ✅ Trust RLS to handle this automatically
  3. Joining Without Schema
    • JOIN groups_memberships m ON ...
    • JOIN planning_center.groups_memberships m ON ...
  4. Skipping Currency Conversion
    • SELECT suggested_donation_cents as suggested_donation
    • SELECT suggested_donation_cents / 100.0 as suggested_donation

Performance Considerations

  1. Indexes: All tables have optimized indexes on:
    • Primary keys and entity IDs
    • Join columns and foreign keys
    • Date columns for time-based queries
  2. Query Optimization:
    • Always use the planning_center. schema prefix
    • RLS handles tenant and status filtering automatically
    • Filter archived groups or attendance flags when relevant
    • Consider CTEs for complex multi-join queries
    • Use direct ID columns when available instead of relationship tables

Data Types and Conventions

Location Preferences

  • physical - In-person meetings
  • virtual - Online meetings
  • hybrid - Both in-person and online

Roles

  • member - Regular group member
  • leader - Group leader with additional permissions

Application Status

  • pending - Awaiting review
  • approved - Accepted into group
  • rejected - Not accepted

Next Steps