Skip to main content
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

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_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 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_check_in_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_check_ins_relationships - Links check-ins to other entities
  • checkins_events_relationships - Links events to related entities
  • checkins_event_times_relationships - Links event times to events and locations
  • checkins_locations_relationships - Links locations to parents and events
  • checkins_attendance_types_relationships - Links attendance types to events
  • checkins_check_in_groups_relationships - Links check-in groups to check-ins and stations
  • checkins_check_in_times_relationships - Links check-in times to check-ins and locations
  • checkins_event_labels_relationships - Links event labels to events and labels
  • checkins_event_periods_relationships - Links event periods to events
  • checkins_headcounts_relationships - Links headcounts to attendance types and event times
  • checkins_integration_links_relationships - Links integration links to external entities
  • checkins_location_event_periods_relationships - Links location event periods to locations and periods
  • checkins_location_event_times_relationships - Links location event times to locations and event times
  • checkins_location_labels_relationships - Links location labels to labels and locations
  • checkins_options_relationships - Links options to labels
  • checkins_pass_relationships - Links passes to people
  • checkins_person_events_relationships - Links person events to people and events
  • checkins_people_relationships - Links people to related entities
  • checkins_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. Relationships (via checkins_check_ins_relationships):
  • relationship_type = 'Person' → links to checkins_people.person_id
  • relationship_type = 'Event' → links to checkins_events.event_id
  • relationship_type = 'EventTime' → links to checkins_event_times.event_time_id
  • relationship_type = 'EventPeriod' → links to checkins_event_periods.event_period_id
  • relationship_type = 'Location' → links to checkins_locations.location_id
  • relationship_type = 'CheckedInAt' → links to checkins_stations.station_id
  • relationship_type = 'CheckedInBy' → links to checkins_people.person_id
  • relationship_type = 'CheckedOutBy' → links to checkins_people.person_id
  • relationship_type = 'CheckInTime' → links to checkins_check_in_times.check_in_time_id

checkins_people

People who have checked in to events.

checkins_events

Recurring event definitions (e.g., “Sunday Service”, “Youth Group”).

checkins_event_times

Specific instances of events with start and end times. Relationships (via checkins_event_times_relationships):
  • relationship_type = 'Event' → links to checkins_events.event_id

checkins_event_periods

Active check-in sessions for events. Relationships (via checkins_event_periods_relationships):
  • relationship_type = 'Event' → links to checkins_events.event_id

checkins_locations

Physical locations (rooms) and logical groupings. Relationships (via checkins_locations_relationships):
  • relationship_type = 'Parent' → links to parent checkins_locations.location_id
  • relationship_type = 'Event' → links to checkins_events.event_id

checkins_stations

Check-in kiosk stations.

checkins_labels

Print labels for check-ins.

checkins_headcounts

Manual attendance counts. Relationships (via checkins_headcounts_relationships):
  • relationship_type = 'AttendanceType' → links to checkins_attendance_types.attendance_type_id
  • relationship_type = 'EventTime' → links to checkins_event_times.event_time_id
  • relationship_type = 'Location' → links to checkins_locations.location_id

checkins_check_in_times

Specific times when people checked into locations. Relationships (via checkins_check_in_times_relationships):
  • relationship_type = 'CheckIn' → links to checkins_check_ins.check_in_id
  • relationship_type = 'EventTime' → links to checkins_event_times.event_time_id
  • relationship_type = 'Location' → links to checkins_locations.location_id
  • relationship_type = 'PreCheck' → links to pre-check record

checkins_attendance_types

Types of attendance tracking for events. Relationships (via checkins_attendance_types_relationships):
  • relationship_type = 'Event' → links to checkins_events.event_id

checkins_check_in_groups

Groups of check-ins processed together for printing labels. Relationships (via checkins_check_in_groups_relationships):
  • relationship_type = 'CheckIn' → links to checkins_check_ins.check_in_id
  • relationship_type = 'EventPeriod' → links to checkins_event_periods.event_period_id
  • relationship_type = 'Station' → links to checkins_stations.station_id

checkins_event_labels

Labels associated with specific events. Relationships (via checkins_event_labels_relationships):
  • relationship_type = 'Event' → links to checkins_events.event_id
  • relationship_type = 'Label' → links to checkins_labels.label_id

checkins_location_event_periods

Location-specific attendance counts for event periods. Relationships (via checkins_location_event_periods_relationships):
  • relationship_type = 'EventPeriod' → links to checkins_event_periods.event_period_id
  • relationship_type = 'Location' → links to checkins_locations.location_id

checkins_location_event_times

Location-specific attendance counts for event times. Relationships (via checkins_location_event_times_relationships):
  • relationship_type = 'EventTime' → links to checkins_event_times.event_time_id
  • relationship_type = 'Location' → links to checkins_locations.location_id

checkins_location_labels

Labels associated with specific locations. Relationships (via checkins_location_labels_relationships):
  • relationship_type = 'Label' → links to checkins_labels.label_id
  • relationship_type = 'Location' → links to checkins_locations.location_id

checkins_options

Label printing options and configurations. Relationships (via checkins_options_relationships):
  • relationship_type = 'Label' → links to checkins_labels.label_id

checkins_passes

Pass codes for secure check-ins. Relationships (via checkins_pass_relationships):
  • relationship_type = 'Person' → links to checkins_people.person_id

checkins_person_events

Connections between people and events they’ve attended. Relationships (via checkins_person_events_relationships):
  • relationship_type = 'Event' → links to checkins_events.event_id
  • relationship_type = 'Person' → links to checkins_people.person_id
  • relationship_type = 'FirstCheckIn' → links to checkins_check_ins.check_in_id
  • relationship_type = 'LastCheckIn' → links to checkins_check_ins.check_in_id

checkins_themes

Visual themes for check-in stations.

checkins_organizations

Organization settings and configuration. Links to external systems and integrations.

Relationship Tables

All relationship tables share this common structure, with the entity ID column named after the parent entity:

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_people
  • Event - Links to checkins_events
  • EventTime - Links to checkins_event_times
  • EventPeriod - Links to checkins_event_periods
  • Location - 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_locations
  • Event - 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 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 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

Joining Check-ins to Locations

Finding Location Hierarchy

Note: checkins_locations has no parent_id column. Parent relationships are stored in checkins_locations_relationships with relationship_type = 'Parent'.

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 and checked_out_at on checkins_check_ins to determine check-in state
  5. Relationship Tables: Core entity tables (like checkins_check_ins, checkins_event_times, checkins_locations) do not have direct FK columns. Use the corresponding *_relationships table to navigate associations (e.g., checkins_check_ins_relationships, checkins_event_times_relationships, checkins_locations_relationships)

Common Mistakes to Avoid

  1. Missing Schema Prefix
    • FROM checkins_check_ins
    • FROM planning_center.checkins_check_ins
  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
    • Join through the *_relationships tables — entity tables carry no foreign-key columns

Next Steps