HubSpot 커넥터
HubSpot 커넥터
HubSpot CRM을 Tajo를 통해 Brevo에 연결하여 양방향 연락처 동기화, 거래 추적, 인게이지먼트 데이터, 그리고 두 플랫폼 전반에 걸친 통합 마케팅 자동화를 구현하세요.
개요
| 속성 | 값 |
|---|---|
| 플랫폼 | HubSpot |
| 카테고리 | CRM |
| 설정 난이도 | 보통 |
| 공식 통합 | 예 |
| 동기화되는 데이터 | 연락처, 회사, 거래, 티켓, 이벤트 |
| API 기본 URL | https://api.hubapi.com |
주요 기능
- 양방향 연락처 동기화 - HubSpot과 Brevo 간의 연락처를 실시간으로 동기화합니다
- 거래 파이프라인 추적 - 매출 기반 세그먼테이션을 위해 거래 단계와 금액을 동기화합니다
- 회사 데이터 동기화 - 연락처를 회사 레코드 및 기업 정보 데이터와 연결합니다
- 티켓 통합 - 고객 헬스 스코어링을 위해 지원 티켓을 추적합니다
- 인게이지먼트 추적 - 이메일 오픈, 클릭, 미팅, 통화, 메모를 동기화합니다
- 커스텀 오브젝트 지원 - HubSpot 커스텀 오브젝트를 Brevo 속성에 매핑합니다
- 워크플로우 트리거 - HubSpot 라이프사이클 단계 변경을 사용해 Brevo 자동화를 트리거합니다
- 웹훅 이벤트 - CRM 데이터 변경에 대한 실시간 알림
사전 준비 사항
시작하기 전에 다음 사항이 준비되어 있어야 합니다.
- HubSpot 계정 (Free, Starter, Professional 또는 Enterprise)
- 필수 스코프를 갖춘 HubSpot private app 또는 OAuth app
- API 액세스가 활성화된 Brevo 계정
- Tajo 계정
인증
Private App 액세스 토큰 (권장)
세분화된 스코프 제어와 함께 직접 API에 액세스하려면 HubSpot에서 private app을 생성하세요.
- HubSpot Settings > Integrations > Private Apps로 이동합니다
- 새 private app을 생성합니다
- 필수 스코프를 설정합니다
- 액세스 토큰을 복사합니다
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
사용자 인증이 필요한 다중 계정 통합에는 OAuth 2.0을 사용합니다.
# Authorization URLhttps://app.hubspot.com/oauth/authorize?client_id={client_id}&scope=crm.objects.contacts.read&redirect_uri={redirect_uri}필수 스코프
crm.objects.contacts.readcrm.objects.contacts.writecrm.objects.companies.readcrm.objects.deals.readcrm.objects.deals.writecrm.objects.custom.readcrm.schemas.custom.read설정
기본 설정
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필드 매핑
HubSpot 속성을 Brevo 연락처 속성에 매핑합니다.
기본 매핑
| Parameter | Type | Description |
|---|---|---|
email required | string | 연락처 이메일 (기본 식별자) |
firstname optional | string | Brevo의 FIRSTNAME 속성에 매핑됩니다 |
lastname optional | string | Brevo의 LASTNAME 속성에 매핑됩니다 |
phone optional | string | WhatsApp/SMS용 SMS 속성에 매핑됩니다 |
company optional | string | 연결된 회사 이름 |
lifecyclestage optional | string | HubSpot 라이프사이클 단계 (subscriber, lead, MQL, SQL, customer) |
hs_lead_status optional | string | 리드 자격 상태 |
hubspot_owner_id optional | string | 담당 영업 담당자 ID |
커스텀 속성 매핑
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: SEGMENTAPI 엔드포인트
CRM 오브젝트
| Method | 엔드포인트 | 설명 |
|---|---|---|
GET | /crm/v3/objects/contacts | 연락처 목록 조회 |
POST | /crm/v3/objects/contacts | 연락처 생성 |
PATCH | /crm/v3/objects/contacts/{id} | 연락처 업데이트 |
GET | /crm/v3/objects/companies | 회사 목록 조회 |
GET | /crm/v3/objects/deals | 거래 목록 조회 |
POST | /crm/v3/objects/deals | 거래 생성 |
GET | /crm/v3/objects/tickets | 티켓 목록 조회 |
연관 관계
| Method | 엔드포인트 | 설명 |
|---|---|---|
GET | /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType} | 연관 관계 조회 |
PUT | /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId} | 연관 관계 생성 |
인게이지먼트
| Method | 엔드포인트 | 설명 |
|---|---|---|
GET | /crm/v3/objects/calls | 통화 인게이지먼트 목록 |
GET | /crm/v3/objects/emails | 이메일 인게이지먼트 목록 |
GET | /crm/v3/objects/meetings | 미팅 목록 |
GET | /crm/v3/objects/notes | 메모 목록 |
GET | /crm/v3/objects/tasks | 작업 목록 |
이벤트
연락처 이벤트
| 이벤트 | 트리거 | 사용 사례 |
|---|---|---|
contact.creation | 새 연락처 생성 | 웰컴 플로우 트리거 |
contact.propertyChange | 연락처 속성 업데이트 | 속성 동기화 |
contact.merge | 연락처 병합 | 중복 제거 처리 |
contact.deletion | 연락처 삭제 | Brevo에서 정리 |
거래 이벤트
| 이벤트 | 트리거 | 사용 사례 |
|---|---|---|
deal.creation | 새 거래 생성 | 영업 알림 |
deal.propertyChange | 거래 단계 변경 | 파이프라인 자동화 |
deal.deletion | 거래 삭제 | 매출 리포팅 |
회사 이벤트
| 이벤트 | 트리거 | 사용 사례 |
|---|---|---|
company.creation | 새 회사 추가 | 계정 기반 마케팅 |
company.propertyChange | 회사 데이터 업데이트 | 기업 정보 동기화 |
코드 예제
커넥터 초기화
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});연락처 동기화 실행
// 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// }웹훅 이벤트 처리
// 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');});요청 제한
HubSpot은 private app 또는 OAuth app별로 요청 제한을 적용합니다.
| 플랜 | 요청 제한 | 버스트 제한 |
|---|---|---|
| Free/Starter | 100회/10초 | 150회/10초 |
| Professional | 150회/10초 | 200회/10초 |
| Enterprise | 200회/10초 | 250회/10초 |
| API add-on | 200회/10초 | 250회/10초 |
추가 제한 사항:
- Search API: 앱당 초당 5회
- 배치 작업: 배치 요청당 100개 레코드
- 일일 제한: 일일 500,000회 요청 (OAuth app)
요청 제한 처리
HubSpot은 제한을 초과하면 429 Too Many Requests 응답을 반환합니다. 지수 백오프를 사용하고 X-HubSpot-RateLimit-* 헤더를 모니터링하세요.
문제 해결
일반적인 문제
| 문제 | 원인 | 해결 방법 |
|---|---|---|
| 401 Unauthorized | 토큰 만료 또는 유효하지 않음 | private app 토큰을 재생성하거나 OAuth 토큰을 새로 고치세요 |
| 연락처가 동기화되지 않음 | 이메일 속성 누락 | HubSpot 연락처에는 Brevo 동기화를 위한 이메일이 필요합니다 |
| 중복 연락처 | 중복 제거 규칙 없음 | HubSpot에서 병합 규칙을 구성하세요 |
| 웹훅 수신 안 됨 | 구독이 활성화되지 않음 | 웹훅 구독을 재등록하세요 |
| 속성이 매핑되지 않음 | 커스텀 속성이 생성되지 않음 | HubSpot에서 먼저 속성을 생성하세요 |
디버그 모드
상세 로깅 활성화:
connectors: hubspot: debug: true log_level: verbose log_webhooks: true연결 테스트
tajo connectors test hubspot# ✓ API connection successful# ✓ Contacts readable# ✓ Companies readable# ✓ Deals readable# ✓ Webhooks registered모범 사례
- API 키보다 private app 사용 - API 키는 deprecated 되었으므로 보안을 위해 private app을 사용하세요
- 양방향 동기화를 신중하게 구현 - 동기화 소스를 추적하여 무한 루프를 방지하세요
- 라이프사이클 단계 매핑 - HubSpot 라이프사이클 단계를 사용해 Brevo에서 연락처를 세분화하세요
- API 요청 배치 처리 - 요청 제한을 준수하기 위해 대량 작업에는 배치 엔드포인트를 사용하세요
- 웹훅 전송 모니터링 - 재시도 로직과 dead letter 처리를 설정하세요
- 증분 동기화 사용 -
lastmodifieddate속성을 사용해 변경된 레코드만 동기화하세요
보안
- Private App 토큰 - 세분화된 권한을 가진 스코프 기반 액세스 토큰
- OAuth 2.0 - 리프레시 토큰 순환이 적용된 업계 표준 인증
- 웹훅 서명 - HMAC 기반 서명 검증 (v3)
- TLS 암호화 - 모든 API 통신은 전송 중 암호화됩니다
- 스코프 권한 - 통합별 최소 필요 스코프 액세스