Migrating donor records from AffinityQuest into Salesforce's Nonprofit Success Pack (NPSP) is one of the most technically demanding data operations a nonprofit can take on — and one of the most underserved topics in the Salesforce ecosystem. If your organization is moving hundreds of thousands of constituent and gift records across two objects, this step-by-step guide explains exactly how to do it using Salesforce Data Loader, including the date formatting and stage field transformations that trip up most teams.
Photo by Stephen Dawson on Unsplash
What Is AffinityQuest and Why Migrate to NPSP?
AffinityQuest (sometimes spelled Affinaquest) is a donor management and fundraising application built natively on Salesforce. It uses custom objects — such as specialized gift and constituent tracking objects — that sit outside NPSP's standard architecture. Organizations often decide to consolidate onto NPSP's standard Opportunity and Contact objects to simplify their tech stack, improve ecosystem compatibility, and reduce long-term maintenance overhead.
The migration is not a straightforward export and re-import. AffinityQuest's custom objects don't map directly to NPSP's standard schema, so you'll need to plan for:
Object-to-object mapping across your source and target structures
Date field reformatting from default formats to ISO 8601
Opportunity stage mapping to match NPSP's required picklist values
Load sequencing — parents before children
Hardware and performance constraints when working with large volumes (400K+ rows per object)
Step 1: Map Your Objects and Fields Before Touching Data Loader
Before opening Data Loader, build a field-level mapping spreadsheet. For a typical AffinityQuest-to-NPSP migration, you'll be mapping two source objects to two target objects:
Source (AffinityQuest)
Target (NPSP)
Custom Constituent Object
Contact / Household Account
Custom Gift Object
Opportunity
For each field, document:
Source field name and data type
Target API name and data type
Any transformation required (reformat, recode, leave as-is)
Whether the field is required in the target
If your target fields are already configured in Salesforce, you don't need to recreate them — but confirm their API names exactly as Data Loader will expect them in the CSV header row.
Step 2: Reformat All Date Fields to ISO 8601
This is the most common source of import errors on large nonprofit migrations. Salesforce Data Loader requires dates in ISO 8601 format — not the default Excel date format your export will likely produce.
Accepted formats for Salesforce Data Loader
YYYY-MM-DD
YYYY-MM-DDThh:mm:ssZ
YYYY-MM-DDThh:mm:ss.sssZ
Fields that almost always need reformatting
Audit fields:Created Date, Last Modified Date (needed to preserve historical data integrity)
Gift close dates and any other Opportunity date fields
Custom date/time fields specific to AffinityQuest's object model
Bulk reformatting approaches
In Excel or Google Sheets:
=TEXT(A2,"YYYY-MM-DD")
Add this as a helper column, then paste-as-values before saving your CSV.
If your machines can't handle the file size (a common issue at 400K+ rows), Zapier's Formatter → Date/Time → Format action can handle date conversion in batches without local hardware constraints. Note that a temporary plan upgrade may be needed depending on task volume — typically around $200 for one month.
Preserve audit fields:Salesforce allows you to retain Created Date and Created By from your legacy system, but you must enable "Allow audit field updates" in your org's Setup before loading.
NPSP enforces picklist validation on the Opportunity Stage field. Any value from AffinityQuest that doesn't exactly match an NPSP stage name will cause a row-level error during import.
A common example:
AffinityQuest Value
NPSP Target Value
Accepted
Closed Won
Pending
Prospecting
Declined
Closed Lost
Before running your load:
Export a list of every distinct stage value in your source data
Cross-reference each one against your NPSP org's Stage picklist (Setup → Object Manager → Opportunity → Fields → Stage)
Apply a VLOOKUP or find-and-replace to recode every value in your CSV
Any unmapped value will appear in the Data Loader error file. Fix all of them before your production run.
Step 4: Load Objects in the Correct Order
Parent objects must be loaded before child objects, or you'll have no AccountId or ContactId to reference when loading Opportunities.
Recommended load order:
Contacts / Accounts (constituent and household records)
Opportunities (gift records), using the IDs generated in Step 1
After loading Contacts, export the newly created Id values from Salesforce and join them back to your Opportunity CSV using your legacy constituent identifier as the matching key.
Step 5: Run a Sandbox Test Load First
Never attempt a production load of 800K records without a validated sandbox run. The process:
Extract a representative sample — 500 to 1,000 records per object, including edge cases (records with null dates, non-standard stage values, etc.)
Load the sample into a Full Sandbox copy of your NPSP org
Verify row counts in both the Data Loader success file and Salesforce reports
Manually inspect at least 20 records across both objects
Run a duplicate detection report
Only proceed to production once the sandbox run is fully clean.
Step 6: Monitor the Production Load and Verify Results
Data Loader generates two output files after every run:
success.csv — records that were inserted successfully, including their new Salesforce IDs
error.csv — every failed row with an error message
After your full load, run a record count report in Salesforce and compare it to your source file row count. Discrepancies greater than 0.1% warrant investigation before signing off.
Common error categories to watch for
Date format issues (see Step 2)
Missing required fields
Invalid picklist values (see Step 3)
Duplicate detection rules triggered
External ID mismatches during relationship loads
Budget and Effort Expectations
For a migration of this scale — two objects, roughly 800,000 total records, with moderate transformation complexity — here's a realistic effort breakdown:
Phase
Estimated Effort
Field mapping and transformation prep
2–4 hours
Sandbox test load and debugging
2–3 hours
Production load and verification
2–4 hours
Audit field and date formatting
1–2 hours
Total
5–13 hours
The biggest variable is the data quality of the source export. Clean, well-structured AffinityQuest exports with consistent date formats can compress this timeline significantly. Messy or inconsistently formatted exports will expand it.
If your internal team hasn't run Data Loader migrations at this scale before, working with an experienced consultant for at least the sandbox phase can prevent costly errors in production.
When to Bring in Expert Help
A few situations where professional support pays for itself quickly:
Your team's hardware can't open and process 400K+ row CSV files reliably
You're unsure how to preserve audit fields or maintain referential integrity across objects
You need the migration completed within a fixed budget and can't afford a failed production run
Zapier is already part of your stack and you want to use it for transformation automation
Get expert help with your AffinityQuest migration
Migrating 800,000+ donor records from AffinityQuest to Salesforce NPSP involves field mapping, date reformatting, picklist transforms, and load sequencing that can go wrong in production. Connex Digital has run migrations like this before — and knows where the errors hide. We can take the preparation and execution off your team's plate so your data arrives clean.
Book a free call to talk through your migration scope and what it takes to get it done right. Schedule a free consultation.
Action Network Salesforce integration guide for nonprofits: choose a source of truth, map essential fields, and sync donors without brittle two-way loops.
Use the Issue-Importance-Impact framework for discovery calls to ask sharper questions, avoid early demos, and connect recommendations to measurable business impact.
Automate LinkedIn lead form responses into Salesforce with Zapier. Eliminate manual data entry and streamline your lead generation process effortlessly.