sendHttpRequest - главный инструмент server-side GTM. Позволяет обращаться к любому API прямо из тега: Meta CAPI, Google Ads, CRM, собственные бэкенды.
#advanced #technical #block-10 #sgtm
Навигация
← 10.29 - Server-Side GTM - Meta CAPI через sGTM | → 10.31 - Chrome DevTools для аналитика
Зачем HTTP-запросы из sGTM
Проблема client-side подхода
В классическом (web) GTM все запросы идут из браузера пользователя:
Браузер → facebook.com/tr (Meta Pixel)
Браузер → google-analytics.com/collect (GA4)
Браузер → ads.google.com (Google Ads)
Проблемы:
- Ad-блокеры режут ~30-40% запросов (PageFair Ad Blocking Report)
- ITP в Safari лимитирует cookies до 7 дней (3rd party) и 24 часов (1st party JS-set)
- Каждый тег = дополнительная загрузка страницы (~50-200ms per tag)
- Невозможно обогатить данные серверной информацией (LTV, сегмент из CRM, hashed PII)
Решение: Server-Side GTM + HTTP-запросы
Браузер → ваш домен (1st party) → sGTM сервер → {Meta CAPI, GA4, Google Ads, CRM, etc.}
Весь трафик идёт через ваш сервер. Вы контролируете:
- Что отправляется (data quality)
- Куда отправляется (routing)
- Чем обогащается (server-side enrichment)
- Что фильтруется (bot filtering, consent enforcement)
API: sendHttpRequest
Синтаксис
Источник: Google Developers - sendHttpRequest API
Ключевые параметры
| Параметр | Тип | Описание |
|---|---|---|
url | string | Endpoint URL |
options.method | string | GET, POST, PUT, PATCH, DELETE |
options.headers | object | HTTP headers |
options.timeout | number | Таймаут в ms (default: 15000, рекомендуется ≤5000) |
body | string | Тело запроса (для POST/PUT) |
Return value
Promise, который resolve'ится в объект:
Практические кейсы
1. Отправка конверсий в Meta CAPI
Зачем: Дублирование конверсий на сервере - обязательное требование Meta для оптимизации. Без CAPI вы теряете до 40% конверсий из-за ad-blockers и ITP.
Важные нюансы:
event_idобязателен для дедупликации (browser pixel + CAPI отправляют одно и то же событие)- Email хешируется SHA256 до отправки - Meta не принимает plain text
fbcиfbpcookies передаются через GA4 Client автоматически, если настроен cookie forwarding
Источник: Meta - Conversions API Reference
2. Обогащение данных из CRM
Сценарий: При событии purchase вы хотите дополнить данные сегментом клиента из CRM перед отправкой в GA4 и Meta.
Архитектурное замечание: Этот паттерн лучше реализовывать через Transformation (sGTM feature), а не через тег. Transformation выполняется до тегов, что гарантирует, что обогащённые данные доступны всем тегам.
3. Вебхук в Telegram
Сценарий: Моментальное уведомление в Telegram-канал при каждой покупке свыше определённой суммы.
4. Fetch API: sendPixel vs sendHttpRequest
sGTM предоставляет два метода для HTTP-запросов:
| Метод | Тип | Body | Response | Use case |
|---|---|---|---|---|
sendPixel | GET only | Нет | Нет (fire-and-forget) | Простые пиксели, трекинг-запросы |
sendHttpRequest | Any | Да | Да (Promise) | API-вызовы, обогащение, любая логика |
Правило: Если вам не нужен response и не нужен POST - используйте sendPixel. Во всех остальных случаях - sendHttpRequest.
Паттерны и best practices
1. Параллельные запросы
Если вам нужно отправить данные в несколько endpoints - не делайте это последовательно:
Источник: Simo Ahava - Advanced Server-Side Tagging
2. Retry с backoff
API иногда возвращают 429 (rate limit) или 5xx. Простой retry:
⚠️ Ограничение: В sGTM нет setTimeout и setInterval. Retry будет мгновенным, без паузы. Для реального backoff нужна внешняя очередь (Cloud Tasks, Pub/Sub).
3. Caching через Firestore
Если вы обогащаете данные из CRM - кешируйте результат, чтобы не делать API-вызов на каждый хит:
Источник: Simo Ahava - Using Firestore with sGTM
Безопасность
API-ключи
Никогда не хардкодите API-ключи в шаблоне тега. Используйте:
-
Environment variables в Cloud Run:
const getContainerVersion = require('getContainerVersion');// Переменные задаются в Cloud Run → Environment Variables -
GTM Variables с типом «Constant» - для менее чувствительных ключей
-
Google Secret Manager - для продакшн-уровня (через sendHttpRequest к Secret Manager API)
Permissions в Custom Templates
Если вы создаёте custom template, нужно явно запросить permissions:
Источник: Google - Custom Template Permissions
Debugging HTTP-запросов в sGTM
1. Preview Mode
В sGTM Preview Mode вы видите:
- Входящий запрос (от web GTM)
- Parsed event data
- Каждый тег + его HTTP-запросы (request/response)
- Ошибки
2. logToConsole
Видно в Server Container → Preview → Console tab.
3. Cloud Logging (production)
Для production-мониторинга:
Ограничения sGTM sandbox
| Возможность | Доступно | Альтернатива |
|---|---|---|
fetch() (Web API) | ❌ | sendHttpRequest |
setTimeout / setInterval | ❌ | Cloud Tasks / внешняя очередь |
localStorage / sessionStorage | ❌ | Firestore, templateDataStorage |
document, window, DOM | ❌ | Это server-side, DOM отсутствует |
require('http') (Node.js) | ❌ | sendHttpRequest - единственный путь |
| Файловая система | ❌ | Cloud Storage через API |
| WebSocket | ❌ | HTTP polling |
Источник: Google - Server-Side Tag Manager Sandboxed JavaScript API
Дополнительные материалы
- Simo Ahava - Server-Side Tagging in GTM - лучший технический ресурс по sGTM
- Analytics Mania - Server-Side GTM Guide - пошаговые гайды
- Google - sGTM API Reference - полная документация API
- Stape.io - Blog - практические кейсы sGTM hosting
🔧 Практика
Задание 1: Meta CAPI через sGTM
- Создайте server-side GTM контейнер (Stape.io free tier или Cloud Run)
- Настройте GA4 Client для приёма входящих хитов
- Создайте Custom Tag, который отправляет
purchaseсобытия в Meta CAPI - Проверьте через Meta Events Manager → Test Events
- Задокументируйте: data flow diagram + payload format
Задание 2: CRM Enrichment
- Создайте простой mock API (можно на Vercel / Railway) - endpoint
/user/:idвозвращает{ segment: "high_value", ltv: 150000 } - В sGTM - создайте Transformation, который вызывает этот API и добавляет
user_segmentв event data - Убедитесь, что GA4 Tag получает обогащённые данные
- Добавьте Firestore caching (опционально)
Задание 3: Telegram Alert
- Создайте Telegram бота через @BotFather
- Настройте тег в sGTM, который отправляет уведомление при
purchase> 100,000 KZT - Включите информацию: сумма, источник трафика, ID транзакции