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

Куда вставлять скрипт в Тильде: HTML-блок, head или footer

Вопрос, куда вставлять скрипт в Тильде, у новичков обычно решается методом тыка: копируют код, суют в первое попавшееся поле, а потом два часа разбираются, почему счётчик не считает или калькулятор СДЭК не рисуется. У Тильды три уровня для вставки кода - HTML-блок на странице, поле head и поле перед закрывающим тегом body, - и каждый предназначен для разных задач. Разберу, что куда класть, на примерах из своих проектов: аналитика, виджет Т‑Банка, калькулятор доставки, кастомные интеграции.

Три места, куда можно вставить скрипт в Тильде

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

  • HTML-блок (Т123) - блок, который перетаскиваешь на конкретную страницу, внутри него свой набор тегов, включая script
  • Head проекта - поле в настройках сайта, код попадает на все страницы перед тегом /head
  • Head страницы - то же самое, но только для одной конкретной страницы, в её настройках
  • Footer проекта или страницы - код вставляется перед закрывающим тегом /body, тоже глобально или точечно

Разница не только в области видимости, но и в моменте выполнения кода. Head грузится до отрисовки страницы, footer - после того как весь DOM уже построен, а HTML-блок выполняется в момент, когда браузер доходит до этого места в вёрстке. От этого напрямую зависит, заработает скрипт или выдаст ошибку про undefined.

Место Где искать Область действия Когда выполняется Примеры скриптов
HTML-блок Перетаскивается на страницу как обычный блок Одна страница, конкретное место в вёрстке В момент отрисовки блока Виджет СДЭК, кастомная форма, встроенный калькулятор
Head проекта Настройки сайта → Ещё → Код для вставки в head Весь сайт До загрузки контента страницы Метрика, GA4, Pixel, верификация домена
Head страницы Настройки страницы → SEO → Ещё код Одна страница До загрузки контента страницы Уникальные meta-теги, скрипты для лендинга акции
Footer (перед /body) Настройки сайта или страницы → Ещё код Весь сайт или одна страница После построения DOM Обработчики форм, чат-виджеты, скрипты с DOM-манипуляциями

HTML-блок на странице: точечная вставка кода

HTML-блок - это блок T123, который добавляется прямо в конструкторе как любой другой элемент страницы: заголовок, картинка, форма. Внутри него можно писать произвольный HTML, CSS и JS, и всё это оказывается ровно в том месте вёрстки, куда блок перетащили.

Сюда я вставляю виджеты, которым нужен конкретный div на странице: калькулятор стоимости доставки СДЭК, кастомную карту с точками выдачи, виджет бронирования. Если скрипту нужен элемент вроде <div id="cdek-map"></div>, разумнее держать его вместе с этим div в одном блоке, чем разносить по head и странице - так меньше шансов, что скрипт выполнится раньше, чем элемент появится в DOM.

<div id="cdek-widget"></div>
<script src="https://cdn.jsdelivr.net/npm/@cdek-it/widget@3"></script>
<script>
  const widget = new ISDEKWidget({
    defaultLocation: 'Москва',
    from: 'Москва',
    goods: [{ length: 10, width: 10, height: 10, weight: 0.5 }],
    element: 'cdek-widget'
  });
</script>

Важный момент: HTML-блок работает только на той странице, куда его добавили. Если у вас интернет-магазин на Тильде и калькулятор доставки нужен на 40 карточках товара, добавлять блок вручную на каждую - не вариант, тут уже нужен либо footer проекта с проверкой на URL, либо единый шаблон страницы товара. Готовые заготовки под похожие сценарии я собираю в библиотеке готовых скриптов - оттуда часто быстрее взять рабочий вариант, чем писать с нуля.

Head проекта и head страницы: для чего нужен

Head - это метаданные и код, который должен отработать до того, как пользователь увидит контент. Классический пример - счётчики аналитики: Яндекс.Метрика, Google Analytics 4, Facebook Pixel (VK Реклама). Их задача - зафиксировать визит с первой миллисекунды, поэтому вставлять их в footer бессмысленно: часть коротких визитов просто не попадёт в статистику.

В head проекта (Настройки сайта → Ещё → Код для вставки в head) я кладу:

  • счётчики аналитики и пиксели ретаргетинга
  • верификационные мета-теги для Search Console и Яндекс.Вебмастера
  • подключение шрифтов через preconnect, если Тильда не тянет их сама
  • глобальные переменные конфигурации, которые нужны скриптам на всех страницах

Head страницы (в настройках конкретной страницы, вкладка SEO, пункт «Ещё код») использую реже - обычно для акционных лендингов с отдельным пикселем ретаргетинга или для страницы оплаты, где нужен скрипт эквайринга Т‑Банка с привязкой к конкретному терминалу. У Т‑Банка (бывший Тинькофф) виджет оплаты требует подключения библиотеки до инициализации формы, и если вставить его в footer, форма оплаты иногда успевает отрисоваться раньше, чем библиотека готова - тогда кнопка «Оплатить» просто не реагирует на клик.

Одна оговорка: то, что вставлено в head страницы, не отменяет head проекта - они складываются. Если один и тот же счётчик поставить и туда, и туда, аналитика задвоится, а в Метрике визиты будут считаться дважды - я такое видел на паре аудитов, когда после смены подрядчика старый код никто не убрал.

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

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

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

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

Всё, что должно сработать после того, как страница полностью отрисована, отправляется в footer - поле «Код для вставки перед /body» в тех же настройках сайта или страницы. Это подходящее место для:

  • обработчиков отправки форм (например, чтобы прокинуть данные в CRM или в n8n-сценарий)
  • чат-виджетов и виджетов обратного звонка
  • скриптов, которые ищут элементы по классам Тильды (querySelector, addEventListener)
  • кода, завязанного на события Тильды вроде tildaForm или t_onFuncLoad

Причина простая: если скрипт пытается найти элемент формы через document.querySelector('.t-form'), а сам код выполняется в head до того, как эта форма прогрузилась, он получит null и упадёт с ошибкой в консоли. В footer к моменту выполнения скрипта DOM уже собран, так что обращения к элементам страницы работают предсказуемо.

Пример: клиент просил после успешной отправки формы записи на консультацию сразу пушить лид в Bitrix24 и параллельно слать уведомление в Telegram через n8n-вебхук. Логика ловит событие Тильды, достаёт значения полей и делает fetch-запрос на вебхук n8n - весь этот код живёт в footer страницы с формой, потому что завязан на уже готовый DOM-элемент формы.

document.addEventListener('tildaForm:aftersuccess', function (e) {
  const data = new FormData(e.detail.form);
  fetch('https://n8n.example.com/webhook/lead', {
    method: 'POST',
    body: JSON.stringify(Object.fromEntries(data)),
    headers: { 'Content-Type': 'application/json' }
  });
});

Проект целиком или одна страница - как выбрать уровень

Правило у меня простое: если скрипт нужен на всех страницах сайта - он идёт в настройки проекта, если только на одной или на группе однотипных страниц - в настройки конкретной страницы или в HTML-блок.

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

Отдельно стоит связка HTML-блок + footer: если виджет требует и div на странице, и обработчик событий, который завязан на форму рядом, я делю код - разметку и инициализацию виджета кладу в HTML-блок, а слушатель событий формы - в footer страницы. Так проще найти, что где лежит, когда через полгода понадобится что-то поправить.

Для сложных случаев - интеграция эквайринга, синхронизация с CRM, калькулятор с несколькими API - комплексная работа обычно тянет на интеграцию, а не на точечную правку: у меня она стоит от 40 000 ₽, простая доработка вроде добавления одного стороннего скрипта - от 3 000 ₽.

Частые ошибки при вставке скриптов в Тильде

За несколько лет работы с Тильдой чаще всего встречаю одни и те же грабли:

  • Дублирование кода. Скрипт вставлен и в head проекта, и в head страницы одновременно - счётчики считают визиты дважды, форма отправляет данные в CRM два раза подряд.
  • Скрипт в head, которому нужен DOM. Код падает в консоли с ошибкой Cannot read properties of null, потому что элемент, который он ищет, ещё не отрисован.
  • Конфликт с Zero Block. Если страница собрана в Zero Block, у неё своя логика подгрузки скриптов, и код, работающий на T123-странице, может вести себя иначе - тестировать нужно именно на той версии редактора, где страница реально собрана.
  • Скрипт остаётся после удаления виджета. Убрали блок с формы или калькулятора, а обработчик события в footer не тронули - он продолжает искать элемент, которого больше нет, и штампует ошибки в консоли на пустом месте.
  • HTTP вместо HTTPS в src. Тильда отдаёт сайт по HTTPS, и подключение стороннего скрипта по HTTP браузер молча блокирует как mixed content - визуально ничего не происходит, а скрипт просто не грузится.

Последний пункт всплывает регулярно на аудитах: смотришь консоль разработчика - ни одной ошибки, а виджет не отображается. Причина в блокировке mixed content, которую браузер даже не всегда явно подсвечивает как ошибку, а просто игнорирует запрос.

Когда стандартных блоков не хватает

Кастомный скрипт

от 3 000 ₽

Подробнее →

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

Можно ли вставить один и тот же скрипт сразу и в head, и в footer?

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

Почему скрипт в HTML-блоке работает на одной странице, а на других - нет?

HTML-блок привязан к конкретной странице, на которую его перетащили в редакторе. Если код нужен на нескольких страницах, либо копируйте блок на каждую вручную, либо переносите логику в footer проекта с проверкой текущего URL через window.location.pathname.

Как вставить скрипт только на одну страницу, а не на весь сайт?

Откройте настройки нужной страницы, а не настройки сайта целиком, и найдите там поля «Код для вставки в head» и «Код для вставки перед /body» - они относятся именно к этой странице и не затрагивают остальные.

Что делать, если после вставки скрипта в head сломалась вёрстка?

Чаще всего дело в незакрытом теге или в CSS, который был вставлен вместе со скриптом и переопределил стили Тильды глобально. Проверьте код на валидность построчно и, если стили должны действовать только в рамках одного блока, оберните их в уникальный класс вместо общих селекторов вроде div или a.

Есть задача?

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

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

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

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