Перейти к содержимому
SwiftCore
Все проекты

Navigo CRM

Кейс · 2026

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

Клиент
Navigo CRM, США
Отрасль
Логистика
Услуги
Дизайн продукта, веб-приложение, бэкенд, интеграции, инфраструктура, поддержка
Платформы
Веб-приложение, публичный API для лидов, маркетинговый сайт
Сроки
2026 — продолжается
Дашборд Navigo CRM и экран Price Check поверх него: сопоставимые грузы Central Dispatch по маршруту Тампа — Даллас
Дашборд Navigo CRM
Рис. 1 — Дашборд и Price Check. Экраны продукта с navigocrm.com, данные демонстрационные.

Обзор

Navigo CRM — SaaS-продукт для брокеров автоперевозок в США, то есть компаний, которые организуют перевозку автомобилей между клиентами и перевозчиками. Агенты получают лиды из множества источников, считают цену по реальным рыночным данным, отправляют договоры, которые клиент подписывает в браузере, принимают оплату картой, публикуют грузы в Central Dispatch и Super Dispatch, назначают перевозчика и видят прибыль до закрытия месяца. Мы спроектировали и сделали продукт целиком: бэкенд на Django, веб-приложение на Vue, публичный API для лидов с документацией, маркетинговый сайт и инфраструктуру.

Задача

День брокера был разбит между таблицами, сайтом Central Dispatch, телефонией, отдельным сервисом электронной подписи и отчётами о прибыли в конце месяца. На каждом этапе одну и ту же перевозку вводили заново, а маржу никто не видел до конца месяца. Продукт должен был заменить всё это, не заставляя брокеров менять то, как они продают.

  1. C1

    Конкуренты на одной платформе

    Каждый брокер — отдельная компания, часто конкурент остальных. Утечка лидов или перевозчиков одной компании к другой недопустима.

  2. C2

    Много внешних систем

    У Central Dispatch, Super Dispatch, RingCentral, Zoom Phone, Gmail и QuickBooks свои API, лимиты и сбои, а их статусы должны совпадать со статусом заказа.

  3. C3

    Платежи и требования

    Оплата картой должна была пройти проверку приложения в Intuit, поэтому данные карт не должны были попадать на наши серверы.

Наш подход — журнал решенийЖурнал решений

Одна запись от первого обращения до архивного заказа — все экраны, интеграции и отчёты читают из неё. Ниже — решения, которые сформировали систему, и цена каждого из них.Решения, которые сформировали систему, и цена каждого из них.

№РешениеПочемуПринятый компромисс
D1Отдельная схема базы данных для каждой компании и отдельный ключ подписи её токенов.Изоляцию обеспечивает сама база, а не фильтр, о котором нужно помнить в каждом запросе. Токен одной компании бесполезен в другой.Создание компании запускает миграции схемы, и каждая миграция выполняется для каждого тенанта.
D2Лиды, расчёты и заказы — одна таблица со стадией, а не три.Перевод расчёта в заказ меняет его состояние, а не копирует запись, поэтому история, заметки и файлы остаются с перевозкой.У каждой стадии своё поле статуса, поэтому фильтрация и валидация сложнее.
D3Карты токенизируются в браузере клиента; рыночные цены кэшируются на 30 дней.Номера карт не попадают на наши серверы, что упростило проверку Intuit. Платные запросы цен с лимитами мгновенно отвечают для повторных маршрутов.Цена по маршруту может быть до месяца старой; агенты видят дату кэша рядом с каждым запросом.
  1. D1

    Отдельная схема базы данных для каждой компании и отдельный ключ подписи её токенов.

    Почему
    Изоляцию обеспечивает сама база, а не фильтр, о котором нужно помнить в каждом запросе. Токен одной компании бесполезен в другой.
    Компромисс
    Создание компании запускает миграции схемы, и каждая миграция выполняется для каждого тенанта.
  2. D2

    Лиды, расчёты и заказы — одна таблица со стадией, а не три.

    Почему
    Перевод расчёта в заказ меняет его состояние, а не копирует запись, поэтому история, заметки и файлы остаются с перевозкой.
    Компромисс
    У каждой стадии своё поле статуса, поэтому фильтрация и валидация сложнее.
  3. D3

    Карты токенизируются в браузере клиента; рыночные цены кэшируются на 30 дней.

    Почему
    Номера карт не попадают на наши серверы, что упростило проверку Intuit. Платные запросы цен с лимитами мгновенно отвечают для повторных маршрутов.
    Компромисс
    Цена по маршруту может быть до месяца старой; агенты видят дату кэша рядом с каждым запросом.

Решение и архитектураАрхитектура

Упрощено · без конфиденциальных деталей

Ядро на Django, отдельная схема для каждого брокера и интеграции за фоновыми воркерами.

Веб-приложение на Vue работает с REST API на Django; обновления в реальном времени — входящие, уведомления и длительные задачи — идут по WebSocket. Всё медленное и внешнее выполняют воркеры Celery: синхронизация с маркетплейсами, SMS и почтой, запросы цен и плановые задачи для каждой компании. PostgreSQL хранит отдельную схему на компанию; Redis служит кэшем, очередью и слоем WebSocket.

  • Создано SwiftCore
  • Существующая или сторонняя система
  • Единая точка входа для всех клиентов
Клиент
Веб-приложение (Vue)
Клиент
Поставщики лидов (API)
Клиент
Страница подписи клиента
Точка входа
Django REST API + WebSocket
Сервис
Заказы и диспетчеризация
Сервис
Распределение лидов
Сервис
Сообщения
Сервис
Отчёты
Данные
PostgreSQL, схема на компанию
Данные
Redis
Данные
Воркеры Celery
Внешнее
Central Dispatch
Super Dispatch
RingCentral
Gmail
QuickBooks Payments
Рис. 2 — Упрощённо: клиенты, API, основные модули, данные и внешние сервисы, с которыми они синхронизируются.

Технологии

Инструменты, работающие в продакшене этого проекта, и причины, по которым каждый выбран вместо альтернатив.

Фронтенд

  • 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 источников лидов видны в середине месяца, а не после его закрытия.

Похожая задача?