Services Data Model

This document provides complete documentation of the Planning Center Services data model in Parable, including all tables, fields, and relationships.

Overview

The Services module contains 63 tables supporting worship planning, volunteer scheduling, song management, and service coordination across your entire ministry.

Query Requirements

Schema Prefix

IMPORTANT: All tables in the Planning Center Services module are in the planning_center schema. You MUST prefix all table names with planning_center. in your queries. ✅ CORRECT: SELECT * FROM planning_center.services_plans ❌ INCORRECT: SELECT * FROM services_plans

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

  • services_service_types - Service categories (Sunday morning, youth, special events)
  • services_plans - Individual service plans with dates and details
  • services_teams - Volunteer and worship teams
  • services_people - People who serve in ministry
  • services_songs - Song library and metadata
  • services_arrangements - Song arrangements and keys
  • services_items - Service elements and order
  • services_schedules - Person scheduling information
  • services_plan_people - People scheduled for specific plans
  • services_attachments - Files, charts, and media

Supporting Entity Tables

  • services_plan_times - Service times (9am service, 11am service, etc.)
  • services_plan_templates - Reusable service templates
  • services_team_positions - Roles within teams (drummer, vocalist, etc.)
  • services_person_team_position_assignments - Who can serve in what roles
  • services_needed_positions - Unfilled positions for services
  • services_blockouts - When people are unavailable
  • services_blockout_dates - Specific unavailable dates
  • services_live - Live service control and streaming
  • services_media - Media files and videos
  • services_folders - Organizational structure

Relationship Tables

  • services_plan_relationships - Links plans to other entities
  • services_team_relationships - Links teams to service types
  • services_item_relationships - Links items to songs, arrangements, etc.
  • services_person_relationships - Links people to teams and positions

Table Definitions

services_service_types

Service types define categories of services (Sunday Morning, Youth Service, etc.).
ColumnTypeDescription
idUUIDInternal unique identifier
service_type_idVARCHAR(64)Planning Center service type ID
nameVARCHAR(255)Service type name
sequenceINTEGERDisplay order
permissionsVARCHAR(50)Permission level
attachment_types_enabledBOOLEANWhether attachment types are enabled
scheduled_publishBOOLEANWhether scheduled publishing is enabled
frequencyVARCHAR(50)Service frequency (Weekly, Monthly, etc.)
archived_atTIMESTAMPWhen service type was archived
created_atTIMESTAMPWhen created in Planning Center
updated_atTIMESTAMPLast update in Planning Center
deleted_atTIMESTAMPWhen deleted in Planning Center
custom_item_typesJSONBCustom service item types configuration
standard_item_typesJSONBStandard item types (Header, Song, Media)
background_check_permissionsVARCHAR(50)Background check requirement level
comment_permissionsVARCHAR(50)Who can comment on plans
last_plan_fromVARCHAR(50)How last plan was created
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status: ‘active’, ‘transferring’, ‘stale’
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

services_plans

Individual service plans containing all details for a specific service date.
ColumnTypeDescription
idUUIDInternal unique identifier
plan_idVARCHAR(64)Planning Center plan ID
service_type_idVARCHAR(64)Associated service type
titleVARCHAR(255)Plan title
series_titleVARCHAR(255)Sermon series title
publicBOOLEANWhether plan is publicly visible
can_view_orderBOOLEANWhether order is viewable
rehearsableBOOLEANWhether rehearsal is scheduled
multi_dayBOOLEANWhether plan spans multiple days
items_countINTEGERTotal number of service items
plan_people_countINTEGERNumber of scheduled people
needed_positions_countINTEGERNumber of unfilled positions
plan_notes_countINTEGERNumber of plan notes
service_time_countINTEGERNumber of service times
rehearsal_time_countINTEGERNumber of rehearsal times
other_time_countINTEGERNumber of other scheduled times
total_lengthINTEGERTotal service length in seconds
sort_dateTIMESTAMPDate used for chronological sorting
last_time_atTIMESTAMPLast service time
datesVARCHAR(255)Human-readable date string
short_datesVARCHAR(100)Abbreviated date string
files_expire_atTIMESTAMPWhen attached files expire
planning_center_urlVARCHAR(2048)Direct link to plan
reminders_disabledBOOLEANWhether reminders are turned off
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
permissionsVARCHAR(50)User permissions for this plan
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

services_teams

Teams of volunteers and staff who serve in ministry.
ColumnTypeDescription
idUUIDInternal unique identifier
team_idVARCHAR(64)Planning Center team ID
service_type_idVARCHAR(64)Associated service type
nameVARCHAR(255)Team name
rehearsal_teamBOOLEANWhether team attends rehearsals
secure_teamBOOLEANWhether team requires background checks
sequenceINTEGERDisplay order
schedule_toVARCHAR(50)Scheduling type (‘plan’ or ‘time’)
default_statusVARCHAR(50)Default response status
default_prepare_notificationsBOOLEANDefault notification setting
assigned_directlyBOOLEANWhether people are assigned directly
viewers_seeINTEGERWhat viewers can see
stage_colorVARCHAR(50)Color for stage display
stage_variantVARCHAR(50)Stage display variant
archived_atTIMESTAMPWhen team was archived
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
last_plan_fromVARCHAR(50)How last plan was created
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

services_people

People who participate in services as volunteers, staff, or worship team members.
ColumnTypeDescription
idUUIDInternal unique identifier
person_idVARCHAR(64)Planning Center person ID
first_nameVARCHAR(100)First name
last_nameVARCHAR(100)Last name
full_nameVARCHAR(255)Complete name
nicknameVARCHAR(100)Preferred name
given_nameVARCHAR(100)Given name
middle_nameVARCHAR(100)Middle name
birthdateDATEDate of birth
anniversaryDATEAnniversary date
photo_urlVARCHAR(2048)Profile photo URL
photo_thumbnail_urlVARCHAR(2048)Thumbnail photo URL
preferred_appVARCHAR(50)Preferred Planning Center app
assigned_to_rehearsal_teamBOOLEANWhether on rehearsal team
archivedBOOLEANWhether person is archived
site_administratorBOOLEANWhether site admin
permissionsVARCHAR(50)General permissions
media_permissionsVARCHAR(50)Media access permissions
song_permissionsVARCHAR(50)Song access permissions
statusVARCHAR(50)Active status
notesTEXTPersonal notes
passed_background_checkBOOLEANBackground check status
access_media_attachmentsBOOLEANCan access media
access_plan_attachmentsBOOLEANCan access plan files
access_song_attachmentsBOOLEANCan access song files
preferred_max_plans_per_dayINTEGERDaily scheduling limit
preferred_max_plans_per_monthINTEGERMonthly scheduling limit
praise_charts_enabledBOOLEANPraiseCharts integration
ical_codeVARCHAR(100)Calendar feed code
logged_in_atTIMESTAMPLast login time
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
archived_atTIMESTAMPWhen archived
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

services_songs

Complete song library with metadata for worship planning.
ColumnTypeDescription
idUUIDInternal unique identifier
song_idVARCHAR(64)Planning Center song ID
titleVARCHAR(255)Song title
authorVARCHAR(255)Song author/composer
copyrightVARCHAR(500)Copyright information
adminVARCHAR(255)Administrator/publisher
ccli_numberINTEGERCCLI license number
hiddenBOOLEANWhether song is hidden
notesTEXTSong notes
themesVARCHAR(500)Song themes/tags
last_scheduled_atTIMESTAMPWhen last used in service
last_scheduled_short_datesVARCHAR(100)Short date of last use
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

services_arrangements

Different arrangements and keys for songs.
ColumnTypeDescription
idUUIDInternal unique identifier
arrangement_idVARCHAR(64)Planning Center arrangement ID
song_idVARCHAR(64)Associated song
nameVARCHAR(255)Arrangement name
bpmDECIMAL(5,1)Beats per minute
lengthINTEGERLength in seconds
meterVARCHAR(10)Time signature (4/4, 3/4, etc.)
notesTEXTArrangement notes
chord_chartTEXTChord chart content
lyricsTEXTSong lyrics
sequenceJSONBSong section sequence
sequence_shortJSONBAbbreviated sequence
sequence_fullJSONBFull detailed sequence
chord_chart_keyVARCHAR(10)Musical key
chord_chart_fontVARCHAR(50)Display font
chord_chart_font_sizeINTEGERFont size
chord_chart_columnsINTEGERColumn layout
has_chordsBOOLEANWhether chords exist
has_chord_chartBOOLEANWhether chart exists
lyrics_enabledBOOLEANWhether lyrics are enabled
number_chart_enabledBOOLEANNashville number system
numeral_chart_enabledBOOLEANRoman numeral system
print_marginVARCHAR(20)Print margins
print_orientationVARCHAR(20)Portrait/landscape
print_page_sizeVARCHAR(20)Paper size
archived_atTIMESTAMPWhen archived
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

services_items

Individual elements within a service plan.
ColumnTypeDescription
idUUIDInternal unique identifier
item_idVARCHAR(64)Planning Center item ID
plan_idVARCHAR(64)Associated plan
titleVARCHAR(255)Item title
sequenceINTEGEROrder in service
lengthINTEGERDuration in seconds
item_typeVARCHAR(50)Type (song, header, media, item)
service_positionVARCHAR(50)Position (pre, during, post)
descriptionTEXTItem description
key_nameVARCHAR(10)Musical key
html_detailsTEXTFormatted details
custom_arrangement_sequenceJSONBCustom sequence
song_idVARCHAR(64)Associated song
arrangement_idVARCHAR(64)Associated arrangement
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

services_plan_people

People scheduled to serve in specific service plans.
ColumnTypeDescription
idUUIDInternal unique identifier
plan_person_idVARCHAR(64)Planning Center plan person ID
plan_idVARCHAR(64)Associated plan
person_idVARCHAR(64)Associated person
team_idVARCHAR(64)Associated team
statusVARCHAR(20)Status (C=Confirmed, U=Unconfirmed, D=Declined)
team_position_nameVARCHAR(100)Position/role name
photo_thumbnailVARCHAR(2048)Person’s photo
decline_reasonTEXTWhy declined
notesTEXTScheduling notes
prepare_notificationBOOLEANWhether to send prep notification
can_accept_partialBOOLEANCan accept partial scheduling
notification_sent_atTIMESTAMPWhen notified
notification_read_atTIMESTAMPWhen read notification
notification_prepared_atTIMESTAMPWhen notification prepared
notification_changed_atTIMESTAMPWhen notification changed
notification_changed_by_nameVARCHAR(255)Who changed notification
notification_sender_nameVARCHAR(255)Who sent notification
status_updated_atTIMESTAMPWhen status changed
scheduled_by_nameVARCHAR(255)Who scheduled this person
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

services_schedules

Individual scheduling records for people across all services.
ColumnTypeDescription
idUUIDInternal unique identifier
schedule_idVARCHAR(64)Planning Center schedule ID
person_idVARCHAR(64)Associated person
service_type_idVARCHAR(64)Associated service type
plan_idVARCHAR(64)Associated plan
team_idVARCHAR(64)Associated team
organization_nameVARCHAR(255)Organization name
service_type_nameVARCHAR(255)Service type name
team_nameVARCHAR(255)Team name
team_position_nameVARCHAR(100)Position name
person_nameVARCHAR(255)Person’s full name
sort_dateTIMESTAMPDate for sorting
datesVARCHAR(255)Service dates
short_datesVARCHAR(100)Short date format
statusVARCHAR(20)Schedule status
decline_reasonTEXTReason if declined
can_accept_partialBOOLEANCan accept partial
can_accept_partial_one_timeBOOLEANOne-time partial
can_rehearseBOOLEANAvailable for rehearsal
plan_visibleBOOLEANCan see plan
plan_visible_to_meBOOLEANPlan visible to user
position_display_timesVARCHAR(255)When position shows
responds_to_nameVARCHAR(255)Who responds to
organization_time_zoneVARCHAR(100)Time zone
organization_twenty_four_hour_timeBOOLEAN24-hour format
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

services_attachments

Files attached to plans, songs, or other resources.
ColumnTypeDescription
idUUIDInternal unique identifier
attachment_idVARCHAR(64)Planning Center attachment ID
filenameVARCHAR(255)File name
file_sizeBIGINTSize in bytes
content_typeVARCHAR(100)MIME type
urlVARCHAR(2048)Download URL
thumbnail_urlVARCHAR(2048)Thumbnail URL
linked_urlVARCHAR(2048)External link
pco_typeVARCHAR(50)Planning Center type
display_nameVARCHAR(255)Display name
filetypeVARCHAR(50)File type
remote_linkVARCHAR(2048)Remote file link
page_orderVARCHAR(50)Page ordering
licenses_purchasedINTEGERNumber of licenses
licenses_remainingINTEGERRemaining licenses
licenses_usedINTEGERUsed licenses
allow_mp3_downloadBOOLEANMP3 download allowed
web_streamableBOOLEANCan stream on web
downloadableBOOLEANCan be downloaded
transposableBOOLEANCan transpose
streamableBOOLEANCan stream
has_previewBOOLEANPreview available
attachable_typeVARCHAR(50)What it’s attached to
attachable_idVARCHAR(64)Parent resource ID
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created in Parable
system_updated_atTIMESTAMPLast update in Parable

Relationship Tables

services_plan_relationships

Links plans to series, previous/next plans, and service types.
ColumnTypeDescription
idUUIDInternal unique identifier
plan_idVARCHAR(64)Plan ID
related_entity_typeVARCHAR(50)Type of related entity
related_entity_idVARCHAR(64)Related entity ID
relationship_typeVARCHAR(50)Type of relationship
tenant_organization_idINTEGEROrganization identifier

services_team_relationships

Links teams to service types and parent teams.
ColumnTypeDescription
idUUIDInternal unique identifier
team_idVARCHAR(64)Team ID
service_type_idVARCHAR(64)Service type ID
relationship_typeVARCHAR(50)Type of relationship
tenant_organization_idINTEGEROrganization identifier

services_item_relationships

Links service items to songs, arrangements, and media.
ColumnTypeDescription
idUUIDInternal unique identifier
item_idVARCHAR(64)Item ID
related_entity_typeVARCHAR(50)Type (song, arrangement, media)
related_entity_idVARCHAR(64)Related entity ID
tenant_organization_idINTEGEROrganization identifier

Data Relationships

Key Relationships

  1. Service Planning Hierarchy
    • Service Types → Plans → Items
    • Plans → Plan Times → Plan People
  2. Team Structure
    • Teams → Team Positions → Person Team Position Assignments
    • Teams → Plan People → Schedules
  3. Song Management
    • Songs → Arrangements → Items
    • Songs → Attachments (chord charts, lead sheets)
  4. Scheduling Flow
    • People → Schedules → Plan People
    • People → Blockouts → Blockout Dates
  5. Resource Attachments
    • Plans → Attachments
    • Songs → Attachments
    • Items → Media

Query Patterns

Finding Scheduled Volunteers

SELECT
    pp.person_id,
    p.full_name,
    pp.team_position_name,
    pl.title as plan_title,
    pl.sort_date
FROM planning_center.services_plan_people pp
JOIN planning_center.services_people p ON pp.person_id = p.person_id
JOIN planning_center.services_plans pl ON pp.plan_id = pl.plan_id
WHERE pp.status = 'C'  -- Confirmed
    AND pl.sort_date >= CURRENT_DATE
ORDER BY pl.sort_date, p.full_name;

Analyzing Song Usage

SELECT
    s.title,
    s.author,
    COUNT(DISTINCT i.plan_id) as times_used,
    MAX(pl.sort_date) as last_used
FROM planning_center.services_songs s
JOIN planning_center.services_items i ON s.song_id = i.song_id
JOIN planning_center.services_plans pl ON i.plan_id = pl.plan_id
GROUP BY s.song_id, s.title, s.author
ORDER BY times_used DESC;

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: Any cost or fee columns are stored in cents - divide by 100.0 for display
  4. Scheduling Status Flags: Use fields like status and decline_reason to interpret plan assignments instead of checking system_status
  5. Direct ID Columns: Core tables such as services_plans and services_plan_people expose direct IDs for performance-sensitive joins

Common Mistakes to Avoid

  1. Missing Schema Prefix
    • FROM services_plan_people
    • FROM planning_center.services_plan_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 services_people p ON ...
    • JOIN planning_center.services_people p ON ...
  4. Forgetting Duration Conversion
    • SELECT duration_seconds as minutes
    • SELECT duration_seconds / 60.0 as minutes

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
    • RLS handles tenant and status filtering automatically
    • Filter scheduling status or declined responses when relevant
    • Consider CTEs for complex aggregations
    • Use direct ID columns when available instead of relationship tables

Data Synchronization

All Services tables use the standard Parable synchronization pattern:
  • system_status: Tracks data lifecycle (‘transferring’ → ‘active’ → ‘stale’)
  • system_created_at: When record entered Parable
  • system_updated_at: Last Parable update
  • created_at/updated_at: Original Planning Center timestamps

Notes

  • Status codes often use single letters: C=Confirmed, U=Unconfirmed, D=Declined
  • All timestamps are stored in UTC
  • JSONB fields store complex nested data structures
  • File URLs may expire based on files_expire_at timestamps
  • Person records link to the main People app for complete profiles