Skip to main content

Check-ins Data Model

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 26 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

Check-ins module data model
Open diagram in new tab →

Key Relationships Explained

Event & Time Structure:
  • EVENTs represent recurring check-in programs (Sunday School, Nursery, etc.)
  • EVENT_TIMEs are specific time slots when events occur
  • EVENT_PERIODs define date ranges when events are active
  • LOCATION_EVENT_TIME links locations to specific time slots
Check-in Flow:
  1. Person arrives at a LOCATION during an EVENT_TIME
  2. CHECKIN record created with security code
  3. Labels printed based on EVENT_LABEL and LOCATION_LABEL configurations
  4. PERSON_EVENT tracks long-term attendance patterns
Label System:
  • LABELs define printable tags (name tags, security labels, allergy alerts)
  • EVENT_LABEL determines which labels print for an event
  • LOCATION_LABEL determines 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 workstations
  • THEMEs customize check-in interface appearance
Headcount Tracking:
  • HEADCOUNT records aggregate attendance by type
  • ATTENDANCE_TYPE categorizes attendees (kids, volunteers, guests)
  • Tracked per EVENT_TIME for capacity planning
Generic Relationship Pattern:
  • Check-in groups via checkins_checkin_relationships
  • Event associations via checkins_event_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_checkins ❌ INCORRECT: SELECT * FROM checkins_checkins

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_checkins - Individual check-in records
  • checkins_people - People who check in
  • checkins_events - Event definitions (Sunday Service, Youth Group, etc.)
  • checkins_event_times - Specific instances of events
  • checkins_event_periods - Active check-in sessions
  • checkins_locations - Physical and logical locations
  • checkins_stations - Check-in kiosk stations
  • checkins_labels - Print labels for check-ins
  • checkins_headcounts - Manual attendance counts
  • checkins_check_in_times - Specific check-in time records

Supporting Entity Tables

  • checkins_attendance_types - Types of attendance tracking
  • checkins_checkin_groups - Groups of check-ins processed together
  • checkins_event_labels - Labels associated with events
  • checkins_location_event_periods - Location-specific period counts
  • checkins_location_event_times - Location-specific time counts
  • checkins_location_labels - Labels for locations
  • checkins_options - Label printing options
  • checkins_passes - Pass codes for check-ins
  • checkins_person_events - Person-event connections
  • checkins_themes - Visual themes for stations
  • checkins_organizations - Organization settings
  • checkins_integration_links - External system integrations

Relationship Tables

  • checkins_checkin_relationships - Links check-ins to other entities
  • checkins_event_relationships - Links events to related entities
  • checkins_eventtime_relationships - Links event times to events and locations
  • checkins_location_relationships - Links locations to parents and events

Table Definitions

checkins_checkins

The main check-in record table that tracks individual check-ins.
ColumnTypeDescription
idUUIDInternal unique identifier
check_in_idVARCHAR(64)Planning Center check-in ID
first_nameVARCHAR(64)First name of person checking in
last_nameVARCHAR(64)Last name of person checking in
kindVARCHAR(64)Type: ‘Regular’, ‘Guest’, ‘Volunteer’
one_time_guestBOOLEANTrue if first-time guest
security_codeVARCHAR(64)Security code for child pickup
numberINTEGERCheck-in number
medical_notesTEXTMedical information or allergies
emergency_contact_nameVARCHAR(64)Emergency contact name
emergency_contact_phone_numberVARCHAR(64)Emergency contact phone
created_atTIMESTAMPWhen check-in was created
updated_atTIMESTAMPLast update time
confirmed_atTIMESTAMPWhen check-in was confirmed
checked_out_atTIMESTAMPWhen person checked out
event_period_idVARCHAR(64)Associated event period
person_idVARCHAR(64)Associated person ID
event_idVARCHAR(64)Associated event ID
checked_in_at_idVARCHAR(64)Station where checked in
checked_in_by_idVARCHAR(64)Person who checked them in
checked_out_by_idVARCHAR(64)Person who checked them out
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

checkins_people

People who have checked in to events.
ColumnTypeDescription
idUUIDInternal unique identifier
person_idVARCHAR(64)Planning Center person ID
avatar_urlVARCHAR(2048)Avatar image URL
birthdateDATEDate of birth
check_in_countINTEGERTotal check-ins
childBOOLEANTrue if child
created_atTIMESTAMPWhen person was created
demographic_avatar_urlVARCHAR(2048)Demographic profile image URL
first_nameVARCHAR(64)First name
genderVARCHAR(64)Gender
gradeINTEGERSchool grade level
headcounterBOOLEANCan do headcounts
ignore_filtersBOOLEANIgnores event filters
last_checked_in_atTIMESTAMPLast check-in time
last_nameVARCHAR(64)Last name
medical_notesTEXTMedical information
middle_nameVARCHAR(64)Middle name
nameVARCHAR(64)Full name
name_prefixVARCHAR(64)Name prefix (Mr., Mrs., etc.)
name_suffixVARCHAR(64)Name suffix (Jr., Sr., etc.)
passed_background_checkBOOLEANBackground check status
permissionVARCHAR(50)Permission level
top_permissionVARCHAR(50)Highest permission level
updated_atTIMESTAMPLast update time
organization_idVARCHAR(64)Organization ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_events

Recurring event definitions (e.g., “Sunday Service”, “Youth Group”).
ColumnTypeDescription
idUUIDInternal unique identifier
event_idVARCHAR(64)Planning Center event ID
nameVARCHAR(255)Event name
frequencyVARCHAR(64)How often event occurs
enable_services_integrationBOOLEANLinks to Services module
location_times_enabledBOOLEANUses location-specific times
pre_select_enabledBOOLEANPre-selection allowed
integration_keyVARCHAR(64)Integration identifier
archived_atTIMESTAMPWhen event was archived
created_atTIMESTAMPWhen event was created
updated_atTIMESTAMPLast update time
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_event_times

Specific instances of events with start and end times.
ColumnTypeDescription
idUUIDInternal unique identifier
event_time_idVARCHAR(64)Planning Center event time ID
created_atTIMESTAMPWhen created
day_of_weekINTEGERDay of week (0-6)
guest_countINTEGERNumber of guests
hides_atTIMESTAMPWhen event time is hidden
hourINTEGERHour of day (0-23)
minuteINTEGERMinute of the hour
nameTEXTEvent time name
regular_countINTEGERNumber of regular attendees
shows_atTIMESTAMPWhen event time is shown
starts_atTIMESTAMPEvent start time
total_countINTEGERTotal attendance count
updated_atTIMESTAMPLast update
volunteer_countINTEGERNumber of volunteers
event_idVARCHAR(64)Parent event ID
event_period_idVARCHAR(64)Associated event period ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_event_periods

Active check-in sessions for events.
ColumnTypeDescription
idUUIDInternal unique identifier
event_period_idVARCHAR(64)Planning Center event period ID
created_atTIMESTAMPWhen created
ends_atTIMESTAMPPeriod end time
guest_countINTEGERGuest count
noteTEXTPeriod notes
regular_countINTEGERRegular attendee count
starts_atTIMESTAMPPeriod start time
volunteer_countINTEGERVolunteer count
quantityINTEGERTotal quantity
updated_atTIMESTAMPLast update
event_idVARCHAR(64)Associated event
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_locations

Physical locations (rooms) and logical groupings.
ColumnTypeDescription
idUUIDInternal unique identifier
location_idVARCHAR(64)Planning Center location ID
nameVARCHAR(255)Location name
kindVARCHAR(255)Type: ‘Folder’, ‘Location’, etc.
openedBOOLEANCurrently open for check-ins
child_or_adultVARCHAR(50)‘child’ or ‘adult’
genderVARCHAR(50)Gender restriction if any
age_min_in_monthsINTEGERMinimum age in months
age_max_in_monthsINTEGERMaximum age in months
age_onDATEDate for age calculation
age_range_byVARCHAR(255)How age range is determined
grade_minINTEGERMinimum grade level
grade_maxINTEGERMaximum grade level
max_occupancyINTEGERRoom capacity
min_volunteersINTEGERMinimum volunteers required
attendees_per_volunteerINTEGERRequired ratio
milestoneVARCHAR(255)Associated milestone
positionINTEGERSort order
effective_dateDATEWhen settings take effect
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
parent_idVARCHAR(64)Parent location ID
event_idVARCHAR(64)Associated event
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_stations

Check-in kiosk stations.
ColumnTypeDescription
idUUIDInternal unique identifier
station_idVARCHAR(64)Planning Center station ID
created_atTIMESTAMPWhen created
input_typeTEXTInput method
input_type_optionsTEXTInput configuration
modeINTEGERStation mode
nameTEXTStation name
timeout_secondsINTEGERSession timeout in seconds
updated_atTIMESTAMPLast update
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_labels

Print labels for check-ins.
ColumnTypeDescription
idUUIDInternal unique identifier
label_idVARCHAR(64)Planning Center label ID
created_atTIMESTAMPWhen created
nameVARCHAR(255)Label name
prints_forVARCHAR(255)Who gets this label
rollVARCHAR(255)Label roll type
updated_atTIMESTAMPLast update
xmlTEXTLabel XML definition
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_headcounts

Manual attendance counts.
ColumnTypeDescription
idUUIDInternal unique identifier
headcount_idVARCHAR(64)Planning Center headcount ID
totalINTEGERTotal count
updated_atTIMESTAMPWhen count was updated
created_atTIMESTAMPWhen count was created
attendance_type_idVARCHAR(64)Type of attendance
event_time_idVARCHAR(64)Associated event time
location_idVARCHAR(64)Associated location
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_checkin_times

Specific times when people checked into locations.
ColumnTypeDescription
idUUIDInternal unique identifier
check_in_time_idVARCHAR(64)Planning Center check-in time ID
kindVARCHAR(64)Type of check-in time
event_time_idVARCHAR(64)Associated event time
location_idVARCHAR(64)Associated location
check_in_idVARCHAR(64)Parent check-in ID
pre_check_idVARCHAR(64)Pre-check identifier
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_attendance_types

Types of attendance tracking for events.
ColumnTypeDescription
idUUIDInternal unique identifier
attendance_type_idVARCHAR(64)Planning Center attendance type ID
colorVARCHAR(255)Display color
created_atTIMESTAMPWhen created
attendance_limitINTEGERMaximum attendance
nameVARCHAR(64)Attendance type name
updated_atTIMESTAMPLast update
event_idVARCHAR(64)Associated event ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_checkin_groups

Groups of check-ins processed together for printing labels.
ColumnTypeDescription
idUUIDInternal unique identifier
check_in_group_idVARCHAR(64)Planning Center check-in group ID
check_ins_countINTEGERNumber of check-ins in group
created_atTIMESTAMPWhen group was created
name_labels_countINTEGERNumber of name labels
print_statusVARCHAR(64)Printing status
security_labels_countINTEGERNumber of security labels
updated_atTIMESTAMPLast update
event_period_idVARCHAR(64)Associated event period
print_station_idVARCHAR(64)Print station ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_event_labels

Labels associated with specific events.
ColumnTypeDescription
idUUIDInternal unique identifier
event_label_idVARCHAR(64)Planning Center event label ID
created_atTIMESTAMPWhen created
for_guestBOOLEANPrint for guests
for_regularBOOLEANPrint for regular attendees
for_volunteerBOOLEANPrint for volunteers
quantityINTEGERNumber of labels to print
updated_atTIMESTAMPLast update
event_idVARCHAR(64)Associated event ID
label_idVARCHAR(64)Associated label ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_location_event_periods

Location-specific attendance counts for event periods.
ColumnTypeDescription
idUUIDInternal unique identifier
location_event_period_idVARCHAR(64)Planning Center location event period ID
created_atTIMESTAMPWhen created
guest_countINTEGERGuest count for this location
regular_countINTEGERRegular attendee count for this location
updated_atTIMESTAMPLast update
volunteer_countINTEGERVolunteer count for this location
event_period_idVARCHAR(64)Associated event period
location_idVARCHAR(64)Associated location
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_location_event_times

Location-specific attendance counts for event times.
ColumnTypeDescription
idUUIDInternal unique identifier
location_event_time_idVARCHAR(64)Planning Center location event time ID
created_atTIMESTAMPWhen created
guest_countINTEGERGuest count for this location
regular_countINTEGERRegular attendee count for this location
updated_atTIMESTAMPLast update
volunteer_countINTEGERVolunteer count for this location
event_time_idVARCHAR(64)Associated event time
location_idVARCHAR(64)Associated location
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_location_labels

Labels associated with specific locations.
ColumnTypeDescription
idUUIDInternal unique identifier
location_label_idVARCHAR(64)Planning Center location label ID
created_atTIMESTAMPWhen created
for_guestBOOLEANPrint for guests
for_regularBOOLEANPrint for regular attendees
for_volunteerBOOLEANPrint for volunteers
quantityINTEGERNumber of labels to print
updated_atTIMESTAMPLast update
label_idVARCHAR(64)Associated label ID
location_idVARCHAR(64)Associated location ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_options

Label printing options and configurations.
ColumnTypeDescription
idUUIDInternal unique identifier
option_idVARCHAR(64)Planning Center option ID
bodyTEXTOption configuration body
created_atTIMESTAMPWhen created
quantityINTEGERQuantity setting
updated_atTIMESTAMPLast update
label_idVARCHAR(64)Associated label ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_passes

Pass codes for secure check-ins.
ColumnTypeDescription
idUUIDInternal unique identifier
pass_idVARCHAR(64)Planning Center pass ID
codeVARCHAR(255)Pass code
created_atTIMESTAMPWhen created
kindVARCHAR(255)Type of pass
updated_atTIMESTAMPLast update
person_idVARCHAR(64)Associated person ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_person_events

Connections between people and events they’ve attended.
ColumnTypeDescription
idUUIDInternal unique identifier
person_event_idVARCHAR(64)Planning Center person event ID
check_in_countINTEGERNumber of check-ins for this event
created_atTIMESTAMPWhen created
updated_atTIMESTAMPLast update
event_idVARCHAR(64)Associated event ID
first_check_in_idVARCHAR(64)First check-in ID
last_check_in_idVARCHAR(64)Most recent check-in ID
person_idVARCHAR(64)Associated person ID
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_themes

Visual themes for check-in stations.
ColumnTypeDescription
idUUIDInternal unique identifier
theme_idVARCHAR(64)Planning Center theme ID
background_colorTEXTBackground color
colorTEXTPrimary color
created_atTIMESTAMPWhen created
image_thumbnailTEXTThumbnail image URL
modeTEXTTheme mode
nameTEXTTheme name
text_colorTEXTText color
updated_atTIMESTAMPLast update
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

checkins_organizations

Organization settings and configuration.
ColumnTypeDescription
idUUIDInternal unique identifier
organization_idVARCHAR(64)Planning Center organization ID
avatar_urlVARCHAR(2048)Organization avatar URL
created_atTIMESTAMPWhen created
daily_check_insINTEGERDaily check-in count
date_format_patternVARCHAR(64)Date format pattern
nameVARCHAR(255)Organization name
time_zoneVARCHAR(64)Organization time zone
updated_atTIMESTAMPLast update
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable
Links to external systems and integrations.
ColumnTypeDescription
idUUIDInternal unique identifier
integration_link_idVARCHAR(64)Planning Center integration link ID
remote_appTEXTRemote application name
remote_gidTEXTRemote global ID
remote_idTEXTRemote ID
remote_typeTEXTRemote type
sync_future_assignment_typesBOOLEANSync future assignments
localVARCHAR(64)Local identifier
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

Relationship Tables

checkins_checkin_relationships

Links check-ins to people, events, locations, and other entities.
ColumnTypeDescription
idUUIDInternal unique identifier
checkin_idVARCHAR(64)Check-in ID
relationship_typeVARCHAR(50)Type: ‘Person’, ‘Event’, ‘Location’, etc.
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update
Common relationship types:
  • Person - Links to checkins_people
  • Event - Links to checkins_events
  • EventTime - Links to checkins_event_times
  • EventPeriod - Links to checkins_event_periods
  • Location - Links to checkins_locations

checkins_event_relationships

Links events to other entities.
ColumnTypeDescription
idUUIDInternal unique identifier
event_idVARCHAR(64)Event ID
relationship_typeVARCHAR(50)Type of relationship
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update

checkins_location_relationships

Links locations to parent locations and events.
ColumnTypeDescription
idUUIDInternal unique identifier
location_idVARCHAR(64)Location ID
relationship_typeVARCHAR(50)Type: ‘Parent’, ‘Event’, etc.
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update

checkins_eventtime_relationships

Links event times to events and locations.
ColumnTypeDescription
idUUIDInternal unique identifier
eventtime_idVARCHAR(64)Event time ID
relationship_typeVARCHAR(50)Type of relationship
relationship_idVARCHAR(64)ID of related entity
tenant_organization_idINTEGEROrganization identifier
system_statusVARCHAR(50)Data status
system_created_atTIMESTAMPWhen created
system_updated_atTIMESTAMPLast update

System Fields

All tables include these system fields for data management:
  • tenant_organization_id - Multi-tenant organization identifier
  • system_status - Data lifecycle status:
    • transferring - Being imported from Planning Center
    • active - Current active data
    • stale - Marked for removal
  • system_created_at - When record was created in Parable
  • system_updated_at - When record was last updated in Parable

Common Query Patterns

Joining Check-ins to People

SELECT
    c.*,
    p.first_name,
    p.last_name,
    p.birthdate
FROM planning_center.checkins_checkins c
JOIN planning_center.checkins_checkin_relationships cr
    ON c.check_in_id = cr.checkin_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_checkins c
JOIN planning_center.checkins_checkin_relationships cr
    ON c.check_in_id = cr.checkin_id
    AND cr.relationship_type = 'Location'
JOIN planning_center.checkins_locations l
    ON cr.relationship_id = l.location_id;

Finding Location Hierarchy

WITH RECURSIVE location_tree AS (
    SELECT
        location_id,
        name,
        parent_id,
        0 as level
    FROM planning_center.checkins_locations
    WHERE parent_id IS NULL
    
    UNION ALL
    
    SELECT
        l.location_id,
        l.name,
        l.parent_id,
        lt.level + 1
    FROM planning_center.checkins_locations l
    JOIN location_tree lt ON l.parent_id = lt.location_id
)
SELECT * FROM location_tree;

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 fee or purchase columns are stored in cents - divide by 100.0 for display
  4. Check-in Status Flags: Use fields like confirmed_at, checked_out_at, and headcount_type instead of relying on system_status
  5. Direct ID Columns: Core tables such as checkins_checkins and checkins_event_times expose direct IDs for fast joins

Common Mistakes to Avoid

  1. Missing Schema Prefix
    • FROM checkins_checkins
    • FROM planning_center.checkins_checkins
  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 checkins_locations l ON ...
    • JOIN planning_center.checkins_locations l ON ...
  4. Skipping Currency Conversion
    • SELECT fee_cents as fee
    • SELECT fee_cents / 100.0 as fee

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 by event period or location status when relevant
    • Consider using CTEs for complex hierarchical queries
    • Use direct ID columns when available instead of relationship tables

Next Steps