This section provides a detailed data mapping configuration between Virtuous and Momentum platforms. The table below outlines how fields from Virtuous 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.
| Virtuous Field | Momentum Field | Notes |
|---|---|---|
| firstName | first_name | Direct copy. |
| lastName | last_name | Direct copy. |
| (firstName + " " + lastName) | name | Concatenated from mapped first/last. |
| — | preferred_name | Set to empty string "". |
| firstName | salutation | Direct copy. |
| — | donor_type | Constant: DonorType.INDIVIDUAL. |
| isPrimary | head_of_household_status | HEAD_OF_HOUSEHOLD if True, else NOT_HEAD_OF_HOUSEHOLD. |
| birthYear, birthMonth, birthDay | birthday | Set only if all three present; built as date(int(year), int(month), int(day)). |
| contactMethods[].value | First method where type contains "email" (case-insensitive) and isPrimary=True; otherwise "". | |
| contactMethods[].value | phone_number | First method where type contains "phone" (case-insensitive) and isPrimary=True; otherwise "". |
| isDeceased | deceased | ALIVE if False, DECEASED if True. (If None/missing, field remains unchanged—no default in code.) |
| avatarUrl | profile_picture_url | Direct copy. |
| description | description | source_data.get("description", ""). |
| name | name | source_data.get("name", ""). |
| type | title | Virtuous notes have no summary; uses type. |
| note | description | Direct copy. |
| createDateTimeUtc | action_created_at | Parsed ISO, converted to UTC via astimezone(UTC). |
| modifiedDateTimeUtc | action_updated_at | Parsed ISO, converted to UTC via astimezone(UTC). |
| — | is_completed | Always True for synced notes. |
| noteDate | completed_date | Parsed with datetime.strptime(..., "%m/%d/%Y"), then .astimezone(UTC). |
| type | category | Mapping: EMAIL→EMAIL, LETTER→LETTER, IN_PERSON→MEETING, CALL→CALL, else OTHER (Virtuous has broader/custom types). |
| amount | amount | Direct copy. |
| giftDate | date | ISO-parsed if present; else None. |
| isAcknowledgedGift | acknowledgement_status | ACKNOWLEDGED if True, else NOT_ACKNOWLEDGED. |
| notes | notes | Uses value or "" if falsy. |
| name | name | source_data.get("name", ""). |