Freshdesk 커넥터
Tajo를 통해 Freshdesk를 Brevo에 연결하여 지원과 마케팅 데이터를 통합하십시오. 고객 지원 티켓, 연락처 프로필, 만족도 점수를 동기화하여 지원 상호작용을 기반으로 한 타겟 커뮤니케이션을 구현하십시오.
개요
| 속성 | 값 |
|---|---|
| 플랫폼 | Freshdesk |
| 카테고리 | Support |
| 설정 복잡도 | 쉬움 |
| 공식 통합 | 아니오 |
| 동기화 데이터 | 티켓, 연락처, 상담원, 회사 |
| 사용 가능한 스킬 | 6 |
기능
- 연락처 동기화 - Freshdesk 연락처를 Brevo 연락처 목록으로 양방향 동기화
- 티켓 이벤트 추적 - 티켓 생성, 업데이트, 해결 이벤트를 Brevo로 전달
- CSAT 동기화 - 고객 만족도 점수를 Brevo 연락처 속성으로 동기화
- 회사 동기화 - Freshdesk 회사를 Brevo 연락처 세그먼테이션에 매핑
- 상담원 데이터 - 내부 워크플로 자동화를 위한 상담원 할당 추적
- 맞춤 필드 - Freshdesk 맞춤 티켓 및 연락처 필드를 Brevo 속성에 매핑
사전 요구 사항
시작하기 전에 다음이 준비되어 있는지 확인하십시오.
- 관리자 접근 권한이 있는 Freshdesk 계정
- Freshdesk API Key (프로필 설정에서 확인 가능)
- Freshdesk 도메인 (예:
yourcompany.freshdesk.com) - API 접근이 가능한 Brevo 계정
- API 자격 증명이 있는 Tajo 계정
인증
API 키 인증
Freshdesk는 HTTP Basic Auth를 통한 API 키 인증을 사용합니다. API 키는 사용자 이름으로 사용되며 비밀번호는 임의의 문자열(일반적으로 X)입니다.
curl -u "YOUR_API_KEY:X" \ https://yourcompany.freshdesk.com/api/v2/tickets또는 Authorization 헤더에서 Base64 인코딩 사용:
curl https://yourcompany.freshdesk.com/api/v2/tickets \ -H "Authorization: Basic BASE64_ENCODED_API_KEY:X" \ -H "Content-Type: application/json"API 키 찾기
- Freshdesk 계정에 로그인
- 오른쪽 상단의 프로필 사진 클릭
- Profile Settings로 이동
- API Key가 오른쪽에 표시됨
구성
기본 설정
connectors: freshdesk: enabled: true domain: "yourcompany.freshdesk.com" api_key: "your-freshdesk-api-key"
# 데이터 동기화 옵션 sync: contacts: true tickets: true companies: true satisfaction_ratings: true
# Brevo 목록 할당 lists: all_support_contacts: 30 open_tickets: 31 resolved_tickets: 32연락처 필드 매핑
Freshdesk 연락처 필드를 Brevo 속성에 매핑합니다.
contact_mapping: email: email name: FULLNAME phone: SMS company_id: COMPANY job_title: JOB_TITLE twitter_id: TWITTER language: LANGUAGE time_zone: TIMEZONE
# 지원 지표 total_tickets: TICKET_COUNT open_tickets: OPEN_TICKETS avg_csat: CSAT_SCORE last_ticket_date: LAST_SUPPORT_DATE
# 맞춤 필드 custom_fields.account_type: ACCOUNT_TYPE custom_fields.subscription_tier: PLAN티켓 이벤트 매핑
Freshdesk 티켓 이벤트를 Brevo 자동화 트리거에 매핑합니다.
ticket_events: ticket_created: "support_ticket_created" ticket_updated: "support_ticket_updated" ticket_resolved: "support_ticket_resolved" ticket_closed: "support_ticket_closed" ticket_reopened: "support_ticket_reopened" satisfaction_rated: "csat_submitted" note_added: "support_note_added"API 엔드포인트
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
GET | /api/v2/tickets | 모든 티켓 목록 |
POST | /api/v2/tickets | 티켓 생성 |
GET | /api/v2/tickets/{id} | 특정 티켓 가져오기 |
PUT | /api/v2/tickets/{id} | 티켓 업데이트 |
DELETE | /api/v2/tickets/{id} | 티켓 삭제 |
GET | /api/v2/contacts | 모든 연락처 목록 |
POST | /api/v2/contacts | 연락처 생성 |
PUT | /api/v2/contacts/{id} | 연락처 업데이트 |
GET | /api/v2/companies | 모든 회사 목록 |
GET | /api/v2/agents | 모든 상담원 목록 |
GET | /api/v2/surveys/satisfaction_ratings | CSAT 평가 목록 |
GET | /api/v2/search/tickets?query= | 티켓 검색 |
코드 예제
Freshdesk 커넥터 초기화
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Freshdesk 계정 연결await tajo.connectors.connect('freshdesk', { domain: 'yourcompany.freshdesk.com', apiKey: process.env.FRESHDESK_API_KEY});연락처를 Brevo로 동기화
// Freshdesk 연락처를 가져와서 Brevo로 동기화const response = await fetch( 'https://yourcompany.freshdesk.com/api/v2/contacts?page=1&per_page=100', { headers: { 'Authorization': 'Basic ' + btoa(`${API_KEY}:X`), 'Content-Type': 'application/json' } });
const contacts = await response.json();// 각 연락처:// {// "id": 12345,// "name": "Jane Kim",// "email": "[email protected]",// "phone": "+15551234567",// "company_id": 678,// "job_title": "Product Manager",// "created_at": "2024-01-15T10:30:00Z"// }티켓 이벤트 추적
// 티켓 이벤트를 전달하도록 Freshdesk 웹훅 설정// Freshdesk Admin > Automations > Webhook에서 구성
// 웹훅 핸들러app.post('/webhooks/freshdesk', async (req, res) => { const { ticket, event_type } = req.body;
await tajo.connectors.handleWebhook('freshdesk', { topic: event_type, payload: { ticketId: ticket.id, subject: ticket.subject, status: ticket.status, priority: ticket.priority, requesterEmail: ticket.requester.email, createdAt: ticket.created_at } });
res.status(200).send('OK');});고객별 티켓 검색
// 특정 고객의 모든 티켓 검색const response = await fetch( `https://yourcompany.freshdesk.com/api/v2/search/tickets?query=${query}`, { headers: { 'Authorization': 'Basic ' + btoa(`${API_KEY}:X`) } });
const { results, total } = await response.json();속도 제한
| 요금제 | 제한 | 세부 사항 |
|---|---|---|
| Sprout | 50 요청/분 | 무료 요금제 |
| Blossom | 200 요청/분 | Starter 요금제 |
| Garden | 400 요청/분 | Growth 요금제 |
| Estate | 700 요청/분 | Pro 요금제 |
| Forest | 1,000 요청/분 | Enterprise 요금제 |
추가 제한:
| 리소스 | 제한 |
|---|---|
| 목록 엔드포인트 | 쿼리당 30 페이지 |
| 페이지당 | 최대 100 레코드 |
| Search API | 2 요청/초 |
| Bulk 작업 | 요청당 10 레코드 |
속도 제한 헤더
Freshdesk는 응답 헤더에 속도 제한 정보를 반환합니다. X-RateLimit-Remaining을 모니터링하고 제한에 접근할 때 백오프를 구현하십시오.
문제 해결
| 문제 | 원인 | 해결 방법 |
|---|---|---|
401 Unauthorized | 잘못된 API 키 | Freshdesk 프로필 설정에서 API 키 확인 |
403 Forbidden | 권한 부족 | API 키가 관리자 계정에 속하는지 확인 |
| 연락처가 동기화되지 않음 | 이메일 필드 누락 | Freshdesk 연락처에는 이메일 주소가 필요함 |
| 티켓이 표시되지 않음 | 잘못된 도메인 | Freshdesk 도메인 URL이 올바른지 확인 |
| 검색이 비어 있음 | 쿼리 구문 오류 | 큰따옴표가 있는 Freshdesk 검색 쿼리 구문 사용 |
429 Too Many Requests | 속도 제한 초과 | 요금제 티어 기반 속도 제한 구현 |
| 맞춤 필드 누락 | 필드가 활성화되지 않음 | Freshdesk 관리자에서 맞춤 필드가 활성화되어 있는지 확인 |
모범 사례
- 실시간 동기화에 웹훅 사용 - 티켓 이벤트에서 웹훅을 트리거하도록 Freshdesk Automations 구성
- CSAT 점수 동기화 - 세그먼테이션을 위해 고객 만족도 평가를 Brevo 속성으로 추적
- 티켓 상태를 목록에 매핑 - 티켓 상태에 따라 Brevo 목록 간에 연락처 자동 이동
- 지원 지표 추적 - 연락처당 티켓 수, 평균 응답 시간, 해결률 동기화
- Search API를 신중하게 사용 - Search API는 엄격한 속도 제한이 있음; 가능한 경우 결과 캐싱
- 대량 내보내기 페이지네이션 - 초기 동기화에
page및per_page매개변수로 페이지네이션 사용
보안
- API 키 인증 - API 키를 사용한 간단한 HTTP Basic Auth
- HTTPS 전용 - 모든 API 통신에 TLS 암호화 필요
- IP 허용 목록 - Estate 및 Forest 요금제에서 사용 가능
- 역할 기반 접근 - 상담원 역할에 연결된 API 키 권한
- SOC 2 Type II - Freshdesk는 SOC 2 Type II 인증을 받음
- GDPR 준수 - 데이터 내보내기 및 삭제 요청 지원