Controlling Planning Center LIVE with a Stream Deck

In my last post, I mentioned a great tool, Companion, that integrates with the Elgato Stream Deck. I’ve had the opportunity to write a few modules for it to extend its control capabilities, like controlling a CueServer, or my own software, ProTally.

If you work in tech for a church, chances are that you use or have at least heard of Planning Center Online to manage your worship services and people. PCO has a feature for their Services product called Services LIVE that allows you to designate where you are at in a service flow while a service is ongoing, which updates anyone who may be watching. It also records the times so you can look back later and see things like “Did that song we said would take 5 minutes actually take more like 6 minutes and 30 seconds?” It’s a very useful tool.

The interface to advance a LIVE plan, however, has not been the best for our volunteers. Even within the PCO app, the buttons to advance a plan to the next item are rather tiny, and some of my team have trouble knowing whether or not they hit the button.

This is the standard PCO Live interface. The small double arrows at the bottom left and right of the screen are the controls. Our volunteers have a hard time pressing these.

One thing that makes Planning Center Online great is that they love developers, and they’ve made a very extensive Application Programming Interface (API) available for anyone to use. This means you can get access to your service and plan data without having to actually click and browse the website.

I delved into that API this past week and used it to create a new module for Companion. One of the caveats of using the API is that in order to advance a live plan, you have to know both the service type ID and the plan ID. This requires traversing the API data some and making multiple requests. If you’re a programmer, this makes sense. If you’re just an end-user, it may not be as straightforward. So, I set out to make something easy enough for anyone to use.

Here is a walkthrough video on how the module works:

What it actually does:

  1. When you first load the module and supply it with the authentication tokens, it requests all of the available service types and stores that internally.
  2. Then it asks for the next 7 upcoming plans for each service type based on the list that was just retrieved. This is then used to build the drop down list so you can choose your plan.${serviceTypeId}/plans?filter=future&per_page=7
  3. When you send a “Previous” or “Next” command, it first asks for the LIVE information for that selected plan.${serviceTypeId}/plans/${planId}/live
  4. It checks for who the current controller of the plan is, and compares that to an internal variable in Companion that represents the owner of the authentication token.
  5. If the current controller is null, a command is sent to toggle control to the token owner, and the returning value of the current controller is stored in that internal variable so we know who “we” are for next time.${serviceTypeId}/plans/${planId}/live/toggle_control
  6. If the current controller is not null, a toggle command is sent to release control of the plan to no one, and then a toggle command is immediately sent again so that control is toggled to us. The reason for this is that if our authentication key is not the current controller, the API will return an error when we try to advance the plan.
  7. Now that we know we are in control, the current controller value returned by the API is stored as an internal variable, and then the next or previous command is sent to advance the plan.${serviceTypeId}/plans/${planId}/live/go_to_next_item

Because Node.js is an asychronous programming language, all of this is done through Promises, which is similar in concept to a callback function, however it allows for cleaner and easier to read code.

So, stay tuned for this module to become available in the next stable release of Companion, and if you’re willing to try it out in development mode, it’s available now!

The PCO Live module in action!


  1. im having trouble with the parent folder. I don’t know where to look to find the text that goes in the text box. I feel like im just being an idiot and missing it.


      1. How do I know which build to use. there is a whole list of them. Sorry if this is basics that I should know.


  2. I feel like I have found a gold mine of all the production things I have always wanted; you are awesome for sharing!!

    One question, when this loads every week, will it default to the next service, or will I have to go in and edit the take control, next, and previous buttons for each service every week?

    I notice the “# of plans to return” lists upcoming plans, so my hope is that a reboot would cause it to load the next set of plans and default to the next up in the list.

    Liked by 1 person

    1. Hey Sean! Thanks for the encouragement. For the PCO integration in Companion, I added two actions recently, “Go to Next Item of Next Plan in Selected Service Type” and “Go to Previous Item of Next Plan in Selected Service Type”, specifically to do what you want. You just select the Service Type in the action dropdown list, and it should fetch the list of plans in that service type and then advance the one that is next. That is what we do here week-to-week and it works great! That should be available in the 1.4 or 2.0 release of Companion. Hope this helps!


  3. How are you getting the feedback of what is item its currently on? I can’t seem to get any feedback to the stream deck, but i do have it functioning for next/backs


      1. Sorry. I read this so fast I assumed it was about my latest post! So PCO feedback, there are dynamic variables you can use to get the current item, but it only updates each time you press next or previous.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s