Salesforce Connector

Salesforce Connector

Connect your Salesforce CRM to Brevo via Tajo for enterprise-grade contact synchronization, lead management, opportunity tracking, and marketing automation powered by your CRM data.

Overview

PropertyValue
PlatformSalesforce
CategoryCRM
Setup ComplexityAdvanced
Official IntegrationYes
Data SyncedContacts, Leads, Accounts, Opportunities, Events
API Base URLhttps://yourInstance.salesforce.com/services/data/vXX.0

Features

  • Bidirectional contact/lead sync - Sync Salesforce contacts and leads with Brevo contact lists
  • Opportunity tracking - Map deal stages and amounts for revenue-based segmentation
  • Account hierarchy - Sync company accounts for account-based marketing in Brevo
  • Custom object mapping - Map Salesforce custom objects to Brevo attributes and events
  • Campaign member sync - Sync Salesforce campaign members with Brevo lists
  • Activity tracking - Sync tasks, events, and email activities for engagement scoring
  • Real-time streaming - Use Salesforce Streaming API for instant data updates
  • SOQL query support - Filter synced data with custom SOQL queries

Prerequisites

Before you begin, ensure you have:

  1. A Salesforce org (any edition with API access)
  2. A Connected App configured in Salesforce Setup
  3. API access enabled for your Salesforce user profile
  4. A Brevo account with API access
  5. A Tajo account

Authentication

Best for production integrations with user authorization.

Terminal window
# Step 1: Authorize
https://login.salesforce.com/services/oauth2/authorize?
response_type=code&
client_id={consumer_key}&
redirect_uri={callback_url}
# Step 2: Exchange code for tokens
curl -X POST https://login.salesforce.com/services/oauth2/token \
-d "grant_type=authorization_code" \
-d "code={auth_code}" \
-d "client_id={consumer_key}" \
-d "client_secret={consumer_secret}" \
-d "redirect_uri={callback_url}"

Username-Password Flow

For server-to-server integrations without user interaction.

Terminal window
curl -X POST https://login.salesforce.com/services/oauth2/token \
-d "grant_type=password" \
-d "client_id={consumer_key}" \
-d "client_secret={consumer_secret}" \
-d "username={username}" \
-d "password={password}{security_token}"

Security Token

Salesforce requires appending your security token to your password for the username-password flow. Reset your token from Setup > My Personal Information > Reset My Security Token.

Configuration

Basic Setup

connectors:
salesforce:
enabled: true
instance_url: "https://yourorg.my.salesforce.com"
api_version: "v59.0"
auth:
type: oauth2
consumer_key: "${SF_CONSUMER_KEY}"
consumer_secret: "${SF_CONSUMER_SECRET}"
refresh_token: "${SF_REFRESH_TOKEN}"
# Data sync options
sync:
contacts: true
leads: true
accounts: true
opportunities: true
campaigns: true
# Sync direction
direction: salesforce_to_brevo
# Brevo list assignment
lists:
all_leads: 15
qualified_leads: 16
customers: 17

Field Mapping

Map Salesforce fields to Brevo contact attributes:

Default Mappings

Parameter Type Description
Email required
string

Contact/Lead email (unique identifier for Brevo)

FirstName optional
string

Maps to FIRSTNAME attribute in Brevo

LastName optional
string

Maps to LASTNAME attribute in Brevo

Phone optional
string

Maps to SMS attribute for WhatsApp/SMS messaging

Account.Name optional
string

Associated account/company name

LeadSource optional
string

Lead acquisition source

StageName optional
string

Opportunity stage for deal tracking

OwnerId optional
string

Assigned sales rep for routing

Custom Field Mapping

field_mapping:
# Standard fields
Email: email
FirstName: FIRSTNAME
LastName: LASTNAME
Phone: SMS
# CRM fields
LeadSource: LEAD_SOURCE
Lead_Score__c: LEAD_SCORE
Account.Name: COMPANY_NAME
Account.Industry: INDUSTRY
# Opportunity fields
Amount: DEAL_VALUE
StageName: DEAL_STAGE
CloseDate: EXPECTED_CLOSE_DATE
# Custom fields
Preferred_Channel__c: PREFERRED_CHANNEL
Customer_Tier__c: VIP_TIER

API Endpoints

REST API Resources

MethodEndpointDescription
GET/services/data/vXX.0/sobjects/ContactQuery contacts
POST/services/data/vXX.0/sobjects/ContactCreate a contact
PATCH/services/data/vXX.0/sobjects/Contact/{id}Update a contact
GET/services/data/vXX.0/sobjects/LeadQuery leads
GET/services/data/vXX.0/sobjects/AccountQuery accounts
GET/services/data/vXX.0/sobjects/OpportunityQuery opportunities
GET/services/data/vXX.0/query?q={SOQL}Execute SOQL query
POST/services/data/vXX.0/composite/sobjectsBatch create/update

Bulk API

MethodEndpointDescription
POST/services/data/vXX.0/jobs/ingestCreate bulk ingest job
PUT/services/data/vXX.0/jobs/ingest/{jobId}/batchesUpload batch data
GET/services/data/vXX.0/jobs/ingest/{jobId}Check job status

Streaming API

EndpointDescription
/cometd/XX.0CometD long-polling for real-time events
PushTopicSubscribe to record changes via SOQL-based topics
Change Data CaptureStream fine-grained field-level changes
Platform EventsCustom event-driven architecture

Events

Record Events (Change Data Capture)

EventTriggerUse Case
ContactChangeEventContact created/updated/deletedReal-time contact sync
LeadChangeEventLead created/updated/convertedLead lifecycle tracking
OpportunityChangeEventOpportunity stage changedDeal pipeline automation
AccountChangeEventAccount record modifiedCompany data sync

Platform Events

EventTriggerUse Case
Lead_Converted__eLead converted to contactPost-conversion nurture
Deal_Won__eOpportunity closed-wonCustomer onboarding flow
Deal_Lost__eOpportunity closed-lostWin-back campaigns

Code Examples

Initialize Connector

import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY
});
// Connect Salesforce
await tajo.connectors.connect('salesforce', {
instanceUrl: 'https://yourorg.my.salesforce.com',
consumerKey: process.env.SF_CONSUMER_KEY,
consumerSecret: process.env.SF_CONSUMER_SECRET,
refreshToken: process.env.SF_REFRESH_TOKEN
});

Sync Contacts with SOQL Filter

// Sync only qualified leads from Salesforce
await tajo.connectors.sync('salesforce', {
type: 'filtered',
resources: ['leads'],
filter: "SELECT Id, Email, FirstName, LastName, LeadScore__c FROM Lead WHERE Status = 'Qualified' AND Email != null",
brevoListId: 16
});
// Check sync status
const status = await tajo.connectors.status('salesforce');
console.log(status);
// {
// connected: true,
// lastSync: '2024-01-15T10:30:00Z',
// contactsSynced: 18400,
// leadsSynced: 7200,
// opportunitiesSynced: 3100
// }

Real-Time Streaming

// Subscribe to Salesforce Change Data Capture
await tajo.connectors.stream('salesforce', {
channels: [
'/data/ContactChangeEvent',
'/data/LeadChangeEvent',
'/data/OpportunityChangeEvent'
],
handler: async (event) => {
console.log(`Change detected: ${event.entity} ${event.changeType}`);
// Automatically synced to Brevo by Tajo
}
});

Rate Limits

Salesforce REST API limits depend on your edition and license count:

EditionAPI Requests per 24 hours
Developer15,000
Enterprise1,000 per user license (min 15,000)
Unlimited5,000 per user license (min 15,000)
Performance5,000 per user license (min 15,000)

Additional limits:

  • Concurrent API limit: 25 long-running requests
  • Bulk API: 15,000 batches per 24 hours
  • Streaming API: 2,000 events per day (can be increased)
  • Composite API: 25 subrequests per composite request

API Usage Monitoring

Monitor your API usage in Salesforce Setup > System Overview. Tajo uses bulk API for large syncs to conserve your API limits.

Troubleshooting

Common Issues

IssueCauseSolution
INVALID_SESSION_IDToken expiredRefresh OAuth token automatically
REQUEST_LIMIT_EXCEEDEDDaily API limit hitUse Bulk API or reduce sync frequency
FIELD_INTEGRITY_EXCEPTIONRequired field missingMap all required fields in configuration
DUPLICATES_DETECTEDDuplicate rules activeConfigure duplicate handling preferences
INSUFFICIENT_ACCESSMissing object permissionsGrant API access in Salesforce profile

Debug Mode

Enable verbose logging:

connectors:
salesforce:
debug: true
log_level: verbose
log_api_calls: true

Test Connection

Terminal window
tajo connectors test salesforce
# ✓ OAuth token valid
# ✓ Contacts accessible
# ✓ Leads accessible
# ✓ Accounts accessible
# ✓ Opportunities accessible
# ✓ Bulk API enabled

Best Practices

  1. Use Bulk API for large syncs - Switch to Bulk API 2.0 for datasets over 2,000 records
  2. Implement Change Data Capture - Use CDC for real-time sync instead of polling
  3. Map only needed fields - Reduce API usage by syncing only required fields
  4. Handle token refresh - Implement automatic OAuth token refresh logic
  5. Use composite requests - Combine related API calls to reduce request count
  6. Test in sandbox first - Use a Salesforce sandbox org before production deployment

Security

  • OAuth 2.0 - Industry-standard authorization with multiple grant types
  • IP restrictions - Salesforce supports login IP ranges and trusted IP settings
  • TLS 1.2+ - All API communication encrypted with TLS 1.2 minimum
  • Field-level security - Granular field access control per profile
  • Session management - Configurable session timeout and concurrent session limits
AI सहायक

नमस्ते! डॉक्यूमेंटेशन के बारे में कुछ भी पूछें।

Brevo के साथ मुफ्त में शुरू करें