HubSpot + Zendesk: почему нативная интеграция не закрывает задачу
Нативная интеграция HubSpot и Zendesk существует, но работает строго в одну сторону: тикеты из Zendesk -> таймлайн контакта в HubSpot. Ни обратной синхронизации, ни тикетов в карточке сделки, ни имён пользователей — только email. Компании подключают её, радуются «интеграции», а через месяц выясняется: менеджер по продажам не видит открытый тикет клиента, workflow HubSpot не срабатывает на статус тикета, а служба поддержки создаёт в Zendesk контакты вручную.
Что происходит: видимость интеграции без реальной синхронизации
После подключения нативной интеграции через HubSpot App Marketplace картина выглядит так:
- В таймлайне контакта HubSpot появляются события «тикет создан» и «тикет решён» из Zendesk
- Менеджер видит что у клиента были обращения в поддержку
- Кажется что всё работает
Но вот что происходит на самом деле:
- Синхронизируется только email контакта. Имя и фамилия из Zendesk — не синхронизируются. Если в Zendesk есть пользователь которого нет в HubSpot — создаётся контакт с пустым именем.
- Тикеты видны только в таймлайне контакта, не в карточке сделки, не в компании.
- Синхронизация только Zendesk -> HubSpot. Контакты из HubSpot в Zendesk не попадают. Тикеты в HubSpot не создаются как объект Ticket.
- Нельзя настроить какие поля тикета синхронизируются — только фиксированный набор.
- HubSpot Workflows не видят события Zendesk как триггеры — нельзя автоматизировать на основе статуса тикета.
Почему так устроена нативная интеграция
Обе компании позиционируют свои инструменты как самодостаточные: Zendesk — как helpdesk, HubSpot — как CRM с Service Hub. Нативная интеграция создана для того чтобы дать visibility — видимость того что у клиента есть обращения в поддержку. Это маркетинговое решение, а не инженерное.
Полноценная двусторонняя интеграция конкурирует с платными модулями обеих платформ:
— HubSpot Service Hub Professional ($100/user/мес) имеет собственный тикет-трекер
— Zendesk Sell ($19–55/user/мес) — встроенная CRM
Если интеграция будет полноценной, клиент может использовать обе платформы раздельно — что не выгодно ни одной из них.
Что конкретно теряет бизнес
Менеджер по продажам не знает о проблемах клиента в момент звонка.
Тикет из Zendesk виден только в контакте, но не в сделке. Менеджер открывает карточку сделки — тикетов не видит. Звонит клиенту с апсейлом — а у того открытый критичный инцидент. Это реальная и частая ситуация.
Новые контакты в Zendesk создаются без имён.
Если клиент пишет в поддержку через форму и его нет в HubSpot — в HubSpot создаётся контакт только с email. First name, last name — пусто. Менеджер получает беспорядок в CRM.
Workflow HubSpot не реагирует на статус тикета.
HubSpot Workflows не видят события Zendesk как триггеры. Нельзя настроить: «если тикет критичного приоритета не решён за 24 часа -> уведомить account manager -> приостановить upsell-цепочку».
Поддержка не видит данные из CRM.
Агент Zendesk не знает на каком этапе сделки клиент, какой тариф у него, кто account manager. Zendesk не получает данные из HubSpot.
Как выглядит правильная интеграция
Полноценная интеграция требует кастомного слоя между двумя API.
Архитектура:
HubSpot Webhook: сделка перешла на этап «Клиент»
↓ Backend
1. GET /crm/v3/objects/deals/{id}?associations=contacts
-> email, имя, тариф, account manager
2. Zendesk API: POST /api/v2/users (upsert по email)
-> name, email, user_fields: {hubspot_deal_id, plan, account_manager}
3. Опционально: Zendesk: POST /api/v2/organizations
-> создать компанию в Zendesk с данными из HubSpot Company
Zendesk Webhook: ticket.created / ticket.updated
↓ Backend
1. Получить email requester из payload
2. HubSpot: GET /crm/v3/objects/contacts?email={email}
-> найти контакт, получить связанные сделки
3. HubSpot: POST /crm/v3/objects/notes
-> Note на сделке: «Тикет #{id}: {subject}. Статус: {status}»
4. Если priority = urgent:
-> HubSpot: PATCH /crm/v3/objects/deals/{id}
-> свойство active_ticket = true (для workflow-триггера)
Zendesk REST API:
import requests
from requests.auth import HTTPBasicAuth
ZD_SUBDOMAIN = 'your-company'
ZD_EMAIL = 'admin@company.com'
ZD_TOKEN = 'your_api_token'
ZD_BASE = f'https://{ZD_SUBDOMAIN}.zendesk.com/api/v2'
ZD_AUTH = HTTPBasicAuth(f'{ZD_EMAIL}/token', ZD_TOKEN)
def upsert_zendesk_user(email: str, name: str, deal_id: str, plan: str) -> int:
# Поиск существующего пользователя
resp = requests.get(
f'{ZD_BASE}/users/search',
params={'query': email},
auth=ZD_AUTH
)
users = resp.json().get('users', [])
user_payload = {
'user': {
'name': name,
'email': email,
'user_fields': {
'hubspot_deal_id': deal_id,
'plan': plan
}
}
}
if users:
# Обновить существующего
user_id = users[0]['id']
requests.put(f'{ZD_BASE}/users/{user_id}', auth=ZD_AUTH, json=user_payload)
return user_id
else:
# Создать нового
resp = requests.post(f'{ZD_BASE}/users', auth=ZD_AUTH, json=user_payload)
return resp.json()['user']['id']
def get_ticket_details(ticket_id: int) -> dict:
resp = requests.get(f'{ZD_BASE}/tickets/{ticket_id}', auth=ZD_AUTH)
return resp.json()['ticket']
HubSpot: создать Note на сделке из тикета Zendesk:
import requests as rq
HS_TOKEN = 'your_hubspot_private_app_token'
HS_BASE = 'https://api.hubapi.com'
HS_HEADERS = {'Authorization': f'Bearer {HS_TOKEN}', 'Content-Type': 'application/json'}
def create_ticket_note_on_deal(deal_id: str, ticket: dict):
note_body = (
f'Zendesk тикет #{ticket["id"]}: {ticket["subject"]}\n'
f'Статус: {ticket["status"]} | Приоритет: {ticket["priority"]}\n'
f'Агент: {ticket.get("assignee_name", "не назначен")}'
)
payload = {
'properties': {
'hs_note_body': note_body,
'hs_timestamp': str(int(__import__('time').time() * 1000))
},
'associations': [
{
'to': {'id': deal_id},
'types': [{'associationCategory': 'HUBSPOT_DEFINED', 'associationTypeId': 214}]
}
]
}
rq.post(f'{HS_BASE}/crm/v3/objects/notes', json=payload, headers=HS_HEADERS)
Zendesk webhook настройка:
Admin Center -> Apps and integrations -> Webhooks. Webhook получает события при создании/обновлении тикета. Используйте Zendesk Triggers чтобы задать условия — например отправлять только тикеты с тегом enterprise-client.
Что менеджер видит в итоге
После кастомной интеграции в карточке сделки HubSpot:
— Note каждый раз когда открывается новый тикет в Zendesk
— Note при смене статуса: «Тикет #1234 решён»
— Свойство active_ticket = true пока тикет открыт — можно использовать в workflows и фильтрах
— В Zendesk агент видит: тариф клиента, имя account manager, ID сделки в HubSpot
Реальный кейс
SaaS-компания (EU-рынок, 80 клиентов, HubSpot Professional + Zendesk Team):
- До: нативная интеграция включена. Менеджеры думали что видят тикеты — но в сделке их не было. Два раза совершали апсейл-звонки клиентам с активными критичными инцидентами. Поддержка создавала пользователей в Zendesk без данных из CRM.
- После: кастомная интеграция через webhook. Каждый тикет — Note на сделке. При
priority=urgent-> свойствоurgent_ticket=true-> HubSpot Workflow приостанавливает маркетинговые письма и уведомляет account manager в Slack. - Zendesk-агенты видят тариф и имя account manager в боковой панели — 30% меньше времени на поиск контекста.
Аналогичная проблема с односторонней синхронизацией была описана для HubSpot + Zoom: нативная интеграция создаёт видимость данных, но не закрывает реальные сценарии.
Для кого актуально
- Используется HubSpot как основная CRM и Zendesk как helpdesk
- Менеджеры по продажам должны знать о статусе обращений клиентов перед звонком
- Поддержка должна видеть данные из CRM: тариф, account manager, этап сделки
- Нужна автоматизация на основе событий из Zendesk (приостановка upsell при критичном инциденте)
Часто задаваемые вопросы
Почему нативная интеграция HubSpot + Zendesk такая ограниченная?
Обе платформы имеют конкурирующие продукты: HubSpot Service Hub — тикет-трекер, Zendesk Sell — CRM. Полноценная двусторонняя интеграция снижает стимул покупать дорогие тарифы. Нативная интеграция даёт baseline visibility, не более.
Zendesk API: Basic Auth или OAuth?
Для серверных интеграций — API Token через Basic Auth: email/token:api_token. OAuth используется для OAuth apps, где пользователь авторизует доступ. API Token проще для server-to-server: Settings -> API -> Zendesk API -> Tokens -> Add API token.
Можно ли видеть тикеты Zendesk прямо в карточке сделки HubSpot?
Нативная интеграция — нет, только в контакте. Через кастомную интеграцию: создавать Notes на сделке при каждом событии тикета + использовать HubSpot Custom Properties (например active_ticket_count) для отображения в карточке и списках.
HubSpot Workflows могут реагировать на события Zendesk?
Через нативную интеграцию — нет. Через кастомную: Zendesk webhook -> backend -> обновить HubSpot-свойство на контакте или сделке -> этот тригер доступен в Workflows. Например: urgent_ticket = true -> отправить notification owner-у сделки.
Сколько стоит кастомная интеграция против нативной?
Нативная интеграция — бесплатна, входит в HubSpot App Marketplace. Кастомная — разработка 2–3 недели, поддержка webhook-инфраструктуры. Вопрос не в цене интеграции, а в цене проблем от её отсутствия: репутационные риски при звонке клиенту с активным инцидентом сложно оцифровать, но они реальны.
Итого
- Нативная интеграция HubSpot + Zendesk: односторонняя (Zendesk -> HubSpot), только email, только в таймлайне контакта
- Тикеты НЕ видны в карточке сделки, НЕ синхронизируются имена, НЕ работают как Workflow-триггеры
- Кастомная интеграция: Zendesk webhook -> Notes на сделке + HubSpot-свойства для автоматизации
- Обратный поток: HubSpot -> Zendesk, upsert пользователя с данными тарифа и account manager
- Типовой срок разработки — 2–3 недели
Если вы используете HubSpot и Zendesk и хотите видеть тикеты в карточках сделок и триггерить автоматизацию — опишите ваши сценарии. Exceltic.dev разберёт webhook-архитектуру и предложит решение под вашу схему работы поддержки и продаж.