MINISTRYPLATFORM CUSTOM WIDGET

Milestone Tracker — Installation Guide

A login-protected page showing a parishioner their progress through a MinistryPlatform Journey. Each step appears as a milestone: completed steps show a green check and the date achieved, while steps still to do show an empty box and — where there is an online form or event to complete them — a Get Started button that takes the parishioner straight to it. When a linked form is submitted, the milestone can be recorded automatically, with no staff data entry.

This guide assumes you have read Getting Started. It covers only where the Milestone Tracker differs from the standard path.

The individual tracker: completed steps carry a green check and the date, and a Get Started button points at the next step.

Two versions install together from one set of files. The Individual version shows the signed-in parishioner their own milestones; the Family version shows every member of their household, each in their own section. You deploy both with the steps below and simply embed whichever pages you want.

Built on the MinistryPlatform Custom Widget framework, with a login gate matching the one used by the My Household widget.

Confirmation is only the worked example. Throughout this guide we use the Confirmation Preparation journey, but nothing here is Confirmation-specific — the Tracker works with any Journey and its Milestones. Wherever you see a Confirmation value (the journey, the group, the milestones, the forms), substitute your own. See Using a different Journey near the end.

What you need before starting

SQL Server Management Studio access to the MinistryPlatform database, edit access to the church website, an existing Journey with its Milestones defined, and a Group whose current participants are the people on that journey. The Tracker takes the parish (Congregation) from that group, so people can complete their journey at a parish other than their home parish.

The following files ship with this guide. Run them in the order shown — database scripts first, web pages last:

  • create_Milestone_Forms.sql — creates the Milestone_Forms table that maps each Milestone, per parish, to the Form and/or Event used to complete it.
  • register_Milestone_Forms_Page.sql — registers a Milestone Forms page so staff can manage those mappings in the Platform.
  • deploy_JourneyMilestonesIndividual.sql — the read procedure behind the Individual page.
  • deploy_JourneyMilestonesFamily.sql — the read procedure behind the Family page.
  • create_Process_FormResponseMilestone.sql — the MinistryPlatform Process that records a milestone automatically when a mapped form is submitted. The logic runs inline within the Process step.
  • journey-milestones-individual.html — the Individual web page.
  • journey-milestones-family.html — the Family web page.

All scripts are safe to re-run: they use CREATE OR ALTER and IF NOT EXISTS guards, so a second run will not create duplicates.

If you do not have a dedicated hosting plan or the required SQL Server skills, reach out to the professional services team for assistance. Normal hourly rates will apply.


Step 1 Create the mapping table and its page

Open each script in SSMS, confirm you are connected to the MinistryPlatform database and not master — check the database dropdown — and execute it.

Run create_Milestone_Forms.sql to create the Milestone_Forms table. A row in this table says: for this Congregation, this Milestone is completed via this Form and/or this Event. Both the Form and the Event are optional. The script also brings an already-existing table up to date automatically.

Then run register_Milestone_Forms_Page.sql to add the Milestone Forms page to the Platform.

Defining the page is not the same as granting access to it. Until the page is added to one or more security roles it will not appear in the navigation menu for any user. Once the page is defined, grant access to each role that should see it: in the Platform go to Administration → Security Roles → (the role) → Pages, add Milestone Forms to a navigation section — the same one as Milestones and Journeys is a good home — and grant rights. Repeat for every role that should have access.


Step 2 Deploy the display procedures

Run both deploy_JourneyMilestonesIndividual.sql and deploy_JourneyMilestonesFamily.sql . Each one does three things, all required:

  1. Creates the read stored procedure — dbo.api_custom_JourneyMilestonesIndividual_JSON or dbo.api_custom_JourneyMilestonesFamily_JSON — which returns a journey's milestones along with the signed-in user's completion status and the correct form or event link for the parish.
  2. Registers the procedure in dp_API_Procedures so the MinistryPlatform API is allowed to call it.
  3. Links the procedure to the Administrators security role in dp_Role_API_Procedures .

Step 3 is easy to miss and the page will not load without it. The API checks role links, not SQL permissions.

Each script ends with verification queries that should each return a row — Proc exists , API registered , Role linked.


Step 3 Deploy the automatic milestone recording

This step lets a submitted form record its milestone with no staff action. Run create_Process_FormResponseMilestone.sql , which creates a Process named Form Response – Create Milestone. The milestone-creation logic runs inline within the Process step, using the record token dp_RecordID , so there is no separate stored procedure to deploy.

The Process fires when a Form Response is created or its Contact is set and, if the submitted form is mapped in Milestone_Forms , records the milestone for that participant. The script is an upsert, so you can re-run it to apply changes.

Automatic execution depends on the Process Manager service. The MinistryPlatform Process Manager service running on your server is what actually executes a Process step. If milestones are not being created after form submissions, confirm that service is active. The display pages from Steps 2 and 5 work regardless — this step only affects automatic recording.


Step 4 Map your milestones to forms and events

Open the Milestone Forms page and add one row for each milestone a parishioner completes online. For each row choose the Congregation — the parish running the journey — the Milestone, and either a Form or an Event:

Mapping When to use it
Form The online form that completes the milestone, for example "Declare Sponsor and Choose Confirmation Name".
Event Use this when the milestone is completed by attending an event, such as a retreat. If a row has both, the page links to the Event.

A mapped Form must have a Program assigned. A milestone record requires a Program, and the Program is taken from the form. If a mapped form has no Program, the automation from Step 3 flags it for an administrator rather than creating the milestone. Set a Program on each form used in a mapping.


Step 5 Add the web pages

Create a login-gated page on the website for each version you want and add an HTML embed containing the full contents of journey-milestones-individual.html and/or journey-milestones-family.html . Everything an administrator normally touches lives in one place: the JOURNEY_CONFIG block at the very top of each file. The settings are identical across both versions.

 const JOURNEY_CONFIG = {
  dataHost:   "yourprefix",   // the part of your Platform URL before .ministryplatform.net
  journeyId:  18,             // the Journey to display (Journeys.Journey_ID)
  groupId:    136,            // the group whose participants are shown; its
                              //   Congregation is the parish used for links
  formBaseUrl:      "/your-form-page?id=",         // form GUID is appended automatically
  eventDetailsPage: "/your-event-detail-page?id=", // Event ID is appended automatically
  requireLogin: true,
  pageHeading:  "My Confirmation Journey",         // Family version: "Our Confirmation Journey"
  showAllGetStartedButtons: true   // false = show a button only on the next step
}; 
Setting What it does
dataHost Your MP host prefix — the part of your Platform URL before .ministryplatform.net , for example "catholicdemo" .
journeyId The Journey_ID to display. Change this to point the Tracker at any journey.
groupId The group whose current participants are shown. Its Congregation is used as the parish when resolving form and event links. On the Individual page this also limits the view to members of that group.
formBaseUrl , eventDetailsPage The base URLs of your form page and your event-detail page. The form's GUID or the event's ID is appended automatically to build each Get Started link.
requireLogin Leave true so the list stays hidden until a parishioner signs in.
pageHeading The heading shown above the list.
showAllGetStartedButtons true shows a button on every incomplete step; false shows a button only on the first incomplete step, so the parishioner focuses solely on their next step.

The login requirement matters here. Because these pages require a signed-in MinistryPlatform user, place them on a page that also carries the site's standard MP Login widget — the same one used on the My Household page. With requireLogin: true the page shows a brief "please sign in" panel and then reveals the milestones automatically once the visitor signs in, with no page refresh needed.

One set of procedures can power any number of pages. Because each embed points at its own journeyId and groupId , you can run a separate page per journey, all sharing the same Milestone_Forms table.


Step 6 Test

As a quick server-side check that the read procedure is reachable, open this URL in a browser, replacing yourprefix with your host prefix and using your own journey and group IDs. You should see JSON listing your group's members and their milestones:

 https://yourprefix.cloudapps.ministryplatform.cloud/sky/api/CustomWidget?storedProcedure=api_custom_JourneyMilestonesFamily_JSON&spParams=@JourneyID=18%26@GroupID=136 

Then open the new pages while signed out — you should see the "please sign in" panel. Sign in through the site's Login and the milestones should appear on their own.

The family tracker shows the same journey for every member of the household on one page. Names are obscured here for privacy.

On the Individual page you will see every milestone in the journey, completed ones dated and the rest offering a link. On the Family page you will see one section per member of your household who is in the group. Finally, submit a mapped form and confirm the milestone is recorded, subject to the Process Manager note in Step 3.


Using a different Journey

Nothing about the Tracker is tied to Confirmation. To use it for another Journey — OCIA and Becoming Catholic, marriage preparation, new-member onboarding, volunteer formation, and so on:

  1. Make sure the Journey and its Milestones exist, and that there is a group of current participants.
  2. Add the Milestone Forms rows that map those milestones to their forms or events, as in Step 4.
  3. Set journeyId and groupId in each embed, and reword pageHeading to suit.

You can run as many Trackers as you like, one page per journey, all from the same procedures and the same table.


Troubleshooting

The page shows only the "please sign in" panel and never reveals the milestones.

The page looks for the signed-in MinistryPlatform user that the standard Login widget stores in the browser. Make sure the page, or its layout, includes the site's MP Login widget, and that you actually completed sign-in. To view the page without logging in while troubleshooting, set requireLogin: false in the config — the data still requires a signed-in user.

No milestones appear at all.

Confirm the signed-in person is a current participant of the configured group, and that journeyId and groupId are correct for this system. Remember that Journey_ID and Group_ID differ between databases.

A milestone shows no Get Started button.

There is no Milestone_Forms row for that milestone at the group's Congregation, or the row has no Form or Event. Steps handled offline and recorded by staff are intentionally left blank.

A form was submitted but the milestone wasn't recorded.

Two common causes: the mapped form has no Program, covered in Step 4, or the MinistryPlatform Process Manager service is not running, covered in Step 3. The display pages are unaffected either way.

The Family page shows other families.

Confirm you deployed the current Family procedure; it scopes members to the signed-in user's own household.

"Procedure … does not exist or user does not have access to it."

The role link in dp_Role_API_Procedures . If the verification queries all pass and the API still refuses, see If the script succeeded but the API still doesn't see it in Getting Started.


MinistryPlatform configuration

Item Requirement
Journey and Milestones Your journey and its milestones must exist. Each milestone has a Sort_Order , which is the order shown on the page, and optionally a Font Awesome class in its Icon field for the small icon beside each step.
Group A group whose current participants are the people on the journey. The group's Congregation is the parish the Tracker uses to resolve form and event links, so a participant can complete the journey at a parish other than their home parish.
Forms and Events The forms and events that complete the milestones. Any form used for automatic recording needs a Program assigned. These forms should require login: when a signed-in parishioner opens the form, MinistryPlatform lets them choose which household member the response is for, and that selected person becomes the participant on the response. Parents commonly complete forms on behalf of a child — the parent is signed in, but the child is attached to the form and credited with the milestone.
Users, Contacts and Participants Parishioners need a MinistryPlatform User login, which is what the site's Login widget authenticates, linked to a Contact, which has a Participant record. The Tracker resolves the signed-in user through Users → Contacts → Participants.
Security Role The read procedures are linked to the Administrators role by the deploy scripts. To use a different role, change the Role_Name value in each script before running it.
ACST powered by Vanco · 800-736-7425 · allsales@acst.com