Введите 6-значный код из аутентификатора
OTC-CRM для криптовалютных обменников. От Excel к автоматизированной платформе.
Единый источник правды о том, где мы находимся и куда движемся.
Операторы OTC-обменников управляют миллионами долларов через Excel, Telegram и записки на бумаге. Каждая ошибка в расчётах, каждая потерянная сделка, каждое неверное сведение баланса — это прямые финансовые потери.
Платформа, которая автоматизирует полный цикл обмена: создание сделок с автоматическим расчётом курса, распределение прибыли с реферальными выплатами, управление балансами контрагентов и отслеживание крипто-кошельков. Всё в одном месте.
От CRM для одного обменника к сетевой платформе. Брокер-брокер сеть, где участники взаимодействуют, делят ликвидность и растут вместе. Но сначала — нужно укрепить фундамент.
Мы здесь. Работающий продукт: сделки, балансы, контрагенты, кошельки, AI-бот. 10 клиентов, 6 платящих.
Следующая цель. Клиенты получают свой портал, брокеры — лендинг и freemium-модель. Вирусный рост через инвайты.
Мобильное приложение: Telegram, WhatsApp, Signal в одном окне. AI-аналитика переписок. Менеджеры работают с телефона.
Стратегическое видение. Межброкерные сделки, зеркальные обязательства, система репутации, общая ликвидность. Сетевые эффекты.
Создание сделок с автоматическим расчётом курса от 9 провайдеров. Расчёт прибыли по каждой сделке.
РаботаетМультивалютные балансы контрагентов. Пополнения, списания, ручные корректировки. Движок сведения.
РаботаетАвтоматическое сопоставление парных сделок между кассовыми аккаунтами. Отслеживание заполнения.
Работает4-уровневая реферальная система. Комиссии агентов, бонусы менеджеров. Закрытие прибыли в один клик.
РаботаетНекастодиальные кошельки, транзитные адреса, импорт транзакций из блокчейна, привязка к сделкам.
РаботаетGPT-4.1 агент с 15 функциями. Полный цикл сделки из Telegram. Понимает сленг.
РаботаетМастер-БД + отдельная база для каждого брокера. Изолированные данные. SaaS-подписки.
РаботаетХэш-цепочки + деревья Меркла + Bitcoin anchoring. Защита истории сделок от подделки.
РаботаетПерсональный дашборд для клиентов обменника. Заявки на обмен, просмотр баланса, история.
ЗапланированоREST API для мобильного приложения менеджеров. Conversations, Messages, Participants. Telegram + WhatsApp + Signal.
В работеБесплатный тариф для соло-обменников. Авто-создание брокера, лимиты клиентов, подписки Starter/Growth/Pro.
РаботаетМежброкерные сделки, обязательства, репутация, ликвидность. Backend + UI (3 Livecom-страницы). 95% готово.
РаботаетОператор OTC-обменника: 4+ менеджеров, 2–6 кассовых аккаунтов, 10+ сделок в день. География: СНГ, Азия, Дубай. Предыдущие инструменты: Excel, Google Sheets, попытки миграции с AmoCRM/Bitrix.
Средний чек: ~$300/мес (со скидками). 6 платящих из 10. Привлечение: сарафанное радио + Instagram Reels. Бюджет на разработку: $100K.
Учёт балансов с контрагентами. Расчёт прибыли по каждой сделке. Автоматическое распределение реферальных выплат. «Больше никакого Excel» — главный аргумент.
Все 6 критических уязвимостей закрыты: мастер-пароль отключён, изоляция тенантов в TG-боте, шифрование ключей кошельков (+ команда миграции), SQL-инъекции в CRUD фильтрах, whitelist методов Livecom, DevSamples отключён в проде. Дополнительно исправлен copy-paste баг SwapCounters + 5 проблем HIGH/MEDIUM.
Исправлено 2026-04-21Исправлено 21 из 40 проблем: 6 critical (безопасность) + 15 high/medium (стабильность, курсы, auth, float→decimal, форматирование, валидация). Осталось: god-объекты (SwapEntity 1575 строк), система сведения, конкуренция транзакций, 27 RC задач.
~318 часов суммарно27 задач застряли «между версиями» — код написан, но не выпущен. Каждый багфикс рискует сломать что-то ещё. Это создаёт хрупкость и непредсказуемость: мы не можем уверенно выкатывать новые фичи.
~45 часов на стабилизациюAPI: 4 Swagger-спеки + Postman. Архитектура: 17 документов (kernel, CRM, bundles, frontend, security, tech-debt, PRD) в docs/architecture/. Правила: CLAUDE.md + .cursor/rules/. Тесты: 98 файлов / 650 тестов / 2693 assertions — покрытие ~7% по файлам. Покрыты: HashService, UidService, InstrumentEntity, Swapper, Ledger, TransferService, CurrencyEntity, SwapEntity, AmountFormatter, Decimal, BaseCurrency + бот-тесты + API + settlements.
Постоянная работа~17 часов
~45 часов
~340 часов
~300 часов
Бэклог
Мы нашли мастер-пароль, дающий доступ к любому аккаунту. Ключи крипто-кошельков хранятся открытым текстом. Одна утечка данных — и мы теряем не просто клиентов, а весь бизнес. 17 часов работы убирают экзистенциальный риск.
27 задач застряли между версиями — каждая новая фича превращается в игру в Дженгу. Нужна чистая, предсказуемая кодовая база, прежде чем добавлять новые блоки. Иначе каждый новый блок рискует обрушить башню.
Личный кабинет напрямую генерирует доход: больше клиентов, выше удержание, меньше нагрузки на менеджеров. Мессенджер-хаб улучшает операции, но не добавляет платящих пользователей напрямую. Фичи, генерирующие доход, финансируют операционные улучшения.
Главное возражение: «Не буду платить, пока не попробую». Freemium убирает его. Соло-операторы начинают бесплатно, растут в платные тарифы. Каждый бесплатный пользователь становится евангелистом. Вирусная механика инвайтов создаёт экспоненциальный рост без маркетинговых затрат.
Команда: 0 разработчиков. Бюджет: $100K. Классический найм даст 1–2 разработчика на 6 месяцев. AI-разработка (Claude Code) позволяет двигаться в 3–5 раз быстрее, покрывая все 18 модулей параллельно.
Сетевые эффекты требуют критической массы. С 10 клиентами сеть — это просто пустая комната. Сначала нужно 100+ брокеров (через freemium), потом сеть станет ценной. Строить её сейчас — преждевременно.
Экзистенциальные риски безопасности устранены. Мастер-пароль отключён, тенанты изолированы, ключи шифруются, SQL-инъекции закрыты, Livecom защищён.
27 Release Candidate задач проанализированы: 17 уже были исправлены ранее, 7 исправлены сейчас, 2 низкоприоритетных отложены (IX2-751, IX2-868), 1 требует дизайн-решений (IX2-821 — роль Client, основа реализована).
<template x-for> каждый per-row <select> нёс все 1010 опций партнёров (+ ~360 пар локация-валюта) → Alpine клонировал их на каждую строку (десятки тыс. DOM-узлов). Убрано: опции вставляются на клиенте из скрытого мастер-списка, существующим строкам — только выбранная (populatePartnerOptions/populateLocationCurrencyOptions); x-data партнёров урезан до {id,name}; payload 6.79→3.76 МБ. Корень №2 (главный, найден через git): коммит "fix select2 in import" добавил синхронную ветку loadSync в alpine-select2.js, которая инициализирует Select2 на ВСЕХ ~60 строках разом и пересоздаёт их при каждом updateSelects/«Загрузить ещё» → блок главного потока. Применено низкорисковое: каждый виджет инициализируется ровно один раз (data-alpine-select2-initialized), первая страница 30→10 строк. Откат: попытка сделать read-only строки нативными (:x-filter) сломала отображение («Создать контрагента» вместо имени) — откачено. БД/данные не тронуты. Если фриз останется — настоящий фикс: ленивая AJAX-загрузка списка партнёров (не строить 1000+ опций вовсе) + батчинг loadSync через rAF, с браузерным тестом.Менеджеры тратят 30–40% времени на ответы «где моя сделка?» и «какой баланс?». ЛК убирает эту нагрузку. Клиенты сами проверяют баланс, смотрят историю, подают заявки. Снижение операционных расходов, рост удовлетворённости, доступность 24/7.
Сейчас привлечение только через сарафан. Лендинг + freemium создают масштабируемую воронку. Соло-операторы начинают бесплатно (Starter), растут в Growth ($29) и Pro ($99). Каждый зарегистрировавшийся может стать брокером — вирусный рост без маркетинговых затрат.
mobile-bank(6).html и проверены на живом стенде stack.fastapp.dad: Фаза 0 дизайн-система wallet-mobile.scss (Taiga-токены → CSS-vars); Фаза 1 Главная (список счетов + ≈$ сводка + последние операции + bottom-nav + ActionsSheet); Фаза 2 экран счёта (баланс-карта + SVG-мини-график + действия + история). Правки сессии 30.05: клиентская терминология действий (Пополнить/Обменять/Вывести/Перевести через отдельные partner.wallet.* переводы, брокерский CRM не тронут); шторка «Выберите действие» с 4 пунктами и подсказками; кольцо у логотипа валюты; trend-чип с реальным % из серии баланса; фикс мини-графика — окно -1 month→-12 month (ReportingBook агрегирует помесячно, за месяц была 1 точка → график не рисовался). Фаза 3 (Операции) реализована и протестирована браузером (Playwright, скриншот-сравнение с макетом): мобильный экран «Все операции» — период-сводка (доход/расход/нетто + stacked-bar), чипы типов с Alpine-фильтром, дни collapsible со статус-пиллами, шторка фильтров (поиск + тип); bottom-nav приведён к 2 кнопкам (Главная/Операции) как в макете. Исправлены 2 бага (пойманы скриншотами): Partner is not defined (wallet x-data без брокерского компонента) и регрессия «Главная показывала Операции» (нормализация пустой page в init()). Шторка действий — информационная (read-only): пункты Пополнить/Обменять/Вывести/Перевести помечены «Скоро» с подсказкой («напишите менеджеру»), без перехода в десктопную форму. Итог: все wallet-экраны макета (Главная/Счёт/Операции/Фильтр/Шторки) реализованы и протестированы браузером (скриншот-сравнение с макетом). Прод-релиз v1 (read-only, подготовлен): отдельная чистая ветка release/lk-readonly-v1 от прод-main — только просмотр (счета, история операций, деталь операции по тапу, полный фильтр тип/счёт/статус/период). UI и бэкенд действий (обмен/пополнение/вывод/перевод, меню «⋮»/«Добавить счёт», sheet'ы, методы walletSwap*/walletOrder*/order*, OrderEntity/OrderService, менеджерская панель PartnerOrders) полностью вырезаны. Не требует новых таблиц: crm_order исключён из ленты, crm_instrument опционален (WalletInstrument с фолбэком имя=код+тип). 15 файлов, +2053 строки, чистый diff к origin/main; прод-оптимизация transferForm сохранена. Деплой: сначала staging, затем merge в main. Открытый вопрос — вход клиента в ЛК (onetime/invite/JWT) решается на staging. Следующий релиз: рабочие wallet-формы действий. Тест в контейнере (rr reset + warmup при переводах; build-css при SCSS; скриншоты — wallet-shots/shoot-*.mjs).Крупные обменники (4+ менеджеров) нуждаются в тонком контроле видимости. Row-level ACL полностью реализован через BrokerEmployee + CrmFilter.applyUserRestrictions().
Менеджеры живут в мессенджерах. Типичный менеджер жонглирует Telegram, WhatsApp, иногда Signal одновременно. Переписки с 50+ клиентами через 3+ приложения теряются. Единое окно с CRM-контекстом и AI-аналитикой превращает хаос в организованный рабочий процесс.
Каждый клиент обменника сейчас вынужден звонить или писать менеджеру, чтобы узнать баланс или уточнить по сделке. Это создаёт узкое горло, которое не масштабируется. При 10+ клиентах на менеджера и 10+ сделках в день менеджеры становятся самым слабым звеном. Портал самообслуживания снимает 30–40% рутинных обращений.
Менеджер вводит имя и телефон клиента. Аккаунта ещё нет.
В один клик: «Отправить в Telegram / WhatsApp / Скопировать». Токен действует 72 часа.
brokerAlfa.fastapp.dad/invite/token — видит брендинг брокера, а НЕ FastOTC. Регистрация по телефону или Telegram Login.
Баланс, сделки, заявки на пополнение/вывод, история. Доступен 24/7 без звонков менеджеру.
«Не буду платить, пока не попробую» — возражение №1. Freemium убирает его. Соло-операторы начинают бесплатно и получают полнофункциональную мини-CRM. Когда они растут, они упираются в лимиты, которые естественно толкают к платным тарифам. Главное: каждый пользователь — потенциальный брокер, привлекающий новых пользователей.
Вводит имена, телефоны. Упирается в лимит. Что дальше?
Online-клиенты (с аккаунтами) не ограничены. Когда offline конвертируется в online, слот освобождается.
Регистрирует свой Starter-аккаунт. Становится новым брокером. Приглашает своих клиентов. Цикл повторяется.
Больше offline-слотов, кастомный домен, выделенная БД. Естественный путь апгрейда.
Сейчас нет веб-присутствия. Потенциальные клиенты узнают о FastOTC по сарафану и им некуда зайти, чтобы узнать подробнее, посмотреть тарифы или зарегистрироваться. B2B-лендинг на fastapp.dad конвертирует интерес в регистрации.
fastapp.dad — B2B-лендинг для брокеров
*.fastapp.dad — клиентские порталы (per-broker)
app.fastapp.dad — админ-панель брокера
свой.домен — CNAME на тарифе Pro
Лендинг говорит: «Платформа для обменников. Создайте свой обменник.» Он НЕ показывает каталог брокеров и не позволяет клиентам искать обменники. Клиент принадлежит брокеру, а не платформе. Это защищает отношения.
Менеджеры обменников живут в мессенджерах. Типичный менеджер держит Telegram, WhatsApp, иногда Signal одновременно. Переписки с 50+ клиентами через 3+ приложения теряются. Единое мобильное приложение с AI-аналитикой превращает хаос в организованный рабочий процесс с data-driven инсайтами.
Telegram, WhatsApp, Signal, Element (Matrix). Все переписки в одной ленте. Менеджер видит историю клиента по всем каналам в едином представлении.
Локальная LLM (Ollama) анализирует переписки в реальном времени. Подсказывает ответы, выявляет возможности для сделок, определяет недовольство клиента. Все данные остаются на сервере — никаких внешних API для конфиденциальной переписки.
Лёгкое приложение, заточенное под коммуникационный workflow. Не порт полной CRM — специально спроектировано для мобильного юзкейса: быстрые ответы, управление перепиской, AI-подсказки.
Крупные обменники (4+ менеджеров) нуждаются в контроле «кто что видит». Сейчас каждый менеджер видит всех контрагентов, включая чувствительные high-value аккаунты. Это стоп-фактор для команд с большими объёмами — им нужно разделение ролей до того, как они смогут перейти на платформу.
AI сейчас живёт только в Telegram-боте. Перенос в веб-CRM означает, что каждый пользователь получает AI-инсайты: распознавание паттернов, классификация клиентов, предиктивная аналитика — без переключения в Telegram. Это конкурентное преимущество, которое сложно повторить.
GPT-4.1 агент в Telegram-боте с 15 функциями: создание сделок, проверка баланса, управление контрагентами. Понимает сленг валют. Полный цикл сделки без открытия CRM.
AI-ассистент в веб-интерфейсе. Аналитика паттернов клиентов (кто прибыльнее, когда пик). Авто-классификация (скоринг риска и ценности). Rate limiting и защита от prompt injection.
Касса — это НЕ отдельная сущность. Это SUM(balance) WHERE partner.type = 'наличныеier'. Кассир — это контрагент с типом наличныеier, который исполняет поручения менеджеров (collect/payout). Свопы — зона менеджера, кассир их не видит.
Инструмент = валюта + способ + локация. EUR-REVOLUT ≠ EUR-CASH ≠ EUR-CASH-BCN. LocationEntity удалена из финансовой модели, заменена гео-тегами. 3 уровня scope: system (все видят), community (обменники), private (только владелец).
Уровень 1: Telegram Login / пароль (95% пользователей). Уровень 2: Seed-фраза BIP39 (восстановление, кассиры, подтверждение операций). Уровень 3: Web3 ID на основе публичного ключа (межброкерская идентификация, арбитраж). Каждый уровень включается по мере необходимости.
Глобальная цепочка — бутылочное горлышко. Per-account цепочки решают проблему: каждый счёт ведёт свою хэш-цепь. 2 хэша вместо 4 (initial + final). Merkle tree собирает хэши ретроспективно. Bitcoin anchoring (OP_RETURN) отложен до реальных межброкерских споров.
Единая база не создаётся принудительно — она вырастает через операции. Контрагент начинает как локальный (global_uid = null) и глобализируется при одном из 4 триггеров. «Глобальная база — телефонная книга, не банковская выписка.»
Межброкерская операция записывает данные в 3 разных базы: ObligationEntity в мастер-БД + TransactionEntity в тенант Бр1 + TransactionEntity в тенант Бр2. MySQL не поддерживает распределённые транзакции — решение через Saga pattern + outbox table.
Два параллельных потока: архитектура платформы (6 фаз) и Messenger Hub (4 фазы). Критический путь: InstrumentEntity → GlobalPartnerEntity → OrderEntity → Межброкерская сеть → Хэш-цепочка. Phase 4 (портал) идёт параллельно и не на критическом пути.
| Фаза | Что | Файлы | Статус |
|---|---|---|---|
| 1. InstrumentResolver | Мост (currency + location) → InstrumentEntity | 1 новый | ✓ Готово |
| 2. Ledger dual-write | Каждая транзакция пишет в оба учёта | Ledger.php | ✓ Готово |
| 3. Swapper instruments | left/right_instrument_id на свопах | Swapper.php | ✓ Готово |
| 4. TransferService | Переводы через инструменты, location опциональна | TransferService, TransferDto | ✓ Готово |
| 5. PartnerRuntime | getExchangeAccount(), getExchangeAccounts() | PartnerRuntime, PartnerEntity | ✓ Готово |
| 6. Client Portal | Портал использует Exchange accounts | 4 Livecom + 4 views | ✓ Готово |
| 7. Data migration | Консольная команда exchange:migrate-accounts | 1 новый | ✓ Готово |
| 8. Consumers | Бот → Exchange balances, API → instrument fields | 8 файлов | ✓ Готово |
| 9. CRM deprecated | @deprecated на CRM Account*, dual-write сохранён | 4 файла | ✓ Готово |
| Модуль | Качество кода | Безопасность | Тесты | Основная проблема |
|---|---|---|---|---|
| Ядро: ORM | Хорошо | Исправлено | Нет | ✓ Фильтры CRUD параметризованы |
| Ядро: БД / Мультитенант | Нормально | Исправлено | Нет | ✓ Изоляция TG-бота, eachTenancy try/finally, maskParams |
| Ядро: Livecom | Хорошо | Исправлено | Нет | ✓ Whitelist: только public из самого компонента |
| CRM: Сущности | God-объекты | Нормально | Нет | ✓ formatColor null-round, AmountFormatter без мутации, margin round(2). SwapEntity: 1575 строк |
| CRM: Swapper | Нормально | Исправлено | Нет | ✓ right=left, округление, курс закрывашек, isRevertRate, BaseCurrency reverted. Осталось: sleep(5) |
| CRM: Бот/AI | Нормально | Нет rate limit | Нет | Риск prompt injection |
| CRM: Livecom (UI) | God-компоненты | SQL в датах | Нет | 120 компонентов, 19K строк |
| User / Auth | Хорошо | Исправлено | Частично | ✓ Мастер-пароль, 2FA, one-time auth fallback на DefaultUserRole |
| ACL | Нормально | Нет default-deny | Нет | Новые ресурсы по умолчанию открыты |
| Wallet | Нормально | Миграция | Нет | ✓ Логирование + wallet:encrypt-legacy. Нужна миграция legacy ключей |
| Exchange | Хорошо | Хорошо | Нет | ✓ Миграция 9/9: dual-write, InstrumentResolver, бот + API на инструментах. CRM @deprecated. |
| ClientPortal | Новый | ACL | Playwright | ✓ MVP 100%: 10 маршрутов (dashboard, accounts, new-request, deposit, withdraw, transfer, transactions, chat, profile, rates) + register + drawer + Shepherd.js onboarding (6 шагов) + pull-to-refresh + ClientTier (Standard/Silver/Gold/Platinum) + MessengerHub чат с CRM badge + PortalDataFilter + Profile (2FA, сессии) + уведомления |
| MessengerHub | Новый | Хорошо | Нет | ✓ Data layer (5 entities, 8 enums), Inbox + Chat + Context Panel в CRM. Портальный чат мигрирован. WhatsApp Cloud API интегрирован. Осталось: Signal, мобильное приложение, LLM |
| TelegramBots | Нормально | Нет проверки webhook | Нет | Кто угодно может отправить фейковый update |
| Frontend | Нет бандлера | Нормально | Нет | 80+ загрузок скриптов, нет дизайн-системы |
MRR: $5 000
Клиентов: 30
CRITICAL уязвимостей: 0
Покрытие тестами: 20%
ЛК клиента: MVP запущен
MRR: $15 000
Клиентов: 100
CRITICAL уязвимостей: 0
Покрытие тестами: 40%
ЛК клиента: Growth live
100 клиентов, микс тарифов:
60 Starter (бесплатно) = $0
25 Growth ($29) = $725
15 Pro ($99) = $1 485
+ кастомные контракты = ~$15K MRR
Это единый вход во все прототипы ЛК: быстрый мобильный тур прямо здесь, детальный кликабельный ЛК клиента и расширенные ролевые сценарии. Сейчас приоритет — ЛК клиента: сначала собираем все функции и экраны на roadmap, кликаем и утверждаем, потом переносим в FastOTC.
Клиент, Менеджер, Владелец, Агент — каждая видит свою версию платформы. Клиентский портал и CRM уже работают, ролевой тур показывает реальные экраны.
Каждый счёт — это инструмент (валюта + способ + локация). Миграция на InstrumentEntity завершена (9/9 фаз). Каждая роль видит только свои счета через ACL (48+ ресурсов).
Портал клиента (11 экранов + чат + 2FA), CRM менеджера (сделки, чаты, Messenger Hub), панель владельца (аналитика, прибыль, настройки), реферальная система (4 уровня).
Каждая роль видит платформу по-своему. Выберите роль, чтобы увидеть её экраны. Клиентский портал сейчас проектируем как основной кликабельный мобильный прототип; CRM менеджера/владельца работает в продакшне.