Skip to main content

Registrations Data Model

Overview

The Registrations module contains 11 entity tables and 3 relationship tables supporting event registration, attendee management, emergency contacts, and signup tracking.

Complete Schema Reference

This guide provides a comprehensive reference for all Planning Center Registrations tables available in Parable. Understanding this data model will help you write accurate queries and build meaningful reports for your event management needs.

Visual Data Model

The diagram below shows the core entities and their relationships in the Registrations module. Use it as a visual reference while exploring the detailed table definitions below.

Core Entity Relationships

Registrations module data model
Open diagram in new tab →

Key Relationships Explained

Registration Structure:
  • REGISTRATION defines an event or program accepting signups
  • CATEGORY organizes signup options (e.g., T-shirt size, Meal preference)
  • SELECTION_TYPE provides specific choices within categories
Signup Flow:
  1. Person creates a SIGNUP for a registration
  2. ATTENDEE(s) are added (self or others)
  3. SIGNUP_TIME(s) specify when attendees will participate
  4. SIGNUP_LOCATION(s) define where events occur
  5. EMERGENCY_CONTACT(s) provide safety information
Person vs Attendee:
  • PERSON is the signup submitter (from People module)
  • ATTENDEE can be the submitter or someone else (child, guest, etc.)
  • One signup can include multiple attendees
  • Each attendee has their own emergency contacts
Time and Location:
  • SIGNUP_TIME tracks session/workshop times
  • SIGNUP_LOCATION tracks event venues
  • Both linked to parent signup, not individual attendees
  • Supports multi-day, multi-location events
Generic Relationship Pattern:
  • Campus associations via registrations_registration_relationships
  • Additional metadata via relationship tables

Query Requirements

Schema Prefix

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

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.

Entity Tables

registrations_signups

Event signup forms and their configuration.

registrations_attendees

Individual attendee records for events.

registrations_registrations

Registration submissions (minimal fields in current implementation).

registrations_categories

Event categories for grouping and filtering.

registrations_selection_types

Pricing tiers and registration options.

registrations_signup_locations

Event venues with geographic coordinates.

registrations_signup_times

Event date and time slots.

registrations_emergency_contacts

Emergency contact information for attendees.

registrations_people

Basic person information for registrations.

registrations_campuses

Church campus locations.

registrations_organizations

Organization settings and configuration.

Relationship Tables

registrations_signup_relationships

Links signups to related entities (categories, campuses, locations, times). Relationship Types:
  • category - Links to registrations_categories
  • campus - Links to registrations_campuses
  • signup_location - Links to registrations_signup_locations
  • signup_time - Links to registrations_signup_times

registrations_registration_relationships

Links registrations to related entities. Relationship Types:
  • signup - Links to registrations_signups
  • person - Links to registrations_people

registrations_attendee_relationships

Links attendees to related entities. Relationship Types:
  • signup - Links to registrations_signups
  • registration - Links to registrations_registrations
  • emergency_contact - Links to registrations_emergency_contacts

System Fields

All tables include these system fields for data management:
  • system_status - Tracks data lifecycle:
    • transferring - Data being synced from Planning Center
    • active - Current, queryable data
    • stale - Outdated data pending removal
  • tenant_organization_id - Ensures data isolation between organizations
  • system_created_at - When Parable first received this record
  • system_updated_at - Last sync timestamp

Row Level Security

All tables implement Row Level Security (RLS) policies that:
  1. Filter data to only show active records
  2. Restrict access to the authenticated organization’s data
  3. Ensure complete data isolation between tenants

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: Cost and fee columns are stored in cents - divide by 100.0 for display
  4. Registration Status Flags: Use booleans like archived, canceled, and waitlisted to control visibility instead of relying on system_status
  5. Direct ID Columns: Core tables like registrations_signups expose direct ID columns for performance-critical joins

Common Mistakes to Avoid

  1. Missing Schema Prefix
    • FROM registrations_signups
    • FROM planning_center.registrations_signups
  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 registrations_attendees a ON ...
    • JOIN planning_center.registrations_attendees a ON ...
  4. Skipping Currency Conversion
    • SELECT total_cost_cents as total_cost
    • SELECT total_cost_cents / 100.0 as total_cost

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 registration status flags when relevant
    • Consider CTEs for complex aggregations
    • Use direct ID columns when available instead of relationship tables

Best Practices

  1. Always join through relationship tables - Relationship tables capture many-to-many links between events and related entities
  2. Trust RLS policies - Skip manual tenant_organization_id or system_status filters
  3. Use Planning Center IDs for lookups - The *_id fields (e.g., signup_id)
  4. Consider NULL values - Many fields may be NULL if not provided by Planning Center
  5. Handle timestamps properly - All timestamps are stored in UTC

Example: Complete Event Details Query

This query demonstrates how to properly join multiple related entities through the relationship tables to get complete event information.