Scenario 01

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.

📦
Source
NPSP
Custom namespace objects
🤖
Maestro AI
Transform + Validate
Field mapping · Data quality
☁️
Destination
NPC Standard Objects
RecurringDonation · GiftTransaction
npe03__Recurring_Donation__c (NPSP) RecurringDonation (NPC)
npe03__Contact__cDonorId
npe03__Amount__cInstallmentAmount
npe03__Installment_Period__cRecurringFrequency
npe03__Date_Established__cStartDate
npe03__Open_Ended_Status__cStatus
npe03__Recurring_Donation_Campaign__cFundraisingCampaignId
npe03__Next_Payment_Date__cNextPaymentDate
SOQL Query salesforce_soql_query
-- 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
Record Creation salesforce_create_record
-- 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"
NPC RecurringDonation — Created 247 records migrated
DonorAmountFrequencyStart DateNext PaymentStatus
Sarah Johnson$500.00Monthly2021-03-012025-06-01Active
Robert Chen$250.00Monthly2022-07-152025-06-15Active
Maria Gonzalez$1,200.00Annually2020-01-012026-01-01Active
David Park$100.00Monthly2023-09-012025-06-01Active
Lisa Thompson$50.00Weekly2024-01-082025-05-26Active

What's Delivered in Build 40

Full NPSP object audit — inventory of all custom objects, fields, and record counts
Field mapping documentation — every NPSP field mapped to its NPC equivalent
Migration scripts — validated, rerunnable data migration for RecurringDonation, GiftTransaction, Contact, and Account
Data quality report — flags missing contacts, duplicate accounts, broken relationships before migration
Rollback documentation — if anything looks wrong post-migration, we can revert

This scenario fits comfortably within a Build 40 sprint.
Typical completion: 2–3 weeks.

Equivalent traditional SI cost: $6,000–$8,000

28
est. hours
Scenario 02

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.

📊
Source
External Data
CSV · DonorPerfect · Bloomerang
🤖
Maestro AI
Normalize + Dedupe
Data quality · Matching rules
Validate
Review + Approve
Exceptions flagged for review
☁️
Destination
NPC Standard Objects
Contact · Account · GiftTransaction
Source example: A nonprofit migrating from DonorPerfect exports a CSV with 1,200 donor records, 4,800 gift transactions, and 180 recurring pledges. Below shows how Maestro processes each layer.
Input — Raw CSV Row source_data
{
  "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"
}
Output — NPC Contact + Account salesforce_create_record
-- 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"
})
Input — Gift History Rows source_data
-- 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
Output — NPC GiftTransaction salesforce_create_record
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
Data Quality Report — 1,200 donor records 38 exceptions flagged
Issue TypeCountActionStatus
Duplicate email addresses12Merge using most recent recordReview
Missing email — will not get comms18Load as-is, flag for enrichmentFlagged
Malformed phone numbers6Normalize format, loadAuto-fixed
Gift with no matching donor2Hold — manual review requiredReview
1,162 clean recordsLoad directlyReady

What's Delivered in Build 40

Source data analysis — full assessment of your export before any data moves
Contact + Account creation — with proper Household Account setup per NPC data model
Gift history load — all GiftTransaction records with campaign attribution preserved
Recurring pledge setup — pledges converted to NPC RecurringDonation objects
External ID mapping — every record tagged with source system ID for future reference
Exception report — every record that needed human review, documented with resolution

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

35
est. hours
Scenario 03

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.

💬
User
Slack Message
#fundraising · #programs
🤖
Maestro AI
Intent + Query
Natural language → SOQL
☁️
Salesforce NPC
Read / Write
Contact · GiftTransaction · Campaign
📋
Response
Formatted Result
Tables · Summaries · Confirmations
🏢
#fundraising High Tide Demo Org
KL
Katie L.10:14 AM
@maestro look up Patricia Williams — she called about her year-end gift
M
Maestro10:14 AM
Found Patricia Williams in Salesforce NPC:
🧑 Patricia Williams — Contact
Emailpat.williams@email.com
Phone(312) 555-0192
Lifetime Giving$4,250.00
Last Gift$500.00 · Dec 15, 2024 · Year End Campaign
Recurring Gift$250/mo · Active since Mar 2022
Salesforce RecordView in Salesforce ↗
KL
Katie L.10:15 AM
Perfect. She wants to increase her monthly to $300. Can you update that?
M
Maestro10:15 AM
Updated ✅ Patricia Williams' recurring gift has been changed from $250.00/mo$300.00/mo effective next billing cycle (June 1).
📝 RecurringDonation Updated
Record ID0a63x000001AbCdEAA
Previous Amount$250.00/month
New Amount$300.00/month
Effective Date2025-06-01
Message #fundraising
🏢
#leadership High Tide Demo Org
ED
Executive Director8:02 AM
@maestro how's the spring campaign doing vs last year?
M
Maestro8:02 AM
Here's the Spring Campaign comparison pulled from Salesforce NPC:
📊 Spring Gala Campaign — YOY Comparison
This Year (2025)$48,200 · 94 donors · Avg $513
Last Year (2024)$41,750 · 82 donors · Avg $509
YOY Growth+15.4% revenue · +14.6% donors
Campaign Goal$60,000 — 80% to goal, 18 days left
Top Gift$5,000 — Anonymous
Message #leadership

What's Delivered in Build 40

Slack-First MCP server — configured and deployed to your Slack workspace
Donor lookup commands — name, email, phone → full NPC profile + giving history
Gift logging from Slack — log a cash gift, check, or pledge without opening Salesforce
Campaign dashboards on demand — totals, donor counts, YOY comparison in any channel
Recurring gift management — update amounts, pause, cancel from Slack
Role-based access — staff see their scope; leadership sees org-wide

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

32
est. hours
Scenario 04

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.

💬
Command
Slack
Migration control channel
📦
Read
NPSP Org
Legacy object queries
🤖
Maestro AI
Transform + Validate
Flags exceptions to Slack
☁️
Write
NPC Org
On human approval
🔄
#npsp-migration Migration control channel
JP
John P.9:00 AM
@maestro run migration dry-run for RecurringDonations — show me what would move
M
Maestro9:00 AM
🔍 Running dry-run on npe03__Recurring_Donation__c in NPSP org...
📋 Dry-Run Results — RecurringDonation
Total NPSP records247
Ready to migrate231 records
Exceptions found16 records need review
Est. write time~4 minutes
Want me to show the 16 exceptions, or proceed with the 231 clean records?
JP
John P.9:01 AM
show me the exceptions first
M
Maestro9:01 AM
Here are the 16 exception records from NPSP:
⚠️ Exceptions — Require Review
8 recordsContact deleted in NPSP — no DonorId to map
5 recordsInstallment_Period = "1st and 15th" — no NPC equivalent
3 recordsAmount = $0 — likely test data
Suggested actions: Skip the 3 zero-amount records, map "1st and 15th" → Monthly, hold the 8 orphaned records for manual contact lookup. Approve?
JP
John P.9:02 AM
approved — go ahead and migrate the 231 clean + 5 frequency-mapped ones. hold the 8 orphans and the 3 zero-amount
M
Maestro9:02 AM
✅ Migration complete. Writing 236 records to NPC now...
✅ Migration Complete — RecurringDonation
Records written236 to NPC RecurringDonation
Held for review11 records (8 orphan + 3 zero)
Errors0
Duration3m 42s
Migration logDownload CSV ↗ · View in Salesforce ↗
Ready to proceed to OpportunityGiftTransaction migration? I can run that dry-run next.
Message #npsp-migration
Read — NPSP Org salesforce_soql_query · org=npsp
-- 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
Write — NPC Org salesforce_create_record · org=npc
-- 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

Dual-org MCP configuration — Maestro connected to both NPSP and NPC orgs simultaneously
Slack migration channel — #npsp-migration with full audit trail of every decision
Human-in-the-loop approvals — no data moves without explicit Slack approval
Exception surfacing — edge cases explained in plain English, not error codes
Migration log artifacts — CSV export of every record migrated, held, and skipped
Rollback-ready — LegacyId__c field on every NPC record links back to NPSP source

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

38
est. hours