Planning Center People Data Model - Complete Documentation
This document provides complete documentation of ALL tables in the Planning Center People data model in Parable, including all 84 entity tables and 25+ relationship tables with full field definitions.
Overview
The People module is the most comprehensive in Planning Center, containing:
- 84 entity tables - All person, household, workflow, form, messaging, and configuration data
- 25+ 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
Open diagram in new tab →
Key Relationships Explained
Direct Parent-Child Relationships:
- Emails, phone numbers, and addresses belong directly to people (via
parent_id)
- Household memberships link people to households with explicit junction table
- Form submissions, workflow cards, notes link back to people
Generic Relationship Pattern:
- Campus associations stored in
people_people_relationships table
- 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 (84 total)
people_people - Core person records
people_addresses - Physical addresses
people_emails - Email addresses
people_phone_numbers - Phone numbers
people_households - Family units
people_household_memberships - Links people to households
people_campuses - Church campus locations
people_connected_persons - Connected person records
people_person_apps - App permissions per person
people_social_profiles - Social media profiles
people_spam_email_addresses - Email filtering
Workflow System Tables (10)
people_workflows - Workflow definitions
people_workflow_cards - Workflow instances
people_workflow_steps - Workflow step definitions
people_workflow_card_activities - Workflow activity logs
people_workflow_card_notes - Notes on workflow cards
people_workflow_categories - Workflow categorization
people_workflow_shares - Workflow sharing settings
people_workflow_step_assignee_summaries - Assignee summaries
people_forms - Form definitions
people_form_submissions - Submitted form data
people_form_fields - Form field definitions
people_form_field_options - Field option definitions
people_form_submission_values - Submitted field values
people_form_categories - Form categorization
Custom Fields Tables (5)
people_field_definitions - Custom field schemas
people_field_datum - Custom field values
people_field_options - Custom field options
people_tabs - UI tab organization
people_conditions - Conditional logic
people_rules - Business rules
Lists & Segmentation Tables (7)
people_lists - Smart lists and segments
people_list_categories - List categorization
people_list_results - People in lists
people_list_shares - List sharing permissions
people_list_stars - Favorited lists
people_mailchimp_sync_status - Email marketing sync
Notes & Documentation Tables (4)
people_notes - Pastoral care notes
people_note_categories - Note categorization
people_note_category_shares - Note sharing
people_note_category_subscriptions - Note subscriptions
Messaging System Tables (4)
people_messages - Individual messages
people_message_groups - Message groupings
people_custom_senders - Custom email senders
people_carriers - Phone carriers
Import & Data Management Tables (5)
people_people_imports - Import jobs
people_people_import_conflicts - Import conflicts
people_people_import_history - Import audit trail
people_person_mergers - Person merge records
Administrative & Reference Tables (11)
people_apps - Application integrations
people_background_checks - Background check records
people_inactive_reasons - Inactivation reasons
people_marital_statuses - Marital status options
people_name_prefixes - Title prefixes
people_name_suffixes - Name suffixes
people_organizations - Organization settings
people_reports - Report definitions
people_school_options - School affiliations
people_service_times - Service schedules
Relationship Tables (25 total)
people_people_relationships
people_household_relationships
people_email_relationships
people_phone_number_relationships
people_campus_relationships
people_background_check_relationships
people_field_data_relationships
people_field_definition_relationships
people_form_relationships
people_form_field_relationships
people_form_submission_relationships
people_list_relationships
people_list_category_relationships
people_message_relationships
people_message_group_relationships
people_note_relationships
people_note_category_relationships
people_people_import_relationships
people_person_merger_relationships
people_report_relationships
people_social_profile_relationships
people_workflow_relationships
people_workflow_card_relationships
people_workflow_card_activity_relationships
people_workflow_card_note_relationships
Complete Table Definitions
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 |
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 |
inactive_reason_id | VARCHAR(64) | Why marked inactive (direct reference) |
marital_status_id | VARCHAR(64) | Marital status (direct reference) |
name_prefix_id | VARCHAR(64) | Title (direct reference) |
name_suffix_id | VARCHAR(64) | Suffix (direct reference) |
organization_id | VARCHAR(64) | Organization ID (direct reference) |
school_id | VARCHAR(64) | School affiliation (direct reference) |
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_id | VARCHAR(64) | Main contact person ID |
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_household_memberships
Links people to households with their roles.
| Column | Type | Description |
|---|
id | UUID | Internal unique identifier |
household_membership_id | VARCHAR(64) | Planning Center membership ID |
pending | BOOLEAN | Pending approval |
person_name | VARCHAR(255) | Person name |
person_id | VARCHAR(64) | Person ID (direct reference) |
household_id | VARCHAR(64) | Household ID (direct reference) |
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_id | VARCHAR(64) | Organization ID |
organization_name | VARCHAR(255) | Organization name |
person_id | VARCHAR(64) | Associated person ID |
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 |
person_id | VARCHAR(64) | Person ID (direct reference) |
app_id | VARCHAR(64) | App ID (direct reference) |
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 |
person_id | VARCHAR(64) | Person ID (direct reference) |
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 |
campus_id | VARCHAR(64) | Associated campus |
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 |
workflow_category_id | VARCHAR(64) | Workflow category |
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_workflowcard_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 |
workflow_id | VARCHAR(64) | Parent workflow (direct reference) |
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 |
default_assignee_id | VARCHAR(64) | Default assignee |
description | TEXT | Step description |
name | VARCHAR(255) | Step name |
sequence | INTEGER | Step order |
updated_at | TIMESTAMP | Last update |
workflow_id | VARCHAR(64) | Parent workflow |
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 |
updated_at | TIMESTAMP | Last update |
workflow_card_id | VARCHAR(64) | Parent card |
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 |
updated_at | TIMESTAMP | Last update |
workflow_card_id | VARCHAR(64) | Parent card |
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 |
created_at | TIMESTAMP | When created |
group | VARCHAR(255) | Share group |
permission | VARCHAR(100) | Permission level |
person_id | VARCHAR(64) | Person with access |
workflow_id | VARCHAR(64) | Shared workflow |
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 |
overdue_cards | INTEGER | Number of overdue cards |
ready_and_snoozed_cards | INTEGER | Number of ready/snoozed cards |
ready_cards | INTEGER | Number of ready cards |
total_cards | INTEGER | Total cards assigned |
person_id | VARCHAR(64) | Assignee person |
workflow_step_id | VARCHAR(64) | Workflow step |
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 |
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 |
campus_id | VARCHAR(64) | Associated campus |
form_category_id | VARCHAR(64) | Form category |
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 |
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 |
person_id | VARCHAR(64) | Submitter person |
form_id | VARCHAR(64) | Parent form |
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 |
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 |
type | VARCHAR(100) | Field type |
updated_at | TIMESTAMP | Last update |
form_id | VARCHAR(64) | Parent form |
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 |
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 |
form_field_id | VARCHAR(64) | Parent field |
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 |
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 |
form_field_id | VARCHAR(64) | Field ID |
form_submission_id | VARCHAR(64) | Submission ID |
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 |
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 |
tab_id | VARCHAR(64) | Associated tab |
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_datum
Custom field values for people.
| Column | Type | Description |
|---|
id | UUID | Internal unique identifier |
field_datum_id | VARCHAR(64) | Planning Center field data ID |
person_id | VARCHAR(64) | Associated person 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 |
field_definition_id | VARCHAR(64) | Field definition (direct reference) |
customizable_id | VARCHAR(64) | Associated entity (direct reference) |
field_option_id | VARCHAR(64) | Selected field option |
tab_id | VARCHAR(64) | Associated tab |
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 |
field_definition_id | VARCHAR(64) | Parent field definition |
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
Conditional logic for fields and workflows.
| 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 |
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
Business rules for data processing.
| 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 |
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 |
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 |
automatic_run | BOOLEAN | Auto-refresh enabled |
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 | BOOLEAN | Includes inactive people |
include_archived | BOOLEAN | Includes archived |
invalid | BOOLEAN | List has errors |
mailchimp_sync_status | VARCHAR(100) | Mailchimp sync status |
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 |
organization_id | VARCHAR(64) | Organization ID |
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 |
list_id | VARCHAR(64) | Parent list |
person_id | VARCHAR(64) | Person in 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 |
group | VARCHAR(255) | Share group |
name | VARCHAR(255) | Share name |
permission | VARCHAR(100) | Permission level |
list_id | VARCHAR(64) | Shared list |
person_id | VARCHAR(64) | Person with access |
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 |
list_id | VARCHAR(64) | Favorited list |
person_id | VARCHAR(64) | Person who 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_mailchimp_sync_status
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 |
error_count | INTEGER | Number of errors |
segment_id | VARCHAR(255) | Mailchimp segment |
status | VARCHAR(100) | Sync status |
list_id | VARCHAR(64) | Synced list |
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 |
note_category_id | VARCHAR(64) | Note category (direct reference) |
organization_id | VARCHAR(64) | Organization (direct reference) |
person_id | VARCHAR(64) | Associated person (direct reference) |
created_by_id | VARCHAR(64) | Author (direct reference) |
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 |
organization_id | VARCHAR(64) | Organization ID |
sort_order | VARCHAR(100) | Sort 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_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 |
created_at | TIMESTAMP | When shared |
group | VARCHAR(255) | Share group |
note_category_id | VARCHAR(64) | Shared category |
person_id | VARCHAR(64) | Person with access |
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 |
note_category_id | VARCHAR(64) | Subscribed category |
person_id | VARCHAR(64) | Subscriber |
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 |
bounce_count | INTEGER | Number of bounces |
created_at | TIMESTAMP | When created |
delivery_status | VARCHAR(100) | Delivery status |
from_addresses | JSONB | Sender addresses |
message_type | VARCHAR(100) | Message type |
read_count | INTEGER | Read count |
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 |
updated_at | TIMESTAMP | Last update |
message_group_id | VARCHAR(64) | Parent message group |
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 |
system_email | BOOLEAN | System email flag |
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 |
custom_sender_share_id | VARCHAR(255) | Share ID |
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 |
attribs | JSONB | Import attributes |
completed_at | TIMESTAMP | When completed |
conflicting_changes | JSONB | Conflicting changes |
created_at | TIMESTAMP | When created |
people_ids | JSONB | Imported people IDs |
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 |
people_import_id | VARCHAR(64) | Parent import |
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 |
person_id | VARCHAR(64) | Associated person |
people_import_id | VARCHAR(64) | Parent import |
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_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 |
person_to_keep_id | VARCHAR(64) | Surviving person record |
person_to_remove_id | VARCHAR(64) | Removed person record |
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 |
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) | Check status |
status_updated_at | TIMESTAMP | Status update time |
person_id | VARCHAR(64) | Person checked |
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 |
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 |
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) |
organization_id | VARCHAR(64) | Organization ID |
campus_id | VARCHAR(64) | Campus ID |
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
people_people_relationships
Links people to campuses, lists, inactive reasons, marital statuses, organizations, etc.
people_household_relationships
Links households to people and campuses.
IMPORTANT: This table stores relationships between households and people. The primary contact for a household is NOT stored here - it is stored directly in the people_households table via the primary_contact_id and primary_contact_name columns.
Relationship Design Decision:
- Planning Center’s API returns both
primary_contact and people relationships for each household
- The
primary_contact person is always included in the people array
- To avoid duplicate data, we only store the
people relationships in this table
- To find the primary contact for a household, query
people_households.primary_contact_id instead of this table
Example Query for Primary Contact:
-- Get primary contact for a household
SELECT primary_contact_id, 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_household_relationships
WHERE household_id = '22041396';
people_email_relationships
Links emails to people.
people_phone_number_relationships
Links phone numbers to people.
people_field_data_relationships
Links custom field data to people and other entities.
Links forms to campuses and categories.
people_workflow_relationships
Links workflows to campuses and categories.
people_workflowcard_relationships
Links workflow cards to people (assignees and subjects), workflow steps, and workflows.
people_message_relationships
Links messages to people and message groups.
people_note_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 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
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
status, primary, and inactive_reason_id to interpret person records instead of relying on system_status
- Direct ID Columns: Core tables such as
people_people, people_households, and people_lists expose 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
-
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
- Use direct ID columns when available instead of relationship tables
Verification Summary
✅ Total Tables Documented: 84 entity tables + 25 relationship tables
✅ All tables include system columns
✅ Comprehensive field definitions provided
✅ Consistent formatting with other modules
This document represents the COMPLETE Planning Center People data model implementation in Parable.