> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wegive.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Campaign Member

> Mapping between WeGive campaign supporters and Salesforce CampaignMember records

The relationship between a supporter and a campaign syncs to Salesforce `CampaignMember`.

## Linkage (create-only)

| WeGive field | NPC field | Notes |
| - | - | - |
| `campaign.npc_id` | `CampaignId` | |
| `donor.npc_id` (individual) | `ContactId` | WeGive resolves the Person Account's `PersonContactId`, because `CampaignMember` references the embedded Contact rather than the Account. |
| `donor.npc_id` (company) | `AccountId` | Only when **Accounts as Campaign Members** is enabled in your org. Otherwise company members are skipped and logged. |
| `npc_id` | `Id` | Stored on the WeGive campaign supporter record. |

`CampaignId` and `ContactId` are read-only after creation in Salesforce, so updates to an existing member do not change them.

## Pull behavior

On pull, WeGive reads `ContactId`, resolves it back to the parent Account ID, and matches the supporter by `npc_id`. If your org has Accounts as Campaign Members enabled, members with only an `AccountId` are matched to companies. A member whose campaign or supporter has not yet synced is skipped and retried on a later pull.

## Status

`CampaignMember.Status` is read on pull but WeGive does not currently write a status on push — confirmed against `compileCampaignDonorPayload()`, whose push payload carries only `CampaignId` and `ContactId`/`AccountId`, nothing else. There's no `first_responded_at` field or equivalent pushed either.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.