Я регулярно дорабатываю корзину 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
Шаги для подключения обычно такие:
- В настройках сайта добавляю блок T123 (HTML-код) на страницу с корзиной либо вставляю скрипт через раздел «Ещё» в настройках сайта, в футер
- Прописываю таблицу ставок НДС по артикулам товаров, беру артикулы из поля SKU в настройках товара Tilda
- Вешаю обработчик на событие tcart:updated, которое Tilda генерирует при любом изменении корзины
- Добавляю в вёрстку корзины пустой блок с классом (например js-vat-amount), куда скрипт будет писать сумму налога
- Тестирую на заказе с несколькими товарами разных ставок, проверяю, что сумма НДС корректно меняется при удалении позиции или смене количества
На боевом проекте я обычно ещё логирую расчёт в консоль на пару дней после запуска, чтобы поймать нестандартные случаи: промокод, который меняет базу расчёта, товар с нулевым остатком или заказ, оформленный без выбора способа доставки.
Передача НДС в чек эквайринга и синхронизация с бухгалтерией
Мало посчитать налог на фронте, его нужно передать в чек, иначе онлайн-касса сформирует документ без нужных реквизитов и бизнес получит вопросы от налоговой. У 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, чтобы не писать с нуля?
В библиотеке у меня есть готовый скрипт под эту задачу, он уже учитывает несколько ставок и передачу данных в чек эквайринга, установка занимает около часа с учётом теста на боевом заказе.