Konektor Salesforce
Hubungkan Salesforce CRM Anda ke Brevo melalui Tajo untuk sinkronisasi kontak kelas enterprise, pengelolaan lead, pelacakan opportunity, dan otomatisasi marketing yang digerakkan oleh data CRM Anda.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | Salesforce |
| Kategori | CRM |
| Kompleksitas setup | Lanjutan |
| Integrasi resmi | Ya |
| Data yang disinkronkan | Kontak, Lead, Akun, Opportunity, Event |
| API Base URL | https://yourInstance.salesforce.com/services/data/vXX.0 |
Fitur
- Sinkronisasi kontak/lead dua arah - Sinkronkan kontak dan lead Salesforce dengan daftar kontak Brevo
- Pelacakan opportunity - Petakan tahap dan nilai deal untuk segmentasi berbasis pendapatan
- Hierarki akun - Sinkronkan akun perusahaan untuk account-based marketing di Brevo
- Pemetaan custom object - Petakan custom object Salesforce ke atribut dan event Brevo
- Sinkronisasi campaign member - Sinkronkan campaign member Salesforce dengan daftar Brevo
- Pelacakan aktivitas - Sinkronkan task, event, dan aktivitas email untuk penilaian engagement
- Streaming real-time - Gunakan Salesforce Streaming API untuk pembaruan data seketika
- Dukungan kueri SOQL - Saring data yang disinkronkan dengan kueri SOQL kustom
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Org Salesforce (edisi apa pun yang memiliki akses API)
- Connected App yang dikonfigurasi di Salesforce Setup
- Akses API yang aktif untuk profil pengguna Salesforce Anda
- Akun Brevo dengan akses API
- Akun Tajo
Autentikasi
OAuth 2.0 Web Server Flow (direkomendasikan)
Paling cocok untuk integrasi produksi yang memerlukan otorisasi pengguna.
# Step 1: Authorizehttps://login.salesforce.com/services/oauth2/authorize? response_type=code& client_id={consumer_key}& redirect_uri={callback_url}
# Step 2: Exchange code for tokenscurl -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
Untuk integrasi server-ke-server tanpa interaksi pengguna.
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 mewajibkan Anda menambahkan security token di belakang password untuk username-password flow. Reset token Anda melalui Setup > My Personal Information > Reset My Security Token.
Konfigurasi
Setup dasar
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: 17Pemetaan field
Petakan field Salesforce ke atribut kontak Brevo:
Pemetaan Bawaan
| Parameter | Type | Description |
|---|---|---|
Email required | string | Email kontak/lead (pengenal unik untuk Brevo) |
FirstName optional | string | Dipetakan ke atribut FIRSTNAME di Brevo |
LastName optional | string | Dipetakan ke atribut LASTNAME di Brevo |
Phone optional | string | Dipetakan ke atribut SMS untuk pesan WhatsApp/SMS |
Account.Name optional | string | Nama akun/perusahaan yang terkait |
LeadSource optional | string | Sumber akuisisi lead |
StageName optional | string | Tahap opportunity untuk pelacakan deal |
OwnerId optional | string | Sales rep yang ditugaskan untuk routing |
Pemetaan field kustom
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_TIEREndpoint API
Resource REST API
| Method | Endpoint | Deskripsi |
|---|---|---|
GET | /services/data/vXX.0/sobjects/Contact | Mengkueri kontak |
POST | /services/data/vXX.0/sobjects/Contact | Membuat kontak |
PATCH | /services/data/vXX.0/sobjects/Contact/{id} | Memperbarui kontak |
GET | /services/data/vXX.0/sobjects/Lead | Mengkueri lead |
GET | /services/data/vXX.0/sobjects/Account | Mengkueri akun |
GET | /services/data/vXX.0/sobjects/Opportunity | Mengkueri opportunity |
GET | /services/data/vXX.0/query?q={SOQL} | Menjalankan kueri SOQL |
POST | /services/data/vXX.0/composite/sobjects | Membuat/memperbarui secara batch |
Bulk API
| Method | Endpoint | Deskripsi |
|---|---|---|
POST | /services/data/vXX.0/jobs/ingest | Membuat job bulk ingest |
PUT | /services/data/vXX.0/jobs/ingest/{jobId}/batches | Mengunggah data batch |
GET | /services/data/vXX.0/jobs/ingest/{jobId} | Memeriksa status job |
Streaming API
| Endpoint | Deskripsi |
|---|---|
/cometd/XX.0 | Long-polling CometD untuk event real-time |
| PushTopic | Berlangganan perubahan record melalui topik berbasis SOQL |
| Change Data Capture | Streaming perubahan terperinci pada level field |
| Platform Events | Arsitektur event-driven kustom |
Event
Event record (Change Data Capture)
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
ContactChangeEvent | Kontak dibuat/diperbarui/dihapus | Sinkronisasi kontak real-time |
LeadChangeEvent | Lead dibuat/diperbarui/dikonversi | Pelacakan lifecycle lead |
OpportunityChangeEvent | Tahap opportunity berubah | Otomatisasi pipeline deal |
AccountChangeEvent | Record akun diubah | Sinkronisasi data perusahaan |
Platform Events
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
Lead_Converted__e | Lead dikonversi menjadi kontak | Nurture pasca-konversi |
Deal_Won__e | Opportunity closed-won | Alur onboarding pelanggan |
Deal_Lost__e | Opportunity closed-lost | Kampanye win-back |
Contoh kode
Inisialisasi konektor
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Connect Salesforceawait 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});Menyinkronkan kontak dengan filter SOQL
// Sync only qualified leads from Salesforceawait 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 statusconst status = await tajo.connectors.status('salesforce');console.log(status);// {// connected: true,// lastSync: '2024-01-15T10:30:00Z',// contactsSynced: 18400,// leadsSynced: 7200,// opportunitiesSynced: 3100// }Streaming real-time
// Subscribe to Salesforce Change Data Captureawait 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 limit
Batas Salesforce REST API bergantung pada edisi dan jumlah lisensi Anda:
| Edisi | Request API per 24 jam |
|---|---|
| Developer | 15.000 |
| Enterprise | 1.000 per lisensi pengguna (minimal 15.000) |
| Unlimited | 5.000 per lisensi pengguna (minimal 15.000) |
| Performance | 5.000 per lisensi pengguna (minimal 15.000) |
Batasan tambahan:
- Batas API bersamaan: 25 request berdurasi panjang
- Bulk API: 15.000 batch per 24 jam
- Streaming API: 2.000 event per hari (dapat ditingkatkan)
- Composite API: 25 subrequest per composite request
Pemantauan penggunaan API
Pantau penggunaan API Anda di Salesforce Setup > System Overview. Tajo menggunakan bulk API untuk sinkronisasi besar agar batas API Anda tetap hemat.
Pemecahan masalah
Masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
| INVALID_SESSION_ID | Token kedaluwarsa | Segarkan token OAuth secara otomatis |
| REQUEST_LIMIT_EXCEEDED | Batas API harian tercapai | Gunakan Bulk API atau kurangi frekuensi sinkronisasi |
| FIELD_INTEGRITY_EXCEPTION | Field wajib tidak ada | Petakan seluruh field wajib dalam konfigurasi |
| DUPLICATES_DETECTED | Aturan duplikat aktif | Konfigurasikan preferensi penanganan duplikat |
| INSUFFICIENT_ACCESS | Izin objek kurang | Berikan akses API pada profil Salesforce |
Mode debug
Aktifkan logging terperinci:
connectors: salesforce: debug: true log_level: verbose log_api_calls: trueUji koneksi
tajo connectors test salesforce# ✓ OAuth token valid# ✓ Contacts accessible# ✓ Leads accessible# ✓ Accounts accessible# ✓ Opportunities accessible# ✓ Bulk API enabledPraktik terbaik
- Gunakan Bulk API untuk sinkronisasi besar - Beralih ke Bulk API 2.0 untuk dataset di atas 2.000 record
- Terapkan Change Data Capture - Gunakan CDC untuk sinkronisasi real-time alih-alih polling
- Petakan hanya field yang diperlukan - Kurangi penggunaan API dengan menyinkronkan hanya field yang dibutuhkan
- Tangani refresh token - Terapkan logika refresh token OAuth otomatis
- Gunakan composite request - Gabungkan panggilan API terkait untuk menekan jumlah request
- Uji di sandbox terlebih dahulu - Gunakan org sandbox Salesforce sebelum penerapan ke produksi
Keamanan
- OAuth 2.0 - Otorisasi standar industri dengan beragam grant type
- Pembatasan IP - Salesforce mendukung rentang IP login dan pengaturan trusted IP
- TLS 1.2+ - Seluruh komunikasi API dienkripsi dengan TLS minimal 1.2
- Keamanan level field - Kontrol akses field yang granular per profil
- Manajemen sesi - Batas waktu sesi dan jumlah sesi bersamaan yang dapat dikonfigurasi