Planning Center Giving Data Model

This document provides complete documentation of the Planning Center Giving data model in Parable, including all tables, fields, and relationships.

Overview

The Giving module contains 26 entity tables and 6 relationship tables supporting donation processing, fund management, pledges, recurring donations, and financial reporting.

Query Requirements

Schema Prefix

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

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.

Core Tables Overview

Primary Entity Tables

  • giving_donations - Individual donation transactions
  • giving_people - Donor profiles
  • giving_funds - Fund definitions for designated giving
  • giving_designations - Donation allocations to funds
  • giving_batches - Groups of donations processed together
  • giving_pledges - Pledge commitments
  • giving_pledge_campaigns - Campaign definitions
  • giving_recurring_donations - Automated recurring giving

Financial Processing Tables

  • giving_batch_groups - Groups of donation batches
  • giving_payment_methods - Payment method details
  • giving_payment_sources - Sources of payments
  • giving_recurring_donation_designations - Fund allocations for recurring
  • giving_refunds - Refund transactions
  • giving_designation_refunds - Refunds for specific designations

Reference Tables

  • giving_campuses - Physical locations/campuses
  • giving_organizations - Organization settings
  • giving_labels - Categorization tags
  • giving_notes - Text notes

Relationship Tables

  • giving_donation_relationships - Links donations to related entities
  • giving_designation_relationships - Links designations to donations
  • giving_pledge_relationships - Links pledges to people
  • giving_person_relationships - Links people to other entities
  • giving_batch_relationships - Links batches to related entities
  • giving_refund_relationships - Links refunds to donations

Table Definitions

giving_donations

Individual donation transactions from donors.
ColumnTypeDescription
idUUIDInternal unique identifier
donation_idVARCHAR(64)Planning Center donation ID
amount_centsINTEGERDonation amount in cents
amount_currencyVARCHAR(10)Currency code (USD, CAD, etc.)
completed_atTIMESTAMPWhen transaction completed
created_atTIMESTAMPWhen donation was created
fee_centsINTEGERProcessing fee in cents
fee_coveredBOOLEANWhether donor covered the fee
fee_currencyVARCHAR(10)Fee currency code
payment_brandVARCHAR(255)Card brand (Visa, Mastercard, etc.)
payment_check_dated_atDATEDate on check
payment_check_numberINTEGERCheck number
payment_last4VARCHAR(4)Last 4 digits of card
payment_methodVARCHAR(255)Payment type (cash, check, card, ach)
payment_method_subVARCHAR(255)Payment subtype details
payment_statusVARCHAR(255)Transaction status
received_atTIMESTAMPWhen donation was received
refundableBOOLEANWhether donation can be refunded
refundedBOOLEANWhether donation has been refunded
updated_atTIMESTAMPLast update time
batch_idVARCHAR(64)Associated batch (direct reference)
campus_idVARCHAR(64)Associated campus (direct reference)
person_idVARCHAR(64)Donor person ID (direct reference)
payment_source_idVARCHAR(64)Payment source (direct reference)
note_idVARCHAR(64)Associated note (direct reference)
recurring_donation_idVARCHAR(64)Recurring donation (direct reference)
refund_idVARCHAR(64)Associated refund (direct reference)
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
Note: This table uses direct ID columns for performance optimization rather than relationship tables.

giving_people

Donor profiles and information.
ColumnTypeDescription
idUUIDInternal unique identifier
person_idVARCHAR(64)Planning Center person ID
donor_numberINTEGERUnique donor identifier
first_nameVARCHAR(255)Donor’s first name
last_nameVARCHAR(255)Donor’s last name
permissionsVARCHAR(255)Giving permissions
primary_campus_idVARCHAR(64)Primary campus (direct reference)
joint_giving_unit_idVARCHAR(64)Joint giving unit ID (direct reference)
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

giving_funds

Fund definitions for designated giving.
ColumnTypeDescription
idUUIDInternal unique identifier
fund_idVARCHAR(64)Planning Center fund ID
colorVARCHAR(64)Display color for fund
created_atTIMESTAMPWhen fund was created
is_defaultBOOLEANWhether this is the default/general fund
deletableBOOLEANWhether fund can be deleted
descriptionTEXTFund description
ledger_codeVARCHAR(64)Accounting ledger code
nameVARCHAR(255)Fund name
updated_atTIMESTAMPLast update time
visibilityVARCHAR(64)Who can see this fund (everywhere, admin_only, etc.)
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

giving_designations

How donations are allocated to specific funds.
ColumnTypeDescription
idUUIDInternal unique identifier
designation_idVARCHAR(64)Planning Center designation ID
amount_centsINTEGERAmount designated in cents
amount_currencyVARCHAR(10)Currency code
fee_centsINTEGERProcessing fee in cents
fund_idVARCHAR(64)Associated fund 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

giving_batches

Groups of donations processed together.
ColumnTypeDescription
idUUIDInternal unique identifier
batch_idVARCHAR(64)Planning Center batch ID
batch_group_idVARCHAR(64)Parent batch group
committed_atTIMESTAMPWhen batch was committed
created_atTIMESTAMPWhen batch was created
descriptionTEXTBatch description
statusVARCHAR(50)Batch status (in_progress, committed)
total_centsINTEGERTotal amount in cents
total_currencyVARCHAR(50)Currency code
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

giving_pledges

Pledge commitments for campaigns.
ColumnTypeDescription
idUUIDInternal unique identifier
pledge_idVARCHAR(64)Planning Center pledge ID
amount_centsINTEGERPledged amount in cents
amount_currencyVARCHAR(10)Currency code
created_atTIMESTAMPWhen pledge was made
donated_total_centsINTEGERTotal amount donated toward this pledge
joint_giver_amount_centsINTEGERAmount pledged by joint giver
joint_giver_donated_total_centsINTEGERTotal amount donated by joint giver
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

giving_pledge_campaigns

Campaign definitions for pledge drives.
ColumnTypeDescription
idUUIDInternal unique identifier
pledge_campaign_idVARCHAR(64)Planning Center campaign ID
created_atTIMESTAMPWhen campaign was created
descriptionTEXTCampaign description
ends_atTIMESTAMPCampaign end date
goal_centsINTEGERCampaign goal in cents
goal_currencyVARCHAR(255)Goal currency
nameTEXTCampaign name
received_total_from_pledges_centsINTEGERTotal received from pledged donations
received_total_outside_of_pledges_centsINTEGERTotal received from non-pledged donations
show_goal_in_church_centerBOOLEANPublic visibility of goal
starts_atTIMESTAMPCampaign start date
updated_atTIMESTAMPLast update
fund_idVARCHAR(64)Associated fund
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

giving_recurring_donations

Automated recurring giving setups.
ColumnTypeDescription
idUUIDInternal unique identifier
recurring_donation_idVARCHAR(64)Planning Center recurring ID
created_atTIMESTAMPWhen setup was created
updated_atTIMESTAMPLast update
release_hold_atTIMESTAMPWhen hold releases
amount_centsINTEGERRecurring amount in cents
amount_currencyVARCHAR(50)Currency code
statusVARCHAR(50)Status (active, paused, inactive)
last_donation_received_atTIMESTAMPMost recent successful donation
next_occurrenceTIMESTAMPNext scheduled donation
scheduleJSONBSchedule configuration
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

giving_batch_groups

Groups of donation batches for organizational purposes.
ColumnTypeDescription
idUUIDInternal unique identifier
batch_group_idVARCHAR(64)Planning Center batch group ID
committedBOOLEANWhether batch group is committed
created_atTIMESTAMPWhen created
descriptionTEXTHuman-readable description
statusVARCHAR(50)Batch group status
total_centsINTEGERTotal amount in cents
total_currencyVARCHAR(50)Currency code
updated_atTIMESTAMPLast update
owner_idVARCHAR(64)Person who owns this batch group
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

giving_payment_methods

Payment method details for recurring donations.
ColumnTypeDescription
idUUIDInternal unique identifier
payment_method_idVARCHAR(64)Planning Center payment method ID
recurring_donation_idVARCHAR(64)Associated recurring donation ID
brandVARCHAR(255)Card brand
created_atTIMESTAMPWhen created
expirationVARCHAR(10)Expiration date
last4VARCHAR(4)Last 4 digits
method_subtypeVARCHAR(255)Payment method subtype
method_typeVARCHAR(255)Payment method type
updated_atTIMESTAMPLast update
verifiedBOOLEANWhether verified
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

giving_payment_sources

Sources of payments (broader category than payment methods).
ColumnTypeDescription
idUUIDInternal unique identifier
payment_source_idVARCHAR(64)Planning Center payment source ID
created_atTIMESTAMPWhen created
nameVARCHAR(255)Display name
payment_source_typeVARCHAR(255)Type of payment source
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

giving_refunds

Refund transactions for donations.
ColumnTypeDescription
idUUIDInternal unique identifier
refund_idVARCHAR(64)Planning Center refund ID
amount_centsINTEGERRefund amount in cents
amount_currencyVARCHAR(10)Currency code
created_atTIMESTAMPWhen created
fee_centsINTEGERRefund processing fee in cents
fee_currencyVARCHAR(10)Fee currency code
refunded_atTIMESTAMPWhen refund was processed
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

giving_campuses

Physical locations/campuses for the organization.
ColumnTypeDescription
idUUIDInternal unique identifier
campus_idVARCHAR(64)Planning Center campus ID
nameTEXTCampus name
street_line_1VARCHAR(255)Street address line 1
street_line_2VARCHAR(255)Street address line 2
cityVARCHAR(255)City
stateVARCHAR(255)State
zipVARCHAR(255)ZIP code
locationVARCHAR(255)Location description
streetVARCHAR(255)Street name
line_1VARCHAR(255)Address line 1
line_2VARCHAR(255)Address line 2
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

giving_organizations

Organization-level settings and information for giving.
ColumnTypeDescription
idUUIDInternal unique identifier
organization_idVARCHAR(64)Planning Center organization ID
nameVARCHAR(255)Organization name
time_zoneVARCHAR(50)Organization time zone
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

giving_labels

Categorization tags for giving-related entities.
ColumnTypeDescription
idUUIDInternal unique identifier
label_idVARCHAR(64)Planning Center label ID
slugTEXTURL-friendly 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

giving_notes

Text notes attached to giving-related entities.
ColumnTypeDescription
idUUIDInternal unique identifier
note_idVARCHAR(64)Planning Center note ID
bodyTEXTNote content
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

giving_recurring_donation_designations

Fund allocations for recurring donations.
ColumnTypeDescription
idUUIDInternal unique identifier
recurring_donation_designation_idVARCHAR(64)Planning Center recurring donation designation ID
amount_centsINTEGERAmount designated in cents
amount_currencyVARCHAR(10)Currency code
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

giving_designation_refunds

Refunds for specific designations within donations.
ColumnTypeDescription
idUUIDInternal unique identifier
designation_refund_idVARCHAR(64)Planning Center designation refund ID
donation_idVARCHAR(64)Associated donation ID
amount_centsINTEGERRefund amount in cents
amount_currencyVARCHAR(10)Currency code
designation_idVARCHAR(64)Associated designation 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

Relationship Tables

giving_donation_relationships

Links donations to related entities beyond the direct ID columns.
ColumnTypeDescription
idUUIDInternal unique identifier
donation_idVARCHAR(64)Parent donation 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 record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

giving_designation_relationships

Links designations to donations and other entities.
ColumnTypeDescription
idUUIDInternal unique identifier
designation_idVARCHAR(64)Parent designation 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 record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

giving_pledge_relationships

Links pledges to people and campaigns.
ColumnTypeDescription
idUUIDInternal unique identifier
pledge_idVARCHAR(64)Parent pledge 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 record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

giving_person_relationships

Links people to other entities beyond the direct ID columns.
ColumnTypeDescription
idUUIDInternal unique identifier
person_idVARCHAR(64)Parent person 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 record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

giving_batch_relationships

Links batches to related entities.
ColumnTypeDescription
idUUIDInternal unique identifier
batch_idVARCHAR(64)Parent batch 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 record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

giving_refund_relationships

Links refunds to related entities.
ColumnTypeDescription
idUUIDInternal unique identifier
refund_idVARCHAR(64)Parent refund 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 record was created in Parable
system_updated_atTIMESTAMPWhen record was last updated in Parable

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

Getting Donations with Donor Information

-- CORRECT: Schema prefix included, no manual RLS filters
SELECT 
    d.donation_id,
    d.amount_cents / 100.0 as amount,
    d.amount_currency,
    p.first_name,
    p.last_name,
    p.donor_number
FROM planning_center.giving_donations d
LEFT JOIN planning_center.giving_people p 
    ON d.person_id = p.person_id
WHERE d.received_at >= CURRENT_DATE - INTERVAL '30 days'
ORDER BY d.received_at DESC;

Donation Designations by Fund

SELECT 
    f.name as fund_name,
    COUNT(DISTINCT des.designation_id) as designation_count,
    SUM(des.amount_cents) / 100.0 as total_amount
FROM planning_center.giving_funds f
JOIN planning_center.giving_designations des
    ON f.fund_id = des.fund_id
JOIN planning_center.giving_donations d
    ON des.donation_id = d.donation_id
WHERE d.received_at >= DATE_TRUNC('month', CURRENT_DATE)
    AND d.refunded = false
GROUP BY f.fund_id, f.name
ORDER BY total_amount DESC;

Batch Summary Report

SELECT 
    b.batch_id,
    b.description,
    b.committed_at,
    b.total_cents / 100.0 as batch_total,
    COUNT(d.donation_id) as donation_count,
    SUM(d.amount_cents) / 100.0 as calculated_total
FROM planning_center.giving_batches b
LEFT JOIN planning_center.giving_donations d
    ON b.batch_id = d.batch_id
WHERE b.status = 'committed'
GROUP BY b.batch_id, b.description, b.committed_at, b.total_cents
ORDER BY b.committed_at DESC;

Recurring Donation Status

SELECT 
    rd.recurring_donation_id,
    rd.amount_cents / 100.0 as amount,
    rd.status,
    rd.last_donation_received_at,
    rd.next_occurrence,
    p.first_name,
    p.last_name
FROM planning_center.giving_recurring_donations rd
LEFT JOIN planning_center.giving_donations d
    ON rd.recurring_donation_id = d.recurring_donation_id
LEFT JOIN planning_center.giving_people p
    ON d.person_id = p.person_id
WHERE rd.status = 'active'
GROUP BY rd.recurring_donation_id, rd.amount_cents, rd.status, 
         rd.last_donation_received_at, rd.next_occurrence, 
         p.first_name, p.last_name
ORDER BY rd.next_occurrence;

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: All amounts are stored in cents - divide by 100.0 for display
  4. Refunded Donations: Filter refunded = true when needed for financial reports
  5. Direct ID Columns: The giving_donations table uses direct ID columns for performance optimization

Common Mistakes to Avoid

  1. Missing Schema Prefix
    • FROM giving_donations
    • FROM planning_center.giving_donations
  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 giving_people p ON ...
    • JOIN planning_center.giving_people p ON ...
  4. Forgetting Currency Conversion
    • SELECT amount_cents as amount (displays cents)
    • SELECT amount_cents / 100.0 as amount (displays dollars)

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 refunded donations when needed
    • Consider CTEs for complex aggregations
    • Use direct ID columns when available instead of relationship tables

Data Types and Conventions

Monetary Values

  • All amounts stored in cents (INTEGER)
  • Divide by 100.0 for dollar amounts
  • Currency codes follow ISO 4217 (USD, CAD, EUR, etc.)

Dates and Times

  • TIMESTAMP fields represent UTC time
  • DATE fields for date-only values (no time component)
  • All times stored without timezone info (implicit UTC)

Payment Methods

  • payment_method - Type (cash, check, card, ach)
  • payment_method_sub - Subtype details
  • payment_status - Transaction status

Boolean Values

  • TRUE/FALSE for PostgreSQL boolean type
  • No NULL booleans - default to FALSE where appropriate

Next Steps