Donation Pipeline
A managed processing engine transforming donation notifications into Salesforce records.
Overview
The MoveData Donation Pipeline (MoveDataDonationPipeline) is a sophisticated multi-stage processing engine that transforms donation notifications from fundraising platforms into structured Salesforce records. It implements the donation schema and provides comprehensive support for complex fundraising scenarios including peer-to-peer campaigns, recurring donations, matched gifts, and tribute donations.
The pipeline operates through a series of sequential stages, each handling specific aspects of the donation processing workflow, ensuring data integrity and 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. These extensions register their processing handlers with the pipeline through metadata configuration, providing turnkey functionality whilst allowing for customisation through Lightning Flows and custom business rules.
MoveData NPSP Fundraising & Donations Extension
Provides comprehensive processing flows for organisations using the Nonprofit Success Pack (NPSP) data model.
MoveData Nonprofit Cloud Extension
Enables processing for organisations using Salesforce Nonprofit Cloud data architecture.
Pipeline Architecture
The Donation Pipeline supports two execution modes:
Multi-Step Processing (Default)
Processes notifications through discrete, sequential stages with full relationship management and complex business rule support. This executes the stages listed below sequentially and is suitable for 99% of implementations.
Single-Step Processing (Alternative)
Provides a streamlined processing approach where all business logic is handled within a single flow or Apex handler. There are few cases where this makes sense; one example is where an organisation has invested heavily in importing from a Salesforce staging object and would like MoveData to write to this object.
If using a single-step, you need to direct the pipeline by create the following metadata entry:
- Label:
EXTENSION_DONATION_MODE - Handler:
single_step - Type:
Config
Single-Step Stage
- Configuration Key:
PIPELINE_DONATION_SINGLE_STEP
When the extension mode is set to single_step, the pipeline bypasses the multi-stage process and executes all business logic within a single Lightning Flow. This approach is suitable for:
- Simple integration requirements
- Legacy system compatibility
- Performance-optimised scenarios using Apex
Multi-Step Pipeline Stages
The multi-step pipeline processes notifications through six distinct stages:
- Pre-Processing
- Accounts
- Contacts
- Campaigns
- Recurring Donations
- Donations
Stage 0: Configuration
Detailed Example
-
Purpose: Enables the setting
Config_values that are either conditional (ie. ifPlatformisx, then) or are more advanced configuration settings that aren't exposed via the Settings interface. -
Metadata Key:
PIPELINE_DONATION_CONFIGURATION
Stage 1: Pre-processing (Optional)
Detailed Example
-
Purpose: Allows transformation or enhancement of the notification before main processing begins.
-
Metadata Key:
PIPELINE_DONATION_PREPROCESS -
Use Cases:
-
Transformation of a notification (eg. Delete all team campaigns)
Stage 2: Account Processing
-
Purpose: Creates or updates Account records for organisational donors and matched gift companies.
-
Default SObject:
Account
| Configuration Phase | Metadata Key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_ACCOUNT_DISABLE |
Disables account processing entirely |
| SObject Type | PIPELINE_DONATION_ACCOUNT_SOBJECT |
Overrides default Account SObject type |
| Field Set | PIPELINE_DONATION_ACCOUNT_FIELDSET |
Defines fields to load for existing records |
| Platform Key | PIPELINE_DONATION_ACCOUNT_PLATFORM_KEY |
Generates unique platform identifier |
| Record Matching | PIPELINE_DONATION_ACCOUNT_DUPLICATE |
Locates 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 |
-
Processing Context:
-
Campaign-related accounts (fundraising organisations)
- Donor accounts (organisational donors)
- Matched gift company accounts
- Tribute organisation accounts
Stage 3: Contact Processing
-
Purpose: Creates or updates Contact records for individual donors, fundraisers, and tribute contacts.
-
Default SObject:
-
Non-Profit Success Pack (or Other):
Contact - Nonprofit Cloud - Person Accounts:
Account
| Configuration Phase | Metadata Key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_CONTACT_DISABLE |
Disables contact processing entirely |
| SObject Type | PIPELINE_DONATION_CONTACT_SOBJECT |
Overrides default Contact SObject type |
| Field Set | PIPELINE_DONATION_CONTACT_FIELDSET |
Defines fields to load for existing records |
| Platform Key | PIPELINE_DONATION_CONTACT_PLATFORM_KEY |
Generates unique platform identifier |
| Record Matching | PIPELINE_DONATION_CONTACT_DUPLICATE |
Locates 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 |
-
Processing Context:
-
Individual fundraisers & team captains
- Matched gift contact persons
- Tribute contacts and memorial contacts
- Donors (One-off & Recurring)
Stage 4: Campaign Processing
-
Purpose: Creates or updates Campaign records representing fundraising initiatives and peer-to-peer hierarchies.
-
Default SObject:
Campaign
| Configuration Phase | Metadata Key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_CAMPAIGN_DISABLE |
Disables campaign processing entirely |
| SObject Type | PIPELINE_DONATION_CAMPAIGN_SOBJECT |
Overrides default Campaign SObject type |
| Field Set | PIPELINE_DONATION_CAMPAIGN_FIELDSET |
Defines fields to load for existing records |
| Platform Key | PIPELINE_DONATION_CAMPAIGN_PLATFORM_KEY |
Generates unique platform identifier |
| Campaign Name | PIPELINE_DONATION_CAMPAIGN_NAME |
Custom campaign name generation logic |
| Record Matching | PIPELINE_DONATION_CAMPAIGN_DUPLICATE |
Locates 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 |
-
Special Features:
-
Hierarchical campaign relationship management
- Parent-child campaign linking / Multi-level peer-to-peer structure
Stage 5: Recurring Donation Processing
-
Purpose: Creates or updates recurring donation records for subscription-based giving.
-
Default SObject:
-
Non-Profit Success Pack:
npe03__Recurring_Donation__c - Non-Profit Cloud:
GiftCommitment
| Configuration Phase | Metadata Key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_RECURRING_DISABLE |
Disables recurring donation processing entirely |
| SObject Type | PIPELINE_DONATION_RECURRING_SOBJECT |
Overrides default recurring donation SObject type |
| Field Set | PIPELINE_DONATION_RECURRING_FIELDSET |
Defines fields to load for existing records |
| Platform Key | PIPELINE_DONATION_RECURRING_PLATFORM_KEY |
Generates unique platform identifier |
| Record Matching | PIPELINE_DONATION_RECURRING_DUPLICATE |
Locates 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 |
Stage 6: Donation Processing
-
Purpose: Creates or updates individual donation records (Opportunities or Gift Transactions).
-
Default SObject:
-
Non-Profit Success Pack:
Opportunity - Non-Profit Cloud:
GiftTransaction
| Configuration Phase | Metadata Key | Description |
|---|---|---|
| Disable | PIPELINE_DONATION_DONATION_DISABLE |
Disables donation processing entirely |
| SObject Type | PIPELINE_DONATION_DONATION_SOBJECT |
Overrides default donation SObject type |
| Field Set | PIPELINE_DONATION_DONATION_FIELDSET |
Defines fields to load for existing records |
| Platform Key | PIPELINE_DONATION_DONATION_PLATFORM_KEY |
Generates unique platform identifier |
| Record Matching | PIPELINE_DONATION_DONATION_DUPLICATE |
Locates 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 |
-
Relationship Management:
-
Links to donor contacts/accounts
- Associates with relevant campaigns
- Connects to recurring donation records
- Handles matched gift relationships
Context Variables
Each stage receives contextual variables to assist with implentation complexities:
Account Stage Context
Context_AccountType:donor|fundraiser|matchedDonor|recurringDonorContext_Fundraiser: Boolean indicating fundraising organisationContext_Donor: Boolean indicating donation sourceContext_RecurringDonor: Boolean indicating recurring donorContext_MatchedDonor: Boolean indicating matched gift company
Contact Stage Context
Context_ContactType:donor|fundraiser|matchedDonor|recurringDonor|tributeContactContext_Fundraiser: Boolean indicating individual fundraiserContext_Donor: Boolean indicating individual donorContext_RecurringDonor: Boolean indicating recurring donor contactContext_MatchedDonor: Boolean indicating matched gift contactContext_TributeContact: Boolean indicating tribute/memorial contact
Campaign Stage Context
CampaignIndex: Position within campaign hierarchyCampaignCount: Total campaigns in hierarchyCampaignIdList: Previously processed campaign IDsHasCampaignAccount: Boolean indicating linked accountHasCampaignContact: Boolean indicating linked contactHasParentCampaign: Boolean indicating parent campaign