Платформа недвижимости под NDA: каталог, мобильное приложение и CRM на одной модели данных, синхронизированной с системой клиента.
01 / 02
В компании из сферы недвижимости данные никогда не живут в одном месте. Объекты, собственники, застройщики, клиенты, заявки и сделки заводят разные отделы, и меняются они с разной скоростью, а каталог при этом должен быть актуальным, маркетингу нужен контент, брокерам — воронка, руководителям — цифры.
Мы собрали для всего этого одну платформу: публичный сайт, мобильное приложение, внутреннюю CRM и слой интеграции с существующей системой компании. Клиент, продукт и регион не раскрываются по NDA, поэтому вместо скриншотов продукта здесь иллюстрация каталога и схема архитектуры.
Публичный сайт рендерится на сервере — ради поисковиков и быстрого первого экрана. Каждый фильтр сохраняется в URL, поэтому поиск можно сохранить, отправить или открыть снова, а осмысленные сочетания фильтров получают свои посадочные страницы. В карточке объекта — медиа, карта, ответственный брокер и похожие предложения; на сайте есть жилые комплексы, застройщики, статьи и вакансии, на нескольких языках.
Сохранённый поиск превращается в подписку: когда появляется подходящий объект, пользователь получает пуш, письмо или SMS.
Приложение для iOS и Android собрано на Nuxt и Capacitor на тех же GraphQL-контрактах, что и сайт, поэтому два канала никогда не расходятся, а команде не нужно поддерживать второй клиент с нуля.
При этом оно ведёт себя как нативное: подтверждение телефона и вход через соцсети, токены в защищённом хранилище устройства, сессии, которые восстанавливаются сами, системное меню «Поделиться», deep links и пуш-уведомления. Небольшой отдельный сервис отправляет каждую расшаренную ссылку туда, куда нужно: на экран внутри приложения, в стор, если оно не установлено, или на веб-страницу.
Брокеры, менеджеры, бэк-офис, редакторы контента и руководство видят те разделы и действия, которые разрешает их роль. Объекты связаны с собственниками, комплексами, застройщиками и агентами, у них есть медиа, координаты на карте, массовый импорт и согласование изменений, которым нужен второй взгляд.
Вокруг них — клиенты, лиды, заявки и сделки с объединением дублей и полной историей изменений, задачи и календарь, счета и касса, где балансы в евро и USDT ведутся рядом, XML-выгрузки на площадки объявлений и дашборды с KPI для каждой роли.
Самой сложной частью была существующая система компании: на ней держался весь бизнес, поэтому выключить её и переехать за одну ночь было нельзя. Мы сделали отдельный сервис синхронизации, который принимает её вебхуки и читает изменения в её базе через Debezium CDC.
Сервис синхронизации никогда не пишет в чужие базы. Он публикует нормализованные события, а каждый доменный сервис применяет их в своих границах — так старая и новая системы работали бок о бок, пока процессы переезжали по одному.
Всё, чего пользователю не нужно ждать, идёт через RabbitMQ: импорт и обработка медиа, синхронизация, проверка подписок и уведомления. Уведомления разделены на бизнес-слой, который решает, кому и что отправить, и транспортный, который только доставляет письма, SMS и пуши, — поэтому провайдера можно сменить, не трогая правила.
Все клиенты ходят в один API Gateway, который через Apollo Federation собирает доменные сервисы в единый GraphQL API. Инфраструктура описана в Terraform и работает в Kubernetes, у каждого сервиса свой Helm-чарт.
Vue · Nuxt · TypeScript · Capacitor · NestJS · GraphQL · Apollo Federation · PostgreSQL · Redis · RabbitMQ · Debezium · Kubernetes · Terraform · AWS

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