54-ФЗ — закон, который требует выдавать электронный чек при любом приёме денежных средств от физлица. В Telegram-боте это не отменяется и не уходит в серую зону: налоговая видит входящие на расчётный счёт, видит выгрузки эквайеров, видит чеки в ОФД — и автоматически сверяет суммы. Несовпадение становится поводом для проверки. Разберём по порядку, кто и что обязан делать, какие есть рабочие схемы интеграции, как формировать корректный чек на каждом типе платежа и где спрятаны штрафы.
Что такое 54-ФЗ простыми словами
Федеральный закон №54-ФЗ «О применении контрольно-кассовой техники» обязывает продавца при каждом расчёте с покупателем-физлицом или ИП:
- Сформировать кассовый чек или бланк строгой отчётности на момент расчёта.
- Передать фискальные данные через ОФД (оператора фискальных данных) в ФНС.
- Выдать чек покупателю — в бумажном виде или электронно (на email, телефон, в мессенджер по ссылке).
«Расчёт» по закону — это не только наличные. Это и оплата картой, и СБП, и любой безнал от физлица, и зачёт аванса, и выдача товара после предоплаты. На каждое событие — отдельный чек.
Закон применяется в том числе к интернет-торговле, дистанционным услугам, подпискам и цифровым товарам. Продаёте курс через бота — нужен чек. Продаёте подписку — нужен чек на каждое продление. Берёте предоплату — нужен чек на аванс, потом ещё один на зачёт.
Кому фискализация нужна, а кому нет
Согласно ст. 1.2 54-ФЗ, ККТ обязаны применять все организации и ИП при расчётах на территории РФ — за исключением закрытого списка случаев.
Кому фискализация нужна:
- ИП и юрлица, принимающие деньги от физлиц или ИП за товары, работы, услуги.
- Любые продажи цифровых товаров и подписок физлицам, в том числе через Telegram-бот.
- Маркетплейсы и агрегаторы (с особенностями: чек агента).
Кому фискализация не нужна (или применяется иначе):
- Самозанятые (плательщики НПД) — выдают чек через приложение «Мой налог», ККТ не используют.
- Безналичные расчёты между юрлицами и ИП без предъявления банковской карты — оформляются счетами и счетами-фактурами.
- Отдельные виды деятельности на ПСН (патентная система) — закрытый перечень в законе, актуальность нужно проверять перед запуском.
- Кредитные организации в ряде операций.
Список исключений периодически меняется — перед запуском проекта сверяйтесь с актуальной редакцией закона и письмами ФНС.
Способы фискализации в Telegram-боте
В порядке популярности:
- Платёжный провайдер с фискализацией — ЮKassa, CloudPayments, Тинькофф Касса, Робокасса. Провайдер сам формирует чек по данным из запроса и передаёт в ОФД. Самый простой путь.
- Облачная касса — отдельный сервис (АТОЛ Онлайн, Эвотор Онлайн, Контур.ОФД, Бизнес.Ру), который вы вызываете из бэкенда после получения денег. Подходит, когда платёж идёт мимо провайдера с фискализацией (например, прямой СБП).
- Физическая онлайн-касса — реальное устройство в офисе, подключённое по API. Дороже на старте, дешевле при больших оборотах.
- «Мой налог» для самозанятых — формирует чек НПД, не подпадает под 54-ФЗ.
Сравнение облачных касс
| Сервис | Стоимость | Цена за чек | Фискальный накопитель | Особенности |
|---|---|---|---|---|
| АТОЛ Онлайн | от 2 500 ₽/мес | включено в тариф | в облаке | надёжная интеграция, развитый API |
| Эвотор Онлайн | от 1 700 ₽/мес | включено | в облаке | простой кабинет, привязка к бренду Эвотор |
| Контур.ОФД (Касса) | от 2 000 ₽/мес | включено | в облаке | удобно, если уже работаете с СКБ Контур |
| Бизнес.Ру Онлайн-чеки | от 1 500 ₽/мес | до 1 ₽ сверх лимита | в облаке | подходит для микро-оборотов |
| МодульКасса Облако | от 1 900 ₽/мес | включено | в облаке | связка с РКО Модульбанка |
Выбор зависит от объёма расчётов и удобства интеграции. У АТОЛ — самый стабильный API, у Эвотора — наиболее массовое внедрение, у Контура — лучшая интеграция с бухгалтерией.
Кто формирует чек: вы или провайдер
Это первый вопрос, который нужно решить ещё до написания кода.
Чек формирует провайдер, если:
- Вы используете ЮKassa / CloudPayments / Тинькофф / Робокассу и в кабинете провайдера включена опция «фискализация» с привязанной онлайн-кассой (своей или арендованной у провайдера).
- В запросе
sendInvoiceили в API провайдера вы передаёте корректный объектreceiptс составом покупки.
Чек формируете вы сами через свою кассу, если:
- Принимаете оплату напрямую через шлюз без фискализации (например, прямой СБП через банк-партнёр без кассового модуля).
- Используете Telegram Stars и реализуете цифровые товары/услуги от своего юрлица в РФ.
- Работаете по агентской модели и обязаны выпустить чек агента.
Когда провайдер фискализирует, всё, что от вас требуется в коде — корректно сформировать receipt и передать его. Когда фискализируете сами — нужен отдельный API-вызов в кассу.
Реквизиты чека по 54-ФЗ
В каждом чеке должны быть:
- Предмет расчёта — название товара/услуги.
- Количество и цена за единицу.
- Сумма расчёта с учётом скидок.
- Ставка НДС (20%, 10%, 0%, без НДС).
- Признак расчёта — приход, возврат прихода, расход, возврат расхода.
- Способ расчёта — предоплата 100%, частичная предоплата, полная оплата, аванс, кредит, оплата кредита.
- Признак предмета расчёта — товар, подакцизный товар, работа, услуга, ставка азартной игры, лотерейный билет, предоставление РИД, платёж (аванс/задаток), агентское вознаграждение, имущественное право и др.
- Email или телефон покупателя — для отправки электронного чека (обязательно при дистанционной торговле).
- Код маркировки — для маркируемых товаров (Честный знак: табак, обувь, парфюмерия, молочка, лекарства, шины и т.д.).
Сбор email/телефона перед оплатой — критично. В Telegram-боте удобнее всего запросить контакт через request_contact или предложить ввести email текстом.
Признаки расчёта и способа расчёта
| Сценарий | Признак расчёта | Способ расчёта |
|---|---|---|
| Покупка курса с моментальной оплатой | приход | полный расчёт |
| Предоплата за подписку | приход | предоплата 100% |
| Частичная предоплата за товар | приход | частичная предоплата |
| Списание подписки в дате продления | приход | полный расчёт |
| Возврат денег клиенту | возврат прихода | полный расчёт |
| Зачёт ранее внесённого аванса при выдаче товара | приход | полный расчёт + признак «зачёт аванса» |
В типичной подписке через Telegram-бот на каждое успешное автосписание формируется новый чек с признаком «приход», способом «полный расчёт». Старый чек продлевать нельзя — это новый расчёт.
JSON-структура чека для ЮKassa
Пример объекта receipt, который передаётся в provider_data:
{
"receipt": {
"customer": {
"email": "client@example.com",
"phone": "+79991234567"
},
"items": [
{
"description": "Подписка Pro на 30 дней",
"quantity": "1.00",
"amount": {
"value": "499.00",
"currency": "RUB"
},
"vat_code": 1,
"payment_mode": "full_prepayment",
"payment_subject": "service"
}
]
}
}
Где:
vat_code: 1— без НДС (для УСН),2— НДС 0%,3— 10%,4— 20%,5/6— расчётные.payment_mode—full_prepayment,partial_prepayment,advance,full_payment,partial_payment,credit,credit_payment.payment_subject—commodity,excise,job,service,gambling_bet,gambling_prize,lottery,intellectual_activity,payment,agent_commission,property_right,non_operating_gain,insurance_premium,sales_tax,resort_fee,composite,another.
Запрос к АТОЛ Онлайн на формирование чека
Если используете отдельную облачную кассу, сценарий такой: после successful_payment бэкенд бота получает токен в АТОЛ и отправляет JSON со составом чека.
import httpx
from datetime import datetime, timezone
ATOL_LOGIN = "your_login"
ATOL_PASSWORD = "your_password"
ATOL_GROUP = "your_group_code"
async def get_atol_token() -> str:
async with httpx.AsyncClient() as c:
r = await c.post(
"https://online.atol.ru/possystem/v4/getToken",
json={"login": ATOL_LOGIN, "pass": ATOL_PASSWORD},
timeout=10,
)
return r.json()["token"]
async def send_receipt_atol(order_id: str, email: str, items: list[dict]) -> str:
token = await get_atol_token()
payload = {
"external_id": order_id,
"receipt": {
"client": {"email": email},
"company": {
"email": "shop@example.com",
"sno": "usn_income",
"inn": "770000000000",
"payment_address": "https://t.me/your_bot",
},
"items": items,
"payments": [
{"type": 1, "sum": sum(i["sum"] for i in items)}
],
"total": sum(i["sum"] for i in items),
},
"timestamp": datetime.now(timezone.utc).strftime("%d.%m.%Y %H:%M:%S"),
}
async with httpx.AsyncClient() as c:
r = await c.post(
f"https://online.atol.ru/possystem/v4/{ATOL_GROUP}/sell",
headers={"Token": token},
json=payload,
timeout=15,
)
return r.json()["uuid"] # сохраняем для аудита
uuid — это идентификатор задачи на формирование чека. Через 5–60 секунд статус можно опросить методом GET /report/{uuid} и получить ссылку на чек в ОФД.
Обработка успешного платежа в боте + чек
Полный путь от successful_payment до сохранения фискального идентификатора:
from aiogram import F, Router
from aiogram.types import Message
router = Router()
@router.message(F.successful_payment)
async def on_paid(message: Message):
sp = message.successful_payment
order_id = sp.invoice_payload
amount_rub = sp.total_amount / 100
# 1. Сохраняем платёж в БД
order = await db.orders.get(order_id)
await db.payments.insert(
order_id=order_id,
provider_payment_id=sp.provider_payment_charge_id,
amount=amount_rub,
currency=sp.currency,
user_id=message.from_user.id,
)
# 2. Если провайдер не фискализирует — сами шлём чек
if not order.provider_fiscalizes:
receipt_uuid = await send_receipt_atol(
order_id=order_id,
email=order.customer_email,
items=[{
"name": order.product_name,
"price": amount_rub,
"quantity": 1.0,
"sum": amount_rub,
"payment_method": "full_payment",
"payment_object": "service",
"vat": {"type": "none"},
}],
)
await db.orders.update(order_id, fiscal_receipt_id=receipt_uuid)
# 3. Выдаём товар/доступ
await grant_access(order)
await message.answer("Оплата получена, чек отправлен на email.")
Ключевой момент — сохраняем provider_payment_charge_id и fiscal_receipt_id рядом с заказом. По этой паре вы потом найдёте платёж и в эквайринге, и в ОФД при сверке.
Подписки и рекуррентные платежи
Каждое автосписание — это новый расчёт по 54-ФЗ. Соответственно:
- При первом платеже — чек с признаком «приход», способом «полный расчёт» (или «предоплата 100%», если услуга оказывается позже).
- При каждом продлении — отдельный чек на сумму списания.
- Если подписка с триалом и первое списание = 0 ₽ — чек не нужен (нет расчёта).
- При downgrade с пропорциональным возвратом — чек «возврат прихода» на разницу.
Технически провайдер при рекуррентных списаниях обычно сам формирует чек, если фискализация включена и в исходном платеже была передана корректная receipt. Проверьте это в кабинете провайдера и в логах: на каждое продление в ОФД должен уходить документ.
Возвраты
Возврат — отдельный фискальный документ с признаком «возврат прихода». Состав чека повторяет исходный (тот же предмет, та же ставка НДС), сумма равна сумме возврата.
{
"type": "refund",
"receipt": {
"customer": {"email": "client@example.com"},
"items": [
{
"description": "Подписка Pro на 30 дней",
"quantity": "1.00",
"amount": {"value": "499.00", "currency": "RUB"},
"vat_code": 1,
"payment_mode": "full_payment",
"payment_subject": "service"
}
],
"settlements": [
{"type": "cashless", "amount": {"value": "499.00", "currency": "RUB"}}
]
}
}
Не делайте возврат «на руки» или «через карту» без фискального документа: при сверке ФНС увидит расхождение между минусовой операцией в эквайринге и отсутствием возвратного чека.
Маркировка товаров (Честный знак)
Если продаёте маркируемый товар (табак, обувь, парфюмерия, шины, шубы, молочная продукция, лекарства, упакованная вода и т.д.), в чеке обязательно указывается код маркировки (Data Matrix). Без него чек не примут в ОФД, продажа будет нелегальной.
Для бота это означает: на этапе сборки заказа нужно отсканировать код у каждой единицы товара и передать его в receipt.items[].mark_code (формат зависит от провайдера и кассы). Для цифровых товаров и услуг маркировка не требуется.
Чек агента: маркетплейс через бот
Если вы работаете как маркетплейс и принимаете деньги в пользу третьих лиц-продавцов, в чеке указывается:
- Признак агента —
agent,commissioner,attorney,payment_agent,bank_payment_agentи др. - ИНН поставщика — реальный продавец товара/услуги.
- Наименование поставщика и его телефон.
- Агентское вознаграждение — отдельной строкой как
payment_subject: "agent_commission".
Несоблюдение этих реквизитов превращает агентскую схему в обычную продажу и налоговая может доначислить НДС/налог на прибыль на всю выручку.
Если поставщики в вашем боте — самозанятые, у них обязанность выпустить чек НПД через «Мой налог» сохраняется параллельно с вашим агентским чеком.
НПД (самозанятые) и приложение «Мой налог»
Для самозанятых-продавцов 54-ФЗ применяется иначе. Они не используют ККТ, не подписывают договор с ОФД, не платят за облачную кассу. Вместо этого:
- После получения денег вызывают API «Мой налог» (ФНС предоставляет открытый REST API).
- Получают
receipt_idи ссылку на чек. - Передают ссылку покупателю.
Технически в боте это выглядит так:
import httpx
async def npd_create_receipt(token: str, amount: float, name: str) -> str:
payload = {
"paymentType": "CASH",
"client": {"contactPhone": None, "displayName": None, "incomeType": "FROM_INDIVIDUAL"},
"requestTime": "2026-05-04T12:00:00+03:00",
"operationTime": "2026-05-04T12:00:00+03:00",
"services": [
{"name": name, "amount": amount, "quantity": 1}
],
"totalAmount": str(amount),
}
async with httpx.AsyncClient() as c:
r = await c.post(
"https://lknpd.nalog.ru/api/v1/income",
headers={"Authorization": f"Bearer {token}"},
json=payload,
timeout=10,
)
data = r.json()
return f"https://lknpd.nalog.ru/api/v1/receipt/{data['approvedReceiptUuid']}/print"
Ограничения НПД: годовой доход до 2.4 млн ₽, нельзя нанимать сотрудников, нельзя торговать чужим товаром (кроме собственной агентской схемы), нельзя сдавать нежилую недвижимость. Превысите лимит — слетите с НПД задним числом и придётся пересчитывать налоги.
Telegram Stars и фискализация
Stars — внутренняя валюта Telegram (валютный код XTR). Юридически это цифровой товар, который пользователь покупает у Telegram, а затем тратит в боте. Деньги собираются Telegram, выплачиваются через Fragment.
С точки зрения 54-ФЗ ситуация неоднозначная и зависит от схемы:
- Когда вы как российское юрлицо/ИП реализуете цифровой товар или услугу за Stars и затем выводите средства в фиат — фактически вы получили оплату за реализацию. ФНС может квалифицировать это как расчёт с физлицом, требующий чека.
- Аргумент «деньги пришли от Telegram, а не от физлица» — слабый, поскольку первоначальный плательщик идентифицируется.
Безопасная практика: при продаже за Stars формируйте обычный фискальный чек на дату фактической реализации, по курсу пересчёта Stars в рубли. Лучше переплатить за чек, чем получить штраф 75% от выручки. Когда судебная практика устоится, можно будет смягчить подход.
Штрафы по ст. 14.5 КоАП
| Нарушение | ИП | Юрлицо |
|---|---|---|
| Неприменение ККТ | 25–50% суммы расчёта, мин. 10 000 ₽ | 75–100% суммы расчёта, мин. 30 000 ₽ |
| Повторное неприменение ККТ (если сумма ≥ 1 млн ₽) | дисквалификация 1–2 года | приостановление деятельности до 90 суток |
| Применение ККТ с нарушениями (неверные реквизиты, нет передачи в ОФД) | 1 500–3 000 ₽ | 5 000–10 000 ₽ |
| Невыдача чека покупателю | 2 000 ₽ | 10 000 ₽ |
| Нарушения при работе с маркированным товаром | до 15 000 ₽ | до 300 000 ₽ |
Дополнительно: налоговая может доначислить налоги, пени и штраф 20–40% по 122 НК РФ — это уже в рамках налоговой проверки, не КоАП.
Контроль ФНС
Нарушение находят тремя способами:
- Автоматическая сверка через ОФД. Налоговая видит все чеки в реальном времени. Если входящие на расчётный счёт от эквайера за месяц не бьются с суммой чеков по этой кассе — это автоматический сигнал.
- Жалобы клиентов. Покупатель не получил чек на email — пишет в ФНС через сервис «Проверка чека». Жалоба превращается в внеплановую проверку.
- Контрольная закупка. Сотрудник ФНС покупает у вас товар или услугу через бот и смотрит, пришёл ли чек. Это легальный инструмент с 2020 года.
Для бота особенно опасна автоматическая сверка: вы не контролируете её и не знаете о расхождении до момента вызова на ковёр.
Архитектура фискализации в коде
Минимальная схема: webhook от шлюза или successful_payment от Telegram → проверка подписи → идемпотентное сохранение по provider_payment_id → если провайдер не фискализирует, формируем JSON чека и шлём в кассу → пишем fiscal_receipt_id в заказ → через 60 секунд джоб опрашивает статус чека и подтягивает ссылку из ОФД → на ошибку алерт и повторная попытка с экспоненциальным бэкоффом → пользователю в чат уходит подтверждение и ссылка на чек.
Все фискальные операции логируем отдельной таблицей с полями: запрос, ответ, статус, время, order_id, provider_payment_id. По 402-ФЗ хранение 5 лет с регулярной резервной копией — на запрос ФНС нужно будет выгрузить любые чеки за период.
Итого
54-ФЗ работает в Telegram-боте без поблажек, обходных путей нет. Для большинства проектов оптимальна связка: эквайринг с фискализацией (ЮKassa, Тинькофф, CloudPayments) + аккуратное заполнение receipt на каждом sendInvoice. Когда платёж идёт мимо такого провайдера — подключайте облачную кассу (АТОЛ, Эвотор) и формируйте чек через её API. Самозанятым касса не нужна — выпускают чек через «Мой налог». Подписки требуют чека на каждое продление, возвраты — отдельного чека «возврат прихода». Сохраняйте fiscal_receipt_id рядом с каждым заказом, храните логи 5 лет, проверяйте выдачу чека контрольной покупкой. Штрафы по ст. 14.5 КоАП достигают 100% суммы расчёта — экономить на фискализации дороже, чем подключить её сразу.
Частые вопросы
Что требует 54-ФЗ при оплате через Telegram-бот?
При получении оплаты от физического лица продавец обязан сформировать кассовый чек на момент расчёта, передать данные в ОФД и оттуда в ФНС, выдать электронный чек покупателю на email или телефон. Это касается всех сделок с физлицами: B2C, ИП, ООО. Telegram-бот не освобождает от этой обязанности — налоговая видит входящие на расчётный счёт и автоматически сверяет с чеками в ОФД. Расхождение становится поводом для проверки. Нельзя «прятаться за провайдером»: если деньги в итоге приходят к вам, обязанность выпустить чек на вас.
Как фискализировать платежи через ЮKassa в Telegram-боте?
ЮKassa, CloudPayments, Тинькофф Касса, Робокасса — у всех есть опция формирования чеков. В кабинете подключаете онлайн-кассу (свою или арендованную у провайдера), включаете фискализацию. В коде в каждом sendInvoice или платёжном запросе передаёте объект receipt с составом покупки, ставками НДС, email или телефоном клиента. Провайдер сам формирует чек через свой ОФД, покупатель получает его на почту. Касса физическая не нужна. Это самая простая и дешёвая схема для большинства проектов.
Когда нужна облачная касса для бота и сколько стоит?
Облачная касса нужна, когда платёж приходит мимо провайдера с фискализацией — например, прямой СБП через банк-партнёр без кассового модуля, продажа за Telegram Stars от российского юрлица, нестандартные агентские схемы. Популярные сервисы: АТОЛ Онлайн, Эвотор Онлайн, Контур.ОФД, Бизнес.Ру. Стоимость от 1 500 до 2 500 ₽ в месяц с включёнными чеками. Бэкенд бота после получения денег вызывает REST API кассы со составом чека, касса передаёт документ в ОФД и отправляет покупателю.
Как самозанятому фискализировать продажи через Telegram-бот?
Самозанятые работают по налогу на профессиональный доход (НПД), 54-ФЗ к ним не применяется. Чеки формируются через приложение или открытый API «Мой налог»: бот после оплаты отправляет POST на lknpd.nalog.ru/api/v1/income, получает receipt_id и ссылку на чек, отправляет ссылку покупателю в Telegram. Касса, ОФД, договоры не нужны. Ограничения НПД: годовой доход до 2.4 млн ₽, без сотрудников, нельзя торговать чужим товаром. Превышение лимита приводит к слёту с режима задним числом.
Какие реквизиты обязательны в чеке для бота?
В каждом чеке: предмет расчёта (название), количество и цена, сумма, ставка НДС, признак расчёта (приход, возврат прихода, расход, возврат расхода), способ расчёта (предоплата 100%, частичная, полная оплата, аванс), признак предмета расчёта (товар, работа, услуга, подписка, агентское вознаграждение и т.д.), email или телефон покупателя для электронного чека. Для маркируемых товаров (табак, обувь, парфюмерия, молочка, лекарства) — код маркировки Data Matrix. Email или телефон собираются перед платежом через request_contact или текстовым вводом.
Как фискализировать подписки и рекуррентные платежи?
Каждое автосписание — отдельный расчёт по 54-ФЗ. На первый платёж формируется чек с признаком «приход» и способом «полный расчёт» (или «предоплата 100%», если услуга оказывается позже). На каждое продление — новый чек на сумму списания. При триале с нулевым списанием чек не нужен (нет расчёта). При downgrade с пропорциональным возвратом — чек «возврат прихода» на разницу. Провайдер обычно фискализирует автосписания сам, если в исходном платеже была корректная receipt. Проверяйте это в логах ОФД.
Какие штрафы за нарушение 54-ФЗ?
По ст. 14.5 КоАП: неприменение ККТ — для ИП 25–50% суммы расчёта (минимум 10 000 ₽), для юрлица 75–100% суммы (минимум 30 000 ₽). Повторное нарушение при сумме от 1 млн ₽ — дисквалификация ИП на 1–2 года или приостановление деятельности юрлица до 90 суток. Применение ККТ с нарушениями реквизитов — 1 500–10 000 ₽. Невыдача чека покупателю — 2 000 ₽ для ИП, 10 000 ₽ для юрлица. Нарушения по маркированным товарам — до 300 000 ₽. Дополнительно ФНС доначислит налоги, пени и штраф 20–40% по 122 НК РФ.