What this integration does
Once configured, the integration runs on its own and does four things:
Syncs your supporters into Tatango every day from a Salesforce report
Logs every broadcast you send as an activity on that person's Salesforce record
Logs every reply you receive on the same record, so the full conversation is visible in one place
Syncs opt-outs back to Salesforce, keeping your CRM the source of truth
This integration is built for Salesforce Nonprofit Cloud and other orgs that use Person Accounts. If your organization uses Contacts or Leads, use the standard Salesforce integration instead.
Before you begin
You'll need:
A Salesforce org with Person Accounts enabled
Permission to create reports and custom fields in Salesforce
Access to Tatango Reports to schedule deliveries
An active Tatango account with the Salesforce Nonprofit Cloud integration enabled
Step 1: Prepare Salesforce
1a. Create your opt-out field
You need a field on the Account object to record when someone opts out of SMS.
Recommended: a picklist called SMS Status
Field Label: SMS Status
Field Name:
SMS_Status__cType: Picklist
Values: Subscribed, Unsubscribed, Unknown
Alternative: two checkboxes, if your organization tracks opt-in and opt-out separately
SMS_Opt_In__c(Checkbox)SMS_Opt_Out__c(Checkbox)
Optional: a date field to record when someone opted out
SMS_Opt_Out_Date__c(Date)
To create these: Setup → Object Manager → Account → Fields & Relationships → New
Create these on Account, not Contact. In Nonprofit Cloud, people are Person Accounts.
1b. Create your Salesforce report
Build a tabular report on a Person Account report type containing the people you want to message.
Your report must include:
At least one phone field — Mobile, Phone, or Home Phone
Use report filters to exclude anyone you don't want to message — board members, major donors, Do Not Contact, and so on.
You must run or save the report in Salesforce before it will appear in Tatango.
Report formats that work: tabular reports only.
Report formats that don't work: summary, matrix and joined reports, bucket fields, custom summary formulas, and row or column groupings.
1c. Create the message ID field
This field is what lets Tatango update an existing message on a record instead of adding it again. Tatango gives every message its own ID, and this field is where that ID gets stored in Salesforce.
To create it: Setup → Object Manager → Activity → Fields & Relationships → New
Type: Text, length 18
Field Label: Tatango Message Id
Field Name:
Tatango_Message_Id__cCheck External ID
Check Unique
Both checkboxes are required. Salesforce can only match an existing activity through an External ID field. Without them, every report delivery adds a second copy of the same message instead of updating the one already there.
Create this on Activity. That covers both Tasks and Events, and messages are logged as Tasks.
Step 2: Connect the integration in Tatango
Go to My Account → Integrations → All Apps → Salesforce Nonprofit Cloud and name your app.
Then work through the setup screens:
Log in to Salesforce and allow access.
Select the Salesforce report you created in Step 1b.
Select the Tatango list you want supporters synced into.
Map your fields - match Salesforce report columns to Tatango subscriber fields. Map a phone column to Phone Number.
Add a custom tag (optional) - see Using custom tags below.
Choose your opt-out logic - single field or two separate fields - then select the field, its type, and the value to set when someone opts out.
Choose whether to record the opt-out date, and if so, which field.
Copy the unsubscribe webhook URL. You'll need it in Step 3.
Copy the report delivery URL. You'll need it in Step 4.
You don't need to map the Salesforce Account ID. The integration creates a salesforce_account_id field on your Tatango list automatically and keeps it updated.
⚠️ Opt-out values are case-sensitive. If your picklist value is Unsubscribed, entering unsubscribed won't work.
Step 3: Set up the unsubscribe webhook
This is what sends opt-outs back to Salesforce.
Go to Lists and select your list
Go to Settings → Webhooks
Click Create New Webhook
Paste the webhook URL you copied in Step 2
Check the Unsubscribes box
Click Save
Step 4: Schedule your Reports
Two reports send message activity back to Salesforce — All replies and Recipients. Both go to the same email address, and Tatango works out which is which from the file it receives.
4a. Build the email address
The setup wizard showed you a URL, like this:
https://7e79cd81-b75e-4fed-8304-93af3397841b.integration-hook.com
Take the ID from the URL — the part before .integration-hook.com — and put it between trigger+ and @traymail.io:
trigger+7e79cd81-b75e-4fed-8304-93af3397841b@traymail.io
That single address receives both reports.
Here's an article on how to setup destinations.
4b. Schedule the reports
In Tatango Reports, schedule both reports to be delivered by email to the address you built above. We recommend setting up a daily scheduled report. Here's an article on how to schedule reports.
Report | Send to |
All replies | your report delivery address |
Recipients | the same address |
Keep the report names as they are. Tatango routes each delivery by the report name, so renaming All replies or Recipients will stop it importing.
4c. Include the Salesforce Account ID column
When you build each report, include the salesforce_account_id column.
This is how messages are matched to the right Salesforce record. Without it, the integration falls back to matching on phone number, which is less reliable — in particular it won't find records whose phone number is stored with an extension, like 555-123-4567x890.
4d. Schedule them after the daily sync
The daily sync runs at 12:00 PM Eastern. Schedule your reports for after that — 2:00 PM Eastern works well.
New supporters only carry their Salesforce Account ID once the daily sync has included them, so reports that run before the sync may be missing it.
What you'll see in Salesforce
Open a Person Account and go to the Activity tab, then expand Past Activity.
Every message appears as a completed activity.
A broadcast you sent:
SMS sent - Fall Appeal - Sept 18
Fall Appeal: your gift is matched today. Reply STOP to opt out.
Sent to supporter as part of a broadcast · Campaign: Fall Appeal - Sept 18 · Delivery status: delivered · Clicked: 2:06 PM
A reply you received:
SMS received - Fall Appeal - Sept 18
Yes! Count me in for the fall campaign.
Received from supporter · Replied to: Fall Appeal - Sept 18
Because both carry the campaign name, the activity timeline reads as a conversation.
💡 If you don't see an Activity section on your Person Account records, ask your Salesforce administrator to add the Activity History related list to the Person Account page layout.
Here's an example of how it would appear in Activities -
Field mapping
Required fields
Salesforce Field | Tatango Field | Purpose |
Any phone field | Phone Number | Required - identifies the subscriber |
(automatic) |
| Created and populated for you; matches messages to records |
Recommended fields for nonprofits
Salesforce Field | Tatango Field | Use case |
First Name |
| Personalize messages |
Last Name |
| Personalize messages |
| Coordinate SMS with email campaigns | |
Mailing Postal Code |
| Geographic segmentation |
Total Gifts |
| Major donor segmentation |
Last Gift Date |
| Lapsed donor campaigns |
Last Gift Amount |
| Ask-string personalization |
Recurring Donor |
| Sustainer campaigns |
Volunteer Status |
| Volunteer recruitment |
Membership Level |
| Member benefit campaigns |
⚠️ Any Tatango field you map to must already exist as a custom field on your Tatango list before you start setup.
Using custom tags
Every supporter synced by this integration can be tagged and you can also add your own tag during setup. This is useful if you're running more than one instance of the integration:
Report A (lapsed donors) → tag
lapsed_donorsReport B (recurring donors) → tag
recurring_donors
Each supporter carries the tag from the report they came from, even if they're on the same list. You can then use those tags to segment campaigns or trigger recurring messages.
To skip this, leave the field blank.
Troubleshooting
My report doesn't appear in the dropdown
Run or save the report in Salesforce, then refresh the setup page. Salesforce only makes reports available through the API once they've been interacted with.
Also check that the report is visible to the Salesforce user you connected with.
Supporters aren't syncing into Tatango
Confirm the Salesforce report returns records when you run it
Confirm you mapped a phone column to Phone Number
Confirm the phone numbers are mobile numbers — landlines and VoIP numbers can't receive SMS and are skipped
Confirm any Tatango custom fields you mapped to already exist on the list
Messages aren't appearing on Salesforce records
Confirm both reports are scheduled and sending
Confirm both reports are going to the report delivery address, and that they are still named All replies and Recipients
Confirm the
salesforce_account_idcolumn is included in both reportsConfirm
Tatango_Message_Id__cexists on the Activity object with External ID and Unique checked — see Step 1c
I'm seeing the same message twice on a record
This almost always means Tatango_Message_Id__c is missing, or was created without External ID and Unique checked. Correct the field in Salesforce — see Step 1c — and future deliveries will update the existing activity instead of adding another copy.
Opt-outs aren't reaching Salesforce
Confirm the webhook is configured on your list with Unsubscribes checked
Confirm the opt-out value matches your Salesforce field exactly, including capitalization and spacing
Confirm the field you chose still exists on the Account object and isn't read-only
Note
The daily sync runs at 12:00 PM Eastern, seven days a week.
It's a full sync, not an incremental one. Your whole report is processed each day. If you'd prefer only recent changes, add a
Last Modified Date = Yesterdayfilter to your Salesforce report.There's no row limit. Reports of any size sync in full.
Opt-outs sync one way only — from Tatango to Salesforce. Opting someone out in Salesforce does not unsubscribe them in Tatango.
Re-sending a report is safe. Messages already logged are updated, not duplicated.
Each integration syncs one report to one list. You can set up as many instances as you need.




