DonorPerfect automation · runs daily
Log donor calls and follow-ups in DonorPerfect
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.
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
- Staff look up the donor, open the record and enter a contact: an activity code, the date, who it is assigned to, and comments.
- The activity codes and the By Whom codes are kept in Settings > Code Maintenance, so each organization has its own list.
- The team reads the result in Reports > Contact Management, which has a Contact Listing and a Contact Calendar.
- 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
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. - 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.
- 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.
- 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.
- 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.
- 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
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) · DonorPerfect release notes · DonorPerfect Online XML API Documentation (dp_savecontact) · DonorPerfect: SmartActions
Call add_contact from a script
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"}' {
"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 cronDonorPerfect tools this automation uses
| 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 |
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.
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.