Konektor HubSpot
Hubungkan HubSpot CRM Anda ke Brevo melalui Tajo untuk sinkronisasi kontak dua arah, pelacakan deal, data engagement, dan otomatisasi marketing terpadu di kedua platform.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | HubSpot |
| Kategori | CRM |
| Kompleksitas setup | Sedang |
| Integrasi resmi | Ya |
| Data yang disinkronkan | Kontak, Perusahaan, Deal, Tiket, Event |
| API Base URL | https://api.hubapi.com |
Fitur
- Sinkronisasi kontak dua arah - Jaga kontak tetap sinkron antara HubSpot dan Brevo secara real-time
- Pelacakan pipeline deal - Sinkronkan tahap dan nilai deal untuk segmentasi berbasis pendapatan
- Sinkronisasi data perusahaan - Kaitkan kontak dengan record perusahaan dan data firmografis
- Integrasi tiket - Lacak tiket support untuk penilaian kesehatan pelanggan
- Pelacakan engagement - Sinkronkan email dibuka, klik, meeting, panggilan, dan catatan
- Dukungan custom object - Petakan custom object HubSpot ke atribut Brevo
- Pemicu workflow - Gunakan perubahan lifecycle stage HubSpot untuk memicu otomatisasi Brevo
- Event webhook - Notifikasi real-time untuk setiap perubahan data CRM
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Akun HubSpot (Free, Starter, Professional, atau Enterprise)
- Private app atau OAuth app HubSpot dengan scope yang diperlukan
- Akun Brevo dengan akses API
- Akun Tajo
Autentikasi
Access token private app (direkomendasikan)
Buat private app di HubSpot untuk akses API langsung dengan kontrol scope yang granular.
- Buka HubSpot Settings > Integrations > Private Apps
- Buat private app baru
- Konfigurasikan scope yang diperlukan
- Salin access token
curl -X GET "https://api.hubapi.com/crm/v3/objects/contacts" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json"OAuth 2.0
Gunakan OAuth 2.0 untuk integrasi multi-akun yang membutuhkan otorisasi pengguna.
# Authorization URLhttps://app.hubspot.com/oauth/authorize?client_id={client_id}&scope=crm.objects.contacts.read&redirect_uri={redirect_uri}Scope yang diperlukan
crm.objects.contacts.readcrm.objects.contacts.writecrm.objects.companies.readcrm.objects.deals.readcrm.objects.deals.writecrm.objects.custom.readcrm.schemas.custom.readKonfigurasi
Setup dasar
connectors: hubspot: enabled: true access_token: "${HUBSPOT_ACCESS_TOKEN}"
# Data sync options sync: contacts: true companies: true deals: true tickets: true engagements: true
# Sync direction direction: bidirectional # or 'hubspot_to_brevo' | 'brevo_to_hubspot'
# List assignment in Brevo lists: all_contacts: 10 qualified_leads: 11 customers: 12Pemetaan field
Petakan properti HubSpot ke atribut kontak Brevo:
Pemetaan Bawaan
| Parameter | Type | Description |
|---|---|---|
email required | string | Email kontak (pengenal utama) |
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 WhatsApp/SMS |
company optional | string | Nama perusahaan yang terkait |
lifecyclestage optional | string | Lifecycle stage HubSpot (subscriber, lead, MQL, SQL, customer) |
hs_lead_status optional | string | Status kualifikasi lead |
hubspot_owner_id optional | string | ID sales owner yang ditugaskan |
Pemetaan properti kustom
field_mapping: # Standard fields email: email firstname: FIRSTNAME lastname: LASTNAME phone: SMS
# CRM fields lifecyclestage: LIFECYCLE_STAGE hs_lead_status: LEAD_STATUS company: COMPANY_NAME
# Deal metrics hs_total_deal_value: DEAL_VALUE num_associated_deals: DEAL_COUNT
# Custom properties preferred_channel: PREFERRED_CHANNEL customer_segment: SEGMENTEndpoint API
Objek CRM
| Method | Endpoint | Deskripsi |
|---|---|---|
GET | /crm/v3/objects/contacts | Menampilkan daftar kontak |
POST | /crm/v3/objects/contacts | Membuat kontak |
PATCH | /crm/v3/objects/contacts/{id} | Memperbarui kontak |
GET | /crm/v3/objects/companies | Menampilkan daftar perusahaan |
GET | /crm/v3/objects/deals | Menampilkan daftar deal |
POST | /crm/v3/objects/deals | Membuat deal |
GET | /crm/v3/objects/tickets | Menampilkan daftar tiket |
Asosiasi
| Method | Endpoint | Deskripsi |
|---|---|---|
GET | /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType} | Mengambil asosiasi |
PUT | /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId} | Membuat asosiasi |
Engagement
| Method | Endpoint | Deskripsi |
|---|---|---|
GET | /crm/v3/objects/calls | Menampilkan daftar engagement panggilan |
GET | /crm/v3/objects/emails | Menampilkan daftar engagement email |
GET | /crm/v3/objects/meetings | Menampilkan daftar meeting |
GET | /crm/v3/objects/notes | Menampilkan daftar catatan |
GET | /crm/v3/objects/tasks | Menampilkan daftar tugas |
Event
Event kontak
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
contact.creation | Kontak baru dibuat | Pemicu alur welcome |
contact.propertyChange | Properti kontak diperbarui | Sinkronisasi atribut |
contact.merge | Kontak digabungkan | Penanganan deduplikasi |
contact.deletion | Kontak dihapus | Pembersihan di Brevo |
Event deal
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
deal.creation | Deal baru dibuat | Notifikasi sales |
deal.propertyChange | Tahap deal berubah | Otomatisasi pipeline |
deal.deletion | Deal dihapus | Pelaporan pendapatan |
Event perusahaan
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
company.creation | Perusahaan baru ditambahkan | Account-based marketing |
company.propertyChange | Data perusahaan diperbarui | Sinkronisasi firmografis |
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 HubSpotawait tajo.connectors.connect('hubspot', { accessToken: process.env.HUBSPOT_ACCESS_TOKEN});Menjalankan sinkronisasi kontak
// Full bidirectional syncawait tajo.connectors.sync('hubspot', { type: 'full', resources: ['contacts', 'companies', 'deals'], direction: 'bidirectional', since: '2023-01-01'});
// Check sync statusconst status = await tajo.connectors.status('hubspot');console.log(status);// {// connected: true,// lastSync: '2024-01-15T10:30:00Z',// contactsSynced: 34200,// companiesSynced: 5100,// dealsSynced: 2340// }Menangani event webhook
// Handle HubSpot webhook notificationsapp.post('/webhooks/hubspot', async (req, res) => { const signature = req.get('X-HubSpot-Signature-v3');
// Verify webhook signature if (!verifyHubSpotSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
for (const event of req.body) { await tajo.connectors.handleWebhook('hubspot', { eventType: event.subscriptionType, objectId: event.objectId, propertyName: event.propertyName, propertyValue: event.propertyValue }); }
res.status(200).send('OK');});Rate limit
HubSpot menerapkan rate limit per private app atau OAuth app:
| Paket | Rate limit | Burst limit |
|---|---|---|
| Free/Starter | 100 request/10 detik | 150 request/10 detik |
| Professional | 150 request/10 detik | 200 request/10 detik |
| Enterprise | 200 request/10 detik | 250 request/10 detik |
| Add-on API | 200 request/10 detik | 250 request/10 detik |
Batasan tambahan:
- Search API: 5 request/detik per app
- Operasi batch: 100 record per request batch
- Batas harian: 500.000 request/hari (OAuth app)
Penanganan rate limit
HubSpot mengembalikan respons 429 Too Many Requests saat batas terlampaui. Gunakan exponential backoff dan pantau header X-HubSpot-RateLimit-*.
Pemecahan masalah
Masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | Token kedaluwarsa atau tidak valid | Buat ulang token private app atau segarkan token OAuth |
| Kontak tidak tersinkronisasi | Properti email tidak ada | Kontak HubSpot memerlukan email untuk sinkronisasi ke Brevo |
| Kontak duplikat | Tidak ada aturan deduplikasi | Konfigurasikan aturan merge di HubSpot |
| Webhook tidak diterima | Langganan tidak aktif | Daftarkan ulang langganan webhook |
| Properti tidak terpetakan | Properti kustom belum dibuat | Buat properti tersebut di HubSpot terlebih dahulu |
Mode debug
Aktifkan logging terperinci:
connectors: hubspot: debug: true log_level: verbose log_webhooks: trueUji koneksi
tajo connectors test hubspot# ✓ API connection successful# ✓ Contacts readable# ✓ Companies readable# ✓ Deals readable# ✓ Webhooks registeredPraktik terbaik
- Gunakan private app, bukan API key - API key sudah tidak digunakan lagi; gunakan private app untuk keamanan yang lebih baik
- Terapkan sinkronisasi dua arah dengan hati-hati - Hindari loop tak terbatas dengan melacak sumber sinkronisasi
- Petakan lifecycle stage - Gunakan lifecycle stage HubSpot untuk melakukan segmentasi kontak di Brevo
- Kelompokkan request API - Gunakan endpoint batch untuk operasi massal agar tetap berada dalam rate limit
- Pantau pengiriman webhook - Siapkan logika retry dan penanganan dead letter
- Gunakan sinkronisasi inkremental - Sinkronkan hanya record yang berubah menggunakan properti
lastmodifieddate
Keamanan
- Token private app - Access token dengan scope dan izin yang granular
- OAuth 2.0 - Otorisasi standar industri dengan rotasi refresh token
- Tanda tangan webhook - Verifikasi tanda tangan berbasis HMAC (v3)
- Enkripsi TLS - Seluruh komunikasi API terenkripsi saat transit
- Izin ber-scope - Akses dengan scope minimum yang diperlukan per integrasi