Planning Center People Data Model
Complete reference for the Planning Center People entity tables in Parable, covering households, field data, workflows, and their relationships.
This document covers every table in the Planning Center People data model in Parable: all 58 entity tables with full field definitions, and all 39 relationship tables, of which the most frequently queried are described individually below.
Overview
The People module is the most comprehensive in Planning Center, containing:
- 58 entity tables - All person, household, workflow, form, messaging, and configuration data
- 39 relationship tables - Linking entities together following Parable's relationship architecture
Visual Data Model
The diagram below shows the core entities and their relationships in the People module. Use it as a visual reference while exploring the detailed table definitions below.
Core Entity Relationships
Key Relationships Explained
Direct Parent-Child Relationships:
- Emails, phone numbers, and addresses belong directly to people (via
parent_id) - Household relationships link people to households via
people_households_relationships - Form submissions, workflow cards, notes link back to people
Generic Relationship Pattern:
- Campus associations stored in
people_people_relationshipstable - Relationship type identifies the connection (e.g.,
primary_campus)
Complex Subsystems:
- Workflows: Multi-step process tracking with cards, steps, and activities
- Forms: Dynamic form builder with fields, options, and submissions
- Lists: Smart segmentation with results linking people to lists
- Messaging: Bidirectional messaging between people
Query Requirements
Schema Prefix
IMPORTANT: All tables in the Planning Center People module are in the planning_center schema. You MUST prefix all table names with planning_center. in your queries.
✅ CORRECT: SELECT * FROM planning_center.people_people
❌ INCORRECT: SELECT * FROM people_people
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.
Complete Table Inventory
Entity Tables (58 total)
Core Person & Contact Tables (10)
people_people- Core person recordspeople_addresses- Physical addressespeople_emails- Email addressespeople_phone_numbers- Phone numberspeople_households- Family unitspeople_campuses- Church campus locationspeople_connected_persons- Connected person recordspeople_person_apps- App permissions per personpeople_social_profiles- Social media profilespeople_spam_email_addresses- Email filtering
Workflow System Tables (8)
people_workflows- Workflow definitionspeople_workflow_cards- Workflow instancespeople_workflow_steps- Workflow step definitionspeople_workflow_card_activities- Workflow activity logspeople_workflow_card_notes- Notes on workflow cardspeople_workflow_categories- Workflow categorizationpeople_workflow_shares- Workflow sharing settingspeople_workflow_step_assignee_summaries- Assignee summaries
Forms System Tables (6)
people_forms- Form definitionspeople_form_submissions- Submitted form datapeople_form_fields- Form field definitionspeople_form_field_options- Field option definitionspeople_form_submission_values- Submitted field valuespeople_form_categories- Form categorization
Custom Fields Tables (6)
people_field_definitions- Custom field schemaspeople_field_data- Custom field valuespeople_field_options- Custom field optionspeople_tabs- UI tab organizationpeople_conditions- Conditional logicpeople_rules- Business rules
Lists & Segmentation Tables (6)
people_lists- Smart lists and segmentspeople_list_categories- List categorizationpeople_list_results- People in listspeople_list_shares- List sharing permissionspeople_list_stars- Favorited listspeople_mailchimpsyncstatus- Email marketing sync
Notes & Documentation Tables (4)
people_notes- Pastoral care notespeople_note_categories- Note categorizationpeople_note_category_shares- Note sharingpeople_note_category_subscriptions- Note subscriptions
Messaging System Tables (4)
people_messages- Individual messagespeople_message_groups- Message groupingspeople_custom_senders- Custom email senderspeople_carriers- Phone carriers
Import & Data Management Tables (4)
people_people_imports- Import jobspeople_people_import_conflicts- Import conflictspeople_people_import_history- Import audit trailpeople_person_mergers- Person merge records
Administrative & Reference Tables (10)
people_apps- Application integrationspeople_background_checks- Background check recordspeople_inactive_reasons- Inactivation reasonspeople_marital_statuses- Marital status optionspeople_name_prefixes- Title prefixespeople_name_suffixes- Name suffixespeople_organizations- Organization settingspeople_reports- Report definitionspeople_school_options- School affiliationspeople_service_times- Service schedules
Relationship Tables (39 total)
people_background_checks_relationshipspeople_conditions_relationshipspeople_connected_people_relationshipspeople_custom_senders_relationshipspeople_emails_relationshipspeople_field_data_relationshipspeople_field_definitions_relationshipspeople_field_options_relationshipspeople_form_field_options_relationshipspeople_form_fields_relationshipspeople_form_submission_values_relationshipspeople_form_submissions_relationshipspeople_forms_relationshipspeople_households_relationshipspeople_list_categories_relationshipspeople_list_results_relationshipspeople_list_shares_relationshipspeople_lists_relationshipspeople_message_groups_relationshipspeople_messages_relationshipspeople_note_categories_relationshipspeople_note_category_shares_relationshipspeople_note_category_subscriptions_relationshipspeople_notes_relationshipspeople_people_imports_relationshipspeople_people_relationshipspeople_person_apps_relationshipspeople_person_mergers_relationshipspeople_phone_numbers_relationshipspeople_reports_relationshipspeople_service_times_relationshipspeople_social_profiles_relationshipspeople_workflow_card_activities_relationshipspeople_workflow_card_notes_relationshipspeople_workflow_cards_relationshipspeople_workflow_shares_relationshipspeople_workflow_step_assignee_summaries_relationshipspeople_workflow_steps_relationshipspeople_workflows_relationships
Complete Table Definitions
Core Person & Contact Tables
people_people
The main person table containing all individual records.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
person_id | VARCHAR(64) | Planning Center person ID |
avatar | TEXT | Profile image URL |
demographic_avatar_url | VARCHAR(2048) | Demographic avatar URL |
first_name | VARCHAR(255) | First/given name |
name | VARCHAR(255) | Full display name |
status | VARCHAR(50) | Membership status (active, inactive, etc.) |
remote_id | VARCHAR(64) | External system ID |
accounting_administrator | BOOLEAN | Finance access |
anniversary | DATE | Wedding anniversary |
birthdate | DATE | Date of birth |
child | BOOLEAN | Is a child |
given_name | VARCHAR(255) | Legal first name |
grade | INTEGER | Current school grade: -1 is Pre-K, 0 is kindergarten, 1–12 are school grades, and values below -1 (down to -5) are younger preschool levels a church may configure. Never NULL — 0 is the default for anyone with no grade set, and sits on hundreds of thousands of adults, so it cannot be distinguished from kindergarten. Filter with child = true and treat 0 with care |
graduation_year | INTEGER | Expected graduation year |
last_name | VARCHAR(255) | Family/surname |
middle_name | VARCHAR(255) | Middle name |
nickname | VARCHAR(255) | Preferred name |
people_permissions | VARCHAR(255) | People app permissions |
site_administrator | BOOLEAN | Admin access |
gender | VARCHAR(50) | Gender |
inactivated_at | TIMESTAMP | When marked inactive |
medical_notes | TEXT | Medical information |
membership | VARCHAR(255) | Membership level |
created_at | TIMESTAMP | When person was created |
updated_at | TIMESTAMP | Last update time |
can_create_forms | BOOLEAN | Form creation permission |
can_email_lists | BOOLEAN | Email list permission |
directory_shared_info | JSONB | Directory sharing settings |
directory_status | VARCHAR(50) | Directory visibility |
passed_background_check | BOOLEAN | Background check status |
resource_permission_flags | JSONB | Resource permissions |
school_type | VARCHAR(255) | School type |
mfa_configured | BOOLEAN | Two-factor auth enabled |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_addresses
Physical addresses for people.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
address_id | VARCHAR(64) | Planning Center address ID |
city | VARCHAR(255) | City |
country_code | VARCHAR(2) | Country code |
country_name | VARCHAR(255) | Country name |
created_at | TIMESTAMP | When created |
updated_at | TIMESTAMP | Last update |
location | VARCHAR(255) | Address type (home, work, etc.) |
is_primary | BOOLEAN | Primary address flag |
state | VARCHAR(255) | State/Province |
street_line_1 | VARCHAR(1024) | Street address line 1 |
street_line_2 | VARCHAR(1024) | Street address line 2 |
zip | VARCHAR(255) | Postal code |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_emails
Email addresses for people.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
email_id | VARCHAR(64) | Planning Center email ID |
address | VARCHAR(255) | Email address |
blocked | BOOLEAN | Email blocked/unsubscribed |
created_at | TIMESTAMP | When created |
location | VARCHAR(50) | Email type (home, work, etc.) |
is_primary | BOOLEAN | Primary email flag |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_phone_numbers
Phone numbers with carrier information.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
phone_number_id | VARCHAR(64) | Planning Center phone ID |
carrier | VARCHAR(255) | Phone carrier |
country_code | VARCHAR(2) | Country code |
e164 | VARCHAR(255) | E164 formatted number |
international | VARCHAR(255) | International format |
location | VARCHAR(255) | Phone type (mobile, home, etc.) |
national | VARCHAR(255) | National format |
number | VARCHAR(255) | Phone number |
is_primary | BOOLEAN | Primary phone flag |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_households
Family units for grouping related people.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
household_id | VARCHAR(64) | Planning Center household ID |
avatar | TEXT | Household avatar URL |
created_at | TIMESTAMP | When created |
updated_at | TIMESTAMP | Last update |
member_count | INTEGER | Number of members |
name | VARCHAR(255) | Household name |
primary_contact_name | VARCHAR(255) | Main contact name |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_campuses
Church campus locations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
campus_id | VARCHAR(64) | Planning Center campus ID |
avatar_url | VARCHAR(2048) | Campus image |
church_center_enabled | BOOLEAN | Church Center enabled |
city | VARCHAR(255) | City |
contact_email_address | VARCHAR(255) | Contact email |
country | VARCHAR(255) | Country |
created_at | TIMESTAMP | When created |
date_format | BOOLEAN | Date format setting |
description | TEXT | Campus description |
geolocation_set_manually | BOOLEAN | Manual geolocation flag |
latitude | DOUBLE PRECISION | GPS latitude |
longitude | DOUBLE PRECISION | GPS longitude |
name | VARCHAR(255) | Campus name |
phone_number | VARCHAR(255) | Contact phone |
state | VARCHAR(255) | State |
street | VARCHAR(255) | Street address |
time_zone | VARCHAR(255) | Time zone |
time_zone_raw | VARCHAR(255) | Raw time zone data |
twenty_four_hour_time | BOOLEAN | 24-hour time format |
updated_at | TIMESTAMP | Last update |
website | VARCHAR(255) | Campus website |
zip | VARCHAR(255) | Postal code |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_connected_persons
Connected person records from external systems.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
connected_person_id | VARCHAR(64) | Planning Center connected person ID |
first_name | VARCHAR(255) | First name |
gender | VARCHAR(50) | Gender |
given_name | VARCHAR(255) | Legal first name |
last_name | VARCHAR(255) | Last name |
middle_name | VARCHAR(255) | Middle name |
nickname | VARCHAR(255) | Nickname |
organization_name | VARCHAR(255) | Organization name |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_person_apps
Application permissions per person.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
person_app_id | VARCHAR(64) | Planning Center person app ID |
allow_pco_login | BOOLEAN | Can login to PCO |
people_permissions | VARCHAR(255) | Permission level |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_social_profiles
Social media profiles for people.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
social_profile_id | VARCHAR(64) | Planning Center social profile ID |
created_at | TIMESTAMP | When created |
site | VARCHAR(255) | Social media platform |
updated_at | TIMESTAMP | Last update |
url | TEXT | Profile URL |
verified | BOOLEAN | Verified account |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_spam_email_addresses
Email addresses marked as spam or blocked.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
spam_email_address_id | VARCHAR(64) | Planning Center spam email ID |
address | VARCHAR(255) | Email address |
created_at | TIMESTAMP | When created |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
Workflow System Tables
people_workflows
Process workflow definitions for managing people through various church processes.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
workflow_id | VARCHAR(64) | Planning Center workflow ID |
completed_card_count | INTEGER | Completed cards count |
created_at | TIMESTAMP | When created |
deleted_at | TIMESTAMP | Soft deletion |
my_due_soon_card_count | INTEGER | Due soon cards for current user |
my_overdue_card_count | INTEGER | Overdue cards for current user |
my_ready_card_count | INTEGER | Ready cards for current user |
name | VARCHAR(255) | Workflow name |
recently_viewed | BOOLEAN | Recently accessed flag |
total_cards_count | INTEGER | Total cards in workflow |
total_ready_and_snoozed_card_count | INTEGER | Ready and snoozed count |
total_ready_card_count | INTEGER | Total ready cards |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_workflow_cards
Individual workflow instances tracking people through processes.
Note: Workflow card relationships (assignee, current_step, person, workflow) are stored in the people_workflow_cards_relationships table, not as direct foreign key columns. See the Relationships section below.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
workflow_card_id | VARCHAR(64) | Planning Center card ID |
calculated_due_at_in_days_ago | INTEGER | Due date calculation |
completed_at | TIMESTAMP | Completion time |
created_at | TIMESTAMP | When created |
updated_at | TIMESTAMP | Last update |
flagged_for_notification_at | TIMESTAMP | Notification flag |
moved_to_step_at | TIMESTAMP | Last step transition |
overdue | BOOLEAN | Overdue status |
removed_at | TIMESTAMP | Removal time |
snooze_until | TIMESTAMP | Snooze end time |
stage | VARCHAR(255) | Current stage |
sticky_assignment | BOOLEAN | Assignment persistence |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_workflow_steps
Workflow step definitions.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
workflow_step_id | VARCHAR(64) | Planning Center step ID |
auto_snooze_days | INTEGER | Auto-snooze duration |
auto_snooze_value | INTEGER | Snooze value |
auto_snooze_interval | VARCHAR(50) | Snooze interval type |
created_at | TIMESTAMP | When created |
description | TEXT | Step description |
name | VARCHAR(255) | Step name |
sequence | INTEGER | Step order |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_workflow_card_activities
Activity logs for workflow cards.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
workflow_card_activity_id | VARCHAR(64) | Planning Center activity ID |
comment | TEXT | Activity comment |
created_at | TIMESTAMP | When created |
person_avatar_url | VARCHAR(2048) | Person avatar |
person_name | VARCHAR(255) | Person name |
reassigned_to_avatar_url | VARCHAR(2048) | Reassigned person avatar |
reassigned_to_name | VARCHAR(255) | Reassigned person name |
subject | VARCHAR(255) | Activity subject |
type | VARCHAR(100) | Activity type |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_workflow_card_notes
Notes attached to workflow cards.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
workflow_card_note_id | VARCHAR(64) | Planning Center note ID |
created_at | TIMESTAMP | When created |
note | TEXT | Note content |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_workflow_categories
Categories for organizing workflows.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
workflow_category_id | VARCHAR(64) | Planning Center category ID |
created_at | TIMESTAMP | When created |
name | VARCHAR(255) | Category name |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_workflow_shares
Workflow sharing permissions.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
workflow_share_id | VARCHAR(64) | Planning Center share ID |
permission | VARCHAR(100) | Permission level |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_workflow_step_assignee_summaries
Summary of workflow step assignments.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
workflow_step_assignee_summary_id | VARCHAR(64) | Planning Center summary ID |
snoozed_count | INTEGER | Cards currently snoozed |
ready_count | INTEGER | Cards ready for action |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
Forms System Tables
people_forms
Form definitions for data collection.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
form_id | VARCHAR(64) | Planning Center form ID |
active | BOOLEAN | Active status |
archived | BOOLEAN | Archived status |
archived_at | TIMESTAMP | Archive timestamp |
created_at | TIMESTAMP | When created |
deleted_at | TIMESTAMP | Soft deletion |
description | TEXT | Form description |
login_required | BOOLEAN | Login required to submit |
name | VARCHAR(255) | Form name |
public_url | VARCHAR(255) | Public form URL |
recently_viewed | BOOLEAN | Recently accessed |
send_submission_notification_to_submitter | BOOLEAN | Email notification to submitter |
submission_count | INTEGER | Number of submissions |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_form_submissions
Submitted form data.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
form_submission_id | VARCHAR(64) | Planning Center submission ID |
created_at | TIMESTAMP | When submitted |
verified | BOOLEAN | Verification status |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_form_fields
Form field definitions.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
form_field_id | VARCHAR(64) | Planning Center field ID |
created_at | TIMESTAMP | When created |
description | TEXT | Field description |
label | VARCHAR(255) | Field label |
required | BOOLEAN | Required field |
sequence | INTEGER | Field order |
settings | JSONB | Field settings |
field_type | VARCHAR(100) | Field type |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_form_field_options
Options for form fields.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
form_field_option_id | VARCHAR(64) | Planning Center option ID |
label | VARCHAR(255) | Option label |
sequence | INTEGER | Option order |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_form_submission_values
Values submitted for form fields.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
form_submission_value_id | VARCHAR(64) | Planning Center value ID |
display_value | TEXT | Display value |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_form_categories
Categories for organizing forms.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
form_category_id | VARCHAR(64) | Planning Center category ID |
name | VARCHAR(255) | Category name |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
Custom Fields Tables
people_field_definitions
Custom field schemas.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
field_definition_id | VARCHAR(64) | Planning Center field definition ID |
config | JSONB | Field configuration |
data_type | VARCHAR(50) | Data type |
deleted_at | TIMESTAMP | Soft deletion |
name | VARCHAR(255) | Field name |
sequence | INTEGER | Field order |
slug | VARCHAR(255) | URL slug |
field_options | JSONB | Field options configuration |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_field_data
Custom field values for people.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
field_data_id | VARCHAR(64) | Planning Center field data ID |
file | TEXT | File attachment URL |
file_content_type | VARCHAR(255) | File MIME type |
file_name | TEXT | File name |
file_size | INTEGER | File size in bytes |
value | TEXT | Field value |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_field_options
Options for custom fields.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
field_option_id | VARCHAR(64) | Planning Center option ID |
sequence | INTEGER | Option order |
value | VARCHAR(255) | Option value |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_tabs
UI tab organization for custom fields.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
tab_id | VARCHAR(64) | Planning Center tab ID |
name | VARCHAR(255) | Tab name |
slug | VARCHAR(255) | URL slug |
sequence | INTEGER | Tab order |
field_definitions | JSONB | Field definitions in tab |
field_options | JSONB | Field options |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_conditions
Conditions included with list rules. Each condition's settings is stored as
JSONB; Planning Center has returned JSON objects for this field. Join through
people_conditions_relationships to find its owning rule and creator.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
condition_id | VARCHAR(64) | Planning Center condition ID |
application | VARCHAR(255) | Application context |
comparison | VARCHAR(255) | Comparison operator |
created_at | TIMESTAMP | When created |
definition_class | VARCHAR(255) | Definition class |
definition_identifier | VARCHAR(255) | Definition identifier |
description | VARCHAR(255) | Condition description |
settings | JSONB | Condition settings |
updated_at | TIMESTAMP | Last update |
system_integration_id | INTEGER | Planning Center connection |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_rules
Rules that define which people belong to a list. The list-to-rule link is in
people_lists_relationships; the rule-to-condition link is in
people_conditions_relationships with relationship_type = 'Rule'.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
rule_id | VARCHAR(64) | Planning Center rule ID |
created_at | TIMESTAMP | When created |
subset | VARCHAR(255) | Rule subset |
updated_at | TIMESTAMP | Last update |
system_integration_id | INTEGER | Planning Center connection |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
For example, inspect the criteria of active lists:
SELECT l.name, r.subset, c.description, c.comparison, c.settings
FROM planning_center.people_lists AS l
JOIN planning_center.people_lists_relationships AS lr
ON lr.list_id = l.list_id
AND lr.tenant_organization_id = l.tenant_organization_id
AND lr.system_integration_id = l.system_integration_id
AND lr.relationship_type = 'Rule'
AND lr.system_status = 'active'
JOIN planning_center.people_rules AS r
ON r.rule_id = lr.relationship_id
AND r.tenant_organization_id = l.tenant_organization_id
AND r.system_integration_id = l.system_integration_id
AND r.system_status = 'active'
JOIN planning_center.people_conditions_relationships AS cr
ON cr.relationship_id = r.rule_id
AND cr.relationship_type = 'Rule'
AND cr.tenant_organization_id = r.tenant_organization_id
AND cr.system_integration_id = r.system_integration_id
AND cr.system_status = 'active'
JOIN planning_center.people_conditions AS c
ON c.condition_id = cr.condition_id
AND c.tenant_organization_id = r.tenant_organization_id
AND c.system_integration_id = r.system_integration_id
AND c.system_status = 'active'
WHERE l.system_status = 'active'
ORDER BY l.name, r.rule_id, c.condition_id
LIMIT 25;Lists & Segmentation Tables
people_lists
Smart lists for segmenting people.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
list_id | VARCHAR(64) | Planning Center list ID |
auto_refresh | BOOLEAN | Whether the list refreshes automatically |
automations_active | BOOLEAN | Automations enabled |
automations_count | INTEGER | Number of automations |
batch_completed_at | TIMESTAMP | Last batch completion |
created_at | TIMESTAMP | When created |
updated_at | TIMESTAMP | Last update |
description | TEXT | List description |
has_inactive_results | BOOLEAN | Includes inactive people |
invalid | BOOLEAN | List has errors |
name | VARCHAR(255) | List name |
name_or_description | TEXT | Combined name/description |
paused_automations_count | INTEGER | Paused automation count |
recently_viewed | BOOLEAN | Recently accessed |
refreshed_at | TIMESTAMP | Last refresh |
returns | VARCHAR(100) | Return type |
starred | BOOLEAN | Is favorited |
status | VARCHAR(50) | List status |
subset | VARCHAR(100) | List subset |
total_people | INTEGER | People count |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_list_categories
Categories for organizing lists.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
list_category_id | VARCHAR(64) | Planning Center category ID |
created_at | TIMESTAMP | When created |
name | VARCHAR(255) | Category name |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_list_results
People included in lists.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
list_result_id | VARCHAR(64) | Planning Center result ID |
created_at | TIMESTAMP | When added to list |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_list_shares
List sharing permissions.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
list_share_id | VARCHAR(64) | Planning Center share ID |
created_at | TIMESTAMP | When shared |
permission_group | VARCHAR(255) | Share group |
name | VARCHAR(255) | Share name |
permission | VARCHAR(100) | Permission level |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_list_stars
Favorited lists per user.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
list_star_id | VARCHAR(64) | Planning Center star ID |
created_at | TIMESTAMP | When favorited |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_mailchimpsyncstatus
Email marketing synchronization status.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
mailchimp_sync_status_id | VARCHAR(64) | Planning Center sync ID |
completed_at | TIMESTAMP | When sync completed |
error | TEXT | Error message |
segment_id | VARCHAR(255) | Mailchimp segment |
status | VARCHAR(100) | Sync status |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
Notes & Documentation Tables
people_notes
Pastoral care notes and follow-ups.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
note_id | VARCHAR(64) | Planning Center note ID |
created_at | TIMESTAMP | When created |
updated_at | TIMESTAMP | Last update |
note | TEXT | Note content |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_note_categories
Categories for organizing notes.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
note_category_id | VARCHAR(64) | Planning Center category ID |
created_at | TIMESTAMP | When created |
locked | BOOLEAN | Category locked |
name | VARCHAR(255) | Category name |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_note_category_shares
Note category sharing permissions.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
note_category_share_id | VARCHAR(64) | Planning Center share ID |
permission_group | VARCHAR(255) | Share group |
permission | VARCHAR(100) | Permission level |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_note_category_subscriptions
Subscriptions to note categories.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
note_category_subscription_id | VARCHAR(64) | Planning Center subscription ID |
created_at | TIMESTAMP | When subscribed |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
Messaging System Tables
people_messages
Individual messages sent through the system.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
message_id | VARCHAR(64) | Planning Center message ID |
app_name | VARCHAR(255) | Originating app |
created_at | TIMESTAMP | When created |
delivery_status | VARCHAR(100) | Delivery status |
from_address | JSONB | Sender address |
message_type | VARCHAR(100) | Message type |
reject_reason | TEXT | Rejection reason |
rejection_notification_sent_at | TIMESTAMP | Rejection notification time |
sent_at | TIMESTAMP | When sent |
subject | TEXT | Message subject |
to_addresses | JSONB | Recipient addresses |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_message_groups
Groupings of related messages.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
message_group_id | VARCHAR(64) | Planning Center group ID |
created_at | TIMESTAMP | When created |
from_address | VARCHAR(255) | Sender address |
message_count | INTEGER | Number of messages |
message_type | VARCHAR(100) | Message type |
subject | TEXT | Group subject |
uuid | VARCHAR(255) | External UUID |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_custom_senders
Custom email sender configurations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
custom_sender_id | VARCHAR(64) | Planning Center sender ID |
name | VARCHAR(255) | Sender name |
email_address | VARCHAR(255) | Email address |
verified_at | TIMESTAMP | Verification time |
verification_requested_at | TIMESTAMP | Verification request time |
created_at | TIMESTAMP | When created |
updated_at | TIMESTAMP | Last update |
verified | BOOLEAN | Verification status |
expired | BOOLEAN | Expiration status |
verification_status | VARCHAR(255) | Verification status |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_carriers
Phone carrier information for SMS messaging.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
carrier_id | VARCHAR(64) | Planning Center carrier ID |
international | BOOLEAN | International carrier |
name | VARCHAR(255) | Carrier name |
value | VARCHAR(255) | Carrier value |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
Import & Data Management Tables
people_people_imports
Import job definitions.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
people_import_id | VARCHAR(64) | Planning Center import ID |
processed_at | TIMESTAMP | When the import finished processing |
created_at | TIMESTAMP | When created |
processed_at | TIMESTAMP | When processed |
status | VARCHAR(100) | Import status |
undone_at | TIMESTAMP | When undone |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_people_import_conflicts
Conflicts detected during imports.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
people_import_conflict_id | VARCHAR(64) | Planning Center conflict ID |
conflicting_changes | JSONB | Conflicting changes |
created_at | TIMESTAMP | When created |
data | JSONB | Conflict data |
ignore | BOOLEAN | Ignore conflict |
kind | VARCHAR(100) | Conflict type |
message | TEXT | Conflict message |
name | VARCHAR(255) | Conflict name |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_people_import_history
Audit trail of import operations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
people_import_history_id | VARCHAR(64) | Planning Center history ID |
conflicting_changes | JSONB | Conflicting changes |
created_at | TIMESTAMP | When created |
name | VARCHAR(255) | History name |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_person_mergers
Records of merged person records.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
person_merger_id | VARCHAR(64) | Planning Center merger ID |
created_at | TIMESTAMP | When merged |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
Administrative & Reference Tables
people_apps
Application integrations available.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
app_id | VARCHAR(64) | Planning Center app ID |
name | VARCHAR(255) | App name |
url | TEXT | App URL |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_background_checks
Background check records for volunteers and staff.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
background_check_id | VARCHAR(64) | Planning Center check ID |
completed_at | TIMESTAMP | When completed |
current | BOOLEAN | Current status |
expires_on | DATE | Expiration date |
note | TEXT | Check notes |
report_url | TEXT | Report URL |
status | VARCHAR(255) | Planning Center check status — manual_clear, report_clear, complete_clear (passes), manual_not_clear / complete_not_clear (fails), plus in-flight values like invitation_pending, awaiting_applicant, report_processing, report_consider. There is no 'passed' value |
status_updated_at | TIMESTAMP | Status update time |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_inactive_reasons
Reasons for marking people inactive.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
inactive_reason_id | VARCHAR(64) | Planning Center reason ID |
value | VARCHAR(255) | Reason value |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_marital_statuses
Marital status options.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
marital_status_id | VARCHAR(64) | Planning Center status ID |
value | VARCHAR(255) | Status value |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_name_prefixes
Title prefixes (Mr., Mrs., Dr., etc.).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
name_prefix_id | VARCHAR(64) | Planning Center prefix ID |
value | VARCHAR(255) | Prefix value |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_name_suffixes
Name suffixes (Jr., Sr., III, etc.).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
name_suffix_id | VARCHAR(64) | Planning Center suffix ID |
value | VARCHAR(255) | Suffix value |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_organizations
Organization configuration and settings.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
organization_id | VARCHAR(64) | Planning Center org ID |
name | VARCHAR(255) | Organization name |
country_code | VARCHAR(10) | Country code |
date_format | VARCHAR(50) | Date format preference |
time_zone | VARCHAR(100) | Time zone |
contact_website | VARCHAR(255) | Contact website |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_reports
Report definitions for data analysis.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
report_id | VARCHAR(64) | Planning Center report ID |
body | TEXT | Report body |
created_at | TIMESTAMP | When created |
name | VARCHAR(255) | Report name |
updated_at | TIMESTAMP | Last update |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_school_options
School affiliations and options.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
school_option_id | VARCHAR(64) | Planning Center school ID |
beginning_grade | VARCHAR(50) | Starting grade |
ending_grade | VARCHAR(50) | Ending grade |
school_types | JSONB | School types |
sequence | INTEGER | Sort order |
value | VARCHAR(255) | School name |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
people_service_times
Service schedule information.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
service_time_id | VARCHAR(64) | Planning Center service time ID |
day | VARCHAR(255) | Day of week |
description | TEXT | Service description |
start_time | INTEGER | Start time (minutes from midnight) |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created in Parable |
system_updated_at | TIMESTAMP | When updated in Parable |
Relationship Tables
All relationship tables follow a similar pattern for linking entities:
Standard Relationship Table Structure
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
{entity}_id | VARCHAR(64) | Parent entity 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 |
Key Relationship Tables
All 39 relationship tables are listed in the inventory above and every one of them follows the standard structure. The ten described below are the ones most often needed in reports; consult them for the relationship types each table carries.
people_people_relationships
Links people to campuses, lists, inactive reasons, marital statuses, organizations, etc.
people_households_relationships
Links households to people and campuses.
IMPORTANT: This table stores relationships between households and people. The primary contact for a household is stored in the people_households table via the primary_contact_name column, and the relationship is available through people_households_relationships.
Relationship Design Decision:
- Planning Center's API returns both
primary_contactandpeoplerelationships for each household - The
primary_contactperson is always included in thepeoplearray - This table stores both
PeopleandPrimaryContactrelationship types - Use
relationship_type = 'PrimaryContact'to find the primary contact person for a household
Example Query:
-- Get primary contact name for a household
SELECT primary_contact_name
FROM planning_center.people_households
WHERE household_id = '22041396';
-- Get all people in a household (including primary contact)
SELECT relationship_id, relationship_type
FROM planning_center.people_households_relationships
WHERE household_id = '22041396';people_emails_relationships
Links emails to people.
people_phone_numbers_relationships
Links phone numbers to people.
people_field_data_relationships
Links custom field data to people and other entities.
people_forms_relationships
Links forms to campuses and categories.
people_workflows_relationships
Links workflows to campuses and categories.
people_workflow_cards_relationships
Links workflow cards to people (assignees and subjects), workflow steps, and workflows.
people_messages_relationships
Links messages to people and message groups.
people_notes_relationships
Links notes to people and note categories.
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
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: People tables that include contribution amounts store them in cents - divide by 100.0 for display
- Contact Status Flags: Use fields like
statusandprimaryto interpret person records instead of relying onsystem_status - Direct ID Columns: Core tables such as
people_people,people_households, andpeople_listsexpose direct IDs for performance-sensitive joins
Common Mistakes to Avoid
-
Missing Schema Prefix
- ❌
FROM people_people - ✅
FROM planning_center.people_people
- ❌
-
Adding Redundant RLS Filters
- ❌
WHERE tenant_organization_id = 1 AND system_status = 'active' - ✅ Trust RLS to handle this automatically
- ❌
-
Joining Without Schema
- ❌
JOIN people_households h ON ... - ✅
JOIN planning_center.people_households h ON ...
- ❌
-
Skipping Currency Conversion
- ❌
SELECT amount_cents as amount - ✅
SELECT amount_cents / 100.0 as amount
- ❌
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 when querying planning center tables. - RLS handles tenant and status filtering automatically
- Filter person status or inactivity flags when relevant
- Consider CTEs for complex multi-join queries
- Join through the
*_relationshipstables — People tables do not carry foreign-key columns to other entities
- Always use the
Verification Summary
✅ 58 entity tables — all listed in the inventory, all with field definitions ✅ 39 relationship tables — all listed in the inventory; 10 described individually, the rest follow the standard structure ✅ All tables include the system columns described above ✅ Consistent formatting with other modules
Counts on this page were verified against the planning_center schema itself, and cover the complete Planning Center People data model in Parable.
Planning Center People SQL Queries
Query Planning Center People data with SQL to understand your congregation: households, demographics, custom fields, and engagement across ministries.
Basic Planning Center People Queries
Start querying Planning Center People data: active people, lookup by name, recent additions, age grouping, and finding children and students.