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

54-ФЗ и фискализация в Telegram-боте

Как соблюсти 54-ФЗ при приёме платежей в Telegram-боте: чеки, ОФД, кассовая техника. Что делает провайдер, что вы, и как избежать штрафов.

  • Telegram
  • 54-ФЗ
  • оплата

54-ФЗ — закон, который требует выдавать электронный чек при любом приёме денежных средств от физлица. В Telegram-боте это не отменяется и не уходит в серую зону: налоговая видит входящие на расчётный счёт, видит выгрузки эквайеров, видит чеки в ОФД — и автоматически сверяет суммы. Несовпадение становится поводом для проверки. Разберём по порядку, кто и что обязан делать, какие есть рабочие схемы интеграции, как формировать корректный чек на каждом типе платежа и где спрятаны штрафы.

Что такое 54-ФЗ простыми словами

Федеральный закон №54-ФЗ «О применении контрольно-кассовой техники» обязывает продавца при каждом расчёте с покупателем-физлицом или ИП:

  • Сформировать кассовый чек или бланк строгой отчётности на момент расчёта.
  • Передать фискальные данные через ОФД (оператора фискальных данных) в ФНС.
  • Выдать чек покупателю — в бумажном виде или электронно (на email, телефон, в мессенджер по ссылке).

«Расчёт» по закону — это не только наличные. Это и оплата картой, и СБП, и любой безнал от физлица, и зачёт аванса, и выдача товара после предоплаты. На каждое событие — отдельный чек.

Закон применяется в том числе к интернет-торговле, дистанционным услугам, подпискам и цифровым товарам. Продаёте курс через бота — нужен чек. Продаёте подписку — нужен чек на каждое продление. Берёте предоплату — нужен чек на аванс, потом ещё один на зачёт.

Кому фискализация нужна, а кому нет

Согласно ст. 1.2 54-ФЗ, ККТ обязаны применять все организации и ИП при расчётах на территории РФ — за исключением закрытого списка случаев.

Кому фискализация нужна:

  • ИП и юрлица, принимающие деньги от физлиц или ИП за товары, работы, услуги.
  • Любые продажи цифровых товаров и подписок физлицам, в том числе через Telegram-бот.
  • Маркетплейсы и агрегаторы (с особенностями: чек агента).

Кому фискализация не нужна (или применяется иначе):

  • Самозанятые (плательщики НПД) — выдают чек через приложение «Мой налог», ККТ не используют.
  • Безналичные расчёты между юрлицами и ИП без предъявления банковской карты — оформляются счетами и счетами-фактурами.
  • Отдельные виды деятельности на ПСН (патентная система) — закрытый перечень в законе, актуальность нужно проверять перед запуском.
  • Кредитные организации в ряде операций.

Список исключений периодически меняется — перед запуском проекта сверяйтесь с актуальной редакцией закона и письмами ФНС.

Способы фискализации в Telegram-боте

В порядке популярности:

  1. Платёжный провайдер с фискализацией — ЮKassa, CloudPayments, Тинькофф Касса, Робокасса. Провайдер сам формирует чек по данным из запроса и передаёт в ОФД. Самый простой путь.
  2. Облачная касса — отдельный сервис (АТОЛ Онлайн, Эвотор Онлайн, Контур.ОФД, Бизнес.Ру), который вы вызываете из бэкенда после получения денег. Подходит, когда платёж идёт мимо провайдера с фискализацией (например, прямой СБП).
  3. Физическая онлайн-касса — реальное устройство в офисе, подключённое по API. Дороже на старте, дешевле при больших оборотах.
  4. «Мой налог» для самозанятых — формирует чек НПД, не подпадает под 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_modefull_prepayment, partial_prepayment, advance, full_payment, partial_payment, credit, credit_payment.
  • payment_subjectcommodity, 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 НК РФ — это уже в рамках налоговой проверки, не КоАП.

Контроль ФНС

Нарушение находят тремя способами:

  1. Автоматическая сверка через ОФД. Налоговая видит все чеки в реальном времени. Если входящие на расчётный счёт от эквайера за месяц не бьются с суммой чеков по этой кассе — это автоматический сигнал.
  2. Жалобы клиентов. Покупатель не получил чек на email — пишет в ФНС через сервис «Проверка чека». Жалоба превращается в внеплановую проверку.
  3. Контрольная закупка. Сотрудник ФНС покупает у вас товар или услугу через бот и смотрит, пришёл ли чек. Это легальный инструмент с 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 НК РФ.