Donation Object Mapping
This document details the real mapping used byNeonIntegration::generateDonationParams().
Core Donation Mapping
Financial Information
There is no
currency field sent at all — no USD default, no currency key in the payload whatsoever.Timing Information
receivedDate is not actually a documented top-level key in the params array — the code computes $renderedData['payout']['paid_at'] on the rendered webhook resource, which only feeds into the custom-field-mapping resolution step (see below), not a hardcoded top-level field. It only reaches Neon if a NeonMappingRule maps payout.paid_at to some Neon path.Attribution
Tribute Information
tribute_type is not a real WeGive field consulted anywhere in this mapping — the value is hardcoded regardless of what kind of tribute (memorial vs. honor) the donation actually represents.Integration Fields
Payment Processing
Tender Type Mapping
Credit Card Processing (source_type = 'card', create only)
creditCardOffline.billingAddress is hardcoded null — no billing address is ever included on the payment object itself (a stripped copy exists separately, on the donor account push — see Account Mapping).Bank Transfer Processing (source_type = 'bank', create only)
Custom Field Mapping
The default seededNeonMappingRule records for donations:
Adding Custom Mappings
Synchronization Behavior
Donation Creation/Update (Push)
- If
neon_idalready set →PUT /donations/{neon_id}(update); otherwise →POST /donations(create) - Payment data is only included on the very first push — see the warning at the top of this page
- There is no “verify donor account exists first” orchestration step inside donation push itself — if the donor’s
neon_account_idisn’t set, the push simply sendsaccountId: nulland Neon’s own API would reject it - There is no “sync campaign first” step either — same pattern,
campaignis sentnullif the campaign hasn’t separately synced yet
Import from Neon CRM (Pull)
POST /donations/searchwith a last-modified-date filter and anEmail NOT_BLANKfilter- Matches the donation’s Neon account to an already-imported WeGive donor
- Creates a new WeGive
Transactionfor any Neon donation not already correlated byneon_id
API Examples
Creating a Donation (real payload shape)
This reflects the real payload shape:
anonymousType as a raw boolean, tribute.type always "Honor", no currency key, and campaign/check or creditCardOffline sent as null when not applicable rather than omitted.Updating a Donation (payments omitted)
Searching Donations (Pull)
Error Handling
Best Practices
- Understand that editing a donation’s tribute/fee/campaign after initial creation will not re-push its payment/tender details — if the payment record needs correcting in Neon, it has to be corrected directly in Neon, not via a WeGive-side re-sync
- Don’t expect
tribute.typeto distinguish memorial vs. honor gifts — it’s always"Honor" - A donation with no campaign correlation in Neon yet will push with
campaign: null— sync/verify the campaign separately first if attribution matters