Как создать приложение для билетов и чек-ина на входе
Пошаговый план создания приложения для продажи билетов и чек-ина: роли, флоу, QR-коды, офлайн-сканирование, безопасность, интеграции и тестирование.

Цели приложения и сценарии использования
Приложение для билетов и чек-ина решает одну практическую задачу: быстро и точно провести человека от «получил билет» до «прошёл на площадку», а организатору — дать понятную картину продаж и фактической посещаемости.
Какие задачи закрывает система
На уровне продукта чаще всего нужны четыре блока:
- Продажа или выдача билетов: платные (с оплатой) и бесплатные (по регистрации/приглашению), промокоды, лимиты.
- Регистрация участников: сбор данных (например, имя, телефон, компания), согласия, категории (VIP, пресса, персонал).
- Контроль доступа: проверка QR-кода, защита от повторного прохода, ручной поиск по имени/телефону, журнал действий.
- Статистика: сколько продано, сколько пришло, пиковые часы, конверсия «купил → пришёл», отчёты для команды и площадки.
Сценарии для разных типов мероприятий
Подход должен одинаково хорошо работать и для конференций (много категорий и бейджи), и для концертов (максимальная скорость прохода), и для клубных встреч (часто есть списки гостей), и для бесплатных событий (важнее учёт и лимиты, чем оплата).
Роли и кто что делает
- Посетитель: покупает/получает билет, хранит QR, при необходимости обновляет данные.
- Организатор: настраивает событие, тарифы/квоты, тексты уведомлений, выгрузки.
- Контролёр на входе: сканирует, видит статус, решает спорные случаи.
- Администратор: управляет правами, устройствами, доступом к данным и аудитом.
Устройства на входе
Чаще всего используются смартфоны и планшеты с камерой; иногда — отдельные сканеры (если поток большой или нужен более надёжный считыватель). Важно заранее определить, сколько устройств будет работать параллельно и кто отвечает за зарядку и резерв.
Критерии успеха
Оцените продукт по измеримым метрикам: скорость прохода (например, среднее время на одного гостя), процент ошибок (ложные отказы/двойные проходы) и устойчивость при плохой связи (возможность продолжать чек-ин при нестабильной сети с последующей синхронизацией).
Архитектура продукта: участник, сканер и админ-панель
Удобнее всего думать о системе билетов как о трёх интерфейсах под разные задачи: участник, контролёр на входе и организатор. Их можно собрать в один продукт или развести на отдельные приложения/модули — выбор влияет на сроки, поддержку и безопасность.
Если вы хотите быстрее проверить гипотезу и собрать рабочий MVP без тяжёлого классического цикла разработки, часть команд в РФ сейчас собирают такие системы на vibe-coding платформах вроде TakProsto.AI: вы описываете сценарии и роли в чате, а платформа помогает собрать веб‑админку (React), бэкенд (Go + PostgreSQL) и мобильные клиенты (Flutter) с возможностью экспорта исходников и отката по снапшотам.
Приложение для участников
Здесь важны простота и доверие. Минимальный набор: покупка билета, «кошелёк» с билетами (QR и детали заказа), статусы (действителен/использован/возврат), уведомления (покупка, напоминание, изменения по событию) и быстрый доступ к помощи на месте (FAQ, контакты, карта входов).
Частая ошибка — перегрузить участника настройками. Пусть всё критичное будет «в один тап»: открыть билет, показать QR, найти поддержку.
Приложение для контролёров (сканер)
Сканер — рабочий инструмент, а не витрина. Нужны: максимально быстрый скан, крупная индикация результата (пускать/не пускать), офлайн-режим, журнал действий (кто, когда, какой билет проверил). Полезны фильтры по входам/зонам и режим «ручного поиска» по номеру билета на случай проблем с камерой.
Админ-панель организатора (веб)
В веб‑панели создают события и типы билетов, управляют продажами и промокодами, настраивают команды контролёров и права доступа, смотрят отчёты и выгрузки. Важно иметь понятный аудит действий и статус синхронизации устройств на площадке.
Один продукт или модульная система
Один «суперапп» проще развернуть и сопровождать, но сложнее разделять права и снижать риск ошибок на входе. Модульный подход (отдельный сканер + отдельная админка) обычно безопаснее и удобнее для операций на площадке.
MVP: что обязательно, а что подождёт
Для старта достаточно: кошелька билетов у участника, сканера с офлайном и базовой админки (события, продажи, список заказов, права, простые отчёты). Можно отложить: сложные схемы залов, продвинутую сегментацию уведомлений, автоматические интеграции с большим числом внешних систем и расширенную аналитику (оставив экспорт в CSV из /reports).
Модель данных: события, билеты, участники и статусы
Хорошая модель данных — способ заранее договориться, «что такое событие» и «что такое билет», чтобы покупки, проход на входе и отчёты работали без ручных правок. Ниже — практичная структура, которую удобно поддерживать и масштабировать.
Структура события
Событие лучше хранить не одним «постом», а набором сущностей:
- Событие: название, описание, организатор, правила посещения (в виде текста), часовой пояс.
- Даты/сессии: один день фестиваля, отдельный концерт или сеанс. Это упрощает билеты «на конкретную дату».
- Локация: адрес, схема проезда.
- Залы/секции: например, «Партер», «Балкон», «Сектор A». Если мест нет, секции можно использовать для потоков.
- Таймслоты/окна входа (опционально): интервалы для распределения очереди (например, 18:00–18:30).
Такой разрез поддерживает и простые события «на один вечер», и многодневные форматы с несколькими площадками.
Типы билетов
Обычно выделяют:
- Обычный (general admission)
- VIP
- Льготный (с возможной проверкой основания на входе)
- По приглашению (промо/комплимент)
- Абонемент (несколько дней или несколько проходов)
Технически «тип билета» — это продукт с ценой, правилами доступа и ограничениями. А конкретный билет — экземпляр, привязанный к заказу и участнику.
Ограничения и правила доступа
Важно хранить ограничения отдельно от текста на лендинге — чтобы сканер мог проверять их автоматически:
- Лимит продаж (общий и по каждому типу)
- Привязка к секции/месту (ряд/место или просто сектор)
- Проход по дням (для абонемента: какие даты активны)
- Окно входа (таймслот или допустимый диапазон времени)
- Количество проходов (1 раз, 2 раза, безлимит в рамках дня)
Данные участника: минимум, который работает
Чем короче форма, тем выше конверсия. Базовый набор: имя, телефон или email, согласие на обработку данных. Дополнительные поля (дата рождения, компания, документ) включайте только если они реально нужны для льготы, бейджа или требований площадки — и делайте их условными по типу билета.
Статусы билетов (включая возвраты/обмены)
Чтобы предусмотреть возвраты/обмены и при этом не «зашить» бизнес-правила, удобно закладывать нейтральные статусы:
- Создан → Оплачен → Выдан (QR активен)
- Аннулирован (например, по запросу поддержки)
- Возврат инициирован → Возвращён (денежная часть вне модели — фиксируем факт)
- Обмен инициирован → Обменён (старый билет закрыт, новый активен)
- Использован (первый проход) / Частично использован (для абонемента)
Такие статусы дают прозрачные отчёты и предсказуемую логику для сканера, даже если процессы со временем меняются.
Пользовательский путь участника: от покупки до входа
Путь участника должен быть предсказуемым: минимум шагов, максимум уверенности, что «билет точно есть, вход пройду». Ниже — логика экранов и сообщений, которые помогают не потеряться до начала события.
1) Карточка события и выбор билета
В карточке события важно сразу показать ключевое: дата и время, адрес (с возможностью открыть маршрут), краткие правила входа и список типов билетов.
Для выбора билета лучше использовать простую таблицу: название тарифа, цена, что включено, условия возврата/обмена и ограничения (например, «вход до 20:00», «18+», «места свободные/нумерованные»). Если есть промокод — ввод на этом же экране, чтобы участник видел итоговую стоимость до оплаты.
2) Оплата и получение билета
После оплаты участник должен получить подтверждение сразу в трёх местах:
- в приложении (раздел «Мои билеты» с текущим статусом);
- на email (квитанция/подтверждение, без лишнего маркетинга);
- опционально — добавление в «кошелёк билетов» устройства.
Ключевой момент — явный статус: «Оплачен», «Ожидает подтверждения», «Возврат оформлен». Это снижает нагрузку на поддержку в день события.
3) QR/штрихкод: где показывать и как защитить
На билете QR/штрихкод должен открываться одним нажатием и быть доступен офлайн. Чтобы снизить риск случайного скриншота и пересылки, можно:
- показывать код только на отдельном экране с предупреждением «не делитесь билетом»;
- добавлять динамический элемент (например, меняющуюся подпись/время обновления) и скрывать код до подтверждения по биометрии/пин-коду;
- отображать имя участника и последние цифры заказа рядом с кодом, чтобы контролёру было проще заметить несоответствие.
4) Напоминания перед событием
Участнику полезны 2–3 уведомления: за день, за пару часов и при подходе ко времени входа. Внутри — адрес, время начала/допуска, правила (документы, дресс-код, запреты), подсказка «Откройте билет заранее».
5) Поддержка без лишних обещаний
В «Моём билете» разместите короткий FAQ (как найти билет, что делать при ошибке оплаты, как переоформить). Рядом — контакт организатора/службы поддержки с рабочими часами и ожидаемым временем ответа. Это лучше, чем общая форма «мы скоро ответим», особенно в день мероприятия.
Пользовательский путь контролёра: сканирование и проверка
Контролёр — человек, от которого зависит скорость очереди и впечатление гостей. Поэтому его путь должен быть предельно коротким: открыть сканер → навести камеру → получить результат и понятную инструкцию за секунды.
Экран сканирования: «один скан — один ответ»
Сканер запускается сразу в режиме камеры, без лишних экранов. Требование по скорости простое: один скан — один результат за 1–2 секунды, даже при слабом интернете.
После считывания QR-кода приложение показывает крупный статус и следующее действие:
- Валидный билет — зелёный экран, имя/тип билета/зона, кнопка «Пропустить».
- Уже использован — жёлтый/красный экран, когда и на каком входе был чек-ин (если доступно), рекомендация «Позвать старшего».
- Неверный (не найден/повреждён код) — красный экран, предложение перейти к ручной проверке.
- Отменён/возврат — красный экран с причиной, запрет на вход.
- Не тот день/сеанс/зона — предупреждение с указанием, куда можно пройти или что билет на другое время.
Важно, чтобы контролёр не «расшифровывал» сообщение: статус должен читаться с первого взгляда и сопровождаться короткой подсказкой.
Запасной вариант: ручной поиск
На случай треснувшего экрана, распечатки плохого качества или забытого телефона нужен ручной поиск по:
- имени и фамилии,
- номеру заказа,
- телефону/email (если вы храните эти данные).
Поиск должен вести на карточку участника/заказа с теми же статусами, что и в сканере.
Разделение потоков и ролей
Если входов несколько, в приложении задаются точка входа и права доступа: разные типы билетов, отдельные зоны (VIP/балкон), доступ персоналу. Тогда сканер проверяет билет «в контексте» — и реже требует разбирательств на месте.
Журнал действий и ответственность
Каждое действие фиксируется в журнале: кто сканировал, когда, какой был результат и на каком входе. Это помогает разбирать спорные случаи, находить узкие места на входе и дисциплинирует команду без лишнего контроля.
QR-коды и проверка подлинности билетов
QR‑код — это лишь «упаковка» данных билета. Настоящая защита строится вокруг того, что именно зашито в код и как система принимает решение «пускать/не пускать».
Формат кода: что хранить внутри
Практичный вариант — QR содержит короткий токен (например, 16–32 символа), а не персональные данные. Токен указывает на билет на сервере и минимизирует риски утечки.
Чтобы усложнить подделку, добавляют подпись (HMAC/подпись приватным ключом) и срок действия:
- Короткий токен: быстрый скан, компактный QR.
- Подпись: проверяется приложением сканера; без знания ключа сгенерировать валидный QR нельзя.
- Срок действия: полезно для временных проходов (например, «вход до 19:00») и уменьшения ценности украденного скрина.
Одноразовость и защита от копирования
Ключевое правило: билет должен иметь статус и «жить» в системе как сущность. При первом успешном проходе он помечается как использованный.
Есть два уровня проверок:
- Серверная проверка: самый надёжный вариант — сканер отправляет токен, получает ответ (валиден/использован/возврат/не тот вход).
- Локальные правила: в офлайне сканер проверяет подпись, срок и наличие токена в локальном списке разрешённых билетов.
Как выдавать коды
Обычно QR выдаётся:
- после покупки (email/пуш + отображение в приложении участника),
- после регистрации (для бесплатных событий),
- по приглашению (уникальная ссылка, которая выпускает билет и токен при активации).
Важно: один билет — один токен. При возврате/замене токен должен инвалидироваться.
Плохой интернет: кэш и очереди
Для площадок с нестабильной связью сканер заранее загружает кэш «разрешённых билетов» на конкретное событие (или по зонам доступа). Все сканы пишутся в локальную очередь событий и синхронизируются при появлении сети.
Конфликты: два устройства просканировали один билет
Типичный кейс — дублирование: один и тот же QR показали дважды или два контролёра просканировали почти одновременно.
Решение: у каждого скана есть временная метка и ID устройства. При синхронизации сервер принимает первое событие как «успешное», остальные помечает как «дубликат» и возвращает причину. В интерфейсе сканера это должно отображаться явно: кто, когда и на каком входе уже пропустил билет.
Офлайн-режим и синхронизация на площадке
Офлайн-режим в сканере — не «приятная опция», а страховка от реальности. На входных группах часто нестабильный интернет: подвальные клубы, стадионы, павильоны с экранирующими конструкциями, а также перегруженная сеть, когда тысячи людей одновременно пытаются подключиться.
Почему офлайн критичен
Если проверка билета зависит от сервера, любой обрыв связи превращает очередь в конфликт. Офлайн-сканирование позволяет продолжать вход даже при нулевом интернете, а синхронизация «догоняет» позже.
Что хранить локально в сканере
Локальные данные должны быть достаточными для быстрой и безопасной проверки, но не избыточными.
Минимальный набор:
- список валидных билетов/пропусков для конкретного события (лучше в виде компактного справочника: идентификатор + статус + зона/сеанс);
- ключи проверки подписи QR (публичные ключи) и параметры валидации (срок действия, разрешённые зоны);
- настройки точки входа: какой вход/турникет, какие типы билетов пускать, режим «один вход» или «многократный»;
- журнал сканирований (очередь событий), который можно выгрузить и синхронизировать.
Персональные данные стоит минимизировать: если для контроля достаточно статуса билета, не нужно хранить ФИО/телефон. Это упрощает комплаенс и снижает последствия потери устройства.
Как синхронизировать сканы с сервером
Рабочая схема — отправлять на сервер не «изменения статуса билета», а события сканирования: кто/где/когда/какой результат. Сервер уже применяет правила и собирает аналитику.
Практические правила синхронизации:
- отправка при появлении сети автоматически, в фоне, малыми пакетами;
- обязательные уникальные идентификаторы событий, чтобы сервер мог безопасно принимать повторы;
- при конфликте (например, тот же билет уже отмечен на другом входе) сервер возвращает итоговый статус, а устройство обновляет локальную базу.
Ограничения офлайна: о чём предупредить организатора
Офлайн всегда несёт риски дублей: если два сканера без связи проверяют один и тот же билет, оба могут «пустить». Снизить риск помогают:
- ограничение по времени офлайн-работы (например, 30–60 минут без обновления);
- предварительная раздача билетов по входам/зонам (каждый сканер видит только свою квоту);
- лимит объёма локальной базы (особенно для массовых мероприятий) и политика обновления по частям.
План восстановления на площадке
Чтобы не сорвать вход, нужен простой аварийный план:
- резервная точка доступа (модем/роутер) и инструкция для персонала;
- возможность экспортировать локальный журнал сканирований (например, файл) для последующей загрузки в админ-панель;
- быстрый «перевод» входа на другое устройство: логин по QR/коду, восстановление настроек входа и загрузка актуальной базы билетов.
Хороший офлайн-режим незаметен, пока всё работает, и спасает мероприятие, когда связь внезапно исчезает.
Интеграции: платежи, уведомления и экспорт данных
Интеграции превращают «приложение для мероприятий» в рабочий инструмент: деньги доходят организатору, участник вовремя получает билет, а команда — понятные отчёты после события.
Платежи: провайдер, статусы и вебхуки
Обычно подключают платёжного провайдера (банковский эквайринг/кошелёк) и строят процесс вокруг статусов платежа: создан, в обработке, успешен, неуспешен, возврат.
Ключевой элемент — вебхуки (уведомления от провайдера на ваш сервер). Именно вебхук должен считаться «истиной»: пользователь мог закрыть приложение, связь могла прерваться, но вебхук всё равно подтвердит оплату и позволит автоматически:
- выдать электронный билет QR;
- отправить чек/квитанцию (если применимо к вашей схеме продаж);
- зафиксировать комиссию/сборы и валюту;
- обработать возвраты и частичные возвраты.
Важно заранее продумать идемпотентность: один и тот же вебхук может прийти дважды — система не должна выдать два билета.
Уведомления: email/SMS/push и шаблоны
Уведомления лучше планировать как цепочку, а не разрозненные сообщения. Типовые этапы:
- После покупки: подтверждение оплаты + билет + правила входа (время, адрес, что показать на входе).
- За день/час до события: напоминание и быстрый доступ к QR.
- После чек-ина (опционально): «вход подтверждён» — полезно для спорных ситуаций.
Шаблоны держите в админ-панели: организатор меняет текст, но переменные (имя, событие, QR-ссылка, номер заказа) подставляются автоматически.
Экспорт и API для организаторов
Организаторам почти всегда нужен CSV-экспорт: продажи, список участников, статусы чек-ина, промокоды, возвраты. Для продвинутых — API, чтобы отправлять данные в CRM/таблицы/BI-аналитику без ручной выгрузки.
Импорт баз: списки приглашённых, квоты, промокоды
Полезно поддержать импорт:
- «white list» приглашённых (ФИО/телефон/email) для бесплатного входа;
- партнёрские квоты (сколько билетов доступно партнёру, отчёт по использованию);
- промокоды с правилами: скидка/фикс. цена, лимит, даты, применимость к типам билетов.
Если вы сравниваете уровни функций и интеграций, удобно вынести детали на /pricing, а подборки кейсов и разборы ошибок — в /blog.
Безопасность и персональные данные
Безопасность в билетном приложении — это не только «не дать пройти без билета», но и аккуратная работа с данными людей. Хорошая новость: для чек-ина обычно не нужен широкий профиль пользователя, и это упрощает соблюдение требований.
Минимизация и структура данных
Собирайте только то, что реально нужно для входа и отчётов: идентификатор билета, статус (действителен/использован/возврат), событие и зона входа. Персональные данные (ФИО, телефон, email) подключайте опционально — например, только если нужны именные билеты или отправка уведомлений.
Отдельно продумайте сроки хранения: операционные данные для события (например, списки входа) можно хранить ограниченное время, а затем агрегировать в статистику без привязки к личности.
Права доступа, роли и аудит
Разделите роли как минимум на: организатор (админ), контролёр (сканер) и поддержка. Ограничивайте доступ по событиям и даже по точкам входа: один контролёр видит только «свои» мероприятия и турникеты.
Добавьте журнал действий: кто и когда выполнял чек-ин, отменял проход, менял настройки, делал экспорт. Это помогает разбирать спорные ситуации и повышает дисциплину.
Защита от подделки билетов
QR-код должен быть не просто номером билета. Используйте подпись (например, HMAC/EdDSA) так, чтобы приложение сканера могло проверить подлинность без обращения к серверу (важно для офлайна).
Поддержите ротацию ключей: новые билеты подписываются свежим ключом, старые остаются проверяемыми в течение заданного периода. На API добавьте rate limiting и базовую защиту от перебора кодов.
Соответствие требованиям и управление жизненным циклом
Подготовьте понятную политику конфиденциальности, опишите цели обработки, сроки хранения, порядок удаления и обращений пользователей. Реализуйте удаление/анонимизацию по запросу и автоматическое удаление после завершения периода хранения.
Антифрод: покупки и «прокси-сканы»
Отмечайте подозрительные сценарии: массовые покупки с одного устройства, повторяющиеся попытки оплаты, аномально частые возвраты, множество регистраций на одинаковые контакты.
Для чек-ина следите за аномалиями: слишком быстрые сканы одним контролёром, попытки повторного прохода, сканы билетов «в разных входах одновременно». Такие события отправляйте на ручную проверку в админ-панели и ограничивайте риск автоматическими правилами.
Тестирование и пилотный запуск
Тестирование системы билетов и чек-ина стоит планировать как отдельный мини‑проект: здесь важны не только «правильные экраны», но и скорость, устойчивость к сбоям и поведение в нестандартных ситуациях. Ошибка на входе превращается в очередь за минуты.
Скорость сканирования
Проведите замеры на нескольких типичных устройствах контролёров (разные модели, «средние» камеры) и при разном освещении: дневной свет, полумрак, прожекторы, мерцание. Фиксируйте метрики: среднее время от наведения до результата, долю нераспознанных QR, влияние защитных стёкол и чехлов.
Нагрузочные сценарии
Нужны два вида нагрузочных тестов:
-
Пики продаж — одновременные покупки, выдача QR, отправка уведомлений.
-
Пики на входе — параллельная работа нескольких сканеров в одной зоне.
Проверяйте, не «задумывается» ли сервер, не растёт ли время ответа, корректно ли обрабатываются одновременные попытки пройти по одному билету.
Офлайн и синхронизация
Смоделируйте реальность: авиарежим, пропадающая сеть, переключение между Wi‑Fi и LTE. Важно проверить, что сканер:
- продолжает верификацию по локальным данным;
- корректно помечает события для последующей отправки;
- после восстановления связи синхронизируется без потерь и дублей.
Ошибки и спорные кейсы
Отдельно прогоните сценарии: дубли прохода, возврат/отмена, замена билета, неверная зона, ручная проверка по фамилии. Результат должен быть однозначным для контролёра: что делать дальше и кого звать.
Пилотное мероприятие
Пилот запускайте на небольшом событии с реальной аудиторией. Перед стартом — чек‑лист: актуальные списки, тестовый проход, запасные устройства/пауэрбанки, инструкции для персонала, контакты ответственных.
На площадке нужен план дежурства: кто принимает решения по спорным проходам, кто следит за связью и синхронизацией, кто собирает обратную связь. После пилота соберите отчёт: узкие места, причины задержек, список улучшений и приоритеты для следующего релиза.
Аналитика: продажи, посещаемость и эффективность чек-ина
Аналитика в приложении для билетов — это не «красивые графики», а инструмент управления: где теряются продажи, хватает ли персонала на входе, какие ошибки сканирования повторяются и как меняется посещаемость по времени. Метрики лучше продумать заранее, чтобы данные собирались автоматически и без ручных отчётов после мероприятия.
Метрики продаж: что происходит до входа
Организатору критично видеть воронку покупки: просмотр → выбор билета → оформление → оплата. Полезный минимум:
- Конверсия по шагам (в том числе по каналам и промокодам): откуда приходят покупатели и где «падают».
- Брошенные корзины: доля и динамика, а также причины (ошибка оплаты, таймаут, нет мест нужной категории).
- Промокоды: использование, средний чек, выручка, эффект на конверсию (например, промокод увеличил продажи, но снизил маржу).
Отдельно стоит выделять продажи по типам билетов (обычный/VIP/льготный), возвраты и апгрейды — это помогает прогнозировать нагрузку на входы и рассадку.
Метрики входа: скорость и качество чек-ина
На площадке нужны показатели, которые быстро отвечают на вопрос «успеваем ли мы»:
- Среднее время сканирования (и распределение: медиана/95-й перцентиль) — чтобы понять, есть ли узкие места.
- Процент отказов (не пропущено) и причины ошибок: уже использован, не найден, просрочен, неверный формат QR, нет синхронизации, билет другого события.
- Пропускная способность по каждому входу/сканеру: сколько людей в минуту/час реально проходит.
Если ошибки типовые, их стоит выводить контролёру понятным текстом и собирать статистику — это ускоряет обучение персонала и уменьшает очередь.
Отчёты для организатора: посещаемость в разрезах
После мероприятия важны отчёты, которые помогают делать следующие события лучше:
- Посещаемость по часам (пики и провалы),
- по входам (какие точки перегружены),
- по типам билетов (кто реально пришёл),
- доля пришедших от проданных (no-show).
Эти отчёты удобно выгружать в CSV/XLSX и смотреть вместе с финансовыми данными.
Оперативный мониторинг: «что происходит сейчас»
В админ-панели нужен дашборд реального времени: продано/вошло, текущий темп входа, активные сканеры, очередь по входам (хотя бы косвенно — по задержкам сканов). Такой экран полезно держать открытым у руководителя смены.
Как улучшать продукт по данным и отзывам персонала
Добавьте быстрый сбор обратной связи от контролёров: кнопка «сообщить проблему» с категориями (связь, камера, подсветка, конфликт с гостем) и коротким комментарием. Совмещая это с метриками ошибок и временем скана, вы получите понятный список улучшений — от подсказок в интерфейсе до изменений в логике проверки билетов.
План разработки: MVP, сроки и приоритеты
Хороший чек-ин строится не вокруг «всех функций сразу», а вокруг минимального набора, который выдержит реальное мероприятие: очередь, плохую связь, человеческий фактор и необходимость быстро получить отчёт. Поэтому план лучше начинать с MVP и заранее расписать, что пойдёт во второй и третий релизы.
MVP за 4–8 недель: что обязательно
Для первой версии достаточно функциональности, которая закрывает полный цикл «купил билет → пришёл → прошёл контроль»:
- базовый билет и его статус (активен/использован/аннулирован);
- QR-код для билета и проверка на входе;
- приложение-сканер для контролёра (проверка + фиксация результата);
- список событий (чтобы контролёр не сканировал «не тот» QR);
- простой отчёт по проходам (сколько вошло, сколько отклонено и почему).
Срок 4–8 недель реалистичен, если не усложнять правила доступа (места, таймслоты, сложные категории) и не пытаться сразу покрыть все интеграции.
План релизов: что добавлять дальше
После MVP логично нарастить возможности, которые чаще всего просят организаторы:
- места и сектора (контроль по зоне, валидация «не в тот вход»);
- таймслоты (окна входа, ограничение по времени);
- промокоды и скидки;
- мерч и доп. позиции к заказу;
- бейджи и печать/экспорт для регистрации на стойке.
Важно: каждую функцию планировать вместе с изменениями в админ-панели и отчётах, иначе появится «невидимая» работа, которая съедает сроки.
Команда и роли
Минимальный состав, чтобы уложиться в сроки и не провалить качество:
- продакт/PM: сценарии, приоритеты, приёмка;
- дизайнер: быстрые потоки участника и контролёра;
- мобильная разработка (1–2 человека): сканер + участник;
- бэкенд: билеты, статусы, безопасность, синхронизация;
- QA: проверки на реальных устройствах, стресс-тесты чек-ина.
Технологии без перегруза
Кроссплатформа подходит, если нужно быстрее выпустить две платформы и интерфейсы не перегружены. Нативная разработка чаще оправдана, когда критичны скорость сканирования, работа камеры на разных устройствах и нестандартные требования площадки. Практичное правило: если сканер — ключевой риск, уделите ему максимум внимания независимо от стека.
Риски и статьи бюджета, о которых забывают
Помимо разработки заложите:
- поддержку на мероприятии (дежурный инженер/чат);
- устройства для контролёров и запасные аккумуляторы;
- связь: SIM/точки Wi‑Fi, план на случай отсутствия сети;
- тестовый пилот на небольшом событии до большого запуска.
FAQ
Сколько времени занимает запуск MVP приложения для билетов и чек-ина?
Для большинства команд реалистичный ориентир — 4–8 недель на MVP, если держать правила доступа простыми.
Минимальный набор:
- выпуск билета и статус (активен/использован/аннулирован);
- QR и проверка на входе;
- приложение-сканер (быстрый скан + фиксация результата);
- базовая админ-панель (события, список заказов, права);
- простой отчёт по проходам и причинам отказов.
Какие модули нужны в системе: участник, сканер и админ-панель?
Оптимально разделить систему на три интерфейса:
- Участник: покупка/получение билета, «кошелёк» с QR, статусы, помощь.
- Контролёр: максимально быстрый скан, крупный результат, офлайн, журнал действий.
- Организатор (веб): настройки события, типы билетов, права, отчёты, экспорт.
Так проще управлять доступами и снижать риск ошибок на входе.
Как правильно сделать офлайн-режим для сканера на входе?
Офлайн нужен, чтобы очередь не зависела от качества связи на площадке.
Практичный подход:
- заранее загрузить локальный кэш «разрешённых билетов» по событию/зоне;
- проверять подпись и срок действия QR локально;
- сохранять все сканы в локальную очередь и синхронизировать при появлении сети.
Важно заранее предупредить организатора о риске дублей при длительной работе без синхронизации.
Что должно быть внутри QR-кода и как защититься от подделок?
QR лучше делать не «номером билета», а токеном, который проверяется правилами системы.
Хорошая практика:
- хранить в QR короткий токен (без персональных данных);
- добавлять криптографическую подпись (например, HMAC/EdDSA), чтобы сканер мог проверить подлинность;
- инвалидировать токен при возврате/обмене;
- помечать билет «использован» при первом успешном проходе.
Так снижается риск подделки и пересылки скриншотов.
Какой должна быть модель данных для событий и билетов?
Нужен предсказуемый набор сущностей, чтобы покупки, проход и отчёты работали без ручных правок.
Минимум обычно такой:
- событие (часовой пояс, правила) и сессии/даты;
- тип билета (цена, ограничения, квоты);
- билет-экземпляр (токен, статус, привязка к заказу/участнику);
- правила доступа (день/сеанс/зона/таймслот/число проходов).
Статусы продумывайте заранее: «оплачен/выдан/аннулирован/возврат/обмен/использован».
Как обрабатывать ситуацию, когда один билет просканировали два раза?
Типовой конфликт — когда один и тот же QR сканируют два устройства почти одновременно.
Надёжная схема:
- каждый скан — это событие с временем и ID устройства;
- сервер принимает первое событие как успешное, остальные помечает как дубликат;
- сканер показывает контролёру понятную причину: где и когда билет уже был использован.
Это особенно важно при офлайне и последующей синхронизации.
Как измерять и улучшать скорость прохода на входе?
Скорость зависит от устройств, света, качества камеры и того, сколько действий должен сделать контролёр.
Что помогает:
- запуск сканера сразу в режиме камеры («один скан — один ответ»);
- крупная индикация результата и короткая подсказка действия;
- локальная проверка (кэш + подпись) при слабом интернете;
- ручной поиск по имени/телефону/номеру заказа как запасной сценарий.
В тестах измеряйте медиану и 95-й перцентиль времени скана, а не только среднее.
Какие интеграции с оплатой обязательны и зачем нужны вебхуки?
Оплата должна подтверждаться не экраном «успех», а событием от провайдера.
Практические правила:
- используйте вебхуки как источник истины;
- делайте обработку идемпотентной (один и тот же вебхук не должен выдавать второй билет);
- храните статусы платежа (создан/в обработке/успешен/неуспешен/возврат);
- автоматически выдавайте QR и отправляйте подтверждение после успешного вебхука.
Это снижает число обращений в поддержку в день события.
Какая аналитика нужна организатору до, во время и после мероприятия?
Начните с отчётов, которые помогают управлять входом и продажами, а не просто рисуют графики.
Полезный минимум:
- воронка покупки (просмотр → выбор → оформление → оплата);
- продано vs вошло, no-show;
- причины отказов на входе (уже использован, не найден, не та зона/день);
- пропускная способность по входам/сканерам и пики по времени.
Для выгрузок достаточно CSV, а расширение можно вынести в экспорт из /reports.
Как минимизировать риски по персональным данным и доступам в билетном приложении?
Чек-ин обычно не требует «широкого профиля» пользователя — это плюс для безопасности.
Рекомендации:
- собирайте только нужное (статус билета, событие, зона, история проходов);
- персональные данные подключайте по необходимости (именные билеты, уведомления);
- разделяйте роли и доступы (организатор/контролёр/поддержка) и ведите аудит действий;
- задайте сроки хранения и реализуйте удаление/анонимизацию по запросу.
Потеря устройства контролёра не должна раскрывать лишние данные.