Planning Center Calendar Data Model
Complete reference for Planning Center Calendar tables in Parable: events, event instances, resources, rooms, tags, and the relationships between them.
This document provides complete documentation of the Planning Center Calendar data model in Parable, including all tables, fields, and relationships.
Overview
The Calendar module contains 22 entity tables and 20 relationship tables supporting event management, resource booking, scheduling, and calendar synchronization.
Visual Data Model
The diagram below shows the core entities and their relationships in the Calendar module. Use it as a visual reference while exploring the detailed table definitions below.
Core Entity Relationships
Key Relationships Explained
Event Hierarchy:
EVENTis the master event (e.g., "Sunday Service")EVENT_INSTANCEis a specific occurrence (e.g., "Sunday Service on Jan 15, 2024")EVENT_TIMEbreaks instances into periods (Setup 8am-9am, Event 9am-11am, Teardown 11am-12pm)
Resource Booking:
RESOURCEs are bookable items (rooms, equipment, vehicles)RESOURCE_FOLDERs organize resources hierarchicallyRESOURCE_BOOKINGlinks resources to event instancesROOM_SETUPdefines different configurations for room resources
Approval Workflow:
EVENT_RESOURCE_REQUESTinitiates booking requestREQUIRED_APPROVALspecifies which groups must approveRESOURCE_APPROVAL_GROUPcontains approversRESOURCE_QUESTIONcollects additional information during booking
Conflict Management:
CONFLICTtracks resource double-bookings- Links are stored via
calendar_conflicts_relationships - Resolved when winner is selected
Cross-App Connections:
EVENT_CONNECTIONlinks calendar events to other Planning Center modules- Connected to Services (worship plans), Groups (group events), etc.
- Enables unified scheduling across the platform
Generic Relationship Pattern:
- All inter-entity links are stored in dedicated
*_relationshipstables - Each relationship table holds a parent entity ID,
relationship_type, andrelationship_id
Query Requirements
Schema Prefix
IMPORTANT: All tables in the Planning Center Calendar module are in the planning_center schema. You MUST prefix all table names with planning_center. in your queries.
✅ CORRECT: SELECT * FROM planning_center.calendar_events
❌ INCORRECT: SELECT * FROM calendar_events
Row Level Security (RLS)
This database uses Row Level Security (RLS) to automatically filter data based on:
- tenant_organization_id: You only see data for your current organization
- system_status: You only see 'active' records by default
DO NOT add these filters to your WHERE clause - they are applied automatically:
- ❌
WHERE tenant_organization_id = 1(unnecessary) - ❌
WHERE system_status = 'active'(unnecessary)
The RLS policies ensure you only access data you're authorized to see, making these filters redundant and potentially causing performance issues.
Core Tables Overview
Primary Entity Tables
calendar_events- Master event definitionscalendar_event_instances- Specific occurrences of eventscalendar_resources- Bookable resources (rooms, equipment)calendar_resource_bookings- Resource reservationscalendar_conflicts- Scheduling conflictscalendar_tags- Event categorizationcalendar_tag_groups- Tag groupings
Supporting Entity Tables
calendar_attachments- File attachments for eventscalendar_event_connections- Links to other PCO modulescalendar_event_resource_requests- Resource booking requestscalendar_event_resource_answers- Answers to booking questionscalendar_event_times- Time blocks within eventscalendar_feeds- Calendar feed configurationscalendar_organizations- Organization settingscalendar_people- People associated with eventscalendar_report_templates- Report templatescalendar_required_approvals- Approval requirementscalendar_resource_approval_groups- Approval groupscalendar_resource_folders- Resource organizationcalendar_resource_questions- Booking questionscalendar_resource_suggestions- Suggested resourcescalendar_room_setups- Room configurations
Relationship Tables
calendar_attachments_relationships- Links attachments to related entitiescalendar_conflicts_relationships- Links conflicts to related entitiescalendar_event_connections_relationships- Links connections to related entitiescalendar_event_resource_answers_relationships- Links answers to related entitiescalendar_event_times_relationships- Links event times to related entitiescalendar_event_instances_relationships- Links instances to related entitiescalendar_event_resource_requests_relationships- Links requests to related entitiescalendar_events_relationships- Links events to related entitiescalendar_feeds_relationships- Links feeds to related entitiescalendar_people_relationships- Links people to related entitiescalendar_required_approvals_relationships- Links required approvals to related entitiescalendar_resource_approval_groups_relationships- Links approval groups to related entitiescalendar_resource_folders_relationships- Links folders to related entitiescalendar_resource_questions_relationships- Links questions to related entitiescalendar_resource_suggestions_relationships- Links suggestions to related entitiescalendar_resource_bookings_relationships- Links bookings to related entitiescalendar_resources_relationships- Links resources to related entitiescalendar_room_setups_relationships- Links room setups to related entitiescalendar_tag_groups_relationships- Links tag groups to related entitiescalendar_tags_relationships- Links tags to related entities
Table Definitions
calendar_events
Master event definitions containing the core event information.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_id | VARCHAR(64) | Planning Center event ID |
approval_status | VARCHAR(1) | 'A' (Approved), 'P' (Pending), or 'R' (Rejected) — never NULL |
created_at | TIMESTAMP | When event was created |
description | TEXT | Full event description |
featured | BOOLEAN | Whether event is featured/highlighted |
image_url | VARCHAR(2048) | Event image URL |
name | TEXT | Event name/title |
percent_approved | INTEGER | Percentage of approvals received |
percent_rejected | INTEGER | Percentage of rejections received |
registration_url | VARCHAR(2048) | External registration link |
summary | TEXT | Brief event summary |
updated_at | TIMESTAMP | Last update time |
visible_in_church_center | BOOLEAN | Public visibility flag |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status: 'active', 'transferring', 'stale' |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_event_instances
Specific occurrences of events, handling both one-time and recurring events.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_instance_id | VARCHAR(64) | Planning Center instance ID |
all_day_event | BOOLEAN | Whether this is an all-day event |
church_center_url | VARCHAR(2048) | Public URL for this instance |
compact_recurrence_description | TEXT | Short recurrence description |
created_at | TIMESTAMP | Instance creation time |
description | TEXT | Instance description |
ends_at | TIMESTAMP | Event end time |
image_url | VARCHAR(2048) | Instance image URL |
location | TEXT | Event location/venue |
name | TEXT | Instance name (may differ from parent event) |
published_ends_at | TIMESTAMP | Published end time (may differ from actual) |
published_starts_at | TIMESTAMP | Published start time |
recurrence | TEXT | 'None', 'Daily', 'Weekly', 'Monthly', 'Yearly', 'CustomDates', 'YearMonth', or 'MonthDay' (never NULL) |
recurrence_description | TEXT | Human-readable recurrence |
starts_at | TIMESTAMP | Event start time |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier (link to parent event via calendar_event_instances_relationships with relationship_type='Event') |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resources
Bookable resources including rooms, equipment, and other facilities.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_id | VARCHAR(64) | Planning Center resource ID |
created_at | TIMESTAMP | Resource creation time |
description | TEXT | Resource description |
expires_at | TIMESTAMP | Expiration date (for leased/rented items) |
home_location | TEXT | Default storage location |
image_url | VARCHAR(2048) | Resource image |
image_thumb_url | VARCHAR(2048) | Thumbnail image |
kind | TEXT | Resource type: 'Room' or 'Resource' |
name | TEXT | Resource name |
path_name | TEXT | Hierarchical path (Building/Floor/Room) |
quantity | INTEGER | Available quantity/capacity |
serial_number | TEXT | Serial number (for equipment) |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_bookings
Reservations linking resources to specific events and times.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_booking_id | VARCHAR(64) | Planning Center booking ID |
created_at | TIMESTAMP | Booking creation time |
ends_at | TIMESTAMP | Booking end time |
quantity | INTEGER | Quantity booked |
starts_at | TIMESTAMP | Booking start time |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier (links to event, event instance, request, and resource via calendar_resource_bookings_relationships) |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_conflicts
Detected scheduling conflicts between events or resources.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
conflict_id | VARCHAR(64) | Planning Center conflict ID |
created_at | TIMESTAMP | When conflict was detected |
note | TEXT | Conflict notes/resolution |
resolved_at | TIMESTAMP | When conflict was resolved |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier (conflicting bookings linked via calendar_conflicts_relationships) |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_tags
Event categorization labels for organizing and filtering.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
tag_id | VARCHAR(64) | Planning Center tag ID |
church_center_category | BOOLEAN | Whether this tag represents a Church Center category |
color | TEXT | Display color for the tag |
created_at | TIMESTAMP | Tag creation time |
name | TEXT | Tag name |
position | REAL | Display order |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier (link to tag group via calendar_tags_relationships with relationship_type='TagGroup') |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_tag_groups
Groupings for tags to organize them by ministry, event type, etc.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
tag_group_id | VARCHAR(64) | Planning Center tag group ID |
created_at | TIMESTAMP | Group creation time |
name | TEXT | Group name |
required | BOOLEAN | Whether a tag from this group is required on events |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_attachments
File attachments associated with events.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
attachment_id | VARCHAR(64) | Planning Center attachment ID |
content_type | TEXT | MIME type of file |
created_at | TIMESTAMP | Attachment creation time |
description | TEXT | Attachment description |
file_size | INTEGER | File size in bytes |
name | TEXT | File name |
updated_at | TIMESTAMP | Last update time |
url | TEXT | Download URL |
tenant_organization_id | INTEGER | Organization identifier (link to event via calendar_attachments_relationships with relationship_type='Event') |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_event_connections
Links between calendar events and other Planning Center modules.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_connection_id | VARCHAR(64) | Planning Center connection ID |
connected_to_id | VARCHAR(64) | ID of connected entity |
connected_to_name | TEXT | Name of connected entity |
connected_to_type | VARCHAR(50) | Type of connected entity |
connected_to_url | VARCHAR(2048) | URL to connected entity |
product_name | VARCHAR(50) | PCO product (services, groups, etc.) |
promoted | BOOLEAN | Whether connection is promoted |
tenant_organization_id | INTEGER | Organization identifier (link to event via calendar_event_connections_relationships with relationship_type='Event') |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_event_times
Specific time blocks within event instances (e.g., "Doors Open", "Main Service").
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_time_id | VARCHAR(64) | Planning Center event time ID |
ends_at | TIMESTAMP | Time block end |
name | TEXT | Time block name |
starts_at | TIMESTAMP | Time block start |
visible_on_kiosks | BOOLEAN | Show on check-in kiosks |
visible_on_widget_and_ical | BOOLEAN | Show in public widgets/calendars |
tenant_organization_id | INTEGER | Organization identifier (link to event instance via calendar_event_times_relationships with relationship_type='EventInstance') |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_room_setups
Predefined room configurations with layout diagrams.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
room_setup_id | VARCHAR(64) | Planning Center setup ID |
created_at | TIMESTAMP | Setup creation time |
description | TEXT | Setup description |
diagram_thumbnail_url | VARCHAR(2048) | Diagram thumbnail |
diagram_url | VARCHAR(2048) | Setup diagram image |
name | TEXT | Setup name |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier (links to containing resource and associated room setup via calendar_room_setups_relationships) |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_event_resource_requests
Resource requests for events, tracking booking requirements.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_resource_request_id | VARCHAR(64) | Planning Center request ID |
approval_sent | BOOLEAN | Whether approval request was sent |
approval_status | VARCHAR(1) | Status: 'A' (Approved), 'P' (Pending), 'R' (Rejected) |
created_at | TIMESTAMP | Request creation time |
notes | TEXT | Request notes |
quantity | INTEGER | Quantity requested |
updated_at | TIMESTAMP | Last update time |
visible_on_kiosks | BOOLEAN | Whether request is visible on kiosks |
tenant_organization_id | INTEGER | Organization identifier (links to event, resource, room setup, created_by, updated_by via calendar_event_resource_requests_relationships) |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_event_resource_answers
Answers to resource booking questions.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_resource_answer_id | VARCHAR(64) | Planning Center answer ID |
answer | JSONB | The answer provided (string or array of strings depending on multiple_select) |
question | JSONB | Embedded question details (question, choices, kind, multiple_select, optional, position) |
db_answer | TEXT | Plain-text representation of answer |
created_at | TIMESTAMP | Answer creation time |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Note: Relationships (created_by, updated_by, resource_question, event_resource_request) are stored in the calendar_event_resource_answers_relationships table.
calendar_feeds
Calendar feed configurations for importing and syncing events.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
feed_id | VARCHAR(64) | Planning Center feed ID |
can_delete | BOOLEAN | Whether feed can be deleted |
default_church_center_visibility | VARCHAR(50) | Default visibility for imported events |
deleting | BOOLEAN | Whether feed is being deleted |
feed_type | VARCHAR(50) | Type of feed (ical, planning_center) |
imported_at | TIMESTAMP | Last import time |
name | TEXT | Feed name |
prefix_event_names | BOOLEAN | Whether to prefix imported event names |
source_id | VARCHAR(64) | Source identifier |
sync_campus_tags | BOOLEAN | Whether to sync campus tags |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_organizations
Organization-wide calendar settings.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
organization_id | VARCHAR(64) | Planning Center organization ID |
calendar_starts_on | VARCHAR(50) | Which day the calendar week starts on |
date_format | VARCHAR(255) | Date display format |
name | TEXT | Organization name |
onboarding | BOOLEAN | Whether organization is in onboarding |
time_zone | VARCHAR(255) | Default timezone |
twenty_four_hour_time | BOOLEAN | Use 24-hour time format |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_people
People with calendar permissions and access.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
person_id | VARCHAR(64) | Planning Center person ID |
avatar_url | VARCHAR(2048) | Profile image URL |
can_edit_people | BOOLEAN | Can edit people permissions |
can_edit_resources | BOOLEAN | Can edit resources |
can_edit_rooms | BOOLEAN | Can edit rooms |
child | BOOLEAN | Is a child account |
contact_data | JSONB | Contact information |
created_at | TIMESTAMP | Person creation time |
event_permissions_type | VARCHAR(50) | Event permission level |
first_name | VARCHAR(255) | First name |
gender | VARCHAR(10) | Gender |
has_access | BOOLEAN | Has calendar access |
last_name | VARCHAR(255) | Last name |
member_of_approval_groups | BOOLEAN | Whether person is in any approval group |
middle_name | VARCHAR(255) | Middle name |
name | VARCHAR(255) | Full name |
name_prefix | VARCHAR(10) | Name prefix (Mr., Dr., etc.) |
name_suffix | VARCHAR(10) | Name suffix (Jr., III, etc.) |
pending_request_count | INTEGER | Number of pending approval requests |
people_permissions_type | TEXT | People permission level |
permissions | INTEGER | Permission bitmask |
resolves_conflicts | BOOLEAN | Can resolve booking conflicts |
resources_permissions_type | TEXT | Resource permission level |
room_permissions_type | TEXT | Room permission level |
site_administrator | BOOLEAN | Is site administrator |
status | TEXT | Account status |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_report_templates
Report templates for calendar data.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
report_template_id | VARCHAR(64) | Planning Center template ID |
body | TEXT | Template body/content |
created_at | TIMESTAMP | Template creation time |
description | TEXT | Template description |
title | TEXT | Template title |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_required_approvals
Approval requirements for resource bookings.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
required_approval_id | VARCHAR(64) | Planning Center approval ID |
tenant_organization_id | INTEGER | Organization identifier (links to approval group and resource via calendar_required_approvals_relationships) |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_approval_groups
Groups responsible for approving resource bookings.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_approval_group_id | VARCHAR(64) | Planning Center group ID |
created_at | TIMESTAMP | Group creation time |
form_count | INTEGER | Number of forms associated |
name | TEXT | Group name |
resource_count | INTEGER | Number of resources this group approves |
room_count | INTEGER | Number of rooms this group approves |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_folders
Hierarchical organization of resources.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_folder_id | VARCHAR(64) | Planning Center folder ID |
ancestry | TEXT | Hierarchical path (parent/child/grandchild) |
created_at | TIMESTAMP | Folder creation time |
kind | TEXT | Folder type |
name | TEXT | Folder name |
path_name | TEXT | Full path name |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_questions
Booking questions for specific resources.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_question_id | VARCHAR(64) | Planning Center question ID |
choices | TEXT | Available choices (for select fields) |
created_at | TIMESTAMP | Question creation time |
description | TEXT | Question description/help text |
kind | TEXT | Question type (text, select, etc.) |
multiple_select | BOOLEAN | Allow multiple selections |
optional | BOOLEAN | Is answer optional |
position | INTEGER | Display order |
question | TEXT | Question text |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier (link to resource via calendar_resource_questions_relationships with relationship_type='Resource') |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_suggestions
Suggested resources for room setups.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_suggestion_id | VARCHAR(64) | Planning Center suggestion ID |
created_at | TIMESTAMP | Suggestion creation time |
quantity | INTEGER | Suggested quantity |
updated_at | TIMESTAMP | Last update time |
tenant_organization_id | INTEGER | Organization identifier (links to resource and room setup via calendar_resource_suggestions_relationships) |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Relationship Tables
All relationship tables share this structure: a parent entity ID, relationship_type (VARCHAR(50)), and relationship_id (VARCHAR(64)) to identify the related record, plus standard system fields.
calendar_attachments_relationships
Links attachments to related entities (events).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
attachment_id | VARCHAR(64) | Parent attachment 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_conflicts_relationships
Links conflicts to related entities (resource bookings).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
conflict_id | VARCHAR(64) | Parent conflict 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_event_connections_relationships
Links event connections to related entities (events).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_connection_id | VARCHAR(64) | Parent connection 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_event_resource_answers_relationships
Links event resource answers to related entities (created_by, updated_by, resource_question, event_resource_request).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_resource_answer_id | VARCHAR(64) | Parent answer 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Common relationship types:
Person(created_by) - Links to calendar_people (who created the answer)Person(updated_by) - Links to calendar_people (who last updated the answer)ResourceQuestion- Links to calendar_resource_questionsEventResourceRequest- Links to calendar_event_resource_requests
calendar_event_times_relationships
Links event times to related entities (event instances).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_time_id | VARCHAR(64) | Parent event time 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_event_instances_relationships
Links event instances to event times, resource bookings, and tags.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_instance_id | VARCHAR(64) | Parent instance 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Common relationship types:
Event- Links to calendar_eventsEventTime- Links to calendar_event_timesResourceBooking- Links to calendar_resource_bookingsTag- Links to calendar_tags
calendar_event_resource_requests_relationships
Links resource requests to answers and bookings.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_resource_request_id | VARCHAR(64) | Parent request 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Common relationship types:
ResourceBooking- Links to calendar_resource_bookingsEventResourceAnswer- Links to calendar_event_resource_answers
calendar_events_relationships
Links events to tags, attachments, and other related entities.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_id | VARCHAR(64) | Parent event ID |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Common relationship types:
Tag- Links to calendar_tagsAttachment- Links to calendar_attachmentsOwner- Links to calendar_people
calendar_feeds_relationships
Links feeds to related entities (event owners).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
feed_id | VARCHAR(64) | Parent feed 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_people_relationships
Links people to related entities.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
person_id | VARCHAR(64) | Parent person 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_required_approvals_relationships
Links required approvals to related entities (approval groups, resources).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
required_approval_id | VARCHAR(64) | Parent required approval 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_approval_groups_relationships
Links approval groups to related entities (people, resources).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_approval_group_id | VARCHAR(64) | Parent approval group ID |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_folders_relationships
Links resource folders to related entities.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_folder_id | VARCHAR(64) | Parent folder 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_questions_relationships
Links resource questions to related entities (resources).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_question_id | VARCHAR(64) | Parent question 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_suggestions_relationships
Links resource suggestions to related entities (resources, room setups).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_suggestion_id | VARCHAR(64) | Parent suggestion 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_resource_bookings_relationships
Links resource bookings to related entities (events, instances, requests, resources).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_booking_id | VARCHAR(64) | Parent booking 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Common relationship types:
Event- Links to calendar_eventsEventInstance- Links to calendar_event_instancesEventResourceRequest- Links to calendar_event_resource_requestsResource- Links to calendar_resources
calendar_resources_relationships
Links resources to approval groups, questions, and room setups.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
resource_id | VARCHAR(64) | Parent resource 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
Common relationship types:
ResourceApprovalGroup- Links to calendar_resource_approval_groupsResourceQuestion- Links to calendar_resource_questionsRoomSetup- Links to calendar_room_setups
calendar_room_setups_relationships
Links room setups to related entities (containing resource, associated room setup).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
room_setup_id | VARCHAR(64) | Parent room setup 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_tag_groups_relationships
Links tag groups to their tags (relationship_type = 'Tag'). To find the events in a tag group, join through the event's own tags in calendar_events_relationships.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
tag_group_id | VARCHAR(64) | Parent tag group ID |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
calendar_tags_relationships
Links tags to related entities (tag groups).
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
tag_id | VARCHAR(64) | Parent tag 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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
System Fields
All tables include these system fields for data management:
tenant_organization_id- Multi-tenant organization identifiersystem_status- Data lifecycle status:transferring- Being imported from Planning Centeractive- Current active datastale- Marked for removal
system_created_at- When record was created in Parablesystem_updated_at- When record was last updated in Parable
Common Query Patterns
Getting Events with Tags
-- CORRECT: Schema prefix included, no manual RLS filters
SELECT
e.*,
STRING_AGG(t.name, ', ') as tags
FROM planning_center.calendar_events e
LEFT JOIN planning_center.calendar_events_relationships er
ON e.event_id = er.event_id
AND er.relationship_type = 'Tag'
LEFT JOIN planning_center.calendar_tags t
ON er.relationship_id = t.tag_id
GROUP BY e.id, e.event_id;Finding Available Resources
SELECT r.*
FROM planning_center.calendar_resources r
WHERE NOT EXISTS (
SELECT 1
FROM planning_center.calendar_resource_bookings rb
JOIN planning_center.calendar_resource_bookings_relationships rbr
ON rbr.resource_booking_id = rb.resource_booking_id AND rbr.relationship_type = 'Resource'
WHERE rbr.relationship_id = r.resource_id
AND rb.starts_at < (CURRENT_DATE + TIME '14:00')
AND rb.ends_at > (CURRENT_DATE + TIME '12:00')
);Detecting Booking Conflicts
WITH resource_bookings AS MATERIALIZED (
SELECT
rb.resource_booking_id,
rb.starts_at,
rb.ends_at,
rbr.relationship_id AS resource_id
FROM planning_center.calendar_resource_bookings rb
JOIN planning_center.calendar_resource_bookings_relationships rbr
ON rbr.resource_booking_id = rb.resource_booking_id
AND rbr.relationship_type = 'Resource'
)
SELECT
rb1.resource_booking_id as booking1,
rb2.resource_booking_id as booking2,
r.name as resource_name
FROM resource_bookings rb1
JOIN resource_bookings rb2
ON rb1.resource_id = rb2.resource_id
AND rb1.resource_booking_id < rb2.resource_booking_id
AND rb1.starts_at < rb2.ends_at
AND rb1.ends_at > rb2.starts_at
JOIN planning_center.calendar_resources r ON r.resource_id = rb1.resource_id;Today's Schedule
SELECT
e.name as event_name,
ei.starts_at,
ei.ends_at,
ei.location
FROM planning_center.calendar_event_instances ei
JOIN planning_center.calendar_event_instances_relationships eir
ON eir.event_instance_id = ei.event_instance_id AND eir.relationship_type = 'Event'
JOIN planning_center.calendar_events e ON e.event_id = eir.relationship_id
WHERE (
DATE(ei.starts_at) = CURRENT_DATE
OR (ei.all_day_event = true
AND DATE(ei.starts_at) <= CURRENT_DATE
AND DATE(ei.ends_at) >= CURRENT_DATE)
)
ORDER BY ei.starts_at;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: Resource fee and cost columns are stored in cents - divide by 100.0 for display
- Time Windows: Use
starts_at/ends_atcomparisons and theall_day_eventflag rather than relying onsystem_status - Relationship Tables: All inter-entity links are stored in
*_relationshipstables — never in direct columns on the entity tables
Common Mistakes to Avoid
-
Missing Schema Prefix
- ❌
FROM calendar_events - ✅
FROM planning_center.calendar_events
- ❌
-
Adding Redundant RLS Filters
- ❌
WHERE tenant_organization_id = 1 AND system_status = 'active' - ✅ Trust RLS to handle this automatically
- ❌
-
Joining Without Schema
- ❌
JOIN calendar_resource_bookings rb ON ... - ✅
JOIN planning_center.calendar_resource_bookings rb ON ...
- ❌
-
Using the wrong parent column in relationship tables
- ❌
WHERE event_resource_request_id = ...incalendar_event_resource_requests_relationships - ✅
WHERE event_resource_request_id = ...(the live column isevent_resource_request_id)
- ❌
-
Using the wrong parent column in eventinstances relationship table
- ❌
WHERE event_instance_id = ...incalendar_event_instances_relationships - ✅
WHERE event_instance_id = ...(the live column isevent_instance_id)
- ❌
Performance Considerations
-
Indexes: All tables have optimized indexes on:
- Primary keys and entity IDs
- Join columns and foreign keys
- Date columns for time-based queries
-
Query Optimization:
- Always use the
planning_center.schema prefix - RLS handles tenant and status filtering automatically
- Filter by approval or conflict flags when relevant
- Consider CTEs for complex hierarchical queries
- Use relationship tables for all cross-entity joins
- Always use the
Data Types and Conventions
Approval Statuses
A- ApprovedP- Pending approvalR- RejectedNULL- No approval required
Resource Types (kind)
Room- Physical spacesResource- Other bookable items (equipment, etc.)
All-Day Events
all_day_event = trueindicates full-day events- Check date portions of
starts_atandends_at - May span multiple days
Recurrence Patterns
recurrenceholds a single keyword, not an iCal RRULE:'None','Daily','Weekly','Monthly','Yearly','CustomDates','YearMonth', or'MonthDay'. It is never NULL — filter withrecurrence <> 'None'to select recurring events- Human-readable detail (days, times, start and end dates) is in
recurrence_description, also never NULL - Each occurrence is a separate event_instance
Next Steps
- Start with Basic Queries for simple examples
- Progress to Advanced Queries for complex analysis
- Use Reporting Examples for production reports
- Return to Overview for overview
Planning Center Calendar SQL Queries
Query Planning Center Calendar data with SQL. Track facility utilization, check room availability, and find double-booked resources before they clash.
Basic Planning Center Calendar Queries
Start querying Planning Center Calendar data: list upcoming events, see which rooms are in use, and check which resources are booked and when.