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 theplanning_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
- ❌
WHERE tenant_organization_id = 1
(unnecessary) - ❌
WHERE system_status = 'active'
(unnecessary)
Core Tables Overview
Primary Entity Tables
groups_groups
- Small groups, classes, and teamsgroups_people
- People who can join groupsgroups_memberships
- Connections between people and groupsgroups_events
- Group meetings and gatheringsgroups_attendances
- Event attendance recordsgroups_group_types
- Categories for organizing groupsgroups_locations
- Physical meeting placesgroups_enrollments
- Sign-up and registration management
Supporting Entity Tables
groups_campuses
- Campus locationsgroups_campus_groups
- Links between campuses and groupsgroups_event_notes
- Notes for eventsgroups_group_applications
- Applications to join groupsgroups_organizations
- Organization settingsgroups_owners
- Group ownership informationgroups_resources
- Group resourcesgroups_tags
- Labels for group characteristicsgroups_tag_groups
- Tag groupings
Relationship Tables
groups_group_relationships
- Links groups to other entitiesgroups_membership_relationships
- Links memberships to related entitiesgroups_event_relationships
- Links events to related entitiesgroups_attendance_relationships
- Links attendances to related entitiesgroups_enrollment_relationships
- Links enrollments to related entitiesgroups_group_application_relationships
- Links applications to related entities
Table Definitions
groups_groups
Small groups, classes, teams, and other group entities.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
group_id | VARCHAR(64) | Planning Center group ID |
archived_at | TIMESTAMP | When group was archived (NULL = active) |
contact_email | VARCHAR(255) | Group contact email |
created_at | TIMESTAMP | When group was created |
description | TEXT | Group description |
events_visibility | VARCHAR(255) | Event visibility setting |
header_image | JSONB | Group header image data |
leaders_can_search_people_database | BOOLEAN | Leader permission setting |
location_type_preference | VARCHAR(255) | ‘physical’, ‘virtual’, or ‘hybrid’ |
memberships_count | INTEGER | Current member count |
name | VARCHAR(255) | Group name |
public_church_center_web_url | VARCHAR(2048) | Public group URL |
schedule | VARCHAR(255) | Meeting schedule description |
virtual_location_url | VARCHAR(2048) | Online meeting URL |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status: ‘active’, ‘transferring’, ‘stale’ |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_people
People who can participate in groups.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
person_id | VARCHAR(64) | Planning Center person ID |
permissions | VARCHAR(50) | Person’s permission level |
created_at | TIMESTAMP | When person was added to Groups |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_memberships
Connections between people and groups with roles.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
membership_id | VARCHAR(64) | Planning Center membership ID |
joined_at | TIMESTAMP | When person joined group |
role | VARCHAR(255) | ‘member’ or ‘leader’ |
group_id | VARCHAR(64) | Associated group ID (direct reference) |
person_id | VARCHAR(64) | Associated person ID (direct reference) |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_events
Group meetings, gatherings, and activities.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
event_id | VARCHAR(64) | Planning Center event ID |
attendance_requests_enabled | BOOLEAN | Requesting attendance responses |
automated_reminder_enabled | BOOLEAN | Auto-reminders enabled |
canceled | BOOLEAN | Cancellation status |
canceled_at | TIMESTAMP | When event was canceled |
description | TEXT | Event description |
ends_at | TIMESTAMP | Event end time |
location_type_preference | VARCHAR(255) | ‘physical’ or ‘virtual’ |
multi_day | BOOLEAN | Spans multiple days |
name | VARCHAR(255) | Event name |
reminders_sent | BOOLEAN | Reminders have been sent |
reminders_sent_at | TIMESTAMP | When reminders were sent |
repeating | BOOLEAN | Recurring event |
starts_at | TIMESTAMP | Event start time |
virtual_location_url | VARCHAR(2048) | Online meeting URL |
visitors_count | INTEGER | Number of visitors |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_attendances
Records of who attended which events.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
attendance_id | VARCHAR(64) | Planning Center attendance ID |
attended | BOOLEAN | Whether person attended |
role | VARCHAR(255) | Person’s role at event |
person_id | VARCHAR(64) | Associated person ID (direct reference) |
event_id | VARCHAR(64) | Associated event ID (direct reference) |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_group_types
Categories for organizing and configuring groups.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
group_type_id | VARCHAR(64) | Planning Center group type ID |
church_center_visible | BOOLEAN | Visible in Church Center |
church_center_map_visible | BOOLEAN | Show on Church Center map |
color | VARCHAR(32) | Display color |
default_group_settings | JSONB | Default settings for groups of this type |
description | TEXT | Type description |
name | TEXT | Type name |
position | INTEGER | Sort order |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_locations
Physical locations where groups meet.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
location_id | VARCHAR(64) | Planning Center location ID |
display_preference | VARCHAR(100) | How to display location |
full_formatted_address | VARCHAR(500) | Complete address |
latitude | DOUBLE PRECISION | GPS latitude |
longitude | DOUBLE PRECISION | GPS longitude |
name | VARCHAR(255) | Location name |
radius | INTEGER | Coverage radius |
strategy | VARCHAR(100) | Location strategy |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_enrollments
Group enrollment and registration management.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
enrollment_id | VARCHAR(64) | Planning Center enrollment ID |
auto_closed | BOOLEAN | Automatically closed |
auto_closed_reason | TEXT | Why auto-closed |
date_limit | TEXT | Enrollment deadline |
date_limit_reached | BOOLEAN | Past deadline |
member_limit | INTEGER | Maximum members allowed |
member_limit_reached | BOOLEAN | At capacity |
status | TEXT | Enrollment status |
strategy | TEXT | Enrollment strategy |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_tags
Labels for categorizing and filtering groups.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
tag_id | VARCHAR(64) | Planning Center tag ID |
name | VARCHAR(255) | Tag name |
position | INTEGER | Sort order |
tag_group_id | VARCHAR(64) | Parent tag group (direct reference) |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_tag_groups
Groupings for organizing tags.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
tag_group_id | VARCHAR(64) | Planning Center tag group ID |
display_publicly | BOOLEAN | Show publicly |
facet | VARCHAR(255) | Facet type |
multiple_options_enabled | BOOLEAN | Allow multiple selections |
name | VARCHAR(255) | Group name |
position | INTEGER | Sort order |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_campuses
Campus locations for multi-site organizations.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
campus_id | VARCHAR(64) | Planning Center campus ID |
name | VARCHAR(255) | Campus name |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_group_applications
Applications to join groups requiring approval.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
group_application_id | VARCHAR(64) | Planning Center application ID |
applied_at | TIMESTAMP | When application was submitted |
message | TEXT | Application message |
status | VARCHAR(100) | Application status |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_event_notes
Notes and annotations for events.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
event_note_id | VARCHAR(64) | Planning Center event note ID |
event_id | VARCHAR(64) | Associated event ID (direct reference) |
body | TEXT | Note content |
annotatable_id | VARCHAR(64) | ID of annotated entity |
owner_id | VARCHAR(64) | Note owner ID |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_organizations
Organization configuration and settings.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
organization_id | VARCHAR(64) | Planning Center organization ID |
name | VARCHAR(255) | Organization name |
time_zone | VARCHAR(255) | Organization time zone |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_owners
Group ownership and management information.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
owner_id | VARCHAR(64) | Planning Center owner ID |
avatar_url | VARCHAR(2048) | Owner avatar image URL |
first_name | VARCHAR(255) | Owner first name |
last_name | VARCHAR(255) | Owner last name |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_resources
Resources associated with group types.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
resource_id | VARCHAR(64) | Planning Center resource ID |
group_type_id | VARCHAR(64) | Associated group type ID |
description | VARCHAR(255) | Resource description |
last_updated | TIMESTAMP | When resource was last updated |
name | VARCHAR(255) | Resource name |
type | VARCHAR(50) | Resource type |
visibility | VARCHAR(50) | Resource visibility |
created_by_id | VARCHAR(64) | Creator ID |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
groups_campus_groups
Links between campuses and groups.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
group_id | VARCHAR(64) | Associated group ID (direct reference) |
campus_id | VARCHAR(64) | Associated campus ID (direct reference) |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Relationship Tables
groups_group_relationships
Links groups to related entities like types, locations, and tags.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
group_id | VARCHAR(64) | Group ID |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created |
system_updated_at | TIMESTAMP | Last update |
GroupType
- Links to groups_group_typesLocation
- Links to groups_locationsTag
- Links to groups_tagsEnrollment
- Links to groups_enrollmentsCampus
- Links to groups_campuses
groups_membership_relationships
Links memberships to additional related entities.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
membership_id | VARCHAR(64) | Membership ID |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created |
system_updated_at | TIMESTAMP | Last update |
groups_event_relationships
Links events to groups and locations.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
event_id | VARCHAR(64) | Event ID |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created |
system_updated_at | TIMESTAMP | Last update |
Group
- Links to groups_groupsLocation
- Links to groups_locations
groups_attendance_relationships
Links attendance records to events and people.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
attendance_id | VARCHAR(64) | Attendance ID |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created |
system_updated_at | TIMESTAMP | Last update |
Event
- Links to groups_eventsPerson
- Links to groups_people
groups_enrollment_relationships
Links enrollments to related entities.Column | Type | Description |
---|---|---|
id | UUID | Internal unique identifier |
enrollment_id | VARCHAR(64) | Enrollment ID |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created |
system_updated_at | TIMESTAMP | Last update |
System Fields
All tables include these system fields for data management:tenant_organization_id
- Multi-tenant organization identifiersystem_status
- Data lifecycle status:transferring
- Being imported from Planning Centeractive
- Current active datastale
- Marked for removal
system_created_at
- When record was created in Parablesystem_updated_at
- When record was last updated in Parable
Common Query Patterns
Finding a Person’s Groups
Getting Group Members with Roles
Finding Events for a Group
Tracking Event Attendance
Groups by Type
Data Integrity Rules
- Schema Qualification: Always use
planning_center.
prefix for all table references - Row Level Security: RLS automatically handles multi-tenancy and status filtering - do not add manual filters
- Monetary Values: Group event fees or donations stored in cents should be divided by 100.0 for display
- Archived Groups: Use
archived_at IS NULL
orarchived_at
comparisons to control visibility instead of checkingsystem_status
- Direct ID Columns: Core tables such as
groups_groups
andgroups_memberships
expose direct IDs for performance-sensitive joins
Common Mistakes to Avoid
-
Missing Schema Prefix
- ❌
FROM groups_groups
- ✅
FROM planning_center.groups_groups
- ❌
-
Adding Redundant RLS Filters
- ❌
WHERE tenant_organization_id = 1 AND system_status = 'active'
- ✅ Trust RLS to handle this automatically
- ❌
-
Joining Without Schema
- ❌
JOIN groups_memberships m ON ...
- ✅
JOIN planning_center.groups_memberships m ON ...
- ❌
-
Skipping Currency Conversion
- ❌
SELECT suggested_donation_cents as suggested_donation
- ✅
SELECT suggested_donation_cents / 100.0 as suggested_donation
- ❌
Performance Considerations
-
Indexes: All tables have optimized indexes on:
- Primary keys and entity IDs
- Join columns and foreign keys
- Date columns for time-based queries
-
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
- Always use the
Data Types and Conventions
Location Preferences
physical
- In-person meetingsvirtual
- Online meetingshybrid
- Both in-person and online
Roles
member
- Regular group memberleader
- Group leader with additional permissions
Application Status
pending
- Awaiting reviewapproved
- Accepted into grouprejected
- Not accepted
Next Steps
- Return to Overview for high-level understanding
- Review Basic Queries for simple examples
- Check Advanced Queries for complex analysis
- See Reporting Examples for production-ready reports