ДескусДескус · Документация
Все разделыРецепты

Синхронизация клиентов с CRM

CRM знает клиента — Дескус знает его обращения. Синхронизация в три шага: выгрузить, кто уже есть, дальше получать новое событиями, а из CRM создавать клиентов без дублей.

1. Начальная выгрузка

Пройдите всех клиентов курсором и сопоставьте по почте или телефону. Запомните время начала — с него пойдёт синхронизация.

import os
import requests

API = "https://app.deskus.ru/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['DESKUS_KEY']}"}


def all_clients(created_since=None):
    params = {"limit": 100}
    if created_since:
        params["created_since"] = created_since
    while True:
        page = requests.get(f"{API}/clients", headers=HEADERS, params=params, timeout=30).json()
        yield from page["data"]
        if not page["next_cursor"]:
            break
        params["cursor"] = page["next_cursor"]


for client in all_clients():
    crm.upsert_contact(email=client["email"], phone=client["phone"], deskus_id=client["id"])

2. Новое — событиями

  • Подпишитесь на client.created — новая карточка в Дескусе станет контактом в CRM.

  • ticket.created и ticket.updated — обращения и смены статуса на карточке контакта, client_id связывает их с клиентом.

  • message.created — переписка в ленте контакта, если она нужна в CRM.

Как подписаться и проверять подпись — вебхуки. Пропустили события, пока CRM лежала, — догоните запросом GET /tickets?updated_since=… с временем последнего события.

3. Из CRM — без дублей

def ensure_client(contact):
    found = requests.get(f"{API}/clients", headers=HEADERS,
                         params={"email": contact.email} if contact.email else {"phone": contact.phone}, timeout=30).json()["data"]
    if found:
        return found[0]["id"]
    res = requests.post(f"{API}/clients", headers={**HEADERS, "Idempotency-Key": f"crm-{contact.id}"},
                        json={"name": contact.name, "email": contact.email, "phone": contact.phone}, timeout=30)
    if res.status_code == 409:  # успели завести между поиском и созданием
        return res.json()["error"]["details"]["existing_client_id"]
    res.raise_for_status()
    return res.json()["data"]["id"]

Поиск по почте и телефону — тот же, что при приёме обращений: письмо клиента попадёт к той же карточке, что создала CRM (найти клиентов).

Не нашли ответ? Напишите нам
Поддержка ответит в рабочее время.
Вы сотрудник «Дескус»?Изменить статью в Дескусе