Tilda · 6 мин чтения

Калькулятор НДС на сайте: виджет для корзины Tilda

Я регулярно дорабатываю корзину Tilda под конкретную бухгалтерию, и вопрос с расчётом налога всплывает в половине проектов на общей системе налогообложения. Штатная корзина считает сумму товаров и скидку, а калькулятор НДС на сайте туда придётся встраивать руками: заводить ставку по каждой позиции, пересчитывать итог при любом изменении корзины и передавать сумму налога в чек для эквайринга. Расскажу, как я обычно собираю такой виджет на практике и какие грабли встречаются чаще всего.

Почему в Tilda нет встроенного расчёта НДС

Tilda задумана как конструктор лендингов и интернет-магазинов для быстрого старта, а не как учётная система. Штатная корзина (блок T‑Cart) хранит цену товара, количество и скидку, но поля под ставку налога там нет в принципе. Если продавец работает на упрощёнке, это не проблема: чек формируется без НДС. Но как только магазин переходит на общую систему или совмещает товары с разными ставками (например, продукты питания по 10% и бытовую химию по 20%), в интерфейсе Tilda для этого нет ни настройки, ни отдельного поля в выгрузке заказов.

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

Как устроен калькулятор НДС на сайте: логика виджета

Идея простая: скрипт слушает изменения корзины Tilda, для каждой позиции знает свою ставку и на лету пересчитывает и сумму налога, и итоговую строку в интерфейсе. Ставку удобнее зашивать в артикул товара или в отдельное поле в настройках карточки, а не хардкодить в самом скрипте: иначе при добавлении нового товара с другой ставкой придётся каждый раз лезть в код.

Порядок действий у меня обычно такой:

  • При загрузке страницы скрипт читает список товаров из tcart.products и сопоставляет каждый со своей ставкой по артикулу или категории
  • При любом событии обновления корзины (добавление, удаление, изменение количества) пересчитывается сумма НДС по каждой позиции и общая сумма налога
  • Результат выводится в отдельный блок рядом с итоговой суммой корзины, а не заменяет её, чтобы клиент видел сумму с налогом и без
document.addEventListener('tcart:updated', function () {
  var vatRate = 0.20; // ставка НДС по товару, 20%
  var total = window.tcart.amount; // сумма корзины с учётом скидки
  var vatAmount = +(total - total / (1 + vatRate)).toFixed(2);
  var vatBlock = document.querySelector('.js-vat-amount');
  if (vatBlock) {
    vatBlock.textContent = vatAmount.toFixed(2) + ' u20BD';
  }
});

Важный момент: цена в Tilda для российского рынка обычно уже включает НДС (расчётная ставка), поэтому налог выделяется из суммы делением на (1 + ставка), а не прибавляется сверху.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Ставки НДС и системы налогообложения: что заложить в виджет

Перед тем как писать код, стоит понять, какие ставки вообще будут в магазине. Закладывать в виджет только 20% не стоит: рано или поздно появится товар со льготной ставкой или экспортный заказ.

Ставка Когда применяется Значение для расчёта
20% Основная ставка для большинства товаров и услуг на ОСН vat20
10% Продукты питания, детские товары, книги, медицинские изделия из перечня НК РФ vat10
0% Экспорт и отдельные операции по ст. 164 НК РФ vat0
Без НДС УСН, ЕСХН, освобождение по ст. 145 НК РФ none

Если у продавца несколько юрлиц или ИП с разными системами налогообложения (частая история для маркетплейсов на Tilda с несколькими продавцами), ставку нужно привязывать не только к товару, а к паре «товар плюс продавец». Для этого я обычно завожу отдельный JSON-справочник, который подгружается перед инициализацией корзины.

Особый случай: доставка и НДС

Стоимость доставки, подключённой через зоны доставки Tilda или интеграцию с СДЭК, тоже участвует в расчёте. Если продавец на ОСН, доставка облагается по той же ставке, что и основной товар (обычно 20%), даже если сама транспортная компания работает без НДС. Эту сумму нужно добавлять в базу расчёта налога отдельной строкой, иначе итоговая сумма в чеке не сойдётся с суммой в заказе.

Установка скрипта в корзину Tilda

Шаги для подключения обычно такие:

  1. В настройках сайта добавляю блок T123 (HTML-код) на страницу с корзиной либо вставляю скрипт через раздел «Ещё» в настройках сайта, в футер
  2. Прописываю таблицу ставок НДС по артикулам товаров, беру артикулы из поля SKU в настройках товара Tilda
  3. Вешаю обработчик на событие tcart:updated, которое Tilda генерирует при любом изменении корзины
  4. Добавляю в вёрстку корзины пустой блок с классом (например js-vat-amount), куда скрипт будет писать сумму налога
  5. Тестирую на заказе с несколькими товарами разных ставок, проверяю, что сумма НДС корректно меняется при удалении позиции или смене количества

На боевом проекте я обычно ещё логирую расчёт в консоль на пару дней после запуска, чтобы поймать нестандартные случаи: промокод, который меняет базу расчёта, товар с нулевым остатком или заказ, оформленный без выбора способа доставки.

Передача НДС в чек эквайринга и синхронизация с бухгалтерией

Мало посчитать налог на фронте, его нужно передать в чек, иначе онлайн-касса сформирует документ без нужных реквизитов и бизнес получит вопросы от налоговой. У T‑Bank и большинства других эквайрингов в объекте чека каждая позиция принимает поле с признаком налога: vat0, vat10, vat20, vat110, vat120 или none. Формирую этот массив из тех же данных, что использовались для расчёта в корзине, чтобы суммы на сайте и в чеке совпадали до копейки.

var receiptItems = tcart.products.map(function (p) {
  return {
    Name: p.title,
    Price: Math.round(p.price * 100),
    Quantity: p.quantity,
    Amount: Math.round(p.price * p.quantity * 100),
    Tax: p.vatCode || 'vat20' // берём ставку из справочника товара
  };
});

Дальше заказ с уже посчитанным налогом обычно нужно передать в учётную систему. Если бухгалтерия ведётся не вручную, удобно завести автоматизацию в n8n: вебхук из Tilda ловит заказ с рассчитанной суммой НДС, n8n раскладывает её по нужным полям и отправляет в API бухгалтерии или в таблицу для менеджера. Если нужна не разовая правка, а доработка корзины под несколько ставок, продавцов и синхронизацию с CRM, на моей стороне это обычно оформляется как комплексная интеграция корзины Tilda с эквайрингом и учётной системой, а не отдельный скрипт.

Частые ошибки при расчёте НДС в корзине

  • Ставка зашита прямо в коде скрипта, а не в данных товара: при добавлении позиции с другой ставкой разработчику приходится редактировать сам скрипт
  • НДС считают от суммы без скидки, а в чеке уже фигурирует сумма со скидкой, из-за чего появляется расхождение в копейках при сверке с эквайрингом
  • Округление выполняется на каждой позиции отдельно вместо округления итоговой суммы, и на большой корзине набегает по несколько рублей расхождения
  • Доставка не включена в базу расчёта или включена по неправильной ставке
  • Промокод меняет сумму заказа, но скрипт слушает только добавление товара и не пересчитывает НДС при применении промокода

Чаще всего эти ошибки всплывают не сразу, а через месяц-другой, когда бухгалтер сверяет отчёт по кассе с отчётом по сайту и находит расхождение в несколько тысяч рублей за период.

Скрипт расчёта налога (НДС) в корзине Tilda

Проблема Tilda не умеет показывать налог отдельной строкой - это критично для продаж в США, Европу и B2B, где налог добавляется к стоимости товара отдельно…

от 5 000 ₽ 

Готовый скрипт →

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

Нужно ли выводить сумму НДС явно, если магазин работает на УСН?

Нет. Если продавец на упрощёнке и не выставляет НДС, в корзине и чеке можно вообще не показывать строку с налогом, реквизит «без НДС» эквайринг проставит сам, и отдельный калькулятор в этом случае не нужен.

Можно ли встроить калькулятор НДС в корзину Tilda без правки кода сайта?

Частично да. Платёжные системы вроде T‑Bank позволяют указать одну общую ставку в личном кабинете эквайринга для всех товаров, но это работает только если ставка одна на весь магазин. При смешанном ассортименте без скрипта на стороне сайта не обойтись.

Как быть, если у части товаров ставка 10%, а у части 20%?

Ставку нужно привязывать к каждому товару отдельно, по артикулу или категории, и учитывать это на этапе расчёта корзины, а не итоговой суммы заказа. Расчёт по среднему проценту не совпадёт с реальными суммами по позициям в чеке, и это сразу видно при сверке.

Где взять готовый скрипт расчёта НДС для Tilda, чтобы не писать с нуля?

В библиотеке у меня есть готовый скрипт под эту задачу, он уже учитывает несколько ставок и передачу данных в чек эквайринга, установка занимает около часа с учётом теста на боевом заказе.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно