Donation pipeline
The MoveData donation pipeline (MoveDataDonationPipeline) is a multi-stage processing engine that transforms donation notifications from fundraising platforms into structured Salesforce records.
It implements the donation schema and supports complex fundraising scenarios including peer-to-peer campaigns, recurring donations, matched gifts, and tribute donations.
The pipeline processes each notification through a series of sequential stages. Each stage handles a specific aspect of the donation workflow, creating or updating Salesforce records while maintaining relationships between donors, campaigns, and donations.
Implementations#
The donation pipeline is implemented through MoveData extensions that provide out-of-the-box processing flows for different Salesforce data models. Each extension registers its processing handlers with the pipeline through metadata configuration, providing turnkey functionality while allowing customisation through Lightning Flows and business rules.
| Extension | Data model | More information |
|---|---|---|
| MoveData NPSP Fundraising & Donations | Nonprofit Success Pack (NPSP) | NPSP extension reference |
| MoveData Nonprofit Cloud | Salesforce Nonprofit Cloud | Nonprofit Cloud extension reference |
For an overview of how extensions work with pipelines, see Understanding extensions.
Execution modes#
The donation pipeline supports two execution modes.
Multi-step processing (default)#
Multi-step processing runs notifications through discrete, sequential stages with full relationship management and business rule support. This is the default mode and is suitable for the vast majority of implementations.
The remainder of this article covers multi-step processing in detail.
Single-step processing (alternative)#
Single-step processing provides a streamlined approach where all business logic is handled within a single flow or Apex handler. This mode is appropriate in rare cases, such as when an organisation writes to a Salesforce staging object rather than directly to standard records.
For details on configuring and using single-step mode, see Single-step pipeline mode.
Multi-step pipeline stages#
The multi-step pipeline processes notifications through seven stages, executed in order:
| Stage | Name | Purpose | Required |
|---|---|---|---|
| 0 | Configuration | Set conditional or advanced configuration values | Optional |
| 1 | Pre-processing | Transform or enhance notifications before processing | Optional |
| 2 | Account processing | Create or update Account records | Yes |
| 3 | Contact processing | Create or update Contact records | Yes |
| 4 | Campaign processing | Create or update Campaign records | Yes |
| 5 | Recurring donation processing | Create or update recurring donation records | Yes |
| 6 | Donation processing | Create or update donation records | Yes |
Note
Each stage can be disabled, customised, or extended using metadata keys. For an overview of how stages and metadata keys work, see Pipeline overview.
Stage 0: Configuration#
Purpose: Set Config_ values that are conditional or that represent advanced configuration settings not exposed in the settings interface.
Metadata key: PIPELINE_DONATION_CONFIGURATION
This stage does not create any Salesforce records. It runs before all other stages, allowing you to control the behaviour of subsequent stages based on notification data.
Stage 1: Pre-processing (optional)#
Purpose: Transform or enhance the notification payload before the main processing stages begin.
Metadata key: PIPELINE_DONATION_PREPROCESS
Use this stage when you need to modify the notification data itself, such as transforming specific information in the payload before processing.
This stage does not create any Salesforce records directly.
Stage 2: Account processing#
Purpose: Create or update Account records for organisational donors, fundraising organisations, and matched gift companies.
Default SObject:
- NPSP:
Account - Nonprofit Cloud:
Account
| Configuration phase | Metadata key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_ACCOUNT_DISABLE |
Disable account processing entirely |
| SObject Type | PIPELINE_DONATION_ACCOUNT_SOBJECT |
Override the default Account SObject type |
| Field Set | PIPELINE_DONATION_ACCOUNT_FIELDSET |
Define fields to load for existing records |
| Platform Key | PIPELINE_DONATION_ACCOUNT_PLATFORM_KEY |
Generate a unique platform identifier |
| Record Matching | PIPELINE_DONATION_ACCOUNT_DUPLICATE |
Locate existing account records |
| Field Mapping | PIPELINE_DONATION_ACCOUNT_MAPPING |
Primary field mapping logic |
| Field Mapping (Extended) | PIPELINE_DONATION_ACCOUNT_MAPPING_EXT |
Additional field mapping logic |
| Post-Processing | PIPELINE_DONATION_ACCOUNT_POST |
Post-upsert processing logic |
The account stage processes several types of account record:
- Campaign-related accounts (fundraising organisations)
- Donor accounts (organisational donors)
- Matched gift company accounts
- Tribute organisation accounts
The pipeline calls the account stage once for each account present in the notification — for example, a notification may contain both a donor account and a fundraising organisation account, resulting in the account stage running multiple times. Use the context variables to determine which type of account is being processed.
Stage 3: Contact processing#
Purpose: Create or update Contact records for individual donors, fundraisers, and tribute contacts.
Default SObject:
- NPSP:
Contact - Nonprofit Cloud (Person Accounts):
Account
| Configuration phase | Metadata key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_CONTACT_DISABLE |
Disable contact processing entirely |
| SObject Type | PIPELINE_DONATION_CONTACT_SOBJECT |
Override the default Contact SObject type |
| Field Set | PIPELINE_DONATION_CONTACT_FIELDSET |
Define fields to load for existing records |
| Platform Key | PIPELINE_DONATION_CONTACT_PLATFORM_KEY |
Generate a unique platform identifier |
| Record Matching | PIPELINE_DONATION_CONTACT_DUPLICATE |
Locate existing contact records |
| Field Mapping | PIPELINE_DONATION_CONTACT_MAPPING |
Primary field mapping logic |
| Field Mapping (Extended) | PIPELINE_DONATION_CONTACT_MAPPING_EXT |
Additional field mapping logic |
| Post-Processing | PIPELINE_DONATION_CONTACT_POST |
Post-upsert processing logic |
The contact stage processes several types of contact record:
- Individual fundraisers and team captains
- Matched gift contact persons
- Tribute and memorial contacts
- One-off and recurring donors
The pipeline calls the contact stage once for each contact present in the notification — for example, a notification may contain both a fundraiser and a donor, resulting in the contact stage running multiple times. For Nonprofit Cloud, contacts are processed as Person Accounts. Use the context variables to determine which type of contact is being processed.
Stage 4: Campaign processing#
Purpose: Create or update Campaign records representing fundraising initiatives and peer-to-peer hierarchies.
Default SObject: Campaign
| Configuration phase | Metadata key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_CAMPAIGN_DISABLE |
Disable campaign processing entirely |
| SObject Type | PIPELINE_DONATION_CAMPAIGN_SOBJECT |
Override the default Campaign SObject type |
| Field Set | PIPELINE_DONATION_CAMPAIGN_FIELDSET |
Define fields to load for existing records |
| Platform Key | PIPELINE_DONATION_CAMPAIGN_PLATFORM_KEY |
Generate a unique platform identifier |
| Campaign Name | PIPELINE_DONATION_CAMPAIGN_NAME |
Custom campaign name generation logic |
| Record Matching | PIPELINE_DONATION_CAMPAIGN_DUPLICATE |
Locate existing campaign records |
| Field Mapping | PIPELINE_DONATION_CAMPAIGN_MAPPING |
Primary field mapping logic |
| Field Mapping (Extended) | PIPELINE_DONATION_CAMPAIGN_MAPPING_EXT |
Additional field mapping logic |
| Post-Processing | PIPELINE_DONATION_CAMPAIGN_POST |
Post-upsert processing logic |
Note
The campaign stage includes an additional Campaign Name metadata key not present in other stages. This allows you to define custom logic for generating campaign names.
The campaign stage manages hierarchical campaign relationships, including parent-child linking for multi-level peer-to-peer campaign structures. The pipeline calls the campaign stage once for each campaign in the hierarchy. Use the context variables to determine the campaign's position and relationships.
Stage 5: Recurring donation processing#
Purpose: Create or update recurring donation records for subscription-based giving.
Default SObject:
- NPSP:
npe03__Recurring_Donation__c - Nonprofit Cloud:
GiftCommitment
| Configuration phase | Metadata key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_RECURRING_DISABLE |
Disable recurring donation processing entirely |
| SObject Type | PIPELINE_DONATION_RECURRING_SOBJECT |
Override the default recurring donation SObject type |
| Field Set | PIPELINE_DONATION_RECURRING_FIELDSET |
Define fields to load for existing records |
| Platform Key | PIPELINE_DONATION_RECURRING_PLATFORM_KEY |
Generate a unique platform identifier |
| Record Matching | PIPELINE_DONATION_RECURRING_DUPLICATE |
Locate existing recurring donation records |
| Field Mapping | PIPELINE_DONATION_RECURRING_MAPPING |
Primary field mapping logic |
| Field Mapping (Extended) | PIPELINE_DONATION_RECURRING_MAPPING_EXT |
Additional field mapping logic |
| Post-Processing | PIPELINE_DONATION_RECURRING_POST |
Post-upsert processing logic |
This stage only runs when the notification contains a recurring donation. For one-off donations, the pipeline skips this stage entirely.
Stage 6: Donation processing#
Purpose: Create or update individual donation records.
Default SObject:
- NPSP:
Opportunity - Nonprofit Cloud:
GiftTransaction
| Configuration phase | Metadata key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_DONATION_DISABLE |
Disable donation processing entirely |
| SObject Type | PIPELINE_DONATION_DONATION_SOBJECT |
Override the default donation SObject type |
| Field Set | PIPELINE_DONATION_DONATION_FIELDSET |
Define fields to load for existing records |
| Platform Key | PIPELINE_DONATION_DONATION_PLATFORM_KEY |
Generate a unique platform identifier |
| Record Matching | PIPELINE_DONATION_DONATION_DUPLICATE |
Locate existing donation records |
| Field Mapping | PIPELINE_DONATION_DONATION_MAPPING |
Primary field mapping logic |
| Field Mapping (Extended) | PIPELINE_DONATION_DONATION_MAPPING_EXT |
Additional field mapping logic |
| Post-Processing | PIPELINE_DONATION_DONATION_POST |
Post-upsert processing logic |
The donation stage creates the final record and establishes relationships to all previously processed records:
- Links to the donor contact and account
- Associates with the relevant campaign
- Connects to the recurring donation record (if applicable)
- Handles matched gift relationships
Context variables#
Each stage receives context variables that indicate what type of record is being processed in the current iteration. These variables are essential when you build custom flows that need to apply different logic depending on the record type.
Account stage context#
| Variable | Type | Values | Description |
|---|---|---|---|
Context_AccountType |
Text | donor, fundraiser, matchedDonor, recurringDonor |
The type of account being processed |
Context_Fundraiser |
Boolean | true / false |
Indicates a fundraising organisation |
Context_Donor |
Boolean | true / false |
Indicates a donation source organisation |
Context_RecurringDonor |
Boolean | true / false |
Indicates a recurring donor organisation |
Context_MatchedDonor |
Boolean | true / false |
Indicates a matched gift company |
Contact stage context#
| Variable | Type | Values | Description |
|---|---|---|---|
Context_ContactType |
Text | donor, fundraiser, matchedDonor, recurringDonor, tributeContact |
The type of contact being processed |
Context_Fundraiser |
Boolean | true / false |
Indicates an individual fundraiser |
Context_Donor |
Boolean | true / false |
Indicates an individual donor |
Context_RecurringDonor |
Boolean | true / false |
Indicates a recurring donor contact |
Context_MatchedDonor |
Boolean | true / false |
Indicates a matched gift contact |
Context_TributeContact |
Boolean | true / false |
Indicates a tribute or memorial contact |
Campaign stage context#
| Variable | Type | Values | Description |
|---|---|---|---|
CampaignIndex |
Number | 0-based index | Position of the current campaign within the hierarchy |
CampaignCount |
Number | Total count | Total number of campaigns in the hierarchy |
CampaignIdList |
Text | Comma-separated IDs | Salesforce IDs of previously processed campaigns |
HasCampaignAccount |
Boolean | true / false |
Indicates the campaign has a linked account |
HasCampaignContact |
Boolean | true / false |
Indicates the campaign has a linked contact |
HasParentCampaign |
Boolean | true / false |
Indicates the campaign has a parent campaign |
Using context variables in flows
When building a custom field mapping or post-processing flow, check the context variable to apply conditional logic.
For example, in the contact stage you might set a different record type when Context_ContactType equals tributeContact.
Other resources#
- Pipeline overview — how pipelines and metadata keys work
- Commerce pipeline — the equivalent pipeline for commerce and ticketing data
- Single-step pipeline mode — alternative execution mode for specialised use cases
- Understanding extensions — how extensions implement pipeline processing