[Cotlet](https://cotlet.dev/index.md) · [Integrations](https://cotlet.dev/integrations.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Use cases](https://cotlet.dev/use-cases.md) · [Security](https://cotlet.dev/security.md) · [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md) · [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [Contact](https://cotlet.dev/contact.md) · [Pricing](https://cotlet.dev/pricing.md) · [Sign up](https://cotlet.dev/signup)

# Log donor calls and follow-ups in DonorPerfect

> Turn call notes into DonorPerfect contact records with the right activity code and owner, so follow-ups show up in your contact reports.

Source: https://cotlet.dev/integrations/donorperfect-api-mcp-server/log-donor-calls-in-contacts

A development officer makes ten donor calls in a day and keeps the notes in a notebook or an email draft. They reach DonorPerfect days later, if at all.

Cotlet does it in your own DonorPerfect account with list\_codes, search\_donors, list\_contacts and add\_contact, called by your AI agent, an n8n workflow or a script.

[Sign up free](https://cotlet.dev/app/signup?app=donorperfect) [All DonorPerfect tools](https://cotlet.dev/integrations/donorperfect-api-mcp-server.md)

Hosted · nothing to install or maintain

## Can DonorPerfect do this on its own?

DonorPerfect saves a contact by hand in the donor record and through dp\_savecontact in the XML API (checked 23 Oct 2026). Neither turns a free-text note into a contact with the right activity code and owner.

## How you do it in DonorPerfect today

1. Staff look up the donor, open the record and enter a contact: an activity code, the date, who it is assigned to, and comments.
2. The activity codes and the By Whom codes are kept in Settings > Code Maintenance, so each organization has its own list.
3. The team reads the result in Reports > Contact Management, which has a Contact Listing and a Contact Calendar.
4. SmartActions can create a task in the contacts table when a trigger fires, such as a new recurring donor. Every other call note is typed in by hand.

## How to log donor calls and follow-ups in DonorPerfect

Prompt

```
Here are my notes from today's donor calls. For each one add a contact in DonorPerfect with the right activity code, today's date and me as the owner. Ask me about any note you cannot place.
```

1. 01  
### Learn your codes  
list\_codes reads your activity codes and By Whom codes once per run. The agent maps each note to a code from that list and leaves a note it cannot place for you, because a wrong activity code is hard to find in a report later.
2. 02  
### Find the donor  
search\_donors looks up the name in the note. A name with more than one match is listed for you, so a call is never logged on the wrong person.
3. 03  
### Skip what is already there  
list\_contacts reads the donor's contacts. A contact with the same date and activity code and the same comments is skipped, so running the job twice does not double an entry.
4. 04  
### Add the contact  
add\_contact writes one contact with your note in the comments, the date and the owner code. It sends nothing to the donor, so it needs no OK.
5. 05  
### Report what to follow up  
The agent lists the follow-ups named in your notes, such as "send sponsor levels by Friday", with the donor, so you can put them in your calendar or ask for a second contact dated for the follow-up.

### What you get back

Example data

```
Notes: 8 calls
Contacts added 7, e.g. Dana Whitfield, PHONE, 2026-10-22: "Wants to host a table; send sponsor levels by Friday"
Skipped 1 (same contact already on the record)
Follow-ups: 3 (Dana Whitfield, Mark Ellis, Riverside Rotary)
```

### Other ways to ask

- Log my email replies from donors this week as EMAIL contacts, owner me.
- Add a contact dated next Friday for every follow-up in my notes.
- Show me the last three contacts on each donor in this list. Add nothing.

## What DonorPerfect allows, and what to know first

- Activity code values come from Settings > Code Maintenance, so list\_codes returns your organization's codes. DonorPerfect release notes list a Text activity code since version 3.54, but whether you have it depends on your setup.
- A contact belongs to one donor, and its Assigned To value comes from the By Whom code you pick.
- The agent writes the note in the contact comments as you gave it, and does not rewrite it.

add\_contact changes only your own DonorPerfect data and reach no one else, so it runs without asking first.

Sources: [DonorPerfect Online Getting Started Guide (Entering Contacts, Contact Management)](https://www.softerware.com/doclib/dp/manuals/dpo%5Fsup%5Fmanual%5Fgettingstarted.pdf) · [DonorPerfect release notes](https://www.donorperfect.com/clients/release-notes/) · [DonorPerfect Online XML API Documentation (dp\_savecontact)](https://softerware-uploads.s3.amazonaws.com/community/donorperfect/DPO%5FXML%5FAPI%5FDocumentation.pdf) · [DonorPerfect: SmartActions](https://www.donorperfect.com/video/smartactions-2/)

## Call add\_contact from a script

curl

```
curl -X POST https://cotlet.dev/api/v1/donorperfect/donors/48213/contacts \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"activity_code":"PHONE","date":"2026-10-22","notes":"Called about the gala. Wants to host a table; send sponsor levels by Friday.","assigned_to":"KHALL"}'
```

Example response

```
{
"contact_id": 31550,
"donor_id": 48213,
"activity_code": "PHONE",
"date": "2026-10-22",
"assigned_to": "KHALL",
"notes": "Called about the gala. Wants to host a table; send sponsor levels by Friday.",
"status": "saved"
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the call is donorperfect\_write → add\_contact. Example data.

[Schedule it in n8n, Make, Zapier or cron](https://cotlet.dev/integrations/donorperfect-api-mcp-server.md#automations)

## DonorPerfect tools this automation uses

__Cotlet DonorPerfect tools used to log donor calls and follow-ups in DonorPerfect__
| Tool | Parameters |
| -------------- | ---------------------------------------------------- |
| list\_codes | field |
| search\_donors | query, by, limit, cursor |
| list\_contacts | donor\_id, limit, cursor |
| add\_contact | donor\_id, activity\_code, date, notes, assigned\_to |

[All 14 DonorPerfect tools with descriptions](https://cotlet.dev/integrations/donorperfect-api-mcp-server.md#tools)

## Frequently asked questions

### Is it safe to connect DonorPerfect to Cotlet?

Yes. You sign in to DonorPerfect yourself, in your own Cloud Browser in the EU, and we never save your password. Your agents only get DonorPerfect once you enable it, every background request is listed, and the browser profile is stored encrypted with AES-256-GCM, the cipher 1Password uses for its vaults. The AI model never sees a login, posts and messages wait for your OK, and Disable for agents cuts access in one click. Independent scanners grade cotlet.dev A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory; live results are on https://cotlet.dev/security.

## More DonorPerfect automations

- [Enter DonorPerfect gifts from a deposit list](https://cotlet.dev/integrations/donorperfect-api-mcp-server/enter-gifts-from-a-deposit-list.md)
- [Apply payments to DonorPerfect pledges](https://cotlet.dev/integrations/donorperfect-api-mcp-server/apply-pledge-payments.md)
- [DonorPerfect API and MCP server: every tool](https://cotlet.dev/integrations/donorperfect-api-mcp-server.md)
- [All use cases](https://cotlet.dev/use-cases.md)

## Give your agent access to DonorPerfect.

Free 7-day trial with 2,000 credits, no card needed. Cotlet is independent and not affiliated with DonorPerfect.

[Sign up free](https://cotlet.dev/app/signup?app=donorperfect)

---

Give your AI agents your signed-in browser.

**Product:** [Integrations](https://cotlet.dev/integrations.md) · [Use cases](https://cotlet.dev/use-cases.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Pricing](https://cotlet.dev/pricing.md) · [Security](https://cotlet.dev/security.md)

**Resources:** [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [GitHub](https://github.com/cotletdev/cotlet)

**Solutions:** [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md)

**Company:** [About](https://cotlet.dev/about.md) · [AI info: company facts](https://cotlet.dev/ai-info.md) · [Contact](https://cotlet.dev/contact.md)

**Legal:** [Terms of service](https://cotlet.dev/terms) · [Privacy policy](https://cotlet.dev/privacy) · [Refund policy](https://cotlet.dev/refunds) · [Acceptable use](https://cotlet.dev/acceptable-use) · [Cookie policy](https://cotlet.dev/cookies) · [DPA](https://cotlet.dev/dpa) · [Subprocessors](https://cotlet.dev/subprocessors)

**Elsewhere:** [Status page](https://status.cotlet.dev) · [Cotlet on GitHub](https://github.com/cotletdev) · [Cotlet on X](https://x.com/cotletdev) · [Cotlet on LinkedIn](https://www.linkedin.com/company/cotletdev) · [Cotlet on Product Hunt](https://www.producthunt.com/products/cotlet) · [Cotlet on Crunchbase](https://www.crunchbase.com/organization/cotlet) · [Cotlet on SaaSHub](https://www.saashub.com/cotlet)

Cotlet.dev is built by Bart Krawczyk and Jake Slugocki, the founders of Take Group sp. z o.o., ul. Wincentego Janasa 4, 40-855 Katowice, Poland. KRS 0000871398, NIP 6342984273, VAT EU: PL6342984273. [About us](https://cotlet.dev/about.md)

Cotlet is an independent service. It is not affiliated with, endorsed by or sponsored by any of the products listed on this site. Product names are trademarks of their respective owners.
