Data Mapping Overview
This page describes what actually syncs between WeGive and Neon CRM, and how.Core Object Mappings
There is no separate “Payment” object mapping distinct from Donation — a Neon donation carries its own nested
payments array in the same request, not a separate synced entity.Neon Object Details
Individual/Company Account
What’s real: first/last name (or companyname), up to 3 email addresses, email/SMS consent flags, mailing and (for individuals) billing address (inline, no phone/fax fields). See the warning below re: address/phone.
Donation
What’s real: amount (fee-adjusted), date, donor account reference, campaign reference (if any), anonymous flag, donor-covered-fee amount, tribute name, and a nested payment (tender type, card/bank detail, last-4 digits).Campaign
What’s real: name, start/end date, goal, active/inactive status, generated campaign page and donation form URLs (push); statistics (donationAmount, donationCount, eventRegistrationAmount, eventRegistrationCount, grandTotal) computed by Neon and read on pull.
Recurring Donation
What’s real: amount, next payment date, and arecurringPeriod/recurringPeriodType pair — push only, create/update, no pull.
Address
What would be real if this were wired up: address lines, city, zip, and phone numbers — push only, no pull. What’s actually real today: a stripped-down inline address copy (no phone) within the donor account push — see Account Mapping.Default Field Mappings
Account/Donor Mapping (all fields below are push-only in practice — see the warning further down)
Individual Donor → Individual Account
Company Donor → Company Account
There is no separate company-specific email/phone field distinct from what’s already listed for individual donors — company donor pushes reuse the same
primaryContact structure (with firstName sent as null).Transaction/Donation Mapping
Transaction amount for donations is not fee-adjusted the way DonorPerfect’s gift-amount is —
generateDonationParams() sends amount / 100 directly (the full transaction amount), and donorCoveredFee is reported as a separate field alongside it, not subtracted from amount.Payment Method Mapping
Card Type Mapping
Any other card issuer has no code mapped at all — the lookup returns
null/undefined for cardTypeCode.Campaign Mapping
Address Mapping
There’s no country-code mapping in this (unreachable) code either —
generateAddressParams() doesn’t populate a country field at all.Custom Field Mapping System
JSONPath-based mapping is real, viaNeonMappingRule:
Supported Objects
NeonMappingRule::integration accepts: ACCOUNT (1), DONATION (2), CAMPAIGN (3), RECURRING_DONATION (4), ADDRESS (5) — same shared enum used by other CRM integrations’ mapping rules (values 6-10 are used by other CRMs, not Neon).
Data Synchronization Rules
Correlation IDs
neon_account_id— Neon account id (donors)neon_id— Neon contact id (donors), or Neon donation/recurring-donation/address/campaign id depending on the modelneon_payment_id— Neon payment id (transactions only)
Matching Logic (push)
- Correlation id (
neon_account_id/neon_id) if already set → update - No correlation id → create; on Neon’s
10012(duplicate) error, search by email and link the existing account instead of retrying create - There is no name+organization fallback matching — only the email-search-on-duplicate-error path above
Matching Logic (pull)
- Email exact match against an existing WeGive
User - No match → create a new
Donor+User+Login - There is no “last modified wins”/field-level conflict resolution mechanism — pull simply overwrites the mapped fields it fetched; push simply sends whatever WeGive currently has. There’s no timestamp comparison deciding which side “wins.”
API Endpoint Reference
WeGive Dashboard API (real, authenticated)
GET /neon-integration— retrieve settingsPUT /neon-integration— update settingsPOST /neon-integration/sync— trigger manual syncPOST /neon-mapping-rules— create/update mapping rulesDELETE /neon-mapping-rules/{neon_mapping_rule}— remove a mapping rule
There is no public
/donors, /transactions, /campaigns, /scheduled-donations REST API surface specific to this integration — those are general WeGive dashboard/public API endpoints, not integration-specific routes.Neon CRM API (real, called by this integration)
POST /accounts/search,POST /accounts,PUT /accounts/{id},GET /accounts/{id}POST /donations/search,POST /donations,PUT /donations/{id}GET /campaigns,POST /campaigns,PUT /campaigns/{id}POST /recurring,PUT /recurring/{id}POST /addresses,PUT /addresses/{id}— implemented in code (generateAddressParams()) but never actually called; this is a known issuePOST /webhooks,GET /webhooks,DELETE /webhooks/{id}
There is no
GET /accounts (list-all), GET /donations/{id} (single-get outside the linkDonorFromResponse helper), or GET /addresses/GET /recurring used anywhere in this integration’s code.Integration Notes
Validation
- Neon donor pull requires a non-blank email — a missing/invalid email skips the row entirely
- There is no ISO 8601 enforcement, phone-number normalization, or amount/currency format validation performed by WeGive — values are sent as-is; any rejection surfaces as a Neon API error