Для розробників

Фіди продажів і лідів

Технічний опис того, що має віддавати ваша система, щоб GalaVision показував наскрізну аналітику: формат, поля, семантика статусів і приблизне ТЗ на реалізацію.

Що потрібно від вас

Рівно дві речі — фід угод і фід лідів. Це HTTP-ендпоїнти (GET), які за вказаний період повертають JSON-масив записів. Все інше — рекламу, GA4, агрегацію, кеші, графіки — робить GalaVision.

Мінімальний обсяг роботи. Якщо у вас Bitrix24 — писати нічого не треба, достатньо вхідного webhook. Якщо CRM саморобна — це один контролер на кожен фід, зазвичай пів дня роботи.

Як це працює

  1. Ви віддаєте нам URL фіду (з токеном у шляху або в query).
  2. GalaVision періодично запитує фід за вікном дат і кешує відповідь.
  3. Записи нормалізуються: дати, суми, статуси, UTM-мітки.
  4. Угоди зшиваються з рекламними витратами за utm_source / utm_medium / utm_campaign і показуються в дашборді як дохід, ROAS, CAC, CPL.

Фід читається тільки на читання. Ми нічого не пишемо у вашу систему.

Загальний контракт

Запит

GET https://crm.example.com/feed/deals?date_from=2026-07-01&date_to=2026-07-31&token=SECRET
Accept: application/json
ПараметрТипОпис
date_fromstringПочаток вікна, YYYY-MM-DD, включно
date_tostringКінець вікна, YYYY-MM-DD, включно
tokenstringСтатичний секрет. Можна замінити на заголовок Authorization: Bearer … або секретний шлях

Відповідь

Масив об'єктів у корені або обгортка з полем result / items — підтримуються обидва варіанти. Кодування UTF-8, Content-Type: application/json.

[
  { "ID": "10231", "OPPORTUNITY": 12400.00, ... },
  { "ID": "10232", "OPPORTUNITY":  890.50, ... }
]

Вимоги

Фід продажів (угоди)

Один запис = одна угода. У вікно потрапляють угоди за датою закриття (CLOSEDATE). Назви полів наведені в «бітріксовому» стилі, бо він найпоширеніший — але приймаються й ваші, ми зіставимо їх при налаштуванні.

ПолеТипОбов'язковоОпис
IDstringтакУнікальний ідентифікатор угоди
OPPORTUNITYnumberтакСума угоди в базовій валюті, без пробілів
CLOSEDATEdateтакДата закриття / оплати, YYYY-MM-DD
STAGE_SEMANTIC_IDenumтакS — успішна, F — провалена, P — у роботі
STAGE_RAWstringбажаноЛюдська назва етапу, для розшифровок
DATE_CREATEdateбажаноДата створення — дає довжину циклу угоди
BEGINDATEdateніДата початку роботи над угодою
UTM_SOURCEstringтак*Мітка джерела з першого візиту
UTM_MEDIUMstringтак*Мітка каналу
UTM_CAMPAIGNstringбажаноКампанія — дає розріз до оголошення
CONTACT_IDstringтакІдентифікатор клієнта — потрібен для «нових / повторних»
COMPANY_IDstringніДля B2B-угод
IS_RETURN_CUSTOMERY/NбажаноЯкщо не передасте — порахуємо за CONTACT_ID
UF_CRM_COMPANY_TYPEstringбажаноСегмент: «Гурт» / «Роздріб» або ваші назви
SOURCE_IDstringніДжерело в термінах CRM (WEB, CALL, …)
ASSIGNED_BYstringніВідповідальний менеджер

* UTM обов'язкові для наскрізної аналітики. Без них система працюватиме, але не зможе віднести дохід до конкретного каналу — залишиться лише загальний ROAS.

Приклад

{
  "ID": "10231",
  "OPPORTUNITY": 12400.00,
  "CLOSEDATE": "2026-07-14",
  "DATE_CREATE": "2026-07-09",
  "STAGE_SEMANTIC_ID": "S",
  "STAGE_RAW": "Оплачено",
  "UTM_SOURCE": "google",
  "UTM_MEDIUM": "cpc",
  "UTM_CAMPAIGN": "pmax_catalog",
  "CONTACT_ID": "50231",
  "COMPANY_ID": "1043",
  "IS_RETURN_CUSTOMER": "N",
  "UF_CRM_COMPANY_TYPE": "Гурт",
  "SOURCE_ID": "WEB",
  "ASSIGNED_BY": "Олена"
}

Фід лідів

Один запис = одне звернення. У вікно потрапляють ліди за датою зміни статусу (CLOSEDATE); дата появи передається окремо.

ПолеТипОбов'язковоОпис
IDstringтакІдентифікатор ліда
Date.LeaddateтакКоли лід з'явився
CLOSEDATEdateтакКоли лід отримав фінальний статус
STAGE_SEMANTIC_IDenumтакP у роботі, S перейшов в угоду, F відмова / брак
STAGE_RAWstringбажаноНазва етапу словами
SourcestringтакДжерело звернення: сайт, дзвінок, форма, маркетплейс
UTM_SOURCEstringбажаноМітка, якщо звернення з реклами
UTM_MEDIUMstringбажаноМітка каналу
Client.IdstringбажаноІдентифікатор клієнта — щоб не рахувати дублі
Responsible personstringніМенеджер — дає розріз по відділу продажу
UF_CRM_COMPANY_TYPEstringніСегмент клієнта

Приклад

{
  "ID": "L88120",
  "Date.Lead": "2026-07-11",
  "CLOSEDATE": "2026-07-13",
  "STAGE_SEMANTIC_ID": "S",
  "STAGE_RAW": "Конвертовано в угоду",
  "Source": "Форми зв'язку",
  "UTM_SOURCE": "facebook",
  "UTM_MEDIUM": "cpc",
  "Client.Id": "50231",
  "Responsible person": "Ігор",
  "UF_CRM_COMPANY_TYPE": "Роздріб"
}

UTM і зшивання з рекламою

Наскрізна аналітика тримається на одному: мітка, з якою клієнт прийшов, має дожити до запису в CRM.

Валюта. Усі суми в одній базовій валюті проєкту. Якщо у вас мультивалютність — конвертуйте на боці CRM за курсом дати угоди.

Варіант: Google-таблиця

Якщо писати ендпоїнти нема кому, підійде таблиця: аркуш deals і аркуш leads, перший рядок — заголовки з таблиць вище, далі рядки даних.

Обмеження цього способу — глибина: таблиця зазвичай містить менше полів, тому частина розрізів (менеджери, етапи) буде недоступна.

Вимоги до якості даних

ТЗ: чек-лист для розробника

Мінімальний обсяг робіт, який можна віддати в задачу як є:

  1. Реалізувати GET /feed/deals з параметрами date_from, date_to, token; повертає JSON-масив угод за датою закриття з полями з розділу «Фід продажів».
  2. Реалізувати GET /feed/leads за тим самим принципом з полями розділу «Фід лідів».
  3. Забезпечити збереження UTM першого візиту в картці клієнта / угоди.
  4. Додати перевірку токена та обмеження за IP або rate-limit.
  5. Перевірити відповідь на вікні в 1 місяць: час < 60 с, коректний UTF-8, дати у YYYY-MM-DD.
  6. Прогнати контрольну звірку: сума OPPORTUNITY по STAGE_SEMANTIC_ID = S за минулий місяць має збігатися зі звітом CRM.
  7. Передати нам URL обох фідів і секрет захищеним каналом.

Орієнтовний обсяг: 4–8 годин для типової CRM з готовою моделлю угод.

Часті питання

Чи можна віддавати не JSON, а CSV?

Можна, але JSON надійніший: у CSV регулярно ламаються коми в назвах і локаль дат. Якщо все ж CSV — роздільник ,, лапки подвійні, кодування UTF-8 з BOM.

Як бути з персональними даними?

Не передавайте їх. Імена, телефони й пошту система не використовує — достатньо знеособлених CONTACT_ID / Client.Id.

Чи потрібен webhook «на подію»?

Ні. Ми опитуємо фід за розкладом — це простіше і стійкіше до збоїв, ніж push, який доведеться повторювати при помилці.

Що робити зі скасованими угодами?

Віддавайте їх зі статусом F. Видаляти рядок не треба — інакше історія за минулі періоди мовчки зміниться.

Питання по інтеграції — Telegram.