How It Works
Donately's native integrations automatically sync donor and donation data to your external tools when events occur (e.g., a new donation is made). Each integration connects via OAuth and uses a default field mapping that can be customized.
Available Integrations
Salesforce
Full CRM sync — Contacts, Accounts, Opportunities. Supports household/single account models, campaign rules, record types, and custom field mapping.
HubSpot
Contacts and Deals. Configurable pipeline and deal stage mapping for donations and recurring gifts.
Mailchimp
Syncs donors as contacts to a selected Mailchimp audience list.
Constant Contact
Syncs donors as contacts to a selected Constant Contact list.
Slack
Sends real-time donation notifications to a selected Slack channel.
Sync Flow
When a donation is processed in Donately, the integration engine runs the following steps:
- Event triggered — A donation is created, updated, or refunded.
- Mapping applied — The default field mapping (plus any custom overrides) is used to transform Donately data into the target system's format.
- Record lookup — For CRM integrations (Salesforce, HubSpot), the system checks if the donor already exists by email or Donately ID.
- Upsert — The donor record is created or updated, then the donation record is created in the target system.
- Event logged — A sync event is recorded in Donately with success/failure status. Failed syncs can be retried from the dashboard.
Salesforce
The Salesforce integration syncs Donately data to Salesforce Contacts, Accounts, and Opportunities. It supports both single-account and household-account models.
Configuration Options
| Setting | Description | Default |
|---|---|---|
| account_model | Account structure: single (one account per contact) or household (shared by last name) | single |
| household_name_format | Template for household account names. Supports {first_name} and {last_name} tokens. | {last_name} Household |
| account_record_type_id | Salesforce Record Type ID for new Accounts | — |
| contact_role | Role assigned to the contact (e.g., "Donor") | — |
| contact_record_type_id | Salesforce Record Type ID for new Contacts | — |
| donation_stage_name | Opportunity stage for one-time donations | Closed Won |
| recurring_donation_stage_name | Opportunity stage for recurring donations | Pledged |
| opportunity_record_type_id | Salesforce Record Type ID for new Opportunities | — |
| gift_type_field | Custom field API name for gift type | — |
| gift_type_value | Value to set in the gift type field | Donately |
| source_field | Custom field API name for source | — |
| source_value_from | Template for source value. Supports tokens like {campaign_title}. | — |
| fund_field | Custom field API name for fund/designation | — |
| fund_default_value | Default value for the fund field | General Operating |
| user_id | 18-character Salesforce User ID for API calls | — |
| link_campaign_to_opportunity | Associate Donately campaigns with Salesforce Campaigns on the Opportunity | false |
| link_fundraiser_as_sub_campaign | Create fundraisers as sub-campaigns under the parent Salesforce Campaign | false |
Default Field Mapping — Contact
| Donately Field | Salesforce Field |
|---|---|
| first_name | FirstName |
| last_name | LastName |
| unique_identifier | dntly_PersonId__c |
| phone_number | Phone |
| street_address | MailingStreet |
| city | MailingCity |
| state | MailingState |
| zip_code | MailingPostalCode |
| country | MailingCountry |
| full_address | dntly_FullAddress__c |
Default Field Mapping — Account
| Donately Field | Salesforce Field |
|---|---|
| title | Name |
| unique_identifier | dntly_AccountId__c |
Default Field Mapping — Opportunity (Donation)
| Donately Field | Salesforce Field |
|---|---|
| donation_name | Name |
| donation_amount | Amount |
| donation_date | CloseDate |
| donation_description | Description |
| unique_identifier | dntly_DonationId__c |
| currency | dntly_Currency__c |
| donation_type | dntly_DonationType__c |
| transaction_id | dntly_TransactionId__c |
| processor | dntly_Processor__c |
| livemode | dntly_Livemode__c |
| anonymous | dntly_Anonymous__c |
| on_behalf_of | dntly_OnBehalfOf__c |
| comment | dntly_Comments__c |
| status | dntly_DonationStatus__c |
| recurring | dntly_DonationRecurring__c |
| subscription_frequency | dntly_RecurringFrequency__c |
| subscription_id | dntly_SubscriptionId__c |
| subscription_status | dntly_SubscriptionStatus__c |
| subscription_start_date | dntly_SubscriptionStartDate__c |
| campaign_id | dntly_CampaignId__c |
| campaign_title | dntly_CampaignName__c |
| fundraiser_id | dntly_FundraiserId__c |
| fundraiser_title | dntly_FundraiserName__c |
| form_id | dntly_FormId__c |
| account_id | dntly_AccountId__c |
| tracking_codes | dntly_TrackingCodes__c |
| metadata | dntly_Metadata__c |
| dtd_company_name | dntly_DtdCompanyName__c |
HubSpot
The HubSpot integration syncs donors as Contacts and donations as Deals. You can configure which pipeline and deal stage donations are assigned to.
Configuration Options
| Setting | Description |
|---|---|
| pipeline | HubSpot pipeline name for donation deals |
| pipeline_id | HubSpot pipeline UUID |
| deal_stage | Deal stage for one-time donations (e.g., "Closed Won") |
| deal_stage_id | HubSpot deal stage UUID |
| recurring_deal_stage | Deal stage for recurring donations (e.g., "Pledged") |
| recurring_deal_stage_id | HubSpot recurring deal stage UUID |
Default Field Mapping — Contact
| Donately Field | HubSpot Property |
|---|---|
| first_name | firstname |
| last_name | lastname |
| unique_identifier | dntly_donor_id |
| full_address | dntly_full_address |
| street_address | dntly_donor_street |
| street_address_2 | dntly_donor_apartment |
| city | dntly_donor_city |
| state | dntly_donor_state |
| zip_code | dntly_donor_zip |
| country | dntly_donor_country |
Default Field Mapping — Deal (Donation)
| Donately Field | HubSpot Property |
|---|---|
| (literal) "Donately Donation" | dealname |
| donation_amount | amount |
| currency_code | deal_currency_code |
| unique_identifier | dntly_donation_id |
| donation_date | dntly_donation_date |
| status | dntly_donation_status |
| transaction_id | dntly_donation_transaction_id |
| processor | dntly_donation_processor |
| donation_type | dntly_donation_type |
| anonymous | dntly_donation_anonymous |
| on_behalf_of | dntly_donation_on_behalf_of |
| comment | dntly_donation_comment |
| recurring | dntly_donation_recurring |
| subscription_frequency | dntly_subscription_frequency |
| subscription_id | dntly_subscription_id |
| subscription_status | dntly_subscription_status |
| subscription_start_day | dntly_subscription_start_day |
| campaign_id | dntly_donation_campaign_id |
| campaign_title | dntly_donation_campaign_title |
| fundraiser_id | dntly_donation_fundraiser_id |
| fundraiser_title | dntly_donation_fundraiser_title |
| form_id | dntly_donation_form_id |
| donor_id | dntly_donor_id |
| livemode | dntly_donation_livemode |
| tracking_codes | dntly_donation_tracking_codes |
| metadata | dntly_donation_meta_data |
| ecard | dntly_donation_ecard |
| notes | dntly_donation_notes |
| dtd_company_name | dntly_donation_dtd_company_name |
Record Matching
When syncing data, the integration uses a series of strategies to find existing records in HubSpot before creating new ones. Strategies are tried in order — the first match wins.
Contact Matching
| Strategy | How It Works |
|---|---|
| FindByPersonId | Searches for a contact by the dntly_donor_id custom property. This is the primary strategy and matches contacts created by the native integration. |
| FindByEmail | Falls back to searching by the contact's email field. Used when dntly_donor_id is not found (e.g., contacts created manually or by another tool). |
Deal Matching
| Strategy | How It Works |
|---|---|
| FindByDonationId | Searches for a deal by the dntly_donation_id custom property. This is the primary strategy and matches deals created by the native integration. |
| FindByCompositeMatch | Falls back to matching by a combination of the associated contact's email, deal amount, and close date. Only targets deals that do not have dntly_donation_id set. Used to match legacy records synced via Zapier or other tools that did not include the Donately Donation ID. If multiple deals match the same criteria, the match is skipped and flagged for manual review to avoid incorrect updates. When a match is found, all native fields (including dntly_donation_id) are backfilled on the next update, so subsequent syncs use the faster primary strategy automatically. |
FindByDonationId strategy.Mailchimp
The Mailchimp integration syncs donor email addresses and names to a selected Mailchimp audience list. When a new donation is made, the donor is added to (or updated in) the chosen list.
Configuration
After connecting via OAuth, you select which Mailchimp audience list to sync donors to. No additional field mapping configuration is needed — donors are synced with their email, first name, and last name.
Constant Contact
Similar to Mailchimp, the Constant Contact integration syncs donors to a selected contact list. When a donation is processed, the donor is added to the chosen list.
Configuration
After connecting via OAuth, select a Constant Contact list. Donors are synced with their email, first name, and last name.
Slack
The Slack integration sends real-time donation notifications to a selected Slack channel. Each time a donation is processed, a message is posted with the donor name, amount, and campaign.
Configuration
After connecting via OAuth, select the Slack channel where donation notifications should be posted.
Custom Field Mapping
For Salesforce and HubSpot, you can override the default field mappings with a custom mapping. Custom mappings are defined as a JSON object where keys are Donately field names and values are the target system's field API names.
JSON Structure
{
"Person": {
"email": "Email",
"unique_identifier": "dntly_PersonId__c",
"phone_number": "MobilePhone"
},
"Donation": {
"donation_amount": "Amount",
"comment": "My_Custom_Comments__c"
}
}
The mapping is organized by Donately object type:
Person— Maps donor fields to the target Contact/ConstituentDonation— Maps donation fields to the target Opportunity/Deal/Gift
Campaign Rules (Salesforce)
Campaign rules allow you to route donations to specific Salesforce Campaigns based on matching criteria. Rules are evaluated in order — the first match wins.
Rule Types
| Type | Description |
|---|---|
| form | Match by the Donately Form used for the donation |
| campaign | Match by the Donately Campaign the donation was made to |
| fundraiser | Match by the Donately Fundraiser the donation was made through |
| meta_data | Match by a metadata key/value on the donation |
| auto_create_from_campaign | Automatically create a Salesforce Campaign from the Donately campaign |
| auto_create_from_fundraiser | Automatically create a sub-campaign from the Donately fundraiser under the parent campaign |
| fallback_campaign | Default catch-all rule if no other rules match |
Rule Structure
{
"type": "campaign",
"match_value": "cmp_e4b08ef12147",
"match_label": "Annual Giving Campaign",
"sf_campaign_id": "7013t000001ABC",
"sf_campaign_name": "2025 Annual Fund"
}
Template Tokens
Some Salesforce configuration fields support dynamic tokens that are replaced with actual values at sync time:
| Token | Resolves To | Used In |
|---|---|---|
| {first_name} | Donor's first name | household_name_format |
| {last_name} | Donor's last name | household_name_format |
| {campaign_title} | Donately campaign title | source_value_from |
| {fundraiser_title} | Donately fundraiser title | source_value_from |
| {fundraiser_or_campaign_title} | Fundraiser title if present, otherwise campaign title | source_value_from |
Example
// Household name format
"{last_name} Household"
// Resolves to: "Smith Household"
// Source value from campaign
"Online - {campaign_title}"
// Resolves to: "Online - Annual Giving 2025"