---
title: "Konektor HubSpot"
description: "Panduan lengkap integrasi HubSpot CRM untuk menyinkronkan kontak, perusahaan, deal, tiket, dan data marketing dengan Brevo melalui Tajo."
url: https://tajo.io/in/docs/connectors/crm/hubspot/
markdown: https://tajo.io/in/docs/connectors/crm/hubspot.md
lang: id-ID
robots: noindex
---

Ajukan akses awal

Masukkan nama depan dan alamat email kerja Anda. Kami akan mengirim tautan untuk mengonfirmasi permintaan akses Tajo.

# Konektor HubSpot

Status konektor: Dalam pengerjaan Sedang dibangun. Belum terverifikasi.

| Field sumber | Field tujuan | Nilai contoh |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

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** | Tidak |
| **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:

1. Akun HubSpot (Free, Starter, Professional, atau Enterprise)
2. Private app atau OAuth app HubSpot dengan scope yang diperlukan
3. Akun Brevo dengan akses API
4. Akun Tajo

## Autentikasi

### Access token private app (direkomendasikan)

Buat private app di HubSpot untuk akses API langsung dengan kontrol scope yang granular.

1. Buka HubSpot Settings > Integrations > Private Apps
2. Buat private app baru
3. Konfigurasikan scope yang diperlukan
4. Salin access token

```bash
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.

```bash
# Authorization URL
https://app.hubspot.com/oauth/authorize?client_id={client_id}&scope=crm.objects.contacts.read&redirect_uri={redirect_uri}
```

#### Scope yang diperlukan

```
crm.objects.contacts.read
crm.objects.contacts.write
crm.objects.companies.read
crm.objects.deals.read
crm.objects.deals.write
crm.objects.custom.read
crm.schemas.custom.read
```

## Konfigurasi

### Setup dasar

```yaml
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: 12
```

### Pemetaan 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

```yaml
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: SEGMENT
```

## Endpoint 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

```javascript
import { TajoClient } from '@tajo/sdk';

const tajo = new TajoClient({
  apiKey: process.env.TAJO_API_KEY,
  brevoApiKey: process.env.BREVO_API_KEY
});

// Connect HubSpot
await tajo.connectors.connect('hubspot', {
  accessToken: process.env.HUBSPOT_ACCESS_TOKEN
});
```

### Menjalankan sinkronisasi kontak

```javascript
// Full bidirectional sync
await tajo.connectors.sync('hubspot', {
  type: 'full',
  resources: ['contacts', 'companies', 'deals'],
  direction: 'bidirectional',
  since: '2023-01-01'
});

// Check sync status
const 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

```javascript
// Handle HubSpot webhook notifications
app.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:

```yaml
connectors:
  hubspot:
    debug: true
    log_level: verbose
    log_webhooks: true
```

### Uji koneksi

```bash
tajo connectors test hubspot
# ✓ API connection successful
# ✓ Contacts readable
# ✓ Companies readable
# ✓ Deals readable
# ✓ Webhooks registered
```

## Praktik terbaik

1. **Gunakan private app, bukan API key** - API key sudah tidak digunakan lagi; gunakan private app untuk keamanan yang lebih baik
2. **Terapkan sinkronisasi dua arah dengan hati-hati** - Hindari loop tak terbatas dengan melacak sumber sinkronisasi
3. **Petakan lifecycle stage** - Gunakan lifecycle stage HubSpot untuk melakukan segmentasi kontak di Brevo
4. **Kelompokkan request API** - Gunakan endpoint batch untuk operasi massal agar tetap berada dalam rate limit
5. **Pantau pengiriman webhook** - Siapkan logika retry dan penanganan dead letter
6. **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

## Sumber terkait

- [Dokumentasi API HubSpot](https://developers.hubspot.com/docs/api/overview)
- [Panduan Autentikasi HubSpot](https://developers.hubspot.com/docs/api/working-with-oauth)
- [Konektor Salesforce](https://tajo.io/in/docs/connectors/crm/salesforce)
- [Skill Customer Sync](https://tajo.io/in/docs/skills/data-sync/customer-sync)
- [Brevo Contacts API](https://tajo.io/in/docs/contact-management)
