> ## 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.

# Constituent Mapping

> Field-level mapping between WeGive donors and Bloomerang constituents

# Constituent Mapping

WeGive donors map to Bloomerang's **Constituent** object — individual donors become `Type: "Individual"`, company donors become `Type: "Organization"`.

## Push (WeGive → Bloomerang)

### Individual donor

```
POST constituent (or PUT constituent/{id} on update)
{
  "Type": "Individual",
  "FirstName": <donor.first_name, or "FNU" if empty>,
  "MiddleName": <donor.middle_name>,
  "LastName": <donor.last_name, or "LNU" if empty>,
  "PrimaryEmail": { "Type": "Home", "Value": <donor.email_1> },
  "PrimaryPhone": { "Type": "Mobile", "Number": <donor.mobile_phone> },
  "PrimaryAddress": { "Type": "Home", "Street": ..., "City": ..., "State": ..., "PostalCode": ..., "Country": ... }
}
```

`PrimaryEmail`/`PrimaryPhone`/`PrimaryAddress` are only included at all if the donor has that field set — there's no attempt to send an empty value.

### Company donor

```
POST constituent
{
  "Type": "Organization",
  "FullName": <donor.name>,
  "PrimaryAddress": { ... }
}
```

Company donors don't send an email or phone — only `FullName` and address.

<Note>
  Only **one** email and **one** phone sync, each — there's no secondary email/phone field on either side of this integration. `middle_name` is the only name field beyond first/last that's sent.
</Note>

### Address

Only a **mailing** address syncs — there's no separate billing-address handling for Bloomerang. The `State` field is validated against the donor's country before sending: an invalid state code for that country (e.g. a US state code on a non-US address) is sent as an empty string rather than the actual value, since Bloomerang rejects the whole request with a 400 if it receives one.

## Pull (Bloomerang → WeGive)

Constituents are pulled via `GET constituents` (50 per page, filtered by `lastModified`) and imported as Donors, matched on `bloomerang_id`:

| WeGive field | Source |
| - | - |
| `bloomerang_id` | Constituent `Id` |
| `bloomerang_account_id` | Constituent `AccountNumber` |
| `type` | `individual` if `Type` is `Individual`, else `company` |
| `first_name` / `middle_name` / `last_name` | `FirstName`/`MiddleName`/`LastName` (individual only) |
| `name` | `FormalName` |
| `email_1` | `PrimaryEmail.Value` |
| `mobile_phone` | `PrimaryPhone.Number` |
| `birthdate` | `Birthdate` |

The mailing address is created or updated from `PrimaryAddress` the same way on both sides — `Country` defaults to `US` if Bloomerang doesn't supply one.

## Matching

Matching is by `bloomerang_id` only — there's no email, name, or address-based matching anywhere in this integration. A donor with no `bloomerang_id` is always created as new on the next push, even if a Constituent with the same email already exists in Bloomerang.

## Getting Help

* **WeGive Support**: [support@wegive.com](mailto:support@wegive.com)
* **Bloomerang API Documentation**: [bloomerang.co/features/api](https://bloomerang.co/features/api/)


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