npsp-program-management

Use this skill when configuring or troubleshooting the Nonprofit Success Pack Program Management Module (PMM) — a separate managed package for program delivery, cohort setup, service scheduling, service delivery recording, and outcome/attendance tracking for beneficiaries. Trigger keywords: program management module, PMM, Program__c, ProgramEngagement__c, ServiceDelivery__c, cohort setup, bulk service delivery, service schedule, service participant. NOT for NPSP core donor management, gift entry, recurring donations, soft credits, or Health Cloud care programs.

Best use case

npsp-program-management is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Use this skill when configuring or troubleshooting the Nonprofit Success Pack Program Management Module (PMM) — a separate managed package for program delivery, cohort setup, service scheduling, service delivery recording, and outcome/attendance tracking for beneficiaries. Trigger keywords: program management module, PMM, Program__c, ProgramEngagement__c, ServiceDelivery__c, cohort setup, bulk service delivery, service schedule, service participant. NOT for NPSP core donor management, gift entry, recurring donations, soft credits, or Health Cloud care programs.

Teams using npsp-program-management should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/npsp-program-management/SKILL.md --create-dirs "https://raw.githubusercontent.com/PranavNagrecha/AwesomeSalesforceSkills/main/skills/admin/npsp-program-management/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/npsp-program-management/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How npsp-program-management Compares

Feature / Agentnpsp-program-managementStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Use this skill when configuring or troubleshooting the Nonprofit Success Pack Program Management Module (PMM) — a separate managed package for program delivery, cohort setup, service scheduling, service delivery recording, and outcome/attendance tracking for beneficiaries. Trigger keywords: program management module, PMM, Program__c, ProgramEngagement__c, ServiceDelivery__c, cohort setup, bulk service delivery, service schedule, service participant. NOT for NPSP core donor management, gift entry, recurring donations, soft credits, or Health Cloud care programs.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# NPSP Program Management Module (PMM)

This skill activates when configuring, troubleshooting, or extending the Salesforce Nonprofit Success Pack Program Management Module (PMM). PMM is a separate managed package from NPSP core — it provides eight custom objects for tracking program delivery to beneficiaries (clients). It has no rollup or trigger integration with NPSP's donation infrastructure.

---

## Before Starting

Gather this context before working on anything in this domain:

- Confirm PMM is installed: check for `pmdm` namespace in Setup > Installed Packages. If the namespace is absent, PMM is not installed — do not attempt to create PMM objects.
- Identify whether the org uses bulk service delivery (the mass-entry quick action) or individual ServiceDelivery__c records. The bulk path has a mandatory field-ordering requirement that causes silent save failures.
- Confirm the NPSP version: PMM is versioned independently and may lag behind NPSP core releases. Check both package versions before troubleshooting cross-package behavior.
- Understand the program structure: each Program__c has zero-to-many Service__c records (the types of help delivered) and zero-to-many ProgramCohort__c records (the time-bounded groups). A Contact is linked to a Program via a ProgramEngagement__c record and to a cohort session via ServiceParticipant__c.

---

## Core Concepts

PMM introduces eight custom objects that model the full program delivery lifecycle. Practitioners who treat these as analogs of NPSP donor objects or Health Cloud care plan objects will misconfigure them.

### The Eight PMM Objects and Their Roles

| Object | Purpose |
|---|---|
| Program__c | Top-level program entity. Has Status (Active/Inactive) and Program Issues/Target Population fields. |
| Service__c | A type of service offered within a program (e.g., Food Pantry, Job Training). Lookup to Program__c. |
| ProgramEngagement__c | Junction between a Contact and a Program. Tracks enrollment date, stage (Enrolled/Active/Graduated/Withdrawn), and cohort assignment. |
| ProgramCohort__c | A time-bounded cohort within a Program (e.g., Spring 2025 Cohort). Has Start/End Date. |
| ServiceDelivery__c | Records one delivery of a service to one client. Captures quantity, date, and optional outcome data. |
| ServiceSchedule__c | A recurring schedule (e.g., every Tuesday) for delivering a service. Parent of ServiceParticipant__c. |
| ServiceParticipant__c | Links a ProgramEngagement__c to a ServiceSchedule__c — identifies who attends a scheduled session. |

There is no eighth object in this list (the research notes cite eight, but the seven above are the primary operational objects documented in Salesforce Help as of Spring '25). Always verify the installed package's object count in Setup.

### Bulk Service Delivery Field Set Ordering

PMM ships a Quick Action called Bulk Service Deliveries that renders a lightning data table for entering multiple service deliveries at once. The field set that controls which columns appear is `ServiceDelivery__c.Bulk_Service_Deliveries_Fields`. The field order within this field set is mandatory and enforced at runtime:

1. **Client** (lookup to Contact) — must be first
2. **Program Engagement** (lookup to ProgramEngagement__c) — must be second
3. **Service** (lookup to Service__c) — must be third

If these three fields are not in this exact order, the bulk entry action will not cascade correctly — selecting a Client will not filter the Program Engagement picklist, and selecting a Program Engagement will not filter the Service options. Additional fields (Quantity, Delivery Date, etc.) may appear after these three in any order.

Marking a field as Required inside the field set does NOT enforce save-time validation. Fields appear with a red asterisk for visual guidance only. To enforce required values, add validation rules on ServiceDelivery__c directly.

### PMM and NPSP Are Separate Data Stacks

PMM data does not flow into NPSP rollup fields, opportunity records, or gift entry. ServiceDelivery__c records are not Opportunities. Program revenue (grants funding the program) is tracked as NPSP Opportunities through the normal donor management path — but the operational delivery data (who received a service, when, how much) lives entirely in PMM objects.

Do not attempt to create formula fields or cross-object rollups from ServiceDelivery__c to npo02__HouseholdContactRoles__c or any NPSP giving rollup field — the objects are in different namespaces and have no platform relationship.

---

## Common Patterns

### Pattern: Full Program Setup from Scratch

**When to use:** A new program is being stood up with defined cohorts and scheduled service delivery sessions.

**How it works:**
1. Create Program__c: set Status = Active, populate Program Issues (optional) and Target Population (optional).
2. Create one or more Service__c records, each looking up to the Program__c.
3. Create one or more ProgramCohort__c records with Start Date and End Date.
4. As clients enroll, create ProgramEngagement__c records: lookup to Contact, lookup to Program__c, assign a cohort via the ProgramCohort__c field, set Stage = Enrolled.
5. If using scheduled sessions, create a ServiceSchedule__c (with Service__c, start/end, and recurrence), then create ServiceParticipant__c records linking each ProgramEngagement__c to the schedule.
6. Record delivery: create ServiceDelivery__c per client per session, or use the Bulk Service Deliveries quick action.

**Why not the alternative:** Creating ServiceDelivery__c records without a ProgramEngagement__c breaks attendance tracking — the PMM attendance report depends on the ProgramEngagement__c link to identify which clients are active in a program.

### Pattern: Enforcing Required Fields in Bulk Service Delivery

**When to use:** Staff use the Bulk Service Deliveries action but leave required fields blank, causing silent incomplete records.

**How it works:**
1. Identify which fields must be populated (e.g., Quantity, Delivery Date).
2. Do NOT rely on field-set Required flag — it is visual only.
3. Create validation rules on ServiceDelivery__c. Example for Quantity:
   ```
   Rule name: PMM_Require_Quantity_On_Bulk_Save
   Condition: AND(
     ISBLANK(pmdm__Quantity__c),
     $RecordType.Name = 'Service Delivery'
   )
   Error message: "Quantity is required for all service deliveries."
   ```
4. Test by attempting to save a bulk delivery row with the field empty — the row should error and remain unsaved.

**Why not the alternative:** The field-set Required flag renders a red asterisk but does not invoke the Salesforce save validation pipeline. Validation rules are the only enforcement mechanism for PMM bulk entry.

---

## Decision Guidance

| Situation | Recommended Approach | Reason |
|---|---|---|
| Need to track individual service sessions with attendance | Use ServiceSchedule__c + ServiceParticipant__c | Provides recurrence, participant roster, and attendance reporting in PMM reports |
| Need to record one-off service deliveries without a schedule | Create ServiceDelivery__c directly with ProgramEngagement__c | Lighter weight; appropriate for drop-in services with no fixed schedule |
| Staff enter deliveries for many clients at once | Use Bulk Service Deliveries quick action | Purpose-built for mass entry; ensure correct field-set order before enabling |
| Required field not being enforced in bulk entry | Add validation rule on ServiceDelivery__c | Field-set Required flag is visual only; only validation rules enforce saves |
| Concurrent bulk saves by multiple staff causing errors | Stagger entry times or use retry guidance | ServiceDelivery__c bulk saves acquire row locks; concurrent inserts to the same parent record collide |
| Reporting on service volume for grant reporting | Use PMM packaged reports and dashboards | They aggregate ServiceDelivery__c by Program, Service, and Cohort — do not try to build this from NPSP Opportunity data |

---

## Recommended Workflow

Step-by-step instructions for an AI agent or practitioner working on this task:

1. Verify PMM is installed and identify the installed version: Setup > Installed Packages > look for "Program Management Module" with the `pmdm` namespace. Note the version number. Confirm the NPSP core package version separately.
2. Map the program structure: gather the list of programs, services, cohorts, and enrollment stages the org needs. Confirm whether sessions are scheduled (needs ServiceSchedule__c) or ad hoc (direct ServiceDelivery__c creation).
3. Create Program__c and Service__c records in the correct order: Program first, then Services (each with a Program__c lookup). Do not create Service__c without a parent Program__c — it leaves orphaned service records that cannot be used in bulk entry.
4. Create ProgramEngagement__c records for each enrolled Contact. Assign cohort if cohorts are in use. Set Stage = Enrolled (or Active if they are currently receiving services).
5. If using scheduled delivery: create ServiceSchedule__c records, then create ServiceParticipant__c records for each active engagement. Confirm recurrence settings match the real schedule.
6. Configure the Bulk Service Deliveries field set if staff will use the quick action: verify Client is first, Program Engagement is second, Service is third. Add required-field validation rules to ServiceDelivery__c for any field that must be populated.
7. Test end-to-end: create a test Program Engagement, use the Bulk Service Deliveries action to save a delivery, verify the ServiceDelivery__c record is created with all required fields, and confirm the record appears in PMM packaged reports.

---

## Review Checklist

Run through these before marking work in this area complete:

- [ ] PMM package (pmdm namespace) is confirmed installed and version is noted
- [ ] All Program__c records have Status = Active for programs currently delivering services
- [ ] All Service__c records have a valid Program__c lookup (no orphaned services)
- [ ] ProgramEngagement__c records exist for all enrolled contacts, each with a Program__c lookup and a Stage value
- [ ] Bulk Service Deliveries field set has Client first, Program Engagement second, Service third
- [ ] Validation rules exist on ServiceDelivery__c for any field that must be required (not relying on field-set Required flag alone)
- [ ] PMM packaged reports return correct data for service delivery counts and attendance
- [ ] No attempt has been made to roll up ServiceDelivery__c data into NPSP Opportunity or giving rollup fields

---

## Salesforce-Specific Gotchas

Non-obvious platform behaviors that cause real production problems:

1. **Field-set Required flag does not enforce saves in Bulk Service Delivery** — The Required checkbox in a PMM field set renders a red asterisk in the UI but does not invoke Salesforce's save-validation pipeline. Staff can save a record with the field blank. Enforcement requires a validation rule on ServiceDelivery__c.
2. **Bulk Service Deliveries field order is functional, not cosmetic** — The Client, Program Engagement, and Service columns must be in that exact order in the field set. Out-of-order fields break the cascading picklist filtering. The UI does not show an error — it simply does not filter correctly, causing staff to select mismatched combinations.
3. **Rowlock errors under concurrent bulk saves** — When two or more staff members submit bulk service delivery batches simultaneously against the same Program or ProgramEngagement__c parent, Salesforce's row-locking mechanism causes UNABLE_TO_LOCK_ROW errors on some records. The saves partially succeed; affected rows must be resubmitted. Mitigation: stagger bulk entry across staff, or implement retry logic in a Flow that calls the save asynchronously.
4. **PMM data does not appear in NPSP donation reports** — ServiceDelivery__c records are not Opportunities and have no relationship to NPSP rollup fields (npo02__TotalOppAmount__c, etc.). Trying to build a grant report by querying NPSP giving data will miss all service delivery volume. Use PMM's own packaged reports or build custom reports on ServiceDelivery__c directly.
5. **Deleting a ProgramEngagement__c cascades to ServiceDelivery__c** — Because ServiceDelivery__c has a lookup (not master-detail) to ProgramEngagement__c, deleting an engagement does not automatically delete delivery records by default, but depending on the lookup behavior setting, orphaned delivery records may lose their program context. Always check the lookup relationship's delete behavior before bulk-deleting engagement records.

---

## Output Artifacts

| Artifact | Description |
|---|---|
| Program setup checklist | Completed record of Program__c, Service__c, and ProgramCohort__c configuration |
| Bulk Service Delivery field set audit | Field order and Required-flag review with validation rule recommendations |
| ServiceDelivery__c validation rules | Rules enforcing required fields that the field set cannot enforce |
| PMM report audit | Confirmation that packaged PMM reports return correct data for active programs |

---

## Related Skills

- `npsp-household-accounts` — For understanding how Contacts are modeled in NPSP before linking them to PMM ProgramEngagement__c records
- `gift-entry-and-processing` — For tracking program revenue (grants and donations) on the donor side; PMM covers the beneficiary/delivery side
- `care-program-management` — For Health Cloud care programs (a completely different object model; do not confuse with PMM)

Related Skills

session-management-and-timeout

8
from PranavNagrecha/AwesomeSalesforceSkills

Use this skill when configuring session timeout values, concurrent session limits, session IP locking, or logout behavior in Salesforce. Covers org-wide session settings, profile-level overrides, Connected App session policies, and Metadata API SecuritySettings deployment. NOT for OAuth token refresh flows, login IP ranges, or MFA/identity-provider configuration.

oauth-token-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Use when work depends on how Salesforce OAuth access and refresh tokens are issued, refreshed, rotated, revoked, or introspected for a Connected App or API client—including unexpected logouts, invalid_grant after refresh, or designing token incident response. NOT for choosing which OAuth grant or Connected App flow to implement (use integration/oauth-flows-and-connected-apps), Named Credential packaging (use integration/named-credentials-setup), or broad Connected App IP and PKCE policy hardening without a token-lifecycle angle (use security/connected-app-security-policies).

certificate-and-key-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Use this skill when creating, uploading, or rotating certificates in Salesforce, configuring mutual TLS (mTLS) client authentication, managing the Java KeyStore for CA-signed certificates, diagnosing certificate expiry in JWT OAuth flows, or understanding which certificate types Salesforce supports and how to migrate them between orgs. NOT for Named Credential configuration (use named-credentials-setup skill), NOT for Shield Platform Encryption key management. Trigger keywords: Certificate and Key Management, self-signed certificate, CA-signed certificate, mutual TLS, mTLS, keystore, JKS, PKCS12, certificate rotation, certificate expiry, JWT certificate.

flexcard-state-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Use when designing FlexCard actions, conditional visibility, and state that must survive navigation, refresh, or parent/child card transitions. Triggers: 'flexcard state', 'flexcard conditional visibility', 'flexcard actions', 'flexcard refresh', 'child flexcard state'. NOT for raw LWC state or for OmniScript step state.

lwc-state-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Share state across LWCs using pub/sub, Lightning Message Service, @wire, and reactive stores. NOT for in-component reactivity.

lwc-focus-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Use when building LWCs that need to manage focus explicitly — modal dialogs, wizard flows, dynamic inserts, list updates, error summaries, and focus after async work. Covers focus restoration, focus traps, programmatic focus across shadow DOM, and patterns for announcing changes to assistive tech. Does NOT cover general LWC a11y audit (see lwc-accessibility).

revenue-lifecycle-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Use this skill when implementing or troubleshooting Salesforce Revenue Lifecycle Management (RLM) — the native Revenue Cloud product covering order-to-cash lifecycle, Dynamic Revenue Orchestrator (DRO) fulfillment plan design, asset amendments, billing schedule creation via Connect API, and invoice management. Triggers on: Dynamic Revenue Orchestrator, RLM order decomposition, DRO fulfillment swimlanes, native Revenue Cloud billing schedule, asset lifecycle management Salesforce. NOT for CPQ quoting or pricing rules (use cpq-* skills), not for the legacy Salesforce Billing managed package with blng__* objects (different product entirely), not for standard Order objects without Revenue Cloud features.

loyalty-management-setup

8
from PranavNagrecha/AwesomeSalesforceSkills

Use this skill when setting up or extending Salesforce Loyalty Management — including program and currency creation, tier group design, qualifying vs. non-qualifying point currency separation, DPE batch job activation, partner loyalty configuration, and member portal setup on Experience Cloud. Triggers on: Loyalty Management setup, loyalty tier setup Salesforce, qualifying points vs redemption points, DPE batch job for loyalty, partner loyalty program Salesforce, loyalty member portal. NOT for Marketing Cloud engagement program design (separate product), not for B2B loyalty via Sales Cloud (standard opportunity, not loyalty program), not for general Experience Cloud site setup (use experience-cloud-setup skill).

scratch-org-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Use this skill when designing, configuring, or troubleshooting scratch orgs: definition file structure, edition selection, allocation limits, Org Shape, CI automation via ScratchOrgInfo, and lifecycle management from the Dev Hub. NOT for SFDX CLI basics (use sf-cli-and-sfdx-essentials), sandbox management, or production org administration.

release-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Use when planning, coordinating, or governing Salesforce releases: version numbering, rollback strategy, release notes, go/no-go criteria, release calendar, and sandbox preview alignment. NOT for deployment mechanics (use devops/post-deployment-validation or devops/change-set-deployment).

pipeline-secrets-management

8
from PranavNagrecha/AwesomeSalesforceSkills

Store and inject Salesforce auth URLs, JWT keys, and API credentials into CI without leaking them. NOT for runtime secrets in Apex.

isv-license-management-and-trialforce

8
from PranavNagrecha/AwesomeSalesforceSkills

Use when an ISV partner is wiring license enforcement, trial provisioning, or feature-flag distribution into a managed package — covers License Management App (LMA) install and registration, Lead/License object lifecycle, Trialforce Management Org (TMO) and Trialforce Source Org (TSO) split, Trialforce templates, SignupRequest API, AppExchange Checkout integration, and Feature Parameters (LmoToSubscriber / SubscriberToLmo) as the cross-org configuration channel. Triggers: 'register package with LMA', 'set up Trialforce', 'add feature parameter to managed package', 'license expired in subscriber org', 'AppExchange Checkout licensing'. NOT for general managed-package version creation, ancestor pinning, or PostInstall handler design (use managed-package-development); NOT for second-generation packaging mechanics (use second-generation-managed-packages); NOT for non-ISV experience-cloud login licensing (use experience-cloud-licensing-model).