Код прямо в шаблоне сайта
Способ для тех, у кого есть доступ к файлам сайта. Один блок перед </body> — и счётчик грузится из вашего же HTML, без посредника. Ничего не режется блокировщиками и ничего не зависит от того, опубликован ли контейнер.
Нужен доступ к шаблону и FTP · 15 минут · счётчик и приёмник живут на вашем домене
Какой способ выбрать
Этот способ надёжнее, но требует доступа к коду
Google Tag Manager — это ещё один внешний файл, gtm.js. Часть блокировщиков рекламы вырезает его вместе с рекламными скриптами: контейнер не загрузился — визит не посчитан вообще. Код в шаблоне посредника не имеет: открылась страница — счётчик отработал. Плата за это простая — нужен доступ к файлам и человек, который умеет их править.
| Google Tag Manager | Код в шаблоне | |
|---|---|---|
| Доступ к коду сайта | не нужен | нужен |
| Блокировщики рекламы | часть режет gtm.js | резать нечего |
| Кто ставит | маркетолог сам | разработчик или мы |
| Обновление темы или CMS | тег остаётся на месте | может стереть — проверяйте после обновления |
| Папка /cg/ на хостинге | нужна | нужна |
| Изменить настройки счётчика | в панели GTM, без FTP | правкой файла шаблона |
Папка /cg/ нужна в обоих случаях. Tag Manager умеет вставлять только JavaScript — PHP-файл на вашем хостинге он создать не может. Поэтому приёмник заливается руками один раз, независимо от способа.
Не ставьте оба способа сразу. Два счётчика на странице — это двойной счёт визитов и перерасход лимита тарифа. Один сайт — один способ установки.
Шаг 1
Блок ставится последним перед закрытием body
Скопируйте блок и вставьте его в шаблон сайта прямо перед строкой </body>. Ключ аккаунта (CG_ACC) выдаёт бот @sadalclik_bot после регистрации — паролей на сайте мы не заводим. Домен в двух адресах замените на свой: файлы лежат на вашем хостинге, а не на нашем.
<script>
window.CG_ACC = 'vash-akaunt';
window.CG_CG_ENDPOINT = 'https://vash-sajt.com/cg/collect.php';
</script>
<script src="https://vash-sajt.com/cg/cg-tracker.safe.js" async></script>
</body>
</html>
- Один раз на страницу. Если блок попал и в шапку, и в подвал — визиты удвоятся.
- Не в <head>. Атрибут async не тормозит отрисовку, но перед </body> скрипт стартует, когда страница уже собрана целиком, и сразу видит её содержимое.
- Атрибут async не убирайте — без него браузер ждёт загрузки счётчика, прежде чем дорисовать страницу.
- Блок не должен попасть внутрь условия «показывать только гостям» или «только на главной». Особенно нужен он на странице благодарности: именно там видно, дал клик заявку или нет.
Шаг 2
Папка /cg/ на вашем хостинге
В папке лежит сам счётчик и приёмник данных. Смысл в том, что браузер посетителя обращается к вашему домену, а не к стороннему: такой запрос не выглядит как трекер и не попадает под списки блокировщиков. Приёмник уже на сервере пересылает визит нам.
cg-tracker.safe.js
Счётчик, меньше 20 КБ. Снимает источник, gclid, устройство, экран, язык, время на странице и поведение указателя. Поля форм, пароли и платёжные данные вырезаются прямо в браузере.
collect.php
Приёмник. Принимает только POST от вашего сайта и передаёт данные в панель. Ничего не выводит и ничего не пишет в корень сайта.
.htaccess
Запрещает листинг папки: посторонний не увидит список файлов по адресу /cg/.
- Скачайте архивСсылка на архив приходит в боте @sadalclik_bot вместе с ключом аккаунта. Архив привязан к домену, который вы указали при регистрации.
- Найдите корень сайтаПо FTP или в файловом менеджере хостинга это папка public_html, www или htdocs — та, где лежит index.php вашего сайта. Для Laravel и других систем с отдельным публичным каталогом — папка public.
- Распакуйте туда папку cgАдрес https://vash-sajt.com/cg/collect.php должен открываться напрямую. Если получилось /public/cg/ или /site/cg/ — папка лежит не там.
- Выставьте праваПапке 755, файлам 644. Права 777 не нужны никому и являются дырой. Владелец файлов должен совпадать с владельцем остальных файлов сайта, иначе PHP-пул их не прочитает.
Файловый менеджер в cPanel, ISPmanager или в панели хостинга подходит так же, как FTP. Важно только одно: папка cg должна оказаться в корне сайта целиком, со всеми тремя файлами.
Шаг 3
Проверьте, что приёмник живой
Откройте в браузере адрес https://vash-sajt.com/cg/collect.php. Нормальный ответ — ошибка 405, Method Not Allowed. Это не поломка: приёмник принимает только POST, а браузер отправляет GET. Любой другой ответ означает, что что-то не доехало.
| Что показал браузер | Что это значит | Что делать |
|---|---|---|
| 405 | Приёмник на месте и работает | Ничего, идите дальше |
| 404 | Папки по этому адресу нет | Залили не в корень сайта. Найдите папку с index.php и перенесите cg туда |
| 403 | Сервер закрыл доступ | Проверьте права (папка 755, файлы 644) и владельца файлов. На некоторых хостингах мешает open_basedir пула |
| 500 | PHP упал | Нужен PHP 7.4 или новее. Точную причину покажет лог ошибок в панели хостинга |
| Текст PHP-кода на экране | PHP в этой папке не выполняется | Хостинг отдаёт файл как текст. Обычно это статический хостинг или запрет PHP в подпапке |
| Пустая белая страница | Файл открылся, но ответа нет | Чаще всего перед открывающим тегом в файле появился лишний символ при заливке. Перезалейте файл в бинарном режиме |
Дальше — две проверки на самом сайте:
- Откройте https://vash-sajt.com/cg/cg-tracker.safe.js — должен отдаться текст скрипта, а не 404.
- Откройте любую страницу сайта с меткой ?gclid=test-cg в адресе и в инструментах разработчика на вкладке «Сеть» найдите запрос collect.php к вашему же домену.
- Через десять минут визит появится в журнале панели с оценкой и причиной: детектор пересчитывает визиты каждые 10 минут, мгновенного вердикта не бывает.
Первую неделю аккаунт работает в режиме наблюдения: система показывает, кого бы отметила как мусор, но ничего не блокирует. Список плохих IP выгружается файлом — в кабинет Google Ads его пока загружает человек, автоматическая отправка исключений ещё в разработке.
Куда именно вставлять
Самописный сайт и шаблонизаторы
Правило одно: файл, где стоит закрывающий </body>, должен быть общим для всех страниц. Тогда блок вставляется один раз и работает везде. Если подвал у каждой страницы свой — сначала вынесите его в отдельный файл, иначе половина страниц останется без счётчика.
Самописный сайт на PHP
Ищите footer.php, bottom.php или конец layout.php — тот файл, который подключается в каждую страницу последним. Блок лучше положить отдельным файлом и подключить одной строкой: так его видно при поиске и не нужно лезть в разметку подвала.
<?php include __DIR__ . '/parts/sadalclik.php'; ?>
</body>
</html>
Laravel, Blade
Общий каркас лежит в resources/views/layouts/app.blade.php. Папку cg распаковывайте в public — в Laravel корнем сайта является именно она, а не корень проекта.
@include('partials.sadalclik')
</body>
</html>
Symfony, Twig
Базовый шаблон — templates/base.html.twig. Остальное так же: отдельный файл с блоком и одна строка перед закрытием body.
{% include 'partials/sadalclik.html.twig' %}
</body>
</html>
Сайты на React, Vue и Next: блок ставится в корневой HTML-шаблон сборки. Переходы между экранами без перезагрузки страницы считаются иначе, чем обычные визиты — напишите в бот @sadalclik_bot, подскажем под вашу сборку.
Если на сайте включён кеш страниц или оптимизатор HTML, после установки очистите кеш и посмотрите исходный код готовой страницы: некоторые оптимизаторы переносят скрипты и склеивают их в один файл. Блок должен остаться целым и на своём месте.
Что спрашивают про этот способ
Обновил тему — тег пропал. Это нормально?
Можно поставить блок в <head>?
У меня нет FTP, только панель хостинга. Получится?
Сайт на Tilda, Wix или другом конструкторе — подойдёт этот способ?
Я и сам могу собрать список плохих IP и вбить его руками. Зачем платить?
Сколько видит Google, если я и так плачу за клики?
Посмотрите на свой трафик
Аккаунт создаётся бесплатно, без карты — платная подписка сама не включается. Мы ничего не блокируем, просто показываем, кто к вам приходит.