Синхронизация клиентов с 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 (найти клиентов).
