HubSpot + Zendesk: почему нативная интеграция не закрывает задачу

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-архитектуру и предложит решение под вашу схему работы поддержки и продаж.

Ещё статьи

Все →