Skip to main content

Salesforce NPC

Connect Salesforce Nonprofit Cloud to Tatango to sync supporters for SMS messaging, see every text sent and received on the Person Account record, and keep opt-outs up to date in Salesforce.

Written by Chinmayee Baral

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__c

  • Type: 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__c

  • Check 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:

  1. Log in to Salesforce and allow access.

  2. Select the Salesforce report you created in Step 1b.

  3. Select the Tatango list you want supporters synced into.

  4. Map your fields - match Salesforce report columns to Tatango subscriber fields. Map a phone column to Phone Number.

  5. Add a custom tag (optional) - see Using custom tags below.

  6. 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.

  7. Choose whether to record the opt-out date, and if so, which field.

  8. Copy the unsubscribe webhook URL. You'll need it in Step 3.

  9. 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.

  1. Go to Lists and select your list

  2. Go to Settings → Webhooks

  3. Click Create New Webhook

  4. Paste the webhook URL you copied in Step 2

  5. Check the Unsubscribes box

  6. 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)

salesforce_account_id

Created and populated for you; matches messages to records

Recommended fields for nonprofits

Salesforce Field

Tatango Field

Use case

First Name

first_name

Personalize messages

Last Name

last_name

Personalize messages

Email

email

Coordinate SMS with email campaigns

Mailing Postal Code

zip

Geographic segmentation

Total Gifts

total_gifts

Major donor segmentation

Last Gift Date

last_gift_date

Lapsed donor campaigns

Last Gift Amount

last_gift_amount

Ask-string personalization

Recurring Donor

recurring_donor

Sustainer campaigns

Volunteer Status

volunteer_status

Volunteer recruitment

Membership Level

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_donors

  • Report 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_id column is included in both reports

  • Confirm Tatango_Message_Id__c exists 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 = Yesterday filter 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.

Did this answer your question?