Skip to main content
Parable

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.

Transform Your Check-in Data Into Ministry Insights

Your check-in system is the heartbeat of your weekend services and events. With Parable's SQL access to Planning Center Check-ins data, you can analyze attendance patterns, optimize volunteer placement, and ensure child safetyβ€”all with nightly-synchronized data at your fingertips.

Quick Start

Ready to see who checked in today? Here's your first query:

-- See the 10 most recent check-ins
SELECT
    c.check_in_id,
    c.first_name,
    c.last_name,
    c.kind,  -- 'Regular', 'Guest', 'Volunteer'
    c.security_code,
    c.created_at as checked_in_at,
    c.checked_out_at
FROM planning_center.checkins_check_ins c
WHERE c.created_at >= CURRENT_DATE
ORDER BY c.created_at DESC
LIMIT 10;

What You Can Do With Check-ins Queries

πŸ‘₯ Track Attendance Patterns

  • Monitor weekly service attendance trends
  • Compare attendance across different service times
  • Identify seasonal patterns in attendance
  • Track first-time guest retention

πŸ‘Ά Manage Children's Ministry

  • Monitor classroom capacity and ratios
  • Track volunteer-to-child ratios with current data
  • Analyze age group distributions
  • Generate security reports for child safety

πŸ™‹ Optimize Volunteer Placement

  • Identify understaffed locations
  • Track volunteer attendance and reliability
  • Balance volunteer assignments across services
  • Monitor volunteer check-in patterns

πŸ“Š Generate Leadership Reports

  • Create attendance dashboards for leadership
  • Track growth metrics across campuses
  • Monitor event effectiveness
  • Export data for strategic planning

Available Tables

Your Planning Center Check-ins data is organized into these main tables:

TableWhat It ContainsKey Use Cases
checkins_check_insIndividual check-in recordsAttendance tracking, security codes
checkins_peoplePeople who check inPerson profiles, contact info
checkins_eventsEvent definitionsService times, recurring events
checkins_event_timesSpecific times for eventsService schedules, time-based analysis
checkins_locationsPhysical or logical locationsRooms, classrooms, volunteer areas
checkins_event_periodsCheck-in sessionsService-specific attendance
checkins_headcountsManual attendance countsTotal attendance tracking
checkins_check_in_timesTimes people checked into locationsLocation-specific attendance
checkins_labelsPrint labels for check-insName tags, security labels
checkins_stationsCheck-in kiosk stationsStation performance, usage patterns

Understanding Relationships

Just like with other Planning Center data, Check-ins stores relationships in separate tables to maintain data integrity:

  • checkins_check_ins_relationships - Links check-ins to people, events, locations
  • checkins_events_relationships - Links events to related entities
  • checkins_locations_relationships - Links locations to events and parent locations
  • checkins_event_times_relationships - Links event times to events and locations

We'll show you exactly how to join these tables in our examples!

Common Check-ins Scenarios

Finding Today's Check-ins by Location

-- Get check-ins grouped by location for today
SELECT
    l.name as location_name,
    l.kind as location_type,
    COUNT(DISTINCT c.check_in_id) as total_checkins,
    COUNT(DISTINCT CASE WHEN c.kind = 'Regular' THEN c.check_in_id END) as regular_checkins,
    COUNT(DISTINCT CASE WHEN c.kind = 'Guest' THEN c.check_in_id END) as guest_checkins,
    COUNT(DISTINCT CASE WHEN c.kind = 'Volunteer' THEN c.check_in_id END) as volunteer_checkins
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
WHERE DATE(c.created_at) = CURRENT_DATE
GROUP BY l.name, l.kind
ORDER BY total_checkins DESC;

Tracking Volunteer Coverage

-- Check volunteer-to-child ratios by location
SELECT
    l.name as location,
    l.attendees_per_volunteer as required_ratio,
    COUNT(DISTINCT CASE WHEN c.kind = 'Regular' THEN c.check_in_id END) as children,
    COUNT(DISTINCT CASE WHEN c.kind = 'Volunteer' THEN c.check_in_id END) as volunteers,
    CASE 
        WHEN COUNT(DISTINCT CASE WHEN c.kind = 'Volunteer' THEN c.check_in_id END) > 0
        THEN ROUND(COUNT(DISTINCT CASE WHEN c.kind = 'Regular' THEN c.check_in_id END)::NUMERIC / 
                   COUNT(DISTINCT CASE WHEN c.kind = 'Volunteer' THEN c.check_in_id END), 1)
        ELSE NULL
    END as actual_ratio
FROM planning_center.checkins_locations l
LEFT JOIN planning_center.checkins_check_ins_relationships cr
    ON l.location_id = cr.relationship_id
    AND cr.relationship_type = 'Location'
LEFT JOIN planning_center.checkins_check_ins c
    ON cr.check_in_id = c.check_in_id
    AND DATE(c.created_at) = CURRENT_DATE
    AND c.checked_out_at IS NULL  -- Only currently checked in
WHERE l.kind = 'Location'  -- Physical rooms only (Folder rows are groupings)
    AND l.child_or_adult = 'C'
GROUP BY l.name, l.attendees_per_volunteer
ORDER BY l.name;

Next Steps

πŸ“š New to SQL? Start with Basic Queries for simple, powerful queries you can use today.

πŸš€ Ready for More? Check out Advanced Queries for complex analysis and reporting.

πŸ“Š Need Reports? See Reporting Examples for complete, production-ready reports.

πŸ” Want Details? Review the Data Model for complete table documentation.

Common Questions

What's the difference between an Event and an Event Time?

  • An Event is the recurring definition (e.g., "Sunday Service")
  • An Event Time is a specific instance (e.g., "Sunday Service at 9:00 AM on Jan 7, 2024")
  • Event Periods represent active check-in sessions

How do I find people who haven't checked out?

Look for records where checked_out_at IS NULL:

SELECT first_name, last_name, security_code, created_at
FROM planning_center.checkins_check_ins
WHERE checked_out_at IS NULL
  AND DATE(created_at) = CURRENT_DATE
ORDER BY created_at DESC;

What does the 'kind' field mean?

The kind field identifies the type of check-in:

  • Regular - Standard attendee (usually children)
  • Guest - First-time or visiting attendee
  • Volunteer - Someone serving in ministry

How do I track guests?

Use kind = 'Guest'. The separate one_time_guest flag means the guest was checked in without creating a person record, and covers only about 29% of guest check-ins β€” it is not a first-visit flag.

SELECT
    COUNT(*) as guest_check_ins,
    COUNT(*) FILTER (WHERE one_time_guest = true) as without_a_profile
FROM planning_center.checkins_check_ins
WHERE kind = 'Guest'
  AND DATE(created_at) >= CURRENT_DATE - INTERVAL '7 days';

For genuine first visits, compare each person's earliest check-in date β€” see First-Time Guest Return Rate.

Getting Help

  • πŸ› Found an issue? Report it at github.com/getparable/parable-api/issues
  • πŸ“– Need more examples? Check our other query guides in this folder
  • πŸ’¬ Have questions? Reach out to your Parable support team

Your attendance data tells a story of growth and engagement. Let's help you understand it.

On this page