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.
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 theMilestone_Formstable 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:
- Creates the read stored procedure —
dbo.api_custom_JourneyMilestonesIndividual_JSONordbo.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. - Registers the procedure in
dp_API_Proceduresso the MinistryPlatform API is allowed to call it. - 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.
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:
- Make sure the Journey and its Milestones exist, and that there is a group of current participants.
- Add the Milestone Forms rows that map those milestones to their forms or events, as in Step 4.
- Set
journeyIdandgroupIdin each embed, and rewordpageHeadingto 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. |