Skip to content

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#

Ask MoveData AI
Ask about setup, configuration, or troubleshooting
How can I help you with MoveData today?