Робоче місце,
у якому видно
роботу і гроші.
MatchGuard.ai — інфраструктура для контент-модерації у ніші крипто-дейтингу. Operator CRM — це не «ще одна панель», а інструмент, у якому виконавець проводить години щодня. Тому планка якості тут — як у Linear, Stripe Dashboard і Vercel.
Спокій і контроль
«Я бачу що відбувається з моєю роботою і грошима, без сюрпризів.»
Прозорість оплати
«Я знаю скільки коштує одиниця, скільки зробив і коли можу вивести.»
Прогрес і впізнаваність
«Я бачу свою динаміку, мене ведуть за руку, мені приємно повертатись.»
Чому ми це робимо
На стороні оператора MatchGuard означає: людина заходить у систему і бачить чіткий, спокійний, преміальний інтерфейс, у якому зрозуміло що робити зараз, скільки на цьому можна заробити, і де гроші вже лежать на балансі.
Operator CRM — це робоче місце виконавця. Мінімалізм, швидкість, точна типографіка, відсутність зайвого шуму — але з акцентами там, де це додає азарту: прогрес, стріки, баланс.
Хто такий Оператор
Персона, під яку проєктуємо кожен екран:
- Здебільшого віддалений виконавець із країн з нижчою вартістю праці — LATAM, Східна Європа, Південно-Східна Азія, MENA.
- Заходить через десктоп (робочі сесії) і телефон (швидкі сесії 10–20 хвилин, перевірка балансу).
- Працює одразу за гроші — мотивація фінансова, тож фінансовий стан інтерфейсу завжди на видноті.
- Не є технічним користувачем. Криптогаманець уже має, але інтерфейс не повинен припускати знання Web3.
- Не реєструється сам — доступ створює Admin. На CRM немає форми реєстрації, лише вхід.
Базові правила доступу і поведінки
- На сайті CRM (
app.matchguard.ai) публічна тільки сторінка входу. Усе інше — за авторизацією. - Облікові записи створює Admin із адмінки. Оператор отримує логін і початковий пароль на пошту.
При першому вході система примушує:
- Змінити пароль.
- Підтвердити пошту.
- Пройти онбординг-тур (можна скіпнути, але система ввічливо нагадає).
Може змінити сам: пароль, аватар, мову, тему, налаштування сповіщень, дефолтні налаштування виплат.
Технологічний фундамент і архітектура розгортання
CRM і адмінка живуть в одному моно-репозиторії Turborepo, але як два незалежних Next.js-застосунки з окремими білдами і розгортанням на різних доменах. Спільний код (UI-кіт, типи, i18n-словники, API-клієнт) шариться через внутрішні npm-пакети. Бекенд — єдиний NestJS-сервіс, що обслуговує обидва фронти на основі role-based гардів. Деталі — у 4.1–4.3.
| Шар | Технологія | Чому |
|---|---|---|
| Frontend | Next.js 15 (App Router) + TypeScript | Два незалежні застосунки в монорепо, SSR/CSR гнучкість |
| UI-кіт | Tailwind CSS v4 + shadcn/ui | Контроль над дизайном + швидкість зборки UI |
| Іконки | lucide-react | Чистий лінійний стиль, дружить з shadcn |
| Анімації | Framer Motion | Преміальні мікро-анімації |
| Стан | Zustand + TanStack Query | Без overhead Redux, розділ серверного/клієнтського стану |
| Форми | React Hook Form + Zod | Типобезпека, мінімум boilerplate |
| Тема | next-themes | System / Light / Dark, SSR-safe |
| i18n | next-intl | Найкраща підтримка App Router, плюрали, RTL |
| Real-time | Socket.IO Client | Сповіщення, чат, оновлення статусів |
| Графіки | Recharts | Достатньо для дашборду, Tailwind-friendly |
| Backend | NestJS + TypeScript | Модульність, DI, чиста архітектура в довгу |
| API | REST + WebSocket gateway | REST для CRUD, WS для live |
| ORM / БД | Prisma + PostgreSQL 16 | Надійна типобезпека |
| Кеш / Queue | Redis + BullMQ | Сповіщення, асинхронні задачі, виплати |
| Платежі | NOWPayments (Custody + Mass Payouts) | 0% збору на виведення, 350+ валют, sandbox, batch/CSV |
| DevOps | Docker Compose + pgAdmin | Локальна розробка і staging |
| Моніторинг | Sentry, BetterStack/Logtail | Помилки фронта/бекенду, аптайм |
4.1 Багатодоменна архітектура
Продукт розгорнутий на трьох окремих доменах і на двох серверах:
| Домен | Роль | Сервер |
|---|---|---|
matchguard-ai.com | Публічний лендінг, маркетинг, збір заявок | Server 1 (уже існує) |
| CRM-домен (TBD) | Робоче місце оператора | Server 2 (прод-платформа) |
| Admin-домен (TBD) | Панель адміна і SuperAdmin | Server 2 (прод-платформа) |
Свідоме рішення — окремі apex-домени, а не піддомени (app.matchguard-ai.com). Мотивація:
- Reconnaissance-захист. З бренд-домену не видно, де живуть операторська й адмінська зони — subdomain enum їх не знайде.
- Ізоляція cookies і origin-boundary. Лендінг з формами й третьосторонніми скриптами не ділить origin з чутливими зонами. Різні apex — жорсткий cookie/CORS boundary за замовчуванням.
- Індексація. Admin і CRM —
robots: noindex, окремий домен посилює ізоляцію від SERP. - Бренд-розподіл. Домени можуть виглядати нейтрально (без згадки бренду) для операторських цілей.
mg-ops.com / mg-panel.com). Технічно головне — це різні apex-домени.4.2 Один проєкт чи три? → Монорепо Turborepo
Розглянуто три архітектурні варіанти:
Три окремих репозиторії
НіОдин Next.js з роут-групами на двох доменах
НіМонорепо Turborepo: apps/crm + apps/admin + packages/*
Такpackages/ui · types · api-client; одна CI, консистентний DX.Структура моно-репо:
matchguard-platform/ (git repo)
├── apps/
│ ├── crm/ → Next.js → CRM-домен
│ └── admin/ → Next.js → Admin-домен
├── packages/
│ ├── ui/ → shadcn обгортки, спільні компоненти
│ ├── types/ → TS-типи, DTO, енуми (єдине джерело)
│ ├── api-client/ → типізований клієнт NestJS
│ ├── i18n/ → спільні строки, next-intl утиліти
│ ├── icons/ → централізовані іконки (lucide)
│ └── config/ → ESLint / TS / Tailwind preset
└── services/
└── api/ → NestJS backend (єдиний для CRM і Admin)
Бекенд — один NestJS-інстанс на приватному API-хості, обслуговує обидва фронти. Розподіл прав — на рівні гардів (@Roles('OPERATOR'), @Roles('ADMIN'), @Roles('SUPERADMIN')). Оператор фізично не може досягти admin-endpoints — блокується гардом на бекенді, навіть маючи URL. CORS-whitelist — тільки CRM- і Admin-домени. Landing лишається окремим проєктом на окремому сервері й у монорепо не потрапляє.
4.3 Взаємодія з лендінгом
Лендінг фізично на окремому сервері й поза монорепо, тож потрібен чіткий контракт передачі даних (заявки, ліди). Схема для MVP — пряма HTTP-передача:
- Endpoint
POST /public/leads. Захист: Cloudflare Turnstile на формі, HMAC-підпис shared secret'ом, rate-limiting по IP, whitelist Referer/Origin. - Тіло — лише нечутливі дані заявки. Без auth-токенів і сесій — односторонній публічний вхід. Усі leads логуються (source, IP, UA, timestamp) для антифроду.
- У БД — окрема таблиця
landing_leads(не входить уusers). Адмін бачить заявки в секції «Applications» і конвертує дією «Approve as operator» — тоді дані переносяться вusersз правильнимadminId.
На майбутнє (якщо трафік зросте): замінити прямий POST на брокер (Redis Streams / NATS / RabbitMQ) з ретенцією 7 днів, щоб лендінг працював навіть під час робіт з API. Для MVP — over-engineering, прямий POST закриває задачу.
Інформаційна архітектура
Карта екранів, які бачить оператор:
/login → публічна сторінка входу
/operator → редирект на /operator/dashboard
/operator/dashboard → головна (огляд, активна робота)
/operator/tasks → список призначених задач
/operator/tasks/:id → деталь задачі (категорії всередині)
/operator/work/:id → робочий екран (виконання завдань)
/operator/balance → баланс, історія, статистика
/operator/balance/withdraw → майстер виведення коштів
/operator/messages → чат з адміном
/operator/notifications → центр сповіщень
/operator/profile → профіль (read-only поля + аватар)
/operator/settings → налаштування
/operator/help → FAQ, перезапуск туру, контакти
Дизайн-система і відчуття «premium»
Загальний tone
Інтерфейс має дихати. Багато повітря, мало рамок, ніяких градієнтних кнопок з 2014 року. Один акцентний колір + нейтральна шкала. Світла тема — м'які тіні. Темна — без чорного #000: м'який вугільний (#0B0D10 / #111418) з ледь помітними внутрішніми підсвітами карток.
Кольори
Приклад палітри для подальшої деталізації дизайнером:
| Роль | Light | Dark |
|---|---|---|
| Background | #FAFAFA | #0B0D10 |
| Surface | #FFFFFF | #15181D |
| Border | #E5E7EB | #23272E |
| Text primary | #0B0D10 | #F3F4F6 |
| Text muted | #6B7280 | #9CA3AF |
| Accent (brand) | TBD by designer | |
| Success | #10B981 | #10B981 |
| Warning | #F59E0B | #F59E0B |
| Danger | #EF4444 | #EF4444 |
Типографіка
Один шрифт — Inter із чіткою шкалою: 12 / 14 / 16 / 20 / 28 / 40. Числа — табулярні (особливо в балансі та статистиці), щоб не «плавали».
Радіуси, тіні, стани
- Cards / inputs:
rounded-xl(12 px); modals:rounded-2xl. - Тіні м'які, тільки на елементах, що реально «плавають» — поповер, тостер, модалка.
- Чіткі й ввічливі empty / loading / error / success стани з ілюстрацією і однією CTA. Ніяких «Сталася помилка» без подробиць.
Анімації
- Page transitions: легкий fade + slight Y-shift.
- Toast: slide in від нижнього правого (десктоп) / зверху (мобільний).
- Hover: 150 ms ease-out. Прогрес-бари — плавна заливка з невеликим shimmer.
prefers-reduced-motionповажаємо.
Layout і навігація
Desktop ≥ 1024px
┌────────────────────────────────────────────┐
│ ┌────────┐ ┌──────────────────────────┐ │
│ │ │ │ Topbar │ │
│ │ Side │ ├──────────────────────────┤ │
│ │ bar │ │ │ │
│ │ │ │ Page content │ │
│ │ │ │ │ │
│ └────────┘ └──────────────────────────┘ │
└────────────────────────────────────────────┘
Sidebar (collapsible) — три смислові розділи:
- Робота: Dashboard · My Tasks · Continue Work (швидкий вхід в останню активну категорію).
- Гроші: Balance · Withdraw.
- Зв'язок: Messages (з бейджем непрочитаних) · Notifications.
- Профіль: Profile · Settings · Help.
- Внизу — блок «Earned today: $X.XX» + аватар + кнопка згортання.
Topbar справа наліво: language switcher → theme toggle → notifications bell → user menu (Profile, Settings, Logout).
Mobile < 768px
- Sidebar схований у Drawer (відкривається з лівого краю).
- Замість sidebar — bottom navigation з 5 пунктами: Home · Work · Balance · Messages · More.
- Topbar компактний: логотип, баланс, bell, аватар. На робочому екрані — окремий mobile-режим зі збільшеними тач-зонами.
Tablet 768–1023px
Сайдбар згорнутий до іконок за замовчуванням, розгортається на ховер/клік.
Перший вхід: повний user journey
Це найважливіша частина продукту. У оператора має скластись враження за перші 5 хвилин, що ним займаються.
Email від системи
«Welcome to MatchGuard. Your admin {AdminName} created an account for you.» — логін, тимчасовий пароль, кнопка «Open the dashboard».
/login
Преміальна центральна картка, субтильна фонова анімація, логотип. Email + password, «Forgot password?» і селектор мови.
Зміна пароля + пошта
mustChangePassword → екран «Set your permanent password». Далі mustVerifyEmail → поле 6-значного коду.
Редирект на dashboard
Усі прелімінарії пройдено → /operator/dashboard.
Welcome modal
«Welcome, {FirstName}! Your admin is {AdminName}. Let's take a 90-second tour.» — кнопки Start tour / Maybe later.
Старт туру
Якщо Start tour → покроковий тур (розділ 09).
Ввічливе нагадування
Якщо Maybe later — м'який pulsing бейдж «Tour available — 90 sec» на Help. Через 24 год — нагадування в центрі сповіщень.
Onboarding tour — як в іграх
Технологія і логіка
Обираємо Driver.js (MIT, легка, framework-agnostic, дружить з Next.js 15 через dynamic import). Альтернативи — Onborda або React Joyride v3. Прогрес туру зберігається на бекенді (User.onboardingProgress), щоб продовжити з іншого пристрою. Перезапуск — будь-коли зі сторінки Help.
Тур розбито на 3 акти по ~30 секунд — один безперервний 90-секундний тур втомлює, а три короткі «акти» — це геймдиз-патерн.
- Підсвітка sidebar: «This is your workspace. Everything you need is here.»
- My Tasks: «Your admin assigns you tasks — work packages with categories inside.»
- Balance + баланс у кутку: «Every completed item adds to your balance.»
- Theme: «Working at night? Switch to dark mode anytime.»
- «Let's open your first task» → перехід на
/operator/tasks. - Категорії всередині: «Each category pays a different price per unit.»
- Кнопка Start working → екран завдання.
- Демо: кнопки Approve / Reject / Skip і гарячі клавіші
1/2/3.
- Balance: «When you're ready to withdraw, come here.»
- Withdraw: «We send payouts in crypto — USDT, USDC, BTC, ETH and more.»
- Messages: «Need to ask your admin something? Write directly here.»
- Фінал: «🎉 You're ready. Good luck and welcome to MatchGuard.»
Сторінки CRM — детальний опис
10.1 /login — Sign in
- Центральна картка ~420 px, легкий glassmorphism, логотип + слоган.
- Помилки — інлайн під полем, без red'а на весь екран.
- Внизу: «Forgot password?», селектор мови, лінк на статус системи.
- Після 5 невірних спроб — м'який captcha (Cloudflare Turnstile).
10.2 /operator/dashboard — Home
Посадкова сторінка — те, що оператор бачить щодня першим. Зверху вниз:
- Welcome strip: «Good evening, {FirstName}» + дата + індикатор streak («🔥 5-day streak»).
- Active work card: назва активного завдання, прогрес-бар, скільки залишилось і скільки ще заробити, CTA «Continue working».
- Today's stats: Tasks done · Earned today · Average rate ($/hour).
- Earnings chart: лінійний графік за 14 днів (Recharts).
- Activity feed: «+$0.05 — Photo Moderation #023», «Task 'Traders #15' assigned», «Admin sent you a message».
- Tips card + Quick actions (mobile only).
10.3 /operator/tasks — My Tasks
- Вкладки Active / Completed / All; сітка карток (3 кол. desktop, 1 mobile).
- Картка: title, призначені категорії з лічильниками, загальний прогрес-бар, потенційний заробіток, дедлайн з кольоровим індикатором, кнопка Open.
- Сортування: за прогресом, дедлайном, призначенням.
10.4 /operator/tasks/:id — Task detail
- Над фолдом: загальний прогрес + сумарний заробіток із цього завдання.
- Список лише призначених оператору категорій (інші він не бачить — це принципово): назва, ставка «$0.05/item», прогрес «220/500», очікуваний дохід із решти, CTA Start / Continue.
- Якщо одиниць немає — статус «Awaiting refill» з тултіпом.
10.5 /operator/work/:id — Робочий екран
Серце продукту. Тут оператор проводить найбільше часу — інтерфейс спокійний, фокусний, швидкий.
┌────────────────────────────────────────────┐
│ Topbar (мінімальний, без sidebar) │
├────────────────────────────────────────────┤
│ ┌──────────────────────┐ ┌─────────────┐ │
│ │ │ │ Action │ │
│ │ Item content │ │ ✅ Approve [1] │
│ │ (фото / відео / │ │ ❌ Reject [2] │
│ │ профіль) │ │ 🚩 Flag [3] │
│ │ │ │ ⏭️ Skip [4] │
│ └──────────────────────┘ └─────────────┘ │
├────────────────────────────────────────────┤
│ Progress • 120/500 • Earned session: $6.00 │
└────────────────────────────────────────────┘
- Гарячі клавіші
1/2/3/4, авто-збереження після кожної дії — без «Save». - Undo останньої дії (Ctrl+Z) впродовж 5 секунд. Skip не зараховує оплату, повертає item у пул.
- Pause/exit будь-коли — сесія зберігається. На мобільному — нижня панель з великими кнопками + свайпи (опційно).
- На вибраних категоріях (Deepfake Detection) бічна панель містить підказки — ознаки, на які звертати увагу.
10.6 /operator/balance — Balance
- Hero: Available — усі виконані одиниці зараховуються миттєво й автоматично, без ручної модерації адміна.
- Pending — виведення у процесі (від кнопки Withdraw до фінального підтвердження транзакції в мережі). Lifetime earned + CTA Withdraw.
- Графік earnings (7d / 30d / 90d / All) + donut-розбивка по категоріях.
- Tabs: Earnings history (дата, завдання, категорія, кількість, сума) · Withdrawals history (статус, txid → explorer).
10.7 /operator/balance/withdraw — Withdraw wizard
Майстер у 3 кроки на одній сторінці; крок 2 розблоковується після валідного кроку 1.
Choose payout method
Криптовалюта — весь каталог NOWPayments (350+ токенів) у двошаровій структурі: Featured (8 плиток — USDT, USDC, BTC, ETH, SOL, MATIC, BNB, TON) + All coins (searchable-список з fuzzy-пошуком). Мережа — усі підтримувані для токена, з бейджем «Cheapest» на найдешевшій. Network fee утримується із суми (платить оператор), тож «You will receive» завжди менший за запрошену суму.
Recipient
Адреса гаманця з валідацією по мережі, «Scan QR», «Save as default» + аліас, whitelist збережених гаманців.
Confirm
Огляд усього + 2FA код + «Confirm withdrawal» (3s debounce). Далі статус: Pending → Processing → Sent (txid).
10.8 /operator/messages — Chat with Admin
- Один зафіксований канал — з призначеним адміном. Інтерфейс месенджера, realtime через Socket.IO.
- Текст з базовим Markdown, прикріплення (зображення до 10 MB), реакції-емодзі (опц.), системні повідомлення інлайн.
- Можна поскаржитись адміну на item із робочого екрану («Ask admin» з підвантаженим контекстом).
- Заборонено: писати іншим операторам, перевідкривати канал, видаляти історію.
10.9 /operator/notifications — Center
- Фільтри: All · Work · Balance · Messages · System. Mark all as read.
- Перехід на джерело події (лінк «Open task»). Toast у правому нижньому куті + запис у центр.
10.10 /operator/profile — Profile
- Аватар (uploadable, з кропом). First / Last name — read-only з тултіпом.
- Operator ID, інфо адміна (ФІО + нікнейм + аватар, «Assigned since»), email, member since. У оператора рівно один адмін — без мультиселектора чи перемикача.
- Stats: lifetime earned, total items, streak best, achievements.
10.11 /operator/settings — Settings
| Вкладка | Що містить |
|---|---|
| Account | Change password · email read-only · delete account (soft, з коментарем) |
| Preferences | Language (11) · Theme · date/number format · currency · sound effects · reduced motion |
| Notifications | Toggles по каналах (email / in-app / push) і категоріях |
| Payouts | Default crypto + network · whitelist гаманців (CRUD) |
| Security | 2FA (TOTP) · active sessions · login history (20 входів з IP, гео, девайсом) |
10.12 /operator/help — Help
- Search bar · FAQ за категоріями · «Replay onboarding tour» (велика кнопка).
- Глосарій (Task, Category, Item, Pending) · «Contact your admin» / «Contact support» · uptime indicator.
Сповіщення і real-time
Канали доставки
| Подія | Toast | Center | Push | |
|---|---|---|---|---|
| Призначено нове завдання | ✓ | ✓ | ✓ | ✓ |
| Призначено категорію в існуючій | ✓ | ✓ | — | ✓ |
| Закінчились items у категорії | ✓ | ✓ | — | — |
| Admin прислав повідомлення | ✓ | ✓ | опц. | ✓ |
| Зарахування на баланс | ✓ | ✓ | — | — |
| Зміна статусу виведення | ✓ | ✓ | ✓ | ✓ |
| Досягнення / мілстоун | ✓ | ✓ | — | — |
| Системні (maintenance) | ✓ | ✓ | ✓ | — |
Поведінка та стек
- Toast: автохайд 5с (info) / 7с (success), ручний close для error. Стек до 3 видимих, один CTA максимум, опційний звук «tick».
- Socket.IO gateway в NestJS, кімнати
room:user:{id}+room:task:{id}. - Бекенд публікує події через BullMQ → fan-out на гейтвей. Reconnect з offline-індикатором у топбарі.
Прогрес і м'яка гейміфікація
- Daily streak — дні поспіль із виконаною роботою (поріг конфігурується). Показ на dashboard і в profile.
- Levels на основі lifetime items: не дають матеріальних переваг — лише статус і бейдж біля аватара. Запобігають синдрому «тільки гроші».
- Achievements: «7-day streak», «First $100 withdrawn», «Multi-category master». Колекція в profile.
- Personal records — тільки персональні, без leaderboard: лідерборди створюють тиск, уникаємо їх у MVP.
Локалізація (i18n)
Підтримувані мови (11)
Принципи
- next-intl + JSON-словники по фічах. Дати/числа/валюти — через
Intl.*з прив'язкою до локалі. - Плюрали — ICU MessageFormat. RTL: автоматичний
dir="rtl", sidebar дзеркалиться праворуч. - Дефолтна мова: cookie → user setting →
Accept-Language→ English. - На наступних ітераціях — Crowdin або Lokalise (поза скоупом MVP).
- FAQ і Help-контент локалізуємо самотужки (у нашій кодовій базі/БД), без зовнішніх helpdesk-платформ (Crisp / Intercom / Help Scout): уже є вбудований канал з адміном, а статичний FAQ якісно перекладається стандартним workflow. До хелпдеска повернемось, коли зʼявиться окрема support-команда.
Безпека
- HTTPS-only. JWT: короткий access 15 хв + httpOnly refresh 30 днів з ротацією при кожному використанні (anti-replay).
- При деактивації акаунта адміном refresh-токен інвалідується миттєво; на логіні оператор бачить екран «Your account has been suspended» без деталей і публічної CTA на підтримку (деталі — у адміна іншими каналами).
- Rate limiting на
/login,/withdraw,/messages. Cloudflare Turnstile після 5 невдалих логінів. - 2FA (TOTP) — обов'язкове перед першим виведенням. Whitelist гаманців із email-підтвердженням.
- IP geo-логування при кожному вході; підозрілий новий регіон — email-нотифікація.
- Усі чутливі дії (зміна пароля, додавання гаманця, виведення) викликають email.
- CSP, XSS, SQL-injection — стандартно. Логи без PII. Sentry зі скрабом sensitive полів.
Автоматичний контроль якості і антифрод
Ми свідомо відмовились від ручної модерації адміном (Додаток A, п. 1): кожен виконаний item зараховується автоматично, миттєво і без людини в циклі. Щоб це не стало дірою для зловживань, потрібна повноцінна автоматична модель довіри. Нижче — вся її механіка.
15.1 Класи загроз
- Speed farming — клікає «Approve» на все підряд заради лічильника.
- Boting — скрипт/макрос натискає замість людини.
- Multi-accounting — одна людина реєструє кілька акаунтів у різних адмінів.
- Collusion — група координує однакові відповіді, щоб пройти cross-check.
- Accuracy drift — працює чесно, наростив довіру, потім починає фейкувати.
- Payout abuse — швидкий фарм → миттєве виведення → зникнення (частково покрито 7-денним cool-down'ом і whitelist-гаманцями з 2FA).
15.2 Сигнали, які збирає система
- Honeypots (gold questions). У кожну категорію підмішуються items з відомою правильною відповіддю — 3–7% для нормальних, до 20% на probation. Оператор не знає, який item — honeypot. Помилки прямо знижують accuracy.
- Time-per-item baseline. Розподіл часу ретельного оператора (median, p25–p95). Хронічно нижче p25 → підозрілий; нижче p5 → майже гарантовано фейк.
- Cross-validation (soft consensus). Частина items іде на 2–3 операторів (вони не знають про перетин). Сходяться → валідно, всі отримують оплату. Розходяться → arbitration-pool. Одну категорію можна призначити кільком операторам (але не двічі одному в межах завдання).
- Behavioral biometrics (light). Патерн взаємодії у workspace: інтервали між кліками, рух миші, hotkeys vs миша, hesitation time. Ідеально рівні інтервали й нульовий рух миші — сигнал бота.
- Device fingerprint + IP. Композитний fingerprint (FingerprintJS OSS) + IP + гео. Ідентичний композит на кількох акаунтах → multi-accounting.
- Answer distribution. 98% approve при нормі категорії 60% → сигнал.
- Withdrawal velocity та session anomalies — різкі відхилення від власного базлайну оператора.
15.3 Trust Score — композитний показник
Усі сигнали агрегуються в число 0–100 на оператора. Зважений композит, перекалібровується щоквартально:
| Сигнал | Вага | % |
|---|---|---|
| Honeypot accuracy | 35% | |
| Cross-validation agreement | 25% | |
| Time-per-item consistency | 15% | |
| Behavioral biometrics | 10% | |
| Answer distribution normality | 8% | |
| Device / IP uniqueness | 5% | |
| Payout velocity | 2% |
Score змінюється поступово (exponential moving average), а не стрибками — щоб один поганий день не убив історію нормального оператора.
15.4 Реакція системи залежно від Trust Score
Нові акаунти стартують з 55 (Normal) і мають 3-денний probation з honeypots 20%. За 3 дні добропорядні виходять у Trusted, проблемні — у Watch/Restricted.
15.5 Прозорість для оператора
- Trusted / Normal: нічого, робота як завжди.
- Watch: нічого явного; можливо трохи більше складніших items у пулі.
- Restricted: м'яке повідомлення на dashboard: «We noticed some unusual activity. Your withdrawals are temporarily paused for review.» — без конкретних сигналів.
- Suspended: той самий екран «Your account has been suspended», що й для деактивації адміном.
Адмін у своїй панелі бачить trust score команди, розбивку по сигналах і рекомендацію системи. Може вручну змінити стан (напр. зняти ban), але не може напряму підняти/занизити score — це системний показник, захищений від маніпуляцій.
15.6 Кошти підозрілого оператора
- Watch / Restricted → суми лежать на балансі, зростають, але не виводяться до нормалізації score.
- Suspended → баланс заморожений; після ручного review адмін може розморозити.
- Banned (рішення адміна після review) → баланс конфіскується. Правило в Terms of Service, які оператор акцептує при першому вході — без цього економічний стимул фроду не зникає.
15.7 Чому так, а не ручна модерація
- Масштабованість. Один адмін не перегляне 5 000 items/день від 20 операторів. Час адміна дорогий.
- Швидкість. Затримка платежу знижує engagement чесних. Миттєве зарахування утримує.
- Консистентність. Автоматика робить однакові рішення на однакових патернах; людина — ні.
- Data-driven. Статистика по мільйонах дій → retro-калібрація ваг. Ручні рішення не дають циклу навчання.
- Стандарт індустрії. Toloka, Appen, Clickworker, Scale AI працюють саме так.
15.8 Поза скоупом антифрод-модуля
- Точна ML-модель для behavioral biometrics — v1 rule-based на порогах, v2 з ML.
- Graph-based ML для detection collusion — на пізніше.
- Авто A/B-калібрація ваг Trust Score — на пізніше. ZK-докази роботи — далеке майбутнє.
Деталі імплементації (алгоритми, пороги, обробники) — окремий технічний документ. Цей розділ описує вимоги і логіку продукту, а не код.
Адаптивність і мобільний досвід
CRM — це не просто responsive, це mobile-first для робочих сесій. Багато операторів робитимуть прості модерації з телефону.
- Workspace окремо оптимізований під мобілку: великі тач-зони, свайпи (опц.), фіксована нижня панель дії.
- Сітки 3-кол → 1-кол. Усі модалки — bottom sheet. Топбар компактний (баланс — лише сума).
- Жести pull-to-refresh у списках. iOS PWA installation (іконка, splash, standalone).
- Шрифти 16+ px (інакше Safari зумить). На повільних мережах — skeleton screens, optimistic UI у workspace.
Аналоги: звідки беремо найкраще
Краудсорсинг (модель роботи)
- Toloka — компактний task feed, «X¢ per task».
- Clickworker — акцент на щоденному заробітку.
- Mechanical Turk — дисципліна «одна одиниця = одна дія».
- Appen / RemoTasks — візуалізація прогресу по категоріях.
Преміальний UI / UX
- Linear — hotkeys, command palette, щільність інфо.
- Stripe Dashboard — типографіка чисел, графіки.
- Vercel — простір, повітря, темна тема.
- Notion — м'якість тіней, empty states з ілюстраціями.
Криптогаманці / виведення
- Binance — індикація network fee і «you will receive».
- OKX — whitelist гаманців з аліасами.
- Coinbase — zero ambiguity на confirm screen.
Онбординг
- Duolingo — streaks, achievements без дитячості.
- Linear onboarding — 3-актова структура туру.
- Stripe onboarding — tooltips з визначеннями інлайн.
Що поза скоупом цього документу
- Адмінська панель (
/admin/*) — окремий vision-документ. - Робота SuperAdmin (завантаження контенту, створення варіацій, призначення).
- Бекенд-схема БД у деталях — окремий технічний документ.
- API-контракти — окремий OpenAPI. Лендінг
matchguard.ai— окремий проєкт. - Деталі імплементації автоматичного контролю якості і антифроду (алгоритми, обробники подій, ML-моделі) — окремий технічний документ. Логіка продукту описана в розділі 15.
- Лідерборди, командна гейміфікація — після MVP.
Що далі
Після затвердження цього vision-документу:
Закриті рішення
Раніше — відкриті запитання; у v0.2 зафіксовані 9 ключових рішень.
Контроль якостіclosed — ручної модерації немає. Усі items зараховуються на баланс автоматично й миттєво; система сама аналізує патерни і фрод (окремий тех-напрямок). Balance більше не має стану «на перевірці»; Pending = виведення у процесі мережевого підтвердження.
Мінімальна сума виведенняclosed — однакова для всіх, фіксує SuperAdmin на рівні системи. Додатково: виведення доступне лише через 7 днів від першого зарахованого item. Антифрод + soft retention.
Network feeclosed — оплачує оператор: комісія утримується із суми виведення, «You will receive» завжди показано після її врахування. Сервісний збір NOWPayments на mass payouts — 0%.
Час життя сесіїclosed — access 15 хв + refresh 30 днів (httpOnly, ротація при кожному використанні, anti-replay). При деактивації refresh інвалідується миттєво.
Кількість адмінівclosed — рівно один (User.adminId NOT NULL). Без перемикача в UI. Re-assignment — окремий адмінкейс в історії, але оператор завжди бачить одного «current admin».
Деактиваціяclosed — єдине повідомлення на логіні «Your account has been suspended», без деталей і публічної CTA. Ban-like soft suspension: дані не видаляються, доступ до CRM заблоковано.
Локалізація FAQclosed — робимо самотужки, без Crisp / Intercom / Help Scout. Уже є канал з адміном, статичний FAQ перекладається стандартним workflow. −1 вендор, −1 підписка, повний контроль.
Звуковий дизайнclosed — мінімальні UI-звуки: approve «tick» (~100 ms), баланс «coin». Вимикаються в Settings. Дефолт — вимкнено, пропонуємо ввімкнути в турі.
Імʼя адміна у профіліclosed — показуємо ФІО + нікнейм + аватар (ФІО над нікнеймом). Посилює довіру і пришвидшує комунікацію поза системою.
Залишилось відкритим
Оновлено у v0.3. Із попереднього списку закрито:
Залишається відкритим:
Точний поріг daily streak. У беті перевіримо: items/день, $ /день, час, або гібрид (хоча б один поріг). Логіка configurable у SuperAdmin без релізу.
Deposit / поповнення на стороні оператора. У v0.3 є лише withdraw. Можливі майбутні кейси: stake за преміум-категорії, insurance-депозит, бонусні токени. Для MVP — out of scope operator CRM.
Фінальні бренд-домени CRM і Admin (розділ 4.1). Бізнес-рішення; зафіксувати перед налаштуванням Cloudflare/DNS і CI/CD.
Точна ставка HMAC-shared secret для лендінг → API (розділ 4.3) — визначаємо з командою лендінгу перед першим інтеграційним тестом.