Planning Center Check-ins Data Model
Complete reference for Planning Center Check-ins tables in Parable: events, event times, locations, check-ins, and how attendance records connect.
This document provides complete documentation of the Planning Center Check-ins data model in Parable, including all tables, fields, and relationships.
Overview
The Check-ins module contains 41 tables supporting attendance tracking, child safety, volunteer management, and event organization.
Visual Data Model
The diagram below shows the core entities and their relationships in the Check-ins module. Use it as a visual reference while exploring the detailed table definitions below.
Core Entity Relationships
Key Relationships Explained
Event & Time Structure:
EVENTs represent recurring check-in programs (Sunday School, Nursery, etc.)EVENT_TIMEs are specific time slots when events occurEVENT_PERIODs define date ranges when events are activeLOCATION_EVENT_TIMElinks locations to specific time slots
Check-in Flow:
- Person arrives at a
LOCATIONduring anEVENT_TIME CHECKINrecord created with security code- Labels printed based on
EVENT_LABELandLOCATION_LABELconfigurations PERSON_EVENTtracks long-term attendance patterns
Label System:
LABELs define printable tags (name tags, security labels, allergy alerts)EVENT_LABELdetermines which labels print for an eventLOCATION_LABELdetermines which labels print at a location- Multiple label types can apply to single check-in
Security & Safety:
PASSes provide reusable check-in codes- Security codes generated per check-in for child pickup
STATIONs configure check-in kiosks and admin workstationsTHEMEs customize check-in interface appearance
Headcount Tracking:
HEADCOUNTrecords aggregate attendance by typeATTENDANCE_TYPEcategorizes attendees (kids, volunteers, guests)- Tracked per
EVENT_TIMEfor capacity planning
Generic Relationship Pattern:
- Check-in groups via
checkins_check_ins_relationships - Event associations via
checkins_events_relationships
Query Requirements
Schema Prefix
IMPORTANT: All tables in the Planning Center Check-ins module are in the planning_center schema. You MUST prefix all table names with planning_center. in your queries.
✅ CORRECT: SELECT * FROM planning_center.checkins_check_ins
❌ INCORRECT: SELECT * FROM checkins_check_ins
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. Adding these filters is redundant and can negatively impact query speed.
Core Tables Overview
Primary Entity Tables
checkins_check_ins- Individual check-in recordscheckins_people- People who check incheckins_events- Event definitions (Sunday Service, Youth Group, etc.)checkins_event_times- Specific instances of eventscheckins_event_periods- Active check-in sessionscheckins_locations- Physical and logical locationscheckins_stations- Check-in kiosk stationscheckins_labels- Print labels for check-inscheckins_headcounts- Manual attendance countscheckins_check_in_times- Specific check-in time records
Supporting Entity Tables
checkins_attendance_types- Types of attendance trackingcheckins_check_in_groups- Groups of check-ins processed togethercheckins_event_labels- Labels associated with eventscheckins_location_event_periods- Location-specific period countscheckins_location_event_times- Location-specific time countscheckins_location_labels- Labels for locationscheckins_options- Label printing optionscheckins_passes- Pass codes for check-inscheckins_person_events- Person-event connectionscheckins_themes- Visual themes for stationscheckins_organizations- Organization settingscheckins_integration_links- External system integrations
Relationship Tables
checkins_check_ins_relationships- Links check-ins to other entitiescheckins_events_relationships- Links events to related entitiescheckins_event_times_relationships- Links event times to events and locationscheckins_locations_relationships- Links locations to parents and eventscheckins_attendance_types_relationships- Links attendance types to eventscheckins_check_in_groups_relationships- Links check-in groups to check-ins and stationscheckins_check_in_times_relationships- Links check-in times to check-ins and locationscheckins_event_labels_relationships- Links event labels to events and labelscheckins_event_periods_relationships- Links event periods to eventscheckins_headcounts_relationships- Links headcounts to attendance types and event timescheckins_integration_links_relationships- Links integration links to external entitiescheckins_location_event_periods_relationships- Links location event periods to locations and periodscheckins_location_event_times_relationships- Links location event times to locations and event timescheckins_location_labels_relationships- Links location labels to labels and locationscheckins_options_relationships- Links options to labelscheckins_pass_relationships- Links passes to peoplecheckins_person_events_relationships- Links person events to people and eventscheckins_people_relationships- Links people to related entitiescheckins_stations_relationships- Links stations to themes and other entities
Table Definitions
checkins_check_ins
The main check-in record table that tracks individual check-ins.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
check_in_id | VARCHAR(64) | Planning Center check-in ID |
first_name | VARCHAR(255) | First name of person checking in |
last_name | VARCHAR(255) | Last name of person checking in |
kind | VARCHAR(64) | Type: 'Regular', 'Guest', 'Volunteer' |
one_time_guest | BOOLEAN | True when the guest was checked in without creating a Planning Center person record — not a first-visit flag |
security_code | VARCHAR(64) | Security code for child pickup |
number | INTEGER | Check-in number |
medical_notes | TEXT | Medical information or allergies |
emergency_contact_name | VARCHAR(255) | Emergency contact name |
emergency_contact_phone_number | VARCHAR(255) | Emergency contact phone |
created_at | TIMESTAMP | When check-in was created |
updated_at | TIMESTAMP | Last update time |
confirmed_at | TIMESTAMP | When check-in was confirmed |
checked_out_at | TIMESTAMP | When person checked out |
confirmed | BOOLEAN | Whether check-in is confirmed |
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 |
system_integration_id | INTEGER | Integration source identifier |
system_deleted_at | TIMESTAMP WITH TIME ZONE | When record was soft-deleted |
Relationships (via checkins_check_ins_relationships):
relationship_type = 'Person'→ links tocheckins_people.person_idrelationship_type = 'Event'→ links tocheckins_events.event_idrelationship_type = 'EventTime'→ links tocheckins_event_times.event_time_idrelationship_type = 'EventPeriod'→ links tocheckins_event_periods.event_period_idrelationship_type = 'Location'→ links tocheckins_locations.location_idrelationship_type = 'CheckedInAt'→ links tocheckins_stations.station_idrelationship_type = 'CheckedInBy'→ links tocheckins_people.person_idrelationship_type = 'CheckedOutBy'→ links tocheckins_people.person_idrelationship_type = 'CheckInTime'→ links tocheckins_check_in_times.check_in_time_id
checkins_people
People who have checked in to events.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
person_id | VARCHAR(64) | Planning Center person ID |
avatar_url | VARCHAR(2048) | Avatar image URL |
birthdate | DATE | Date of birth |
check_in_count | INTEGER | Total check-ins |
child | BOOLEAN | True if child |
created_at | TIMESTAMP | When person was created |
demographic_avatar_url | VARCHAR(2048) | Demographic profile image URL |
first_name | VARCHAR(255) | First name |
gender | VARCHAR(64) | Gender |
grade | INTEGER | School grade level |
headcounter | BOOLEAN | Can do headcounts |
ignore_filters | BOOLEAN | Ignores event filters |
last_checked_in_at | TIMESTAMP | Last check-in time |
last_name | VARCHAR(255) | Last name |
medical_notes | TEXT | Medical information |
middle_name | VARCHAR(255) | Middle name |
name | VARCHAR(255) | Full name |
name_prefix | VARCHAR(64) | Name prefix (Mr., Mrs., etc.) |
name_suffix | VARCHAR(64) | Name suffix (Jr., Sr., etc.) |
passed_background_check | BOOLEAN | Background check status |
permission | VARCHAR(50) | Permission level |
top_permission | VARCHAR(50) | Highest permission level |
updated_at | TIMESTAMP | Last update time |
search_name | VARCHAR(255) | Searchable name field |
addresses | JSONB | Address records |
email_addresses | JSONB | Email address records |
phone_numbers | JSONB | Phone number records |
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_integration_id | INTEGER | Integration source identifier |
system_deleted_at | TIMESTAMP WITH TIME ZONE | When record was soft-deleted |
checkins_events
Recurring event definitions (e.g., "Sunday Service", "Youth Group").
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_id | VARCHAR(64) | Planning Center event ID |
name | VARCHAR(255) | Event name |
frequency | VARCHAR(64) | How often event occurs |
enable_services_integration | BOOLEAN | Links to Services module |
location_times_enabled | BOOLEAN | Uses location-specific times |
pre_select_enabled | BOOLEAN | Pre-selection allowed |
integration_key | VARCHAR(64) | Integration identifier |
app_source | VARCHAR(255) | Source application for the event |
archived_at | TIMESTAMP | When event was archived |
created_at | TIMESTAMP | When event was created |
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 |
system_integration_id | INTEGER | Integration source identifier |
system_deleted_at | TIMESTAMP WITH TIME ZONE | When record was soft-deleted |
checkins_event_times
Specific instances of events with start and end times.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_time_id | VARCHAR(64) | Planning Center event time ID |
created_at | TIMESTAMP | When created |
day_of_week | INTEGER | Day of week (0-6) |
guest_count | INTEGER | Number of guests |
hides_at | TIMESTAMP | When event time is hidden |
hour | INTEGER | Hour of day (0-23) |
minute | INTEGER | Minute of the hour |
name | TEXT | Event time name |
regular_count | INTEGER | Number of regular attendees |
shows_at | TIMESTAMP | When event time is shown |
starts_at | TIMESTAMP | Event start time |
total_count | INTEGER | Total attendance count |
updated_at | TIMESTAMP | Last update |
volunteer_count | INTEGER | Number of volunteers |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_event_times_relationships):
relationship_type = 'Event'→ links tocheckins_events.event_id
checkins_event_periods
Active check-in sessions for events.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_period_id | VARCHAR(64) | Planning Center event period ID |
created_at | TIMESTAMP | When created |
ends_at | TIMESTAMP | Period end time |
guest_count | INTEGER | Guest count |
note | TEXT | Period notes |
regular_count | INTEGER | Regular attendee count |
starts_at | TIMESTAMP | Period start time |
volunteer_count | INTEGER | Volunteer count |
quantity | INTEGER | Total quantity |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_event_periods_relationships):
relationship_type = 'Event'→ links tocheckins_events.event_id
checkins_locations
Physical locations (rooms) and logical groupings.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
location_id | VARCHAR(64) | Planning Center location ID |
name | VARCHAR(255) | Location name |
kind | VARCHAR(255) | 'Location' for a physical room, 'Folder' for a grouping of locations |
opened | BOOLEAN | Currently open for check-ins |
child_or_adult | VARCHAR(50) | 'C' (child) or 'A' (adult); empty when unset |
gender | VARCHAR(50) | 'M' or 'F' restriction; empty when unset |
age_min_in_months | INTEGER | Minimum age in months |
age_max_in_months | INTEGER | Maximum age in months |
age_on | DATE | Date for age calculation |
age_range_by | VARCHAR(255) | How age range is determined |
grade_min | INTEGER | Minimum grade level |
grade_max | INTEGER | Maximum grade level |
max_occupancy | INTEGER | Room capacity; 0 when no limit has been set (never NULL) |
min_volunteers | INTEGER | Minimum volunteers required; 0 when not configured (never NULL) |
attendees_per_volunteer | INTEGER | Required attendees-per-volunteer ratio; 0 when not configured (never NULL) — guard divisions with > 0 |
milestone | VARCHAR(255) | Associated milestone |
position | INTEGER | Sort order |
effective_date | DATE | When settings take effect |
questions | TEXT[] | Custom questions for check-in |
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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
system_integration_id | INTEGER | Integration source identifier |
system_deleted_at | TIMESTAMP WITH TIME ZONE | When record was soft-deleted |
Relationships (via checkins_locations_relationships):
relationship_type = 'Parent'→ links to parentcheckins_locations.location_idrelationship_type = 'Event'→ links tocheckins_events.event_id
checkins_stations
Check-in kiosk stations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
station_id | VARCHAR(64) | Planning Center station ID |
created_at | TIMESTAMP | When created |
input_type | TEXT | Input method |
input_type_options | TEXT | Input configuration |
mode | INTEGER | Station mode |
name | TEXT | Station name |
timeout_seconds | INTEGER | Session timeout in seconds |
check_in_count | INTEGER | Number of check-ins at this station |
closes_at | TIMESTAMP | When station closes |
next_shows_at | TIMESTAMP | When station next becomes visible |
online | BOOLEAN | Whether station is online |
open_for_check_in | BOOLEAN | Whether station is accepting check-ins |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
checkins_labels
Print labels for check-ins.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
label_id | VARCHAR(64) | Planning Center label ID |
created_at | TIMESTAMP | When created |
name | VARCHAR(255) | Label name |
prints_for | VARCHAR(255) | Who gets this label |
roll | VARCHAR(255) | Label roll type |
updated_at | TIMESTAMP | Last update |
xml | TEXT | Label XML definition |
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_integration_id | INTEGER | Integration source identifier |
checkins_headcounts
Manual attendance counts.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
headcount_id | VARCHAR(64) | Planning Center headcount ID |
total | INTEGER | Total count |
updated_at | TIMESTAMP | When count was updated |
created_at | TIMESTAMP | When count was created |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_headcounts_relationships):
relationship_type = 'AttendanceType'→ links tocheckins_attendance_types.attendance_type_idrelationship_type = 'EventTime'→ links tocheckins_event_times.event_time_idrelationship_type = 'Location'→ links tocheckins_locations.location_id
checkins_check_in_times
Specific times when people checked into locations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
check_in_time_id | VARCHAR(64) | Planning Center check-in time ID |
kind | VARCHAR(64) | Type of check-in time |
alerts | JSONB | Alert data for this check-in time |
has_validated | BOOLEAN | Whether check-in time has been validated |
services_integrated | BOOLEAN | Whether linked to Services module |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_check_in_times_relationships):
relationship_type = 'CheckIn'→ links tocheckins_check_ins.check_in_idrelationship_type = 'EventTime'→ links tocheckins_event_times.event_time_idrelationship_type = 'Location'→ links tocheckins_locations.location_idrelationship_type = 'PreCheck'→ links to pre-check record
checkins_attendance_types
Types of attendance tracking for events.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
attendance_type_id | VARCHAR(64) | Planning Center attendance type ID |
color | VARCHAR(255) | Display color |
created_at | TIMESTAMP | When created |
attendance_limit | INTEGER | Maximum attendance |
name | VARCHAR(64) | Attendance type name |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_attendance_types_relationships):
relationship_type = 'Event'→ links tocheckins_events.event_id
checkins_check_in_groups
Groups of check-ins processed together for printing labels.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
check_in_group_id | VARCHAR(64) | Planning Center check-in group ID |
check_ins_count | INTEGER | Number of check-ins in group |
created_at | TIMESTAMP | When group was created |
name_labels_count | INTEGER | Number of name labels |
print_status | VARCHAR(64) | Printing status |
security_labels_count | INTEGER | Number of security labels |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_check_in_groups_relationships):
relationship_type = 'CheckIn'→ links tocheckins_check_ins.check_in_idrelationship_type = 'EventPeriod'→ links tocheckins_event_periods.event_period_idrelationship_type = 'Station'→ links tocheckins_stations.station_id
checkins_event_labels
Labels associated with specific events.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
event_label_id | VARCHAR(64) | Planning Center event label ID |
created_at | TIMESTAMP | When created |
for_guest | BOOLEAN | Print for guests |
for_regular | BOOLEAN | Print for regular attendees |
for_volunteer | BOOLEAN | Print for volunteers |
quantity | INTEGER | Number of labels to print |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_event_labels_relationships):
relationship_type = 'Event'→ links tocheckins_events.event_idrelationship_type = 'Label'→ links tocheckins_labels.label_id
checkins_location_event_periods
Location-specific attendance counts for event periods.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
location_event_period_id | VARCHAR(64) | Planning Center location event period ID |
created_at | TIMESTAMP | When created |
guest_count | INTEGER | Guest count for this location |
regular_count | INTEGER | Regular attendee count for this location |
updated_at | TIMESTAMP | Last update |
volunteer_count | INTEGER | Volunteer count for this location |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_location_event_periods_relationships):
relationship_type = 'EventPeriod'→ links tocheckins_event_periods.event_period_idrelationship_type = 'Location'→ links tocheckins_locations.location_id
checkins_location_event_times
Location-specific attendance counts for event times.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
location_event_time_id | VARCHAR(64) | Planning Center location event time ID |
created_at | TIMESTAMP | When created |
guest_count | INTEGER | Guest count for this location |
regular_count | INTEGER | Regular attendee count for this location |
updated_at | TIMESTAMP | Last update |
volunteer_count | INTEGER | Volunteer count for this location |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_location_event_times_relationships):
relationship_type = 'EventTime'→ links tocheckins_event_times.event_time_idrelationship_type = 'Location'→ links tocheckins_locations.location_id
checkins_location_labels
Labels associated with specific locations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
location_label_id | VARCHAR(64) | Planning Center location label ID |
created_at | TIMESTAMP | When created |
for_guest | BOOLEAN | Print for guests |
for_regular | BOOLEAN | Print for regular attendees |
for_volunteer | BOOLEAN | Print for volunteers |
quantity | INTEGER | Number of labels to print |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_location_labels_relationships):
relationship_type = 'Label'→ links tocheckins_labels.label_idrelationship_type = 'Location'→ links tocheckins_locations.location_id
checkins_options
Label printing options and configurations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
option_id | VARCHAR(64) | Planning Center option ID |
body | TEXT | Option configuration body |
created_at | TIMESTAMP | When created |
quantity | INTEGER | Quantity setting |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_options_relationships):
relationship_type = 'Label'→ links tocheckins_labels.label_id
checkins_passes
Pass codes for secure check-ins.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
pass_id | VARCHAR(64) | Planning Center pass ID |
code | VARCHAR(255) | Pass code |
created_at | TIMESTAMP | When created |
kind | VARCHAR(255) | Type of pass |
send_to | VARCHAR(255) | Delivery destination for pass |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_pass_relationships):
relationship_type = 'Person'→ links tocheckins_people.person_id
checkins_person_events
Connections between people and events they've attended.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
person_event_id | VARCHAR(64) | Planning Center person event ID |
check_in_count | INTEGER | Number of check-ins for this event |
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 record was created in Parable |
system_updated_at | TIMESTAMP | When record was last updated in Parable |
system_integration_id | INTEGER | Integration source identifier |
Relationships (via checkins_person_events_relationships):
relationship_type = 'Event'→ links tocheckins_events.event_idrelationship_type = 'Person'→ links tocheckins_people.person_idrelationship_type = 'FirstCheckIn'→ links tocheckins_check_ins.check_in_idrelationship_type = 'LastCheckIn'→ links tocheckins_check_ins.check_in_id
checkins_themes
Visual themes for check-in stations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
theme_id | VARCHAR(64) | Planning Center theme ID |
background_color | TEXT | Background color |
color | TEXT | Primary color |
created_at | TIMESTAMP | When created |
image_thumbnail | TEXT | Thumbnail image URL |
mode | TEXT | Theme mode |
name | TEXT | Theme name |
text_color | TEXT | Text color |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
checkins_organizations
Organization settings and configuration.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
organization_id | VARCHAR(64) | Planning Center organization ID |
avatar_url | VARCHAR(2048) | Organization avatar URL |
created_at | TIMESTAMP | When created |
daily_check_ins | INTEGER | Daily check-in count |
date_format_pattern | VARCHAR(64) | Date format pattern |
name | VARCHAR(255) | Organization name |
time_zone | VARCHAR(64) | Organization time zone |
updated_at | TIMESTAMP | Last update |
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_integration_id | INTEGER | Integration source identifier |
checkins_integration_links
Links to external systems and integrations.
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
integration_link_id | VARCHAR(64) | Planning Center integration link ID |
remote_app | TEXT | Remote application name |
remote_gid | TEXT | Remote global ID |
remote_id | TEXT | Remote ID |
remote_type | TEXT | Remote type |
sync_future_assignment_types | BOOLEAN | Sync future assignments |
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_integration_id | INTEGER | Integration source identifier |
Relationship Tables
All relationship tables share this common structure, with the entity ID column named after the parent entity:
| Column | Type | Description |
|---|---|---|
id | UUID | Internal unique identifier |
<entity>_id | VARCHAR(64) | Parent entity ID (e.g., check_in_id, event_id) |
relationship_type | VARCHAR(50) | Type of relationship |
relationship_id | VARCHAR(64) | ID of related entity |
tenant_organization_id | INTEGER | Organization identifier |
system_integration_id | INTEGER | Integration source identifier |
system_status | VARCHAR(50) | Data status |
system_created_at | TIMESTAMP | When created |
system_updated_at | TIMESTAMP | Last update |
checkins_check_ins_relationships
Links check-ins to people, events, locations, and other entities.
Parent ID column: check_in_id
Common relationship types:
Person- Links to checkins_peopleEvent- Links to checkins_eventsEventTime- Links to checkins_event_timesEventPeriod- Links to checkins_event_periodsLocation- Links to checkins_locations
checkins_events_relationships
Links events to other entities.
Parent ID column: event_id
checkins_locations_relationships
Links locations to parent locations and events.
Parent ID column: location_id
Common relationship types:
Parent- Links to parent checkins_locationsEvent- Links to checkins_events
checkins_event_times_relationships
Links event times to events and locations.
Parent ID column: event_time_id
checkins_attendance_types_relationships
Links attendance types to events and other entities.
Parent ID column: attendance_type_id
checkins_check_in_groups_relationships
Links check-in groups to check-ins, event periods, and stations.
Parent ID column: checkin_group_id
checkins_check_in_times_relationships
Links check-in times to check-ins, event times, and locations.
Parent ID column: check_in_time_id
checkins_event_labels_relationships
Links event labels to events and labels.
Parent ID column: event_label_id
checkins_event_periods_relationships
Links event periods to events.
Parent ID column: event_period_id
checkins_headcounts_relationships
Links headcounts to attendance types, event times, and locations.
Parent ID column: headcount_id
checkins_integration_links_relationships
Links integration links to external entities.
Parent ID column: integration_link_id
checkins_location_event_periods_relationships
Links location event periods to locations and event periods.
Parent ID column: location_event_period_id
checkins_location_event_times_relationships
Links location event times to locations and event times.
Parent ID column: location_event_time_id
checkins_location_labels_relationships
Links location labels to labels and locations.
Parent ID column: location_label_id
checkins_options_relationships
Links options to labels.
Parent ID column: option_id
checkins_pass_relationships
Links passes to people.
Parent ID column: pass_id
checkins_person_events_relationships
Links person events to people, events, and check-ins.
Parent ID column: person_event_id
checkins_people_relationships
Links people to related entities.
Parent ID column: person_id
checkins_stations_relationships
Links stations to themes and other entities.
Parent ID column: station_id
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
Joining Check-ins to People
SELECT
c.*,
p.first_name,
p.last_name,
p.birthdate
FROM planning_center.checkins_check_ins c
JOIN planning_center.checkins_check_ins_relationships cr
ON c.check_in_id = cr.check_in_id
AND cr.relationship_type = 'Person'
JOIN planning_center.checkins_people p
ON cr.relationship_id = p.person_id;Joining Check-ins to Locations
SELECT
c.*,
l.name as location_name,
l.max_occupancy
FROM planning_center.checkins_check_ins c
JOIN planning_center.checkins_check_ins_relationships cr
ON c.check_in_id = cr.check_in_id
AND cr.relationship_type = 'Location'
JOIN planning_center.checkins_locations l
ON cr.relationship_id = l.location_id;Finding Location Hierarchy
Note: checkins_locations has no parent_id column. Parent relationships are
stored in checkins_locations_relationships with relationship_type = 'Parent'.
WITH RECURSIVE location_tree AS (
-- Top-level locations: those with no Parent relationship entry
SELECT
l.location_id,
l.name,
NULL::varchar AS parent_location_id,
0 AS level
FROM planning_center.checkins_locations l
WHERE NOT EXISTS (
SELECT 1
FROM planning_center.checkins_locations_relationships lr
WHERE lr.location_id = l.location_id
AND lr.relationship_type = 'Parent'
)
UNION ALL
SELECT
l.location_id,
l.name,
lt.location_id AS parent_location_id,
lt.level + 1
FROM planning_center.checkins_locations l
JOIN planning_center.checkins_locations_relationships lr
ON l.location_id = lr.location_id
AND lr.relationship_type = 'Parent'
JOIN location_tree lt ON lr.relationship_id = lt.location_id
)
SELECT * FROM location_tree;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: Any fee or purchase columns are stored in cents - divide by 100.0 for display
- Check-in Status Flags: Use fields like
confirmed_atandchecked_out_atoncheckins_check_insto determine check-in state - Relationship Tables: Core entity tables (like
checkins_check_ins,checkins_event_times,checkins_locations) do not have direct FK columns. Use the corresponding*_relationshipstable to navigate associations (e.g.,checkins_check_ins_relationships,checkins_event_times_relationships,checkins_locations_relationships)
Common Mistakes to Avoid
-
Missing Schema Prefix
- ❌
FROM checkins_check_ins - ✅
FROM planning_center.checkins_check_ins
- ❌
-
Adding Redundant RLS Filters
- ❌
WHERE tenant_organization_id = 1 AND system_status = 'active' - ✅ Trust RLS to handle this automatically
- ❌
-
Joining Without Schema
- ❌
JOIN checkins_locations l ON ... - ✅
JOIN planning_center.checkins_locations l ON ...
- ❌
-
Skipping Currency Conversion
- ❌
SELECT fee_cents as fee - ✅
SELECT fee_cents / 100.0 as fee
- ❌
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 event period or location status when relevant
- Consider using CTEs for complex hierarchical queries
- Join through the
*_relationshipstables — entity tables carry no foreign-key columns
- Always use the
Next Steps
- Return to Basic Queries for simple examples
- Review Advanced Queries for complex analysis
Planning Center Check-ins SQL Queries
Query Planning Center Check-ins data with SQL to analyze weekend attendance, track first-time guests, and understand service-by-service patterns.
Basic Planning Center Check-ins Queries
Ready-to-run SQL for Planning Center Check-ins: who checked in today, counts by location, how full each room is, and guest versus regular attendance.