> For the complete documentation index, see [llms.txt](https://docs.anedot.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.anedot.com/integrations/crm-donor-management/donorperfect.md).

# DonorPerfect

Connect Anedot to DonorPerfect to sync donations and supporter data into your CRM workflows and related records from Settings → Integrations → Directory.

> For the complete documentation index, see [llms.txt](https://anedot.gitbook.io/anedot-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://anedot.gitbook.io/anedot-docs/integrations/crm-donor-management/donorperfect.md).

## DonorPerfect

Connect Anedot to DonorPerfect to automatically relay donation data, including fund allocations and hidden custom fields, with flexible setup options for Action Pages, Teams, and recurring gifts.

DonorPerfect is a donor management platform used by nonprofits for fundraising, marketing, automation, and integrations.

#### How It Works

Anedot relays financial data from Donation Pages directly to DonorPerfect for tracking and donor record updates.

### Connecting Anedot to DonorPerfect

To set up the integration:

1. In your Anedot account, go to **Settings → Integrations → Directory**.
2. Click **+ New Connection**.
3. Select **DonorPerfect** from the directory.
4. Choose which Action Pages to sync. All pages are selected by default. To exclude specific pages, enter a comma-separated list of Action Page IDs.
5. (Optional) Limit the integration to a specific Team.
6. Paste your DonorPerfect API Key.
7. Click **Create integration** to complete the setup.

You can edit Action Pages, Team scope, and credentials at any time after setup.

### Data Relays

#### Custom Hidden Field

Anedot supports the following Custom Hidden Fields, which must be configured within the Action Page Builder under **Form → Hidden Fields**:

**Donation Relay**

* `solicit_code`
* `sub_solicit_code`
* `campaign`
* `gift_aid_date`
* `gift_aid_amt`
* `gift_aid_eligible_g`
* `gift_type`
* `gift_narrative`
* `gfname`
* `glname`
* `memory_honor`
* `old_amount`
* `receipt_delivery_g`
* `acknowledgepref`
* `transaction_id`
* `ty_letter_no`

**Pledge Relay**

* `solicit_code`
* `sub_solicit_code`
* `campaign`
* `gift_narrative`
* `receipt_delivery_g`
* `ty_letter_no`
* `vault_id`

`receipt_delivery_g` response codes:

* `L` — Letter
* `E` — Email
* `B` — Both
* `N` — Do not acknowledge

#### Set Up Custom Hidden Field Values

Hidden field values can be configured as Global Values, Page-Level Values, or by using URL Parameters.

* **Global Values** allow the same hidden field and value to be reused across multiple pages. This value can be set when the hidden field is created.
* **Page-Level Values** allow the same hidden field to be used across multiple pages while assigning a different value for each page. Leave the Global Value field blank, then go to **Settings → Sharing → Page Specific Values** to set the value for each page.
* **URL Parameters** can also be used to apply a Page-Specific Value dynamically. See the URL Parameters guide for instructions.

All custom hidden field values are included in both one-time and recurring donation payloads.

#### Single vs. Multi-Fund Donations

* **Single Fund:** Uses `@split_gift='N'` and sends one relay.
* **Multi-Fund:** Uses `@split_gift='Y'` and sends one relay per fund:
  * One main gift relay with `@record_type='M'`
  * One relay per fund with `@record_type='G'`

#### Viewing Data in DonorPerfect

* New or existing donor records are matched using the email address.
* Use **Quick Search** to find donor records by email.

The **Created Date** shows when the record was added; the **Modified Date** reflects the most recent successful relay.

![DonorPerfect — Quick Search results](https://1576281756-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQuNikYKWprVDzRjF4GER%2Fuploads%2FZbh7ym9ysNHT9M6FKGUU%2Fdp-quick-search.png?alt=media)

![DonorPerfect — Donor record Gifts tab](https://1576281756-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQuNikYKWprVDzRjF4GER%2Fuploads%2F27MweIW477lUozrLGqZJ%2Fdp-gifts-tab.png?alt=media)

**Where to View Donations**

* **Donor Record:** View contact info and most recent donation.
* **Gifts Tab:** See a complete history of donations from that donor.

### Field Mapping

#### Donor Relay

This mapping relates to the SaveDonor template.

| Anedot Field         | Value from Anedot                     | DonorPerfect Field |
| -------------------- | ------------------------------------- | ------------------ |
| donor\_id            | `"0"`                                 | donor\_id          |
| firstName            | firstName                             | first\_name        |
| lastName             | lastName                              | last\_name         |
| middleName           | middleName                            | middle\_name       |
| suffix               | suffix                                | suffix             |
| title                | title                                 | title              |
| title                | title (or, if not present, firstName) | salutation         |
| N/A                  | `""`                                  | prof\_title        |
| N/A                  | `""`                                  | opt\_line          |
| address.line1        | address `{line1}`                     | address            |
| address.line2        | address `{line2}`                     | address2           |
| address.city         | address `{city}`                      | city               |
| address.region       | address `{region}`                    | state              |
| address.postal\_code | address `{postal_code}`               | zip                |
| address.country      | address `{country}`                   | country            |
| N/A                  | `""`                                  | address\_type      |
| N/A                  | `""`                                  | home\_phone        |
| N/A                  | `""`                                  | business\_phone    |
| N/A                  | `""`                                  | fax\_phone         |
| phone                | phone                                 | mobile\_phone      |
| email                | email                                 | email              |
| N/A                  | `"N"`                                 | org\_rec           |
| N/A                  | `"IN"`                                | donor\_type        |
| N/A                  | `"N"`                                 | nomail             |
| N/A                  | `""`                                  | nomail\_reason     |
| N/A                  | `""`                                  | narrative          |
| \*donor\_rcpt\_type  | donor\_rcpt\_type (otherwise `"I"`)   | donor\_rcpt\_type  |
| N/A                  | `"Anedot"`                            | user\_id           |

\* Custom Hidden Fields must be added to the Action Page in order to be relayed.

#### Donation Relay

This mapping relates to the SaveGift template.

| Anedot Field                    | Value from Anedot                       | DonorPerfect Field     |
| ------------------------------- | --------------------------------------- | ---------------------- |
| donor\_id                       | donor\_id (from Donor Relay's Response) | donor\_id              |
| gift\_id                        | `"0"`                                   | gift\_id               |
| created\_at                     | created\_at                             | gift\_date             |
| total\_amount / processed total | amount                                  | amount                 |
| gl\_code                        | gl\_code                                | gl\_code               |
| \*solicit\_code                 | solicit\_code                           | solicit\_code          |
| \*sub\_solicit\_code            | sub\_solicit\_code                      | sub\_solicit\_code     |
| \*campaign                      | campaign                                | campaign               |
| \*gift\_type                    | gift\_type                              | gift\_type             |
| split\_gift                     | split\_gift                             | split\_gift            |
| initial\_payment                | pledge\_payment                         | pledge\_payment        |
| reference                       | reference                               | reference              |
| \*transaction\_id               | transaction\_id                         | transaction\_id        |
| \*memory\_honor                 | memory\_honor                           | memory\_honor          |
| \*gfname                        | gfname                                  | gfname                 |
| \*glname                        | glname                                  | glname                 |
| batch\_no                       | batch\_no                               | batch\_no              |
| \*gift\_narrative               | gift\_narrative                         | gift\_narrative        |
| \*ty\_letter\_no                | ty\_letter\_no                          | ty\_letter\_no         |
| gift\_rk                        | gift\_rk                                | gift\_rk               |
| plink                           | plink                                   | plink                  |
| nocalc                          | nocalc                                  | nocalc                 |
| \*old\_amount                   | old\_amount                             | old\_amount            |
| currency                        | currency                                | currency               |
| \*gift\_aid\_amt                | gift\_aid\_amt                          | gift\_aid\_amt         |
| \*gift\_aid\_eligible\_g        | gift\_aid\_eligible\_g                  | gift\_aid\_eligible\_g |
| \*gift\_aid\_date               | gift\_aid\_date                         | gift\_aid\_date        |
| receipt                         | receipt                                 | receipt                |
| \*receipt\_delivery\_g          | receipt\_delivery\_g                    | receipt\_delivery\_g   |
| \*acknowledgepref               | acknowledgepref                         | acknowledgepref        |
| `"Anedot"`                      | `"Anedot"`                              | user\_id               |

\* Custom Hidden Fields must be added to the Action Page in order to be relayed.

#### Pledge Relay

This mapping relates to the SavePledge template (commitments and recurrences).

| Anedot Field                | Value from Anedot                       | DonorPerfect Field    |
| --------------------------- | --------------------------------------- | --------------------- |
| donor\_id                   | donor\_id (from Donor Relay's Response) | donor\_id             |
| created\_at                 | created\_at                             | gift\_date            |
| commitment\_schedule\_start | start\_date                             | start\_date           |
| total                       | total                                   | total                 |
| bill                        | bill                                    | bill                  |
| commitment\_frequency       | frequency                               | frequency             |
| reminder                    | reminder                                | reminder              |
| gl\_code                    | gl\_code                                | gl\_code              |
| \*solicit\_code             | solicit\_code                           | solicit\_code         |
| initial\_payment            | initial\_payment                        | initial\_payment      |
| \*sub\_solicit\_code        | sub\_solicit\_code                      | sub\_solicit\_code    |
| writeoff\_amount            | writeoff\_amount                        | writeoff\_amount      |
| writeoff\_date              | writeoff\_date                          | writeoff\_date        |
| \*campaign                  | campaign                                | campaign              |
| membership\_type            | membership\_type                        | membership\_type      |
| membership\_level           | membership\_level                       | membership\_level     |
| membership\_enr\_date       | membership\_enr\_date                   | membership\_enr\_date |
| membership\_exp\_date       | membership\_exp\_date                   | membership\_exp\_date |
| membership\_link\_id        | membership\_link\_id                    | membership\_link\_id  |
| address\_id                 | address\_id                             | address\_id           |
| \*gift\_narrative           | gift\_narrative                         | gift\_narrative       |
| \*ty\_letter\_no            | ty\_letter\_no                          | ty\_letter\_no        |
| \*vault\_id                 | vault\_id                               | vault\_id             |
| \*receipt\_delivery\_g      | receipt\_delivery\_g                    | receipt\_delivery\_g  |
| contact\_id                 | contact\_id                             | contact\_id           |
| `"Anedot"`                  | `"Anedot"`                              | user\_id              |

\* Custom Hidden Fields must be added to the Action Page in order to be relayed.

### Payload Data

#### Donor Contact Details

**Request Body (Find Donor)**

```json
{
  "query": "select donor_id, first_name, last_name, address, city, state, zip from dp where email = 'annie@anedot.com'"
}
```

**Request Body (Create Donor)**

```json
{
  "first_name": "Annie",
  "last_name": "Dote",
  "middle_name": "",
  "suffix": "",
  "title": "",
  "salutation": "",
  "prof_title": "",
  "opt_line": "",
  "address": "123 Washington St",
  "address2": "",
  "city": "New York",
  "state": "NY",
  "zip": "10011",
  "country": "US",
  "address_type": "",
  "home_phone": "",
  "business_phone": "",
  "fax_phone": "",
  "mobile_phone": "2252501301",
  "email": "annie@anedot.com",
  "org_rec": "N",
  "donor_type": "IN",
  "nomail": "N",
  "nomail_reason": "",
  "narrative": "",
  "donor_rcpt_type": "I",
  "user_id": "Anedot"
}
```

**Response Body (No Donor Found)**

```json
{
  "result": null
}
```

**Response Body (Create Donor)**

```json
{
  "result": {
    "record": {
      "field": {
        "id": "donor_id",
        "name": "donor_id",
        "value": "12345"
      }
    }
  }
}
```

**Response Body (Donor Found)**

```json
{
  "result": {
    "record": {
      "field": [
        {
          "id": "donor_id",
          "name": "donor_id",
          "value": "12345"
        },
        {
          "id": "first_name",
          "name": "first_name",
          "value": "Annie"
        },
        {
          "id": "last_name",
          "name": "last_name",
          "value": "Dote"
        },
        {
          "id": "address",
          "name": "address",
          "value": "123 Washington St"
        },
        {
          "id": "city",
          "name": "city",
          "value": "New York"
        },
        {
          "id": "state",
          "name": "state",
          "value": "NY"
        },
        {
          "id": "zip",
          "name": "zip",
          "value": "10011"
        }
      ]
    }
  }
}
```

**Response Body (Failure)**

```json
{
  "result": {
    "field": {
      "id": "success",
      "name": "success",
      "value": "false",
      "reason": "login failed"
    }
  }
}
```

#### Donation Details

**Request Body**

```json
{
  "gift_id": 0,
  "donor_id": 12345,
  "record_type": "G",
  "gift_date": "3/24/26",
  "amount": 100.00,
  "gl_code": "UD",
  "split_gift": "N",
  "pledge_payment": "Y",
  "reference": "Online Gift",
  "fmv": 0,
  "batch_no": 0,
  "glink": "",
  "plink": "",
  "nocalc": "N",
  "currency": "USD",
  "receipt": "N",
  "user_id": "Anedot",
  "solicit_code": "",
  "sub_solicit_code": "",
  "campaign": "",
  "gift_aid_date": "",
  "gift_aid_amt": "",
  "gift_aid_eligible_g": "",
  "gift_type": "ANEDOT",
  "gift_narrative": "",
  "gfname": "",
  "glname": "",
  "memory_honor": "",
  "old_amount": "",
  "receipt_delivery_g": "N",
  "acknowledgepref": "",
  "transaction_id": "",
  "ty_letter_no": ""
}
```

**Response Body (Success)**

```json
{
  "result": {
    "record": {
      "field": {
        "id": "gift_id",
        "name": "gift_id",
        "value": "67890"
      }
    }
  }
}
```

#### Pledge Details (Recurring/Commitment)

**Request Body**

```json
{
  "gift_id": 0,
  "donor_id": 12345,
  "gift_date": "3/24/26",
  "start_date": "3/24/26",
  "total": 0,
  "bill": null,
  "frequency": "M",
  "reminder": "Y",
  "initial_payment": "N",
  "gl_code": "UD",
  "writeoff_amount": null,
  "writeoff_date": null,
  "user_id": "Anedot",
  "membership_type": null,
  "membership_level": null,
  "membership_enr_date": null,
  "membership_exp_date": null,
  "membership_link_id": null,
  "address_id": null,
  "contact_id": null,
  "solicit_code": "",
  "sub_solicit_code": "",
  "campaign": "",
  "gift_narrative": "",
  "receipt_delivery_g": "N",
  "ty_letter_no": "",
  "vault_id": ""
}
```

**Response Body (Success)**

```json
{
  "result": {
    "record": {
      "field": {
        "id": "gift_id",
        "name": "gift_id",
        "value": "67891"
      }
    }
  }
}
```

### Payload Templates

#### SaveDonor

```
@donor_id=0,
@first_name= resource_first_name,
@last_name= resource_last_name,
@middle_name= resource_middle_name,
@suffix= resource_suffix,
@title= resource_title,
@salutation="",
@prof_title="",
@opt_line="",
@address= resource_address_line_1,
@address2= resource_address_line_2,
@city= resource_address_city,
@state= resource_address_region,
@zip= resource_address_postal_code,
@country= resource_address_country,
@address_type="",
@home_phone="",
@business_phone="",
@fax_phone="",
@mobile_phone= resource_phone,
@email= resource_email,
@org_rec='N',
@donor_type='IN',
@nomail='N',
@nomail_reason="",
@narrative="",
@donor_rcpt_type='I',
@user_id='Anedot'
```

#### SaveGift

```
@gift_id=0,
@donor_id=<queried from DP>,
@record_type='G',
@gift_date=resource created_at,
@amount=resource total_amount,
@gl_code="",
@solicit_code="",
@sub_solicit_code="",
@campaign="",
@gift_type="",
@split_gift='N',
@pledge_payment='N' or 'Y',
@reference=resource id,
@transaction_id="",
@memory_honor="",
@gfname="",
@glname="",
@fmv=0,
@batch_no=0,
@gift_narrative="",
@ty_letter_no="",
@glink="",
@plink=<pledge_id queried from dp>,
@nocalc='N',
@old_amount="",
@currency='USD',
@gift_aid_date="",
@gift_aid_amt="",
@gift_aid_eligible_g="",
@receipt='N',
@receipt_delivery_g='N',
@acknowledgepref='3DD',
@user_id='Anedot'
```

#### SavePledge

```
@gift_id=0,
@donor_id=<donor_id queried from DP>,
@gift_date=resource created_at,
@start_date=resource commitment schedule,
@total=0,
@bill="",
@frequency=commitment frequency --> ('A', 'Q', 'M', or 'S'),
@reminder='Y',
@gl_code="",
@solicit_code="",
@initial_payment='N',
@sub_solicit_code="",
@writeoff_amount="",
@writeoff_date="",
@user_id='Anedot',
@campaign="",
@membership_type="",
@membership_level="",
@membership_enr_date="",
@membership_exp_date="",
@membership_link_id="",
@address_id="",
@gift_narrative="",
@ty_letter_no="",
@vault_id="",
@receipt_delivery_g="",
@contact_id=""
```

***

## Agent Instructions

This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

### Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://anedot.gitbook.io/anedot-docs/integrations/crm-donor-management/donorperfect.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language. `goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.anedot.com/integrations/crm-donor-management/donorperfect.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
