Мобільний застосунок і CRM як одна система: двостороння інтеграція без дублів
Замовлення із застосунку продавця мали потрапляти в CRM, а зміни статусів - повертатися назад. Коробкова інтеграція вміла лише один напрям, тому обидва довелося зробити самому - з захистом від циклів і звіркою, що ловить те, чого не привіз вебхук.
- Два напрями обміну замість одного коробкового: замовлення туди, статуси назад
- Звірка кожні 20 хвилин ловить те, що не приїхало вебхуком
- Дерево категорій застосунку зведене один в один з каталогом: 47 категорій, жодного сироти
- Захист від нескінченних циклів між системами і від повторної обробки тієї самої події
У продавців зʼявився мобільний застосунок. У компанії вже була CRM, у якій живуть замовлення, оплати й уся історія клієнта.
Готова інтеграція між ними вміла рівно одне: перекидати замовлення в один бік. Статуси, оплати, товари й категорії лишались на людях - а те, що лишається на людях між двома системами, розходиться приблизно за тиждень.
Далі починається знайоме. У застосунку замовлення ще збирається, у CRM воно вже відправлене, клієнт питає, а правильної відповіді немає в жодній із двох програм.
Проблема: дві односторонні дороги не складаються в обмін
Здається логічним: якщо дані вміють ходити в один бік, треба просто зробити ще один такий самий канал у зворотний. На практиці друга дорога не додає можливостей, вона додає ризиків.
Коли обидві системи мають право змінювати ту саму сутність, зʼявляється питання, на яке жодна з них не відповідає сама: чия версія правильна. Поки на нього немає письмової відповіді, будь-який обмін рано чи пізно псує дані.
👯 Дубль
- Та сама подія приходить двічі - через повтор або через збій мережі
- Наївний обробник створює друге замовлення на те саме
- Помилку помічають на складі, коли товар уже зібрано двічі
🔁 Цикл
- Ми записали статус у другу систему, вона повідомила про зміну
- Ми прийняли це повідомлення і записали статус назад
- Дві системи штовхають одне одного нескінченно, доки хтось не вимкне сервіс
⚠️ Немає джерела правди
- Обидві сторони вважають себе головними щодо статусу
- Виграє та, що записала останньою, а не та, що має рацію
- Дані не втрачаються - вони тихо стають неправильними
Як автоматизація це вирішує
Обмін зроблено в обидва боки власним сервісом. Замовлення із застосунку заходять у CRM, зміни статусів повертаються назад до продавця, товари й категорії їдуть з основного каталогу.
Але головне тут не другий напрям, а третій контур: незалежна звірка. Кожні двадцять хвилин система сама питає застосунок, які замовлення там зʼявились за останні два тижні, і дозаливає те, чого в CRM немає.
Одне джерело правди на статус
Домовленість, без якої нічого не працює: майстром статусів є CRM. Застосунок може змінити статус у себе, але остаточне слово лишається за CRM.
Це не технічне, а управлінське рішення, і ухвалює його власник, а не програміст. Зате далі все просто: перед записом система читає поточне значення і пише тільки тоді, коли воно справді інше.
Що це дало бізнесу
Дві програми перестали бути двома джерелами новин. Продавець у застосунку і менеджер у CRM бачать той самий статус того самого замовлення, і питання «а в кого правильно» більше не виникає.
Каталог теж перестав жити окремим життям: дерево категорій застосунку зведене один в один з основним - 47 категорій, жодного сироти й жодного товару поза деревом.
Тепер чесно про межу, яку кодом не обійти. Фотографії товарів через API застосунку не заливаються: запит приймається, завдання завершується успішно, а поле лишається порожнім.
Тож автоматично створені картки поки що йдуть без фото, і це закривається руками. Ми пробували кілька шляхів і не приховуємо результат: не кожне обмеження чужої системи можна перемогти з нашого боку.
Як це влаштовано всередині
Наступний розділ пояснює, як система влаштована. Якщо вас цікавить лише результат, його можна пропустити - нижче є розділ про те, кому це підходить.
Три запобіжники
Урок: назва події змінилась мовчки
Одного дня замовлення із застосунку перестали заходити в CRM. Нічого не падало, жоден монітор не спрацював, у журналах було порожньо. Причина виявилась простою: постачальник перейменував подію, на яку ми підписані.
Ніхто не попереджав, помилки не було - просто тиша. Це найгірший вид відмови, бо система в цей момент виглядає абсолютно здоровою.
Звідси два правила, які тепер діють постійно. Перше: код тримає всі відомі назви події одночасно, а не лише актуальну. Друге: вебхук ніколи не буває єдиним каналом - саме тому зʼявилась звірка кожні двадцять хвилин.
Окремо варто згадати сусідній клас відмов: автоматичне заведення товарів у застосунку двічі ламалось через втрачене поле у вивантаженні, і той самий клас помилок розгорнуто описаний в іншому кейсі, про синхронізацію цін і залишків.
Кому це підходить
Усім, хто ставить мобільний застосунок або друге робоче місце поверх наявної CRM: роздрібу з польовими продавцями, магазинам з окремим застосунком для торгової точки, компаніям, у яких склад працює в одній програмі, а продажі - в іншій.
Побутова ознака, за якою легко перевірити, чи це про вас: якщо співробітники вголос питають «а де дивитись правильний статус», значить, джерела правди у вас поки що немає. Другий сигнал ще простіший - хтось відкриває дві програми поруч і звіряє їх очима.
Вебхук - це обіцянка чужої системи. Звірка - це ваша власна гарантія.
Потрібне схоже рішення?
Опишіть задачу - підберу архітектуру під ваш бюджет і дані.