PCO Bridge
All posts

Connecting Planning Center to a site that isn't WordPress

Most Planning Center integration writing assumes WordPress. If you're building on Astro, Next, Nuxt, or no framework at all, here's the shape of the work.

A developer working at a desk in a home office, seen over the shoulder

Search for Planning Center website integration and you'll get WordPress plugins, a Zapier page, and a few widget vendors. If you're building a church site on something else, almost nothing is written for you. This is the shape of the work.

Pick the right credential first

Planning Center offers two paths and choosing wrong costs you a rewrite later.

A Personal Access Token belongs to a user inside one organization. It's the right choice when you're building for a single church, it takes a minute to create, and it's the fastest way to get a response back from the API.

An OAuth application is what you need if you're building something several churches will install. Planning Center suggests creating a separate organization to own the OAuth app. Start here if there's any chance this becomes a product, because migrating a live integration from PATs to OAuth is miserable.

Either way the token grants broad access to church data, so it belongs on a server. Never ship it to a browser, and never put it in a client bundle where View Source will find it.

The API is JSON:API

Planning Center's API follows the JSON:API specification, which matters more than it sounds. Relationships come back as references rather than nested objects, so the group list you fetch won't contain the related records you probably want, and you'll be using includes and a second pass to assemble what you need.

Budget real time for pagination and for the fact that a naive implementation makes far more requests than you expect. Rate limits are a thing you will meet.

Decide what you store

This is the architectural decision, and it's worth making deliberately. Fetching Planning Center on every page load ties your site's speed and uptime to someone else's API, and it means a crawler hitting fifty group pages triggers fifty API calls.

Storing a local copy and refreshing it on a schedule is almost always the better answer. Your pages render from your own database, they're fast, they work when the API is slow, and the content is in the HTML before any JavaScript runs. The cost is reconciliation: you have to notice when a group is unpublished or deleted, and withdraw your copy. Getting that wrong leaves ghost pages advertising groups that ended in March.

Where PCO Bridge fits

PCO Bridge runs a hosted server between Planning Center and your site. It handles the OAuth connection, keeps tokens encrypted server-side, and returns a normalized, privacy-safe view of published groups, so your site never holds Planning Center credentials and never talks to Planning Center directly.

A TypeScript SDK for exactly this case is in development rather than released, which is the honest status. If you're building a custom church site now and want to shape what that SDK looks like, the beta is where to say so.

PCO Bridge is in beta and applications are open to churches, developers, and agencies.

Frequently Asked Questions

Does Planning Center have an API for Groups?
Yes. Planning Center exposes Groups through its REST API, which follows the JSON:API specification and requires either a Personal Access Token or an OAuth application.
Should I use a Personal Access Token or an OAuth app?
Use a Personal Access Token when you're building for one church. Use an OAuth application if several churches will install it, because migrating from tokens to OAuth later means reconnecting every church.
Can I call the Planning Center API from the browser?
No. Planning Center credentials grant broad access to church data and belong on a server. Anything shipped to a browser is readable by anyone who views source.
Should I fetch Planning Center on every page load?
Usually not. Fetching live ties your page speed and uptime to someone else's API and multiplies requests when a crawler visits. Storing a local copy and refreshing on a schedule is normally better.