I run the software systems for Harvest Community Church and also play guitar for our 3 services on Sunday.  We’ve been using Planning Center’s Services app to schedule and manage our Sunday mornings for almost a decade. Recently Harvest moved from Rock RMS to PCO, and it’s been great, but I want to explain why we made the move and how to do it mostly seamlessly.

Why we switched to Planning Center from Rock RMS

One huge reason we picked Rock RMS initially was that it was open source. In the church, there are so many places where you can volunteer, and having an entire church management system that’s open source is an incredible opportunity to put development talents to use. We set up the database, deployed Rock to Azure, and away we went. Over time, the amount of technical maintenance and configuration it required ended up being too much overhead for our mostly non-technical volunteers. We ended up not having the usage required for it to be worth it, and the teams using Planning Center had a markedly higher engagement rate.

In addition, we Rock tended to require the volunteers and users to have a higher degree of technical capabilities. Considering this, we decided that a move to Planning Center Online was the right choice, at least for now.

How to migrate

Rock RMS Database export script

Below is the database script I used to extract the data needed from RockRMS and get it in the format needed for a Planning Center Online import.

SELECT TOP (1000)
p.[Id] as PersonId
,COALESCE( [FirstName] , '' ) as FirstName
,COALESCE([NickName], '') AS NickName
,COALESCE([MiddleName], '') AS MiddleName
,COALESCE([LastName], '') AS LastName
,[BirthDate] as Birthdate
,[AnniversaryDate] as Anniversary
--,MedicalNotes
,g.id as HouseholdID
--HouseholdPrimaryContact
--Grade
--SchoolType
--SchoolName
,CAST(
CASE
WHEN [Gender] = 1
THEN 'M'
WHEN [Gender] = 2
THEN 'F'
ELSE
''
END AS varchar) as Gender
--Child (bool)
--Barcode (Not used)
--Status (Active/Inactive)
,CAST(
CASE
WHEN [MaritalStatusValueId] = 143
THEN 'Married'
WHEN [MaritalStatusValueId] = 144
THEN 'Single'
ELSE
''
End as varchar) as MaritalStatus
--Membership (Unassigned, Member, Attender, Guest, Outreach, or custom - is case-sensitive)
--NamePrefix (Mr, Mrs, Ms, Miss, Dr, Rev, or custom - is case-sensitive)
--NameSuffix (Jr, Sr, Ph.D, I, III, or custom - is case-sensitive)
--BackgroundCheckCleared (bool)
--BackgroundCheckDateCompleted
--BackgroundCheckExpiresOn
--BackgroundCheckNote
,p.Email as HomeEmail
,'' as WorkEmail
,'' as OtherEmail
,pn.Number as HomePhoneNumber
,'' as WorkPhoneNumber
,'' as MobilePhoneNumber
,'' as PagerPhoneNumber
,'' as FaxPhoneNumber
,'' as SkypePhoneNumber
,'' as OtherPhoneNumber
,dbo.ufnCrm_GetAddress(p.Id, 'Home', 'Street1') as HomeAddressStreetLine1
,dbo.ufnCrm_GetAddress(p.Id, 'Home', 'Street2') as HomeAddressStreetLine2
,dbo.ufnCrm_GetAddress(p.Id, 'Home', 'City') as HomeAddressCity
,dbo.ufnCrm_GetAddress(p.Id, 'Home', 'State') as HomeAddressState
,dbo.ufnCrm_GetAddress(p.Id, 'Home', 'PostalCode') as HomeAddressPostalCode
,dbo.ufnCrm_GetAddress(p.Id, 'Work', 'Street2') as WorkAddressStreetLine2
,dbo.ufnCrm_GetAddress(p.Id, 'Work', 'Street1') as WorkAddressStreetLine1
,dbo.ufnCrm_GetAddress(p.Id, 'Work', 'City') as WorkAddressCity
,dbo.ufnCrm_GetAddress(p.Id, 'Work', 'State') as WorkAddressState
,dbo.ufnCrm_GetAddress(p.Id, 'Work', 'PostalCode') as WorkAddressPostalCode
-- Rock only has a "Previous Address", which may not be what you want in "Other", so commented out
--,dbo.ufnCrm_GetAddress(p.Id, "Previous", 'Street1') as OtherAddressStreetLine1
--,dbo.ufnCrm_GetAddress(p.Id, "Previous", 'Street2') as OtherAddressStreetLine2
--,dbo.ufnCrm_GetAddress(p.Id, "Previous", 'City') as OtherAddressCity
--,dbo.ufnCrm_GetAddress(p.Id, "Previous", 'State') as OtherAddressState
--,dbo.ufnCrm_GetAddress(p.Id, "Previous", 'PostalCode') as OtherAddressPostalCode
FROM [dbo].[Person] as p
LEFT JOIN PhoneNumber as pn on pn.PersonId = p.Id
LEFT JOIN GroupMember as gm on gm.PersonId = p.Id
LEFT JOIN [Group] as g on g.Id = gm.GroupId
WHERE g.GroupTypeId = 10
order by HouseholdID

Extract the data from Rock RMS

Keep in mind that this script has a “SELECT TOP(1000)” at the top because we had A LOT of data. It’s easier to test your export if you don’t pull out everyone every time. When ready, you’ll want to replace “SELECT TOP(1000)” WITH ”*” in order to pull all of the records.

You’ll notice that some of the lines are commented out for the migration from Rock RMS to PCO. These records we ended up not needing or were unused. If you do need them, those names are what PCO is looking for, so just add to the script to pull those additional pieces if needed.

Once you have the data extracted, you’ll need to get it into a CSV format. I like to use Azure Data Studio (Download here) to connect to the database and run the query because you can save the results of the above query as a CSV, which is the format Planning Center needs in order to do an import.

Importing into Planning Center Online

Once you have the data in a .csv file, log into your Planning Center account, go to the People app, and select CSV Import / Export and upload your file.

Planning Center Online Import 1024x224

Once the file is uploaded, you can review the import. You can revert it within the first few hours in case things don’t look quite.

Cleanup and Gotchas

From there, you may need to merge some people if you already have folks in the system. Keep an eye out for any Services people that you merge and make sure the email they used in Services remains their primary email. If it doesn’t, they may stop getting notifications for when they’re scheduled to serve or be unable to log in.

Hope this helps your Rock RMS to Planning Center Online migration go a little more smoothly!