> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getparable.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Data model

# 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

<Tip>
  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.
</Tip>

### Core Entity Relationships

<Frame>
  <img src="https://mintcdn.com/parable/dIkTtcPi0zjaWA0V/diagrams/planning-center/people-data-model-01.svg?fit=max&auto=format&n=dIkTtcPi0zjaWA0V&q=85&s=5f6885ffe9a877bce0b389e0f4881467" alt="People module data model" width="5648" height="1201" data-path="diagrams/planning-center/people-data-model-01.svg" />
</Frame>

[Open diagram in new tab →](/diagrams/planning-center/people-data-model-01.svg)

### 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)

#### Core Person & Contact Tables (11)

* `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

#### Forms System Tables (8)

* `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_mailchimpsyncstatus` - 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_phonenumber_relationships`
* `people_campus_relationships`
* `people_backgroundcheck_relationships`
* `people_fielddata_relationships`
* `people_fielddefinition_relationships`
* `people_form_relationships`
* `people_formfield_relationships`
* `people_formsubmission_relationships`
* `people_list_relationships`
* `people_listcategory_relationships`
* `people_message_relationships`
* `people_messagegroup_relationships`
* `people_note_relationships`
* `people_note_category_relationships`
* `people_peopleimport_relationships`
* `people_personmerger_relationships`
* `people_report_relationships`
* `people_socialprofile_relationships`
* `people_workflow_relationships`
* `people_workflowcard_relationships`
* `people_workflowcardactivity_relationships`
* `people_workflowcardnote_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                       |
| `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       |

### 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                     |
| `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         |

#### 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                |
| `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       |

#### 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             |
| `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    |

#### 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               |
| `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    |

#### 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              |
| `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    |

#### 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                            |
| `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\_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              |
| `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**:

```sql theme={null}
-- 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\_phonenumber\_relationships

Links phone numbers to people.

#### people\_fielddata\_relationships

Links custom field data to people and other entities.

#### people\_form\_relationships

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

1. **Schema Qualification**: Always use `planning_center.` prefix for all table references
2. **Row Level Security**: RLS automatically handles multi-tenancy and status filtering - do not add manual filters
3. **Monetary Values**: People tables that include contribution amounts store them in cents - divide by 100.0 for display
4. **Contact Status Flags**: Use fields like `status`, `primary`, and `inactive_reason_id` to interpret person records instead of relying on `system_status`
5. **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

1. **Missing Schema Prefix**

   * ❌ `FROM people_people`
   * ✅ `FROM planning_center.people_people`

2. **Adding Redundant RLS Filters**

   * ❌ `WHERE tenant_organization_id = 1 AND system_status = 'active'`
   * ✅ Trust RLS to handle this automatically

3. **Joining Without Schema**

   * ❌ `JOIN people_households h ON ...`
   * ✅ `JOIN planning_center.people_households h ON ...`

4. **Skipping Currency Conversion**
   * ❌ `SELECT amount_cents as amount`
   * ✅ `SELECT amount_cents / 100.0 as amount`

## Performance Considerations

1. **Indexes**: All tables have optimized indexes on:

   * Primary keys and entity IDs
   * Join columns and foreign keys
   * Date columns for time-based queries

2. **Query Optimization**:
   * Always use the `planning_center.` schema prefix 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.
