What flows where
The sync is one-directional: Raise → CRM+. Three resources have a sync mapping into CRM+:| Raise resource | CRM+ resource |
|---|---|
| Donor | Becomes (or links to) a CRM+ Contact |
| Gift | Becomes a CRM+ Gift |
| RecurringGift | Becomes a CRM+ RecurringGift |
This page describes the sync as observable from the Raise API. The full sync behavior, including timing guarantees, conflict resolution, and how data conflicts between Raise-originated and CRM+-originated changes are handled, is a platform-level concern that may evolve. The integration patterns on this page are conservative — they assume the sync exists and works, without depending on specific timing or behavior contracts.
Cross-product identifiers: crmKey, crmSecondKey, and crmKeyUrls
Three fields on Raise resources track the linkage to corresponding records in CRM+ (or other external CRMs):
| Field | Type | Where it appears |
|---|---|---|
crmKey | string | DonorModel, CampaignModel, RecurringGiftModel |
crmSecondKey | string | DonorModel only |
crmKeyUrls | object (map of integration type → CrmUrlInfo) | DonorModel, CampaignModel, RecurringGiftModel |
crmKey
The crmKey is the primary identifier of the corresponding record in the external CRM. For a Raise Donor that has been synced to CRM+, crmKey typically holds the CRM+ Contact’s ID.
A Raise record that has not yet been synced (or whose sync was disabled) will have crmKey: null. Partner integrations can use the presence or absence of crmKey as a signal:
crmKey != null: the record has been synced to at least one external CRM.crmKey == null: the record has not been synced yet, or sync is disabled for the parent Campaign.
crmSecondKey
A secondary identifier on Donors only. Used when the donor needs to be tracked across two distinct external systems, or when an alternative identifier (different from the primary CRM Contact ID) is meaningful.
crmKeyUrls
A map of integration type to CrmUrlInfo records. Each CrmUrlInfo has two fields:
url field gives partner integrations a direct hyperlink to the donor’s record in the external CRM. Useful for “view in CRM” links inside the partner’s UI:
JavaScript
Setting crmKey on creation
Several create/update endpoints accept crmKey in the request body — partners can seed the linkage rather than waiting for the sync to populate it:
DonorRequest—crmKeyfield (single key)UpdateDonorPatchRequest—crmKeysfield (multiple keys for multi-CRM scenarios)DonorPaymentRequest(the body ofPOST /api/Raise/give) —crmKeyfieldCampaignRequest—crmKeyfieldRecurringGiftRequest—crmKeyfield
crmKey on creation is useful when an integration creates a Raise record from data that originated in CRM+: the integration knows the CRM+ Contact ID and can stamp it on the Raise Donor at creation time, avoiding any uncertainty during the sync.
Controlling sync at the Campaign level: canSync
The canSync boolean on a Campaign controls whether that Campaign’s data flows to CRM+. When canSync: true, Gifts produced under the campaign sync as expected; when canSync: false, those Gifts remain in Raise without propagating.
Toggling sync
PUT /api/Campaign/{campaignId}/toggle-sync flips the flag:
cURL
- The customer needs to pause sync for a specific campaign — e.g., during data cleanup or a CRM+ migration.
- Test campaigns shouldn’t appear in CRM+ as production data.
- An integration is performing a bulk import and wants CRM+ sync paused until the import is verified.
What canSync: false does and doesn’t do
When canSync is false | Behavior |
|---|---|
| New gifts created under the campaign | Continue to be created in Raise normally. |
| Those gifts flowing to CRM+ | Do not propagate — they stay in Raise only. |
| Gifts already synced before the toggle | Remain in CRM+. The toggle is not retroactive. |
| Donor records associated with the campaign | Sync to CRM+ may continue depending on whether they’re attached to other syncing campaigns. |
canSync: true) resumes propagation for new gifts but does not automatically backfill the gifts that occurred during the disabled window. For backfill of historical gifts during a sync-disabled period, coordinate with the customer’s admin team — there’s no API endpoint to trigger backfill.
What partner integrations can and can’t do across the two products
The platform-level sync is the only mechanism that moves data between Raise and CRM+. The implications:Things partner integrations can do
| Capability | How |
|---|---|
| Detect sync status | Check crmKey on a Raise record — if non-null, it has been synced. |
| Seed the linkage | Set crmKey when creating Raise records from CRM+-originated data. |
| Pause sync for specific campaigns | Use PUT /api/Campaign/{campaignId}/toggle-sync. |
| Build “view in CRM” links | Use crmKeyUrls to get the direct URL. |
| Reconcile records across the two products | Use crmKey as the join key. |
| Subscribe to events from each product separately | Each has its own webhook system. A giftCreate event in Raise and the corresponding giftCreate in CRM+ are separate webhook deliveries. |
Things partner integrations can’t do
| Limitation | What this means |
|---|---|
| Force a one-time sync of a specific record | No “sync this gift now” endpoint exists. The sync runs on its own cadence. |
| Query CRM+ data from the Raise API | Raise endpoints return only Raise data. To read CRM+ data, call the CRM+ API directly with CRM+ credentials. |
| Write to CRM+ via Raise | Raise endpoints only write Raise data. CRM+ writes use the CRM+ API. |
| Get sync timing guarantees | The spec doesn’t document timing SLAs for the sync. Treat the sync as eventually consistent. |
| See sync errors | Errors that occur during the sync (e.g., a Raise Donor that fails to sync to CRM+) are not exposed via the Raise API. Coordinate with the customer’s admin team to investigate. |
Reconciliation patterns
Partner integrations that read from both Raise and CRM+ — typically reporting tools or unified-view applications — need to reconcile the two data sets. Three patterns work well:Pattern 1: crmKey as the join key
The most direct approach: use crmKey to match a Raise Donor to its CRM+ Contact. If both records exist, they’re the same entity:
JavaScript
Pattern 2: dual webhook subscription with deduplication
For integrations that want real-time updates from both products, subscribe to webhook events from each separately and deduplicate at the integration level:JavaScript
Pattern 3: periodic reconciliation backstop
For high-confidence reconciliation regardless of webhook reliability, run a periodic backstop that queries both sides and reconciles discrepancies:JavaScript
Timing expectations
The Raise spec does not document timing guarantees for the sync. In practice, partner integrations should plan for:- Most gifts appear in CRM+ within seconds to a few minutes after creation in Raise.
- Occasional gifts may take longer due to processing batching, transient errors, or maintenance windows.
- Rare gifts may fail to sync entirely if the source data has a problem (malformed donor record, missing required field on the CRM+ side, etc.).
- Use the Raise event as the source of truth and treat CRM+‘s view as eventually consistent, or
- Implement the periodic-reconciliation backstop (Pattern 3 above) to catch the rare cases where sync doesn’t complete.
When crmKey is missing
A Raise record with crmKey: null could be in any of several states:
| State | What it means |
|---|---|
| Sync hasn’t run yet | The record was just created and the sync hasn’t processed it. Usually resolved within minutes. |
| Sync is disabled for the parent | The Campaign has canSync: false. Records under it don’t sync. |
| Sync failed | An error during sync prevented the link from being established. May need investigation. |
| The customer doesn’t run CRM+ | Single-product Raise customers will never have crmKey populated. |
crmKey to drive behavior should not treat its absence as an error. Treat it as “linkage not established yet” and handle gracefully — show a “not yet synced” indicator in the UI rather than a hard failure.
Where to go next
Statuses and Lifecycle States
The lifecycle states across Donors, Gifts, and RecurringGifts that matter for sync reconciliation.
Campaigns
The Campaign resource where
canSync and toggle-sync live.Reconcile Raise with CRM+
The workflow that puts the reconciliation patterns on this page into production.
Sync Architecture Patterns
The broader architectural patterns for sync-aware integration design.