Legan Studio
Все статьи
~ 5 мин чтения

Бот для дейтинга в Telegram: архитектура и фишки

Как собрать дейтинг-бот в Telegram: анкеты, гео-матчинг, антифрод, монетизация в Stars и модерация контента. Полный разбор инфраструктуры.

  • Telegram
  • дейтинг
  • Mini App
  • монетизация

Дейтинг в Telegram — растущая ниша 2026 года: конкуренция с Tinder, удобный логин через Telegram, нативные платежи в Stars, низкий CAC через каналы. За год в нише появилось десятки ботов с аудиторией от 100 тысяч до 5 миллионов юзеров. Разберём, как собрать такой сервис технически и что критично для запуска.

Базовый функционал

Минимум для жизнеспособного MVP:

  • Анкета (фото + текст + базовые поля).
  • Лента кандидатов с like/dislike.
  • Матч и личный чат через бота (или редирект в Telegram-чат).
  • Гео-фильтр.
  • Платная подписка с лимитом лайков для бесплатных юзеров.
  • Модерация фото и текстов.

Это уровень Tinder 2014 года. Для MVP достаточно, дальше расширяем.

Архитектура

[Mini App] ←→ [Backend API] ←→ [PostgreSQL + PostGIS]
                            ↘  [Redis] (matchmaking, rate-limit)
                            ↘  [S3] (фото)
                            ↘  [ML-сервис] (модерация фото)
                            ↘  [Telegram Bot API] (push, чаты)

Mini App на Next.js или Vue даёт нативный UX (свайпы, анимации). Бот — для пушей, платежей и админки.

Анкета и хранение

Базовая схема:

CREATE TABLE profiles (
    user_id BIGINT PRIMARY KEY,
    name TEXT NOT NULL,
    age INT NOT NULL CHECK (age >= 18),
    gender TEXT CHECK (gender IN ('m', 'f', 'nb')),
    target_gender TEXT[],
    bio TEXT,
    location GEOGRAPHY(POINT) NOT NULL,
    city TEXT,
    photos TEXT[],  -- s3 keys
    interests TEXT[],
    last_active TIMESTAMPTZ,
    is_premium BOOLEAN DEFAULT FALSE,
    is_banned BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMPTZ DEFAULT now()
);

CREATE INDEX idx_profile_geo ON profiles USING GIST (location);
CREATE INDEX idx_profile_active ON profiles (last_active DESC) WHERE NOT is_banned;

PostGIS даёт быстрый поиск по геораспределению (ST_DWithin).

Алгоритм матчинга

Простой и эффективный:

SELECT user_id, ST_Distance(location, $user_loc) AS distance_m
FROM profiles
WHERE NOT is_banned
  AND user_id != $self
  AND age BETWEEN $age_min AND $age_max
  AND gender = ANY($target_genders)
  AND $self_gender = ANY(target_gender)
  AND ST_DWithin(location, $user_loc, $radius_m)
  AND user_id NOT IN (SELECT target FROM swipes WHERE user_id = $self)
ORDER BY last_active DESC, distance_m
LIMIT 50;

Редис-кеш на 5 минут уменьшает нагрузку. Перед выдачей применяем буст премиум-юзеров.

Свайпы и матчи

async def swipe(user_id: int, target_id: int, action: str):
    await db.execute(
        "INSERT INTO swipes(user_id, target, action, ts) VALUES($1,$2,$3,now())",
        user_id, target_id, action,
    )
    if action != "like":
        return None
    reciprocal = await db.fetchrow(
        "SELECT 1 FROM swipes WHERE user_id=$1 AND target=$2 AND action='like'",
        target_id, user_id,
    )
    if reciprocal:
        match_id = await create_match(user_id, target_id)
        await notify_match(user_id, target_id, match_id)
        return match_id
    return None

При матче — push в обоих ботов с кнопкой «Открыть чат». Чат можно реализовать внутри Mini App или редиректом в обычный Telegram-чат через tg://user?id=.

Антифрод

Главные проблемы дейтинг-сервиса:

  1. Фейковые анкеты (девушки-боты для развода).
  2. Скам-схемы («переведи на карту»).
  3. NSFW-контент в фото.
  4. Многоаккаунтинг (один юзер — десять профилей).

Меры:

УгрозаРешение
ФейкиKYC через Telegram Passport, верифицированный значок
СкамNLP-модель на текстах сообщений + жалобы юзеров
NSFWмодель типа NudeNet или AWS Rekognition на загрузке
Multi-accfingerprint по tg_id, device_id, IP, телефон

Для каждого профиля считаем фрод-скор; >0.7 → теневой бан (показывается только себе и таким же).

Модерация фото

Фото пропускаем через CV-модель перед публикацией:

async def moderate_photo(s3_key: str) -> dict:
    image = await s3.get(s3_key)
    result = await aws_rekognition.detect_moderation(image)
    nsfw = max((l["Confidence"] for l in result["ModerationLabels"]
                if l["Name"] in ("Explicit Nudity", "Sexual Activity")), default=0)
    has_face = bool(await aws_rekognition.detect_faces(image))
    return {
        "approved": nsfw < 60 and has_face,
        "nsfw_score": nsfw,
        "has_face": has_face,
    }

NSFW score выше 60 — отклоняем. Без лица — отклоняем (фото машины/собаки в анкете не работают).

Монетизация

Стандартная free-mium модель:

ТарифЦенаЧто входит
Free010 лайков/день, без буста
Premium250 Stars / месбезлимит, 5 супер-лайков, буст 1× в день
Gold500 Stars / мес+ видеть кто лайкнул, режим инкогнито

Подписка — Star subscriptions (subscription_period: 2592000). Разовые буст-покупки — sendInvoice за 50–150 Stars.

CR free → premium в дейтинге обычно 4–8%, что выше других ниш — мотивация платить высокая.

UX-фишки

  • Daily picks — 5 кандидатов в 12:00 каждый день, push «Сегодняшние совпадения».
  • Question of the day — общий вопрос, ответы видят матчи. Снимает барьер «о чём писать».
  • Видео-кружочки в анкете — нативная фича Telegram, конверсия в матч х1.5.
  • Голосовые приветствия — записал голосовую, она прикреплена к анкете.

Юридика

  • 18+, обязательная проверка возраста (Telegram Passport или ручная модерация документов).
  • 152-ФЗ: согласие на обработку ПД, политика и правила сервиса.
  • Запрет интим-сервисов, фильтр коммерческих анкет.
  • В РФ — ОКВЭД 63.99 или 96.09 + кассовое решение для оплат через российский эквайер (Stars обходят это).

Топ-5 ошибок

  1. Не модерируют фото — каталог захламляется NSFW и эскорт-анкетами.
  2. Запускают без 18+ — попадают под законодательство о защите детей.
  3. Не борются с многоаккаунтингом — отзывы заполняются «накручено лайков».
  4. Делают чат внутри Mini App, теряя нативность Telegram.
  5. Ставят лимит 5 лайков free — слишком жадно, новые юзеры не успевают понять ценность.

Итого

Дейтинг-бот — нишa с понятной архитектурой и зрелыми инструментами в Telegram: Mini App для свайпов, Bot API для пушей и платежей, PostGIS для гео, Stars для подписок. Главный челлендж — не технический, а контентный: модерация, антифрод и UX. С грамотной командой MVP запускается за 8–10 недель и за полгода вырастает до 100+ тысяч активных юзеров при бюджете на маркетинг от $20k.

Частые вопросы

Использовать Mini App или обычный бот?

Для дейтинга — обязательно Mini App. Свайпы, анимации, лента карточек — без нативного UI выглядит топорно. Бот используется только как «сервисный»: пуши о матчах, платежи, поддержка. Ядро — Mini App на React или Vue.

Как защититься от ботов-фейков?

Многоуровнево: 1) Telegram Passport для верификации; 2) обязательное селфи с жестом (поднять руку, моргнуть) при загрузке; 3) проверка фотографий на дубликаты в базе и в reverse image search; 4) ML-модель на тексте сообщений (детектит скам); 5) динамические лимиты — новые анкеты могут лайкать ограниченно первые 24 часа. Каждый уровень режет 30–60% бот-трафика.

Сколько стоит запуск дейтинга в Telegram?

MVP с командой из 3 человек (бекенд, фронт-Mini App, дизайнер) — 8–12 недель, $25–40k. Это анкета, свайпы, матчинг, базовые платежи. Каждая дополнительная фича (видеокружки, голосовые, daily picks, премиум-фильтры) добавляет 1–3 недели. Сервера на старте — $200/мес, до 50k DAU вырастает до $1500/мес.

Как делать чат: внутри Mini App или нативный?

Чаще берут гибрид: список совпадений и приветственный месседж — внутри Mini App, дальше юзеры переходят в обычный личный чат Telegram через tg://user?id=. Это даёт нативный UX (стикеры, голосовые, видео), а вы экономите на собственной инфре чатов. Минус — теряете контроль над контентом и не можете применить свою модерацию.

Что показывать в качестве main metric?

DAU, retention 7d, и главное — match rate (доля свайпов, которые приводят к матчу). Норма для здорового сервиса: 3–8%. Ниже 3% — анкеты слишком разбалансированы по полу или геораспределению. Выше 10% — у вас слишком мало юзеров и они «выгребают» друг друга.

Какая средняя выручка на юзера?

ARPU в дейтинге выше большинства ниш: $1.5–4 в месяц на DAU при 5–8% конверсии в Premium. На 50k DAU это $75–200k/мес выручки. Stars даёт ~50% от этой суммы после комиссий Apple/Google и Telegram. Окупаемость рекламы 4–8 недель при CPL $0.5–1.5.

Что делать с пустыми городами?

Если в городе меньше 100 активных юзеров, лента «выгребается» за 1–2 дня. Решения: расширять радиус автоматически, показывать «звёздные» анкеты из других городов, агрессивно вкладываться в маркетинг в этих городах. Запускайтесь сразу с критмассой в 3–5 целевых городах, не размазывайтесь.