How New Supporters Sync to Salesforce NPSP
Last updated: February 24, 2026
When someone donates through a WeGive checkout for the first time, the integration needs to decide: does this person already exist in Salesforce, or do we need to create a new record? The answer depends on whether the supporter is an individual (syncs to a Contact) or a company (syncs to an Account) — and the matching logic is different for each.
The Two Scenarios
Scenario 1: A New Individual Donates via Checkout
What the donor does: Jane Smith fills out a checkout form, enters her name, email, and payment info, and completes a $50 donation. She's never given through WeGive before.
What WeGive does in Salesforce:
The donation completes and WeGive queues the sync (roughly 5-minute delay)
Before creating anything, WeGive searches Salesforce: "Is there already a Contact with this email address?"
If a match is found → WeGive links to the existing Contact and updates it with the incoming data
If no match is found → WeGive creates a new Contact, and NPSP automatically creates a Household Account for them
Then the donation syncs as an Opportunity and Payment under that Contact
Scenario 2: A New Company Donates via Checkout
What happens: Acme Corp makes a $1,000 donation through checkout. The company has never given through WeGive before.
What WeGive does in Salesforce:
The donation completes and WeGive queues the sync
WeGive does not search for an existing Account — there is no matching logic for companies
WeGive creates a new Account in Salesforce with the Record Type "Organization" (or whatever your org has configured)
Then the donation syncs as an Opportunity and Payment under that Account
Key difference: Individuals get email-based matching. Companies do not get any matching — a new Account is always created.
Individual Matching: How It Works Step by Step
When WeGive is about to push an individual donor to Salesforce, it runs through this decision tree:
Step 1: Does the donor have an email?
If the donor's primary email (email_1) is blank, matching is skipped entirely and a new Contact is always created. No lookup happens.
Step 2: Search Salesforce by email
WeGive queries Salesforce:
"Give me all Contacts where Email = jane.smith@email.com, sorted by most recently modified."
This is an exact email match only. WeGive does not match on name, phone, address, or any other field — just email.
Step 3: Was a Contact found?
If no Contact has that email → WeGive creates a new Contact in Salesforce. NPSP auto-creates a Household Account. Done.
If multiple Contacts have that email → WeGive picks the one with the most recent LastModifiedDate — not the most recently created, but the most recently modified. Any field update on a Contact counts as a modification, so a bulk data cleanup, an automation rule firing, or even a manual edit to an unrelated field could change which Contact WeGive selects. This is worth knowing if your Salesforce org has duplicate Contacts with the same email address.
If a Contact with that email exists → Go to Step 4.
Step 4: Is that Salesforce Contact already claimed by another WeGive donor?
This is the duplicate prevention check. WeGive looks at its own database: "Do I already have a different donor record linked to this Salesforce Contact ID?"
If no other WeGive donor is linked to it → WeGive links to the existing Contact and updates it with the new donor's data. No duplicate created.
If another WeGive donor IS already linked to it → WeGive intentionally creates a new Contact in Salesforce, even though the email matches. This prevents one WeGive donor's updates from overwriting another's data.
What Gets Created
When a new Contact is created, the following default fields are set:
Salesforce Field | Source |
| Donor's first name (defaults to "FNU" if blank) |
| Donor's last name (defaults to "LNU" if blank) |
| Based on preferred email setting (personal, work, or alternate) |
| Mailing address line 1 + line 2 |
| Mailing city |
| Mailing zip |
| Billing address line 1 + line 2 |
| Billing city |
| Billing zip |
State and country fields are not set by default due to Salesforce picklist conflicts — these can be mapped through custom Mapping Rules if needed.
After the Contact is created, WeGive retrieves the auto-created Household Account ID from Salesforce and stores it. If the donor belongs to a WeGive Household, that Household is linked to the Salesforce Household Account.
What Gets Updated (on a match)
When WeGive matches to an existing Contact, it updates all of the same fields listed above. The existing Contact's data is overwritten with whatever WeGive has for that donor.
Company Matching: There Is None
Company donors follow a simpler path: WeGive always creates a new Account. There is no lookup, no email matching, no name matching. Every company donor pushed from WeGive results in a brand new Account record in Salesforce.
What Gets Created
Salesforce Field | Source |
| Company name |
| "Organization" |
| Office phone |
| Fax number |
| Based on the "Non-Household Record Type" setting (defaults to "Organization") |
Why This Matters
If the same company already exists as an Account in Salesforce — say, "Acme Corp" was entered manually by a fundraiser last year — WeGive will create a second "Acme Corp" Account. This is a known behavior, not a bug.
How to handle it:
Use Salesforce's built-in duplicate rules to catch and merge duplicates after they're created
Manually merge the Accounts in Salesforce after the sync
If the company will be a repeat donor, merge the duplicates once and future donations will sync to the correct Account going forward
Timing and Order of Operations
Here's the full sequence when someone donates through checkout for the first time:
Donor completes checkout → WeGive creates a Donor record and a Transaction record
Sync is queued → The push to Salesforce happens with a ~5 minute delay, allowing related data to settle
Donor syncs first → WeGive checks if the donor needs a Salesforce record
Individual with no
salesforce_id→ runs matching logic → creates or links ContactCompany with no
salesforce_account_id→ creates new Account (no matching)
Transaction syncs second → The donation pushes as an Opportunity with a Payment record, linked to the Contact or Account from step 3
Related data syncs → GAU Allocations, Campaign links, Recurring Donation references all sync after
The donor must sync before the transaction because the Opportunity needs a Contact or Account to attach to.
Edge Cases and Common Questions
"The donor used a different email than what's in Salesforce"
WeGive matches on exact email only. If Jane Smith is in Salesforce as jane@company.com but donates using jane.smith@gmail.com, WeGive will not find the match. A new Contact will be created. You'll need to merge the duplicates in Salesforce manually.
"There are multiple Contacts in Salesforce with the same email"
WeGive picks the one that was most recently modified (LastModifiedDate DESC). This is not the same as most recently created — any field change on a Contact updates its LastModifiedDate. Be aware that bulk updates, automation rules, or even a manual edit to an unrelated field on an older Contact could cause WeGive to start matching to a different record. If you have known duplicates in Salesforce, merging them before they cause unexpected matching behavior is recommended.
"The donor didn't provide an email"
No matching is attempted. A new Contact is created every time. The Contact will have a blank Email field.
"Two WeGive donors have the same email"
The first donor to sync will claim the Salesforce Contact. The second donor will create a new Contact (intentional duplicate) to prevent data from being mixed between the two WeGive records.
"A company donor has the same name as an existing Salesforce Account"
WeGive will still create a new Account. Company matching does not exist — not by name, email, or any other field.
"We merged Contacts in Salesforce — will WeGive know?"
It depends on how the merge was done. If the merge was performed using Salesforce's standard merge tool, the losing record gets a MasterRecordId field pointing to the winning record. WeGive recognizes this and updates its reference. If a third-party merge tool was used that doesn't set MasterRecordId, WeGive won't detect the merge and may have a stale reference.
"Can we change the matching to use name instead of email?"
No. The matching logic is email-only and not configurable. This is hardcoded in the integration.
"The Record Type for company Accounts is wrong"
Check the Non-Household Record Type setting in your Salesforce Integration configuration. This controls which Record Type is assigned to company Accounts. The default is "Organization" — if your Salesforce org uses a different Record Type name, update this setting.
Summary
Individual Donor → Contact | Company Donor → Account | |
Matching logic | Email-based lookup | None — always creates new |
Matching field |
| N/A |
If match found | Links to and updates existing Contact | N/A |
If no match | Creates new Contact + Household Account | Creates new Account |
If no email | Creates new Contact (no matching attempted) | N/A |
Duplicate prevention | Yes — won't claim a Contact already linked to another WeGive donor | No |
Record Type | None set on Contact (NPSP default applies) | Configurable via "Non-Household Record Type" setting |
Household | NPSP auto-creates Household Account; WeGive captures the ID | N/A |
Sync trigger | Transaction creation (donor syncs as a dependency) | Transaction creation (donor syncs as a dependency) |
Delay | ~5 minutes after checkout completion | ~5 minutes after checkout completion |