Navigo CRM
Кейс · 2026Брокеры автоперевозок вели каждую перевозку в шести разных инструментах. Мы сделали одну систему, в которой лид становится расчётом, заказом и отправленным грузом без повторного ввода.


Обзор
Navigo CRM — SaaS-продукт для брокеров автоперевозок в США, то есть компаний, которые организуют перевозку автомобилей между клиентами и перевозчиками. Агенты получают лиды из множества источников, считают цену по реальным рыночным данным, отправляют договоры, которые клиент подписывает в браузере, принимают оплату картой, публикуют грузы в Central Dispatch и Super Dispatch, назначают перевозчика и видят прибыль до закрытия месяца. Мы спроектировали и сделали продукт целиком: бэкенд на Django, веб-приложение на Vue, публичный API для лидов с документацией, маркетинговый сайт и инфраструктуру.
Задача
День брокера был разбит между таблицами, сайтом Central Dispatch, телефонией, отдельным сервисом электронной подписи и отчётами о прибыли в конце месяца. На каждом этапе одну и ту же перевозку вводили заново, а маржу никто не видел до конца месяца. Продукт должен был заменить всё это, не заставляя брокеров менять то, как они продают.
- C1
Конкуренты на одной платформе
Каждый брокер — отдельная компания, часто конкурент остальных. Утечка лидов или перевозчиков одной компании к другой недопустима.
- C2
Много внешних систем
У Central Dispatch, Super Dispatch, RingCentral, Zoom Phone, Gmail и QuickBooks свои API, лимиты и сбои, а их статусы должны совпадать со статусом заказа.
- C3
Платежи и требования
Оплата картой должна была пройти проверку приложения в Intuit, поэтому данные карт не должны были попадать на наши серверы.
Наш подход — журнал решенийЖурнал решений
Одна запись от первого обращения до архивного заказа — все экраны, интеграции и отчёты читают из неё. Ниже — решения, которые сформировали систему, и цена каждого из них.Решения, которые сформировали систему, и цена каждого из них.
| № | Решение | Почему | Принятый компромисс |
|---|---|---|---|
| D1 | Отдельная схема базы данных для каждой компании и отдельный ключ подписи её токенов. | Изоляцию обеспечивает сама база, а не фильтр, о котором нужно помнить в каждом запросе. Токен одной компании бесполезен в другой. | Создание компании запускает миграции схемы, и каждая миграция выполняется для каждого тенанта. |
| D2 | Лиды, расчёты и заказы — одна таблица со стадией, а не три. | Перевод расчёта в заказ меняет его состояние, а не копирует запись, поэтому история, заметки и файлы остаются с перевозкой. | У каждой стадии своё поле статуса, поэтому фильтрация и валидация сложнее. |
| D3 | Карты токенизируются в браузере клиента; рыночные цены кэшируются на 30 дней. | Номера карт не попадают на наши серверы, что упростило проверку Intuit. Платные запросы цен с лимитами мгновенно отвечают для повторных маршрутов. | Цена по маршруту может быть до месяца старой; агенты видят дату кэша рядом с каждым запросом. |
- D1
Отдельная схема базы данных для каждой компании и отдельный ключ подписи её токенов.
- Почему
- Изоляцию обеспечивает сама база, а не фильтр, о котором нужно помнить в каждом запросе. Токен одной компании бесполезен в другой.
- Компромисс
- Создание компании запускает миграции схемы, и каждая миграция выполняется для каждого тенанта.
- D2
Лиды, расчёты и заказы — одна таблица со стадией, а не три.
- Почему
- Перевод расчёта в заказ меняет его состояние, а не копирует запись, поэтому история, заметки и файлы остаются с перевозкой.
- Компромисс
- У каждой стадии своё поле статуса, поэтому фильтрация и валидация сложнее.
- D3
Карты токенизируются в браузере клиента; рыночные цены кэшируются на 30 дней.
- Почему
- Номера карт не попадают на наши серверы, что упростило проверку Intuit. Платные запросы цен с лимитами мгновенно отвечают для повторных маршрутов.
- Компромисс
- Цена по маршруту может быть до месяца старой; агенты видят дату кэша рядом с каждым запросом.
Решение и архитектураАрхитектура
Ядро на Django, отдельная схема для каждого брокера и интеграции за фоновыми воркерами.
Веб-приложение на Vue работает с REST API на Django; обновления в реальном времени — входящие, уведомления и длительные задачи — идут по WebSocket. Всё медленное и внешнее выполняют воркеры Celery: синхронизация с маркетплейсами, SMS и почтой, запросы цен и плановые задачи для каждой компании. PostgreSQL хранит отдельную схему на компанию; Redis служит кэшем, очередью и слоем WebSocket.
- Создано SwiftCore
- Существующая или сторонняя система
- Единая точка входа для всех клиентов
Технологии
Инструменты, работающие в продакшене этого проекта, и причины, по которым каждый выбран вместо альтернатив.
Фронтенд
- Vue 3
- TypeScript
- Vite
- Pinia
- TanStack Query
- Element Plus
- Tailwind CSS
Vue 3 · TypeScript · Vite · Pinia · TanStack Query · Element Plus · Tailwind CSS
Плотное бэк-офисное приложение с таблицами; модули в стиле feature-sliced остаются независимыми по мере роста продукта.
Бэкенд
- Python
- Django
- Django REST Framework
- Celery
- Django Channels
- django-tenants
Python · Django · Django REST Framework · Celery · Django Channels · django-tenants
Зрелые инструменты для бизнес-системы с большим объёмом данных; фоновые задачи и WebSocket в одной кодовой базе.
Данные
- PostgreSQL
- Redis
PostgreSQL · Redis
Изоляция по схемам в PostgreSQL; Redis для кэша, очередей и сообщений в реальном времени.
Инфраструктура
- Docker
- Traefik
- Nginx
- GitHub Actions
- Vercel
Docker · Traefik · Nginx · GitHub Actions · Vercel
Контейнеризированные сервисы за обратным прокси; веб-приложение и сайт выкладываются через Vercel.
Качество и инструменты
- pytest
- Vitest
- CI on every change
pytest · Vitest · CI on every change
Тесты запускаются на каждое изменение на тех же версиях PostgreSQL и Redis, что и в продакшене.
Внутри продукта


Результаты
Результаты ещё измеряются.
Мы публикуем цифры только после того, как они измерены за полный период и одобрены клиентом. А пока — что изменилось:
- Перевозка проходит путь от лида до отправленного груза в одной записи, без повторного ввода между инструментами.
- Клиенты подписывают договор и платят картой в браузере по ссылке из письма или SMS.
- Грузы публикуются в Central Dispatch, а перевозчики назначаются, не выходя из заказа.
- Валовая прибыль и ROI источников лидов видны в середине месяца, а не после его закрытия.