Integrations · CRM · automation
Three channels, one CRM, zero duplicates
A lead from the website form, the Telegram bot, a phone call or a partner site lands in one CRM card — with its source, campaign and language. Repeated webhooks are refused. An outage delays a lead, it never loses one.
The problem this solves
- Leads live in four places. A form goes to email, the bot to a phone, calls to a notebook. Nobody can say how many requests came in yesterday.
- The same customer becomes three cards. They fill the form, then call, then write in the messenger. Three reps chase one person.
- Something breaks and nobody notices. The CRM is down for a minute, the integration swallows the error, and the lead is simply gone.
What was built
An integration hub with one event contract for every channel. Each source has a thin adapter; everything after it is shared: signature check, idempotency, normalisation, contact matching, then a write to the CRM and notifications from a transactional outbox.
- Website form with UTM, campaign and the visitor's language carried through to the deal and to the confirmation email
- Telegram bot orders and PBX call webhooks in the same funnel
- Partner endpoint with a per-partner secret — a neighbouring demo stand already sends live leads into it
- Stage changes push a message to the sales chat and an email to the customer, in the customer's language
- Guest CRM with deals, contact timeline, delivery queue and dead letters
Numbers, measured on the live stand
Everything above is verifiable from your own terminal. The CRM has a public read-only key, and the panel prints the exact curl commands.
What I connect in production
The CRM on this stand is mine, so that the guest login is real and safe to click. The same integration layer is what I connect to KeyCRM, SalesDrive, Bitrix24 and HubSpot, to PBX webhooks, to Telegram, and to whatever internal system a client already runs.
Stack
Node 22, Fastify, TypeScript, SQLite. No frontend build step. 43 offline tests cover duplicates, races, contact matching, outages, dead letters and signatures. systemd for the service, a 6-hour data reset and a 5-minute health check.
Try to break it. Open the panel, press “Take the CRM down”, then send a lead and watch it land anyway.
Интеграции · CRM · автоматизация
Три канала, одна CRM, ноль дублей
Заявка с формы сайта, из Telegram-бота, звонок или лид от партнёра попадают в одну карточку CRM — вместе с источником, кампанией и языком клиента. Повторный вебхук отбивается. Падение системы задерживает заявку, но не теряет её.
Какую боль закрывает
- Заявки лежат в четырёх местах. Форма уходит на почту, бот — в телефон, звонки — в блокнот. Никто не скажет, сколько обращений было вчера.
- Один клиент превращается в три карточки. Заполнил форму, потом позвонил, потом написал в мессенджер. Три менеджера ведут одного человека.
- Что-то ломается — и никто не замечает. CRM полежала минуту, интеграция проглотила ошибку, заявка просто исчезла.
Что сделано
Интеграционный хаб с единым контрактом события для всех каналов. У каждого источника — тонкий адаптер, дальше всё общее: проверка подписи, идемпотентность, нормализация, матчинг контакта, запись в CRM и уведомления из transactional outbox.
- Форма сайта с UTM, кампанией и языком посетителя — всё доезжает до сделки и до письма клиенту
- Заказы из Telegram-бота и вебхуки телефонии в той же воронке
- Партнёрский эндпоинт со своим секретом на каждого — соседний демо-стенд уже шлёт в него живые лиды
- Смена стадии отправляет сообщение в чат продаж и письмо клиенту на его языке
- Гостевая CRM: сделки, таймлайн контакта, очередь доставки и DLQ
Цифры, замеренные на живом стенде
Всё перечисленное проверяется из вашего терминала: у CRM есть публичный ключ на чтение, а панель печатает готовые команды curl.
Что подключаю в проде
CRM на стенде — своя, чтобы гостевой вход был настоящим и его было не страшно трогать. Тот же интеграционный слой я подключаю к KeyCRM, SalesDrive, Bitrix24 и HubSpot, к вебхукам АТС, к Telegram и к той внутренней системе, которая у заказчика уже работает.
Стек
Node 22, Fastify, TypeScript, SQLite. Фронт без сборщика. 43 офлайн-теста: дубли, гонки, склейка контактов, падения, DLQ, подписи. systemd для сервиса, автосброс данных каждые 6 часов и проверка живости раз в 5 минут.
Попробуйте сломать. Откройте панель, нажмите «уронить CRM», отправьте заявку — и посмотрите, как она всё равно доедет.
Інтеграції · CRM · автоматизація
Три канали, одна CRM, нуль дублів
Заявка з форми сайту, з Telegram-бота, дзвінок або лід від партнера потрапляють в одну картку CRM — разом із джерелом, кампанією та мовою клієнта. Повторний вебхук відбивається. Збій затримує заявку, але не втрачає її.
Який біль закриває
- Заявки лежать у чотирьох місцях. Форма йде на пошту, бот — у телефон, дзвінки — у блокнот. Ніхто не скаже, скільки звернень було вчора.
- Один клієнт стає трьома картками. Заповнив форму, потім подзвонив, потім написав у месенджер. Три менеджери ведуть одну людину.
- Щось ламається — і ніхто не помічає. CRM полежала хвилину, інтеграція проковтнула помилку, заявка просто зникла.
Що зроблено
Інтеграційний хаб з єдиним контрактом події для всіх каналів. У кожного джерела — тонкий адаптер, далі все спільне: перевірка підпису, ідемпотентність, нормалізація, матчинг контакту, запис у CRM та сповіщення з transactional outbox.
- Форма сайту з UTM, кампанією та мовою відвідувача — усе доїжджає до угоди й до листа клієнту
- Замовлення з Telegram-бота і вебхуки телефонії в тій самій воронці
- Партнерський ендпоінт із власним секретом на кожного — сусідній демо-стенд уже шле в нього живі ліди
- Зміна стадії надсилає повідомлення у чат продажів і лист клієнту його мовою
- Гостьова CRM: угоди, таймлайн контакту, черга доставки і DLQ
Цифри, заміряні на живому стенді
Усе перелічене перевіряється з вашого терміналу: у CRM є публічний ключ на читання, а панель друкує готові команди curl.
Що підключаю в проді
CRM на стенді — власна, щоб гостьовий вхід був справжнім і його не страшно було чіпати. Той самий інтеграційний шар я підключаю до KeyCRM, SalesDrive, Bitrix24 і HubSpot, до вебхуків АТС, до Telegram і до тієї внутрішньої системи, яка у замовника вже працює.
Стек
Node 22, Fastify, TypeScript, SQLite. Фронт без збирача. 43 офлайн-тести: дублі, гонки, склейка контактів, падіння, DLQ, підписи. systemd для сервісу, автоскидання даних кожні 6 годин і перевірка живості раз на 5 хвилин.
Спробуйте зламати. Відкрийте панель, натисніть «покласти CRM», надішліть заявку — і подивіться, як вона все одно доїде.