This section provides a detailed data mapping configuration between Salesforce NPSP and Momentum platforms. The table below outlines how fields from Salesforce NPSP align with their corresponding fields in Momentum, accompanied by specific notes to clarify mapping rules and any necessary transformations. This mapping ensures seamless data integration and consistency between the two systems.
Note: The mapping information below applies only to Salesforce Nonprofit Starter Pack and related Salesforce packages. Support for non-NPSP deployments is available, but limited, and typically configured on an account-by-account basis. For more information on non-NPSP deployments, please reach out.
Momentum field | Salesforce Field | Notes |
|---|---|---|
| first_name | FirstName | Direct copy; default "" if missing. |
last_name | LastName | Direct copy; default "". |
| name | (FirstName + " " + LastName) | Concatenated and .strip(). |
| company_name | Name | Set only when npe01__Type_of_Account__c == "Organization". |
| donor_type | npe01__Type_of_Account__c | "Organization"→ORGANIZATION, "Individual"→INDIVIDUAL. |
| Direct copy; default "". | ||
| phone_number | Phone | Direct copy; default "". |
| do_not_email | HasOptedOutOfEmail | Boolean copy; default False. |
do_not_mail | Postal_Mail_Opt_Out__c / DoNotMail__c | True if either is True; else False. |
do_not_call | DoNotCall | Boolean copy |
do_not_contact | npsp__Do_Not_Contact__c / Do_not_Solicit__c / ok_to_solicit__c | Start with npsp__Do_Not_Contact__c; force True if Do_not_Solicit__c is truthy; force True if ok_to_solicit__c is False. |
| birthday | Birthdate | Parsed with date.fromisoformat if present. |
| deceased | npsp__Deceased__c | True→DECEASED, False→ALIVE, None/other→UNKNOWN. |
head_of_household_status | npsp__Primary_Contact__c + npe01__Organization_Type__c | Only when npe01__Organization_Type__c == "Household Account": True→HEAD_OF_HOUSEHOLD, False→NOT_HEAD_OF_HOUSEHOLD. |
| preferred_name | (custom field via org config) | If donor.org.donor_custom_fields["preferred_name"].path is set, value resolved via get_custom_field_from_donor(...); default "". |
address_line1 | MailingAddress.street | Default "" if missing. |
| city | MailingAddress.city | Default "". |
state | MailingAddress.state | Default "". |
| zip | MailingAddress.postalCode | Default "". |
| country | MailingAddress.country | Default "". |
| description | Description | Direct copy (may be None). |
| acknowledgement_status | npsp__Acknowledgment_Status__c | "Acknowledged"→ACKNOWLEDGED, "Do Not Acknowledge"→DO_NOT_ACKNOWLEDGE, else NOT_ACKNOWLEDGED. |
| amount | Amount | Cast to Decimal with 2 decimals: Decimal(f"{Amount:.2f}"); default 0.00. |
| appeal | - | Explicitly set to None (irrelevant in SF mapping). |
| date | CloseDate | Parsed with datetime.strptime(..., "%Y-%m-%d").date() if present. |
| stage | StageName | Direct copy or "" if missing. |
| gift_type | StageName / IsClosed / IsWon / npe03__Recurring_Donation__c / npsp__Grant_Program_Area_s__c / Grant__c | If IsClosed & IsWon & amount>0: StageName=="In-Kind Received"→IN_KIND, elif npe03__Recurring_Donation__c set→RECURRING, else→ONE_TIME. If grant fields present→OTHER. If not closed-won or amount≤0→OTHER. |
| notes | Description | Direct copy or "". |
gift_type (org override) | RecordTypeId | If gift.org.slug=="merola" and RecordTypeId=="0121a0000005sRAAAY", force OTHER. |
| category | TaskSubtype | "Email"/"List Email"→EMAIL, "Call"→CALL, "Task"→TASK, else→OTHER. |
| title | Subject | Direct copy or "". |
| initiator | - | Constant: CrmActionInitiator.UNKNOWN. |
| is_completed | Status | True if Status == "Completed". |
| completed_date | CompletedDateTime | isoparse(...).replace(tzinfo=UTC) if present. |
action_created_at | CreatedDate | isoparse(...).replace(tzinfo=UTC) if present. |
action_updated_at | LastModifiedDate | isoparse(...).replace(tzinfo=UTC) if present. |