本文へ移動
cccskills
無料GitHub で公開

npsp-program-management

Configuring or troubleshooting the Nonprofit Success Pack Program Management Module (PMM) - program delivery, cohort setup, service scheduling, service delivery recording, and 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 designing which outcomes and indicators to measure - use admin/program-outcome-tracking-design. NOT for NPSP donor, household and giving-rollup data - use data/nonprofit-data-architecture.

インストール方法を見る

含まれるファイル(7)

  • SKILL.md15.7 KB
  • references/examples.md6.0 KB
  • references/gotchas.md5.5 KB
  • references/llm-anti-patterns.md6.5 KB
  • references/well-architected.md5.1 KB
  • scripts/check_npsp_program_management.py8.4 KB
  • templates/npsp-program-management-template.md4.9 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

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

ObjectPurpose
Program__cTop-level program entity. Has Status (Active/Inactive) and Program Issues/Target Population fields.
Service__cA type of service offered within a program (e.g., Food Pantry, Job Training). Lookup to Program__c.
ProgramEngagement__cJunction between a Contact and a Program. Tracks enrollment date, stage (Enrolled/Active/Graduated/Withdrawn), and cohort assignment.
ProgramCohort__cA time-bounded cohort within a Program (e.g., Spring 2025 Cohort). Has Start/End Date.
ServiceDelivery__cRecords one delivery of a service to one client. Captures quantity, date, and optional outcome data.
ServiceSchedule__cA recurring schedule (e.g., every Tuesday) for delivering a service. Parent of ServiceParticipant__c.
ServiceParticipant__cLinks 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

SituationRecommended ApproachReason
Need to track individual service sessions with attendanceUse ServiceSchedule__c + ServiceParticipant__cProvides recurrence, participant roster, and attendance reporting in PMM reports
Need to record one-off service deliveries without a scheduleCreate ServiceDelivery__c directly with ProgramEngagement__cLighter weight; appropriate for drop-in services with no fixed schedule
Staff enter deliveries for many clients at onceUse Bulk Service Deliveries quick actionPurpose-built for mass entry; ensure correct field-set order before enabling
Required field not being enforced in bulk entryAdd validation rule on ServiceDelivery__cField-set Required flag is visual only; only validation rules enforce saves
Concurrent bulk saves by multiple staff causing errorsStagger entry times or use retry guidanceServiceDelivery__c bulk saves acquire row locks; concurrent inserts to the same parent record collide
Reporting on service volume for grant reportingUse PMM packaged reports and dashboardsThey 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

ArtifactDescription
Program setup checklistCompleted record of Program__c, Service__c, and ProgramCohort__c configuration
Bulk Service Delivery field set auditField order and Required-flag review with validation rule recommendations
ServiceDelivery__c validation rulesRules enforcing required fields that the field set cannot enforce
PMM report auditConfirmation 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)

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Use this skill when writing test-first, behavior-driven acceptance criteria in Given/When/Then format for a Salesforce user story. Covers happy path, edge cases, negative paths, permission boundaries, and data-state preconditions so the AC block can drive UAT scripts and Apex test design downstream. Trigger keywords: given when then, gherkin, behavior driven AC, test first acceptance criteria, scenario outline, BDD acceptance criteria. NOT for the user-story format itself (use admin/user-story-writing-for-salesforce). NOT for UAT script writing (use admin/uat-test-case-design). NOT for Apex test method generation (use agents/test-class-generator). NOT for high-level UAT planning (use admin/uat-and-acceptance-criteria). More triggers: acceptance criteria record, ac_id, req_id on a criterion, artefact under test, negative case for a rule-type requirement, no-match fall-through criterion, oracle for a Then clause, test type apex flow manual, criteria linter, check_ac_format.py, --manifest-dir.

日本語の概要は準備中です。原文の説明を表示しています。

PranavNagrecha/AwesomeSalesforceSkills192026年10月4日 更新

Task and Event objects: polymorphic WhatId/WhoId, Activity object model, ActivityHistory vs OpenActivity, activity timeline customization, bulk task creation, Einstein Activity Capture boundaries. NOT for turning on EAC or calendar sync — use admin/einstein-activity-capture-setup. NOT for Email-to-Case — use admin/case-management-setup. Covers ActivitiesSettings metadata, enableActivities, shared Task/Event custom fields and FLS, TaskStatus value sets, Shared Activities and TaskRelation/EventRelation, recurring and child activities, and partial-success bulk DML on Task.

日本語の概要は準備中です。原文の説明を表示しています。

PranavNagrecha/AwesomeSalesforceSkills192026年10月4日 更新

Design Invocable Apex actions that return deterministic, agent-friendly errors instead of surfacing raw exceptions to the LLM. NOT for authoring the action itself — @InvocableMethod schema, labels, security context — use agentforce/custom-agent-actions-apex. NOT for the Apex tests that force each error branch — use agentforce/agent-action-unit-tests.

日本語の概要は準備中です。原文の説明を表示しています。

PranavNagrecha/AwesomeSalesforceSkills192026年10月4日 更新

Use when designing how an Agentforce agent extracts structured input parameters (slots) from a user's natural-language utterance to invoke an action. Triggers: 'agent extract date from user', 'agent action argument extraction', 'agentforce slot filling', 'agent invocable input mapping', 'agent fails to fill required parameter'. NOT for action authoring (use agentforce/agent-actions) or for prompt-template variable binding (use agentforce/prompt-builder-templates).

日本語の概要は準備中です。原文の説明を表示しています。

PranavNagrecha/AwesomeSalesforceSkills192026年10月4日 更新

Apex test patterns for @InvocableMethod agent actions: per-reason-code branch coverage, bulk safety, callout mocking, deterministic assertions. NOT for testing whether the agent routes to the right topic or answers well — use agentforce/agent-testing-and-evaluation. NOT for designing the error envelope the tests assert on — use agentforce/agent-action-error-handling.

日本語の概要は準備中です。原文の説明を表示しています。

PranavNagrecha/AwesomeSalesforceSkills192026年10月4日 更新

Designing or reviewing Agentforce actions: Flow actions, Apex invocable actions, prompt-template actions, action naming, input and output contracts, confirmation requirements, and safe error behavior. Triggers: 'agent actions', 'build an agent that can look up an order', 'make the agent able to check order status', 'give the agent a capability', 'agent that can retrieve a record', 'flow action for agent', 'agent invocable action', 'action schema design'. NOT for writing the Apex class itself — use agentforce/custom-agent-actions-apex. NOT for the reason_code error envelope that stops an agent retry loop — use agentforce/agent-action-error-handling.

日本語の概要は準備中です。原文の説明を表示しています。

PranavNagrecha/AwesomeSalesforceSkills192026年10月4日 更新

PranavNagrecha のスキルをすべて見る

このスキルの問題を報告する