Virtuous
Learn how to integrate Anedot with Virtuous CRM to sync donor data from Action Pages. Includes setup instructions, segment configuration, and relay behavior.
Virtuous is a nonprofit-focused CRM designed to help organizations manage donor relationships, communications, and giving data. Anedot’s integration allows you to sync donor data from Action Pages directly into your Virtuous account.
Table of Contents
- Connecting Anedot to Virtuous
- Data Relays
- Using Segment Names with Virtuous
- Field Mapping
- Payload Data
Connecting Anedot to Virtuous
To integrate your Anedot fundraising account with Virtuous:
-
Navigate to Settings > Integrations > Directory in your Anedot account.
-
Click the blue + New Connection button in the upper right corner.
-
Select Virtuous from the integration directory.
-
Choose the Action Pages you’d like to sync.
-
The default is All Pages.
-
To exclude specific pages, enter their Action Page IDs as a comma-separated list.
-
-
(Optional) Scope the integration to only include Team-specific data.
- Enter your Virtuous API Key.
- (Optional) To only sync donation pages, check the "Relay donation pages only" box.
- Click Save to finalize setup.
You can update Action Pages, Team filters, or credentials anytime.
Data Relays
-
Relay Types:
By default, Anedot relays both financial and non-financial page data. To limit relays to donations only, enable the “Relay donation pages only” option. - Supported Fields:
- Name
- Phone
- Address
-
Contact Matching:
-
Every submission triggers a "find or create contact" action in Virtuous, based on the email address.
-
If a contact exists, no new contact is created.
-
If no match is found, a new contact is added.
-
-
-
Donations:
-
Donation submissions trigger an additional "gift_designation" relay.
-
Void, full refunds (not partial), and ACH returned events are relayed once daily.
-
-
Relay Scheduling:
-
Gift records are imported into Virtuous once daily at midnight.
-
You can also use Virtuous’s Import Tool to manually import gift batches.
-
-
Retrying Relays:
-
Use Push Unsent to resend failed or unsent donations with a specified date range.
-
Using Segment Names with Virtuous
To properly relay segmented data to Virtuous, follow these steps:
-
Go to Action Pages > Pages.
-
Hover over the desired Action Page and click Actions > Edit.
-
In the Form tab, add a Custom Hidden Field named
segment_name
. -
Then, go to Settings > Sharing > Page Specific Values and assign a value to
segment_name
. -
Click Publish to save your changes.
If the segment appears as
"null"
in Virtuous, it's likely due to a setup error in the hidden field or value configuration.
Field Mapping
Contact Individual Info
Anedot Field Name | Field Name in Virtuous |
---|---|
firstName lastName | name |
Household | contact_type |
Anedot | reference_source |
title | prefix |
suffix | suffix |
first_name | firstName |
last_name | lastName |
middle_name | middleName |
Contact Method
Anedot Field Name | Field Name in Virtuous |
---|---|
Home Email | type |
value | |
communication_consent_email | isOptedIn |
"Home Phone" | type |
phone | value |
communication_consent_phone | isOptedIn |
Contact Address
Anedot Field Name | Field Name in Virtuous |
---|---|
line_1 | address1 |
line_2 | address2 |
city | city |
region | stateCode |
postal_code | postal |
country | countryCode |
Action Pages Fund/Project
Anedot Field Name | Field Name in Virtuous |
---|---|
name | name |
public_description | description |
Ongoing | financialNeedType |
OngoingNeed | financialNeedType |
annually | financialNeedFrequency |
identifier | revenueAccountingCode |
Unspecified | location |
Not Allocated | inventoryStatus |
Default | type |
TRUE | isActive |
FALSE | enableSync |
Gift
Anedot Field Name | Field Name in Virtuous |
---|---|
"Donation" | transactionSource |
submissionId | transactionId |
created_at | giftDate |
payment_type | giftType |
total_amount | amount |
frequency | frequency |
card_type | creditCardType |
segment_name | segment |
Payload Data
Contact
Request Body
{
"name": "Annie Dot",
"contact_type": "Household",
"reference_source": "Anedot",
"contact_addresses": [{
"city": "New Orleans",
"state": "LA",
"postal": "70112",
"country": "US",
"address1": "1340 Poydras St",
"address2": null
}],
"contact_individuals": [{
"prefix": null,
"suffix": null,
"last_name": "Dot",
"first_name": "Annie",
"middle_name": null,
"contact_methods": [{
"type": "Home Email",
"value": "admin@anedot.com",
"is_opted_in": false
}, {
"type": "Home Phone",
"value": "12252501301",
"is_opted_in": false
}]
}]
}
Response Body
{
"id": 2566,
"name": "Annie Dot",
"tags": [],
"address": {
"id": 2026,
"city": "New Orleans",
"label": "Primary Address",
"state": "LA",
"endDay": 31,
"postal": "70112",
"country": "United States",
"address1": "1340 Poydras St",
"address2": null,
"endMonth": 12,
"startDay": 1,
"isPrimary": true,
"startMonth": 1,
"canBePrimary": false,
"createdByUser": "Paul Dietzel",
"modifiedByUser": "Paul Dietzel",
"createDateTimeUtc": "2023-05-25T18:27:06.0288969Z",
"modifiedDateTimeUtc": "2023-05-25T18:27:06.7788543Z"
},
"website": null,
"isPrivate": false,
"contactType": "Household",
"description": null,
"giftAskType": null,
"customFields": [],
"informalName": "Ann",
"lastGiftDate": "Unavailable",
"createdByUser": "Paul Dietzel",
"giftAskAmount": "$0",
"maritalStatus": null,
"originSegment": null,
"anniversaryDay": null,
"contactTagsUrl": "/api/ContactTag/ByContact/2566",
"lastGiftAmount": "$0",
"modifiedByUser": "Paul Dietzel",
"anniversaryYear": null,
"contactGiftsUrl": "/api/Gift/ByContact/2566",
"contactNotesUrl": "/api/ContactNote/ByContact/2566",
"originSegmentId": null,
"anniversaryMonth": null,
"lifeToDateGiving": "$0",
"primaryAvatarUrl": null,
"yearToDateGiving": "$0",
"contactReferences": [],
"createDateTimeUtc": "2023-05-25T18:27:05.9976457Z",
"customCollections": [],
"formalContactName": "Annie Dot",
"contactIndividuals": [{
"id": 3723,
"gender": null,
"prefix": null,
"suffix": null,
"passion": null,
"prefix2": null,
"birthDay": null,
"lastName": "Dot",
"nickname": null,
"avatarUrl": null,
"birthDate": "",
"birthYear": null,
"contactId": 2566,
"firstName": "Ann",
"isPrimary": true,
"birthMonth": null,
"isDeceased": false,
"middleName": null,
"isSecondary": false,
"canBePrimary": false,
"customFields": [],
"deceasedDate": "",
"createdByUser": "Paul Dietzel",
"approximateAge": null,
"canBeSecondary": false,
"contactMethods": [{
"id": 4715,
"type": "Home Email",
"value": "admin@anedot.com",
"isOptedIn": false,
"isPrimary": true,
"canBePrimary": false,
"createdByUser": "Paul Dietzel",
"modifiedByUser": "Paul Dietzel",
"preMarriageName": null,
"createDateTimeUtc": "2023-05-25T18:27:05.9976457Z",
"modifiedDateTimeUtc": "2023-05-25T18:27:06.7944799Z"
}, {
"id": 4716,
"type": "Home Phone",
"value": "12252501301",
"isOptedIn": false,
"isPrimary": true,
"canBePrimary": false,
"createdByUser": "Paul Dietzel",
"modifiedByUser": "Paul Dietzel",
"createDateTimeUtc": "2023-05-25T18:27:06.0288969Z",
"modifiedDateTimeUtc": "2023-05-25T18:27:06.7944799Z"
}],
"modifiedByUser": "Paul Dietzel",
"createDateTimeUtc": "2023-05-25T18:27:05.9976457Z",
"customCollections": [],
"modifiedDateTimeUtc": "2023-05-25T18:27:06.7944799Z"
}],
"organizationGroups": [],
"mergedIntoContactId": null,
"modifiedDateTimeUtc": "2023-05-25T18:27:06.7788543Z",
"alternateContactName": "Annie",
"contactPlannedGiftsUrl": "/api/PlannedGift/ByContact/2566",
"preferredAddresseeName": "Annie Dot",
"contactRelationshipsUrl": "/api/Relationship/ByContact/2566",
"preferredSalutationName": "Annie",
"contactImportantNotesUrl": "/api/ContactNote/Important/ByContact/2566",
"contactRecurringGiftsUrl": "/api/RecurringGift/ByContact/2566",
"contactPassthroughGiftsUrl": "/api/Gift/Passthrough/ByContact/2566"
}
Gifts
Request Body
{
"amount": 50.0,
"contact": {
"id": 1739,
"name": "Annie Dot",
"email": "admin@anedot.com",
"phone": "2252503501",
"title": null,
"suffix": null,
"address": {
"city": "New Orleans",
"state": "LA",
"postal": "70113",
"country": "US",
"address1": "1340 Poydras Street",
"address2": null
},
"last_name": "Dot",
"first_name": "Annie",
"middle_name": null
},
"segment": null,
"frequency": null,
"gift_date": "2024-02-12T18:10:27.980Z",
"gift_type": "Credit",
"designations": [{
"code": "1001",
"name": "General Fund",
"amountDesignated": 50.0
}],
"transaction_id": "8482b070-fca8-462f-a519-f03e4b410b2f",
"credit_card_type": "Master",
"transaction_source": "Donation",
"recurring_gift_transaction_id": null
}
Response Body
{ }
Donation Reversal (Void, Refund, ACH Return)
Request Body
{
"notes": "",
"giftDate": "2023-12-22T00:00:00",
"reversedGiftId": 21728
}
Response Body (Success)
{
"id": 21734,
"batch": null,
"grant": null,
"notes": "",
"amount": -55,
"giftUrl": "/api/Gift/21734",
"grantId": null,
"segment": null,
"tribute": null,
"giftDate": "2023-12-22T00:00:00",
"giftType": "ReversingTransaction",
"grantUrl": null,
"contactId": 2063,
"giftAskId": null,
"isPrivate": false,
"segmentId": null,
"tributeId": null,
"contactUrl": "/api/Contact/2063",
"segmentUrl": null,
"contactName": "Annie",
"mediaOutlet": null,
"receiptDate": null,
"segmentCode": null,
"tributeType": null,
"currencyCode": "USD",
"customFields": [],
"exchangeRate": 1,
"giftPremiums": [],
"createdByUser": "Paul Dietzel",
"mediaOutletId": null,
"transactionId": null,
"modifiedByUser": "Paul Dietzel",
"pledgePayments": [],
"reversedGiftId": 21728,
"amountFormatted": "-$55.00",
"isTaxDeductible": true,
"baseCurrencyCode": "USD",
"giftDesignations": [{
"id": 12689,
"display": "General Fund: -$55.00",
"project": "General Fund",
"projectId": 394,
"projectUrl": "/api/Project/394",
"projectCode": "1001",
"projectType": "Default",
"projectLocation": "Unspecified",
"amountDesignated": -55,
"externalAccountingCode": null
}],
"createDateTimeUtc": "2023-12-29T20:51:51.5903749Z",
"giftDateFormatted": "12/22/2023",
"giftTypeFormatted": "Reversing Transaction",
"transactionSource": null,
"cashAccountingCode": null,
"isAcknowledgedGift": false,
"acknowledgementDate": null,
"contactIndividualId": 3116,
"contactMembershipId": null,
"modifiedDateTimeUtc": "2023-12-29T20:51:51.741603Z",
"acknowledgementNotes": null,
"contactPassthroughId": null,
"receiptDateFormatted": "",
"contactPassthroughUrl": null,
"recurringGiftPayments": [],
"acknowledgeeIndividualId": null
}
Response Body (Failure)
{
"message": "The request is invalid.",
"modelState": {
"": ["Gift Transaction already exists."]
}
}
Response Body (Error)
{
"message": "The request is invalid.",
"modelState": {
"": ["Gift Transaction already exists."]
}
}
Response Status (Success)
200
Response Status (Failure)
400
Response Status (Error)
null