Migrating from NPSP
to Nonprofit Cloud
Salesforce is retiring NPSP in favor of Nonprofit Cloud (NPC), which uses native standard objects instead of custom namespaced ones. Maestro reads your existing NPSP data, maps every field to the NPC data model, and writes clean records to the new standard objects — preserving relationships, history, and giving summaries.
-- Pull active recurring donors from NPSP SELECT Id, npe03__Contact__c, npe03__Contact__r.FirstName, npe03__Contact__r.LastName, npe03__Contact__r.Email, npe03__Amount__c, npe03__Installment_Period__c, npe03__Date_Established__c, npe03__Open_Ended_Status__c, npe03__Next_Payment_Date__c, npe03__Recurring_Donation_Campaign__c FROM npe03__Recurring_Donation__c WHERE npe03__Open_Ended_Status__c = 'Open' ORDER BY npe03__Amount__c DESC
-- Create NPC RecurringDonation for each row salesforce_create_record("RecurringDonation", { "DonorId": row.npe03__Contact__c, "InstallmentAmount": row.npe03__Amount__c, "RecurringFrequency": mapFrequency( row.npe03__Installment_Period__c ), "StartDate": row.npe03__Date_Established__c, "Status": "Active", "NextPaymentDate": row.npe03__Next_Payment_Date__c, "FundraisingCampaignId": row.npe03__Recurring_Donation_Campaign__c }) -- mapFrequency: "Monthly" → "Monthly" -- "Yearly" → "Annually" -- "Weekly" → "Weekly"
| Donor | Amount | Frequency | Start Date | Next Payment | Status |
|---|---|---|---|---|---|
| Sarah Johnson | $500.00 | Monthly | 2021-03-01 | 2025-06-01 | Active |
| Robert Chen | $250.00 | Monthly | 2022-07-15 | 2025-06-15 | Active |
| Maria Gonzalez | $1,200.00 | Annually | 2020-01-01 | 2026-01-01 | Active |
| David Park | $100.00 | Monthly | 2023-09-01 | 2025-06-01 | Active |
| Lisa Thompson | $50.00 | Weekly | 2024-01-08 | 2025-05-26 | Active |
What's Delivered in Build 40
This scenario fits comfortably within a Build 40 sprint.
Typical completion: 2–3 weeks.
Equivalent traditional SI cost: $6,000–$8,000
Loading an External Source
into Nonprofit Cloud
Coming from a spreadsheet, legacy database, Bloomerang, DonorPerfect, or another CRM? Maestro ingests your donor data, normalizes it to NPC's data model, deduplicates contacts, creates the right Account types, and loads clean records — all without you touching a data loader.
{
"DONOR_ID": "DP-004821",
"FIRST_NAME": "Patricia",
"LAST_NAME": "Williams",
"EMAIL": "pat.williams@email.com",
"PHONE": "(312) 555-0192",
"ADDRESS1": "4821 Oak Street",
"CITY": "Chicago",
"STATE": "IL",
"ZIP": "60614",
"TOTAL_GIVING": "$4,250.00",
"LAST_GIFT": "12/15/2024",
"SPOUSE_NAME": "James Williams"
}
-- 1. Create Household Account salesforce_create_record("Account", { "Name": "Williams Household", "Type": "Household", "BillingStreet": "4821 Oak Street", "BillingCity": "Chicago", "BillingState": "IL" }) -- 2. Create Contact linked to Account salesforce_create_record("Contact", { "FirstName": "Patricia", "LastName": "Williams", "Email": "pat.williams@email.com", "Phone": "3125550192", "AccountId": account.Id, "ExternalId__c": "DP-004821" })
-- DonorPerfect gift export (sample)
DONOR_ID | GIFT_DATE | AMOUNT | CAMPAIGN | TYPE
DP-004821 | 2024-12-15 | $500.00 | Year End | Check
DP-004821 | 2024-06-01 | $250.00 | Spring Gala | Credit
DP-004821 | 2023-12-14 | $500.00 | Year End | Check
DP-004821 | 2023-05-20 | $200.00 | Annual Fund | Online
DP-004821 | 2023-01-10 | $750.00 | Major Gifts | Wire
DP-004821 | 2022-12-12 | $500.00 | Year End | Check
DP-004821 | 2022-11-01 | $550.00 | Annual Fund | Online
salesforce_create_record("GiftTransaction", { "DonorId": contact.Id, "Amount": 500.00, "TransactionDate": "2024-12-15", "FundraisingCampaignId": campaigns["Year End"], "PaymentMethod": "Check", "Status": "Completed", "Source": "DonorPerfect", "ExternalGiftId__c": "DP-004821-20241215" }) -- Idempotent: ExternalGiftId prevents -- duplicates on re-run
| Issue Type | Count | Action | Status |
|---|---|---|---|
| Duplicate email addresses | 12 | Merge using most recent record | Review |
| Missing email — will not get comms | 18 | Load as-is, flag for enrichment | Flagged |
| Malformed phone numbers | 6 | Normalize format, load | Auto-fixed |
| Gift with no matching donor | 2 | Hold — manual review required | Review |
| 1,162 clean records | — | Load directly | Ready |
What's Delivered in Build 40
Scales with record volume. A 1,200-donor import fits within Build 40. For larger datasets, Build 80 handles up to ~5,000 donors in a single sprint.
Equivalent traditional SI cost: $7,500–$10,000
NPC Standard Objects
Accessible via Slack
Your fundraising and program staff live in Slack. Maestro connects a Slack-first MCP layer so your team can look up donors, log gifts, check campaign totals, and create records — all without leaving the channel where the conversation is already happening.
What's Delivered in Build 40
Slack-First MCP setup + 5 core command types fits in Build 40. Expansion to additional workflows can continue in Maestro Run.
Equivalent traditional SI cost: $8,000–$12,000
NPSP → NPC Migration
Orchestrated via Slack
The most powerful Maestro pattern: Slack acts as the command center. Your team triggers reads from the legacy NPSP org, reviews exceptions, approves transformations, and monitors writes to NPC — all from a Slack channel. No SQL clients, no data loaders, no Salesforce tabs.
-- Maestro queries NPSP on your behalf SELECT Id, npe03__Contact__c, npe03__Contact__r.Name, npe03__Amount__c, npe03__Installment_Period__c, npe03__Date_Established__c, npe03__Open_Ended_Status__c, npe03__Next_Payment_Date__c FROM npe03__Recurring_Donation__c WHERE npe03__Open_Ended_Status__c = 'Open' AND npe03__Contact__c != null AND npe03__Amount__c > 0
-- After human approval in Slack, -- Maestro writes to the NPC org FOR EACH approvedRecord: salesforce_create_record("RecurringDonation", { "DonorId": contactMap[record.npe03__Contact__c], "InstallmentAmount": record.npe03__Amount__c, "RecurringFrequency": mapFrequency(record.npe03__Installment_Period__c), "StartDate": record.npe03__Date_Established__c, "Status": "Active", "MigrationSource__c": "NPSP", "LegacyId__c": record.Id })
What's Delivered in Build 40
The most sophisticated scenario — but still fits in a single Build 40 sprint because AI handles the repetitive query/transform/write loops automatically.
Equivalent traditional SI cost: $12,000–$18,000