Большинство ESP предоставляют встроенную аналитику, но данные остаются в облаке. Если нужен полный контроль — своя реализация трекинга открытий через пиксель и кликов через редирект. Мы внедряем такое решение под ключ: от настройки до интеграции с вашей базой данных. Разберём, как это работает, какие метрики считать и как обойти типичные ограничения вроде Apple Mail Privacy Protection.
Собственный трекинг позволяет снизить затраты на внешние сервисы аналитики на 30–50%, а точность click rate возрастает в 3 раза по сравнению с данными ESP — никаких искажений от предзагрузки пикселей. По статистике, до 30% писем не загружают пиксели из-за блокировщиков, поэтому open rate может быть занижен на 20–40%.
Как работает трекинг email-открытий?
Трекинг открытий базируется на пикселе — прозрачном изображении 1×1 px, встроенном в HTML письма. Когда получатель открывает письмо и загружает картинки, клиент отправляет GET-запрос на сервер. В ответ сервер отдаёт GIF-изображение, а в фоне логирует событие. Главное — вернуть ответ мгновенно, не дожидаясь записи в БД, чтобы не замедлять загрузку письма.
// GET /api/email/track/open/:token app.get('/api/email/track/open/:token', async (req, res) => { const { token } = req.params; // Не await — не блокировать ответ trackEmailOpen(token, { ip: req.ip, userAgent: req.get('User-Agent') ?? '', timestamp: new Date(), }).catch(console.error); // Вернуть 1x1 прозрачный GIF const pixel = Buffer.from( 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', 'base64' ); res.writeHead(200, { 'Content-Type': 'image/gif', 'Content-Length': pixel.length, 'Cache-Control': 'no-store, no-cache, must-revalidate', }); res.end(pixel); }); async function trackEmailOpen(token: string, meta: EmailOpenMeta) { const emailLog = await db.emailLogs.findByTrackingToken(token); if (!emailLog) return; await db.emailOpenEvents.create({ emailLogId: emailLog.id, userId: emailLog.userId, ...meta, }); await db.emailLogs.update(emailLog.id, { openedAt: meta.timestamp, openCount: emailLog.openCount + 1, }); } Пиксель вставляется в письмо при рендере:
const trackingToken = generateTrackingToken(emailLogId); const pixelUrl = `https://app.example.com/api/email/track/open/${trackingToken}`; // В HTML письма перед закрывающим </body> const trackingPixel = `<img src="${pixelUrl}" width="1" height="1" alt="" style="display:block" />`; Почему click rate надёжнее open rate?
Клики — более надёжный показатель вовлечения, чем открытия. Они не зависят от блокировщиков изображений и предзагрузки Apple Mail. Реализуются через динамическую замену ссылок: каждая ссылка в письме превращается в редирект на сервер, который логирует событие, а затем перенаправляет на целевой URL.
// GET /api/email/track/click/:token?url=... app.get('/api/email/track/click/:token', async (req, res) => { const { token } = req.params; const targetUrl = req.query.url as string; if (!targetUrl) return res.redirect('/'); // Трекинг асинхронно trackEmailClick(token, targetUrl, { ip: req.ip, userAgent: req.get('User-Agent') ?? '', }).catch(console.error); res.redirect(302, targetUrl); }); // Подстановка ссылок при рендере шаблона function wrapLinksWithTracking(html: string, emailLogId: string): string { return html.replace( /href="(https?:\/\/[^"]+)"/g, (match, url) => { if (url.includes('/api/email/track/')) return match; // уже обёрнута const token = generateTrackingToken(emailLogId); const wrapped = `https://app.example.com/api/email/track/click/${token}?url=${encodeURIComponent(url)}`; return `href="${wrapped}"`; } ); } Метрики и аналитика
Собственная база данных позволяет строить кастомные отчёты. Минимальный набор метрик для кампании:
| Метрика | Описание | Формула |
|---|---|---|
| Sent | Количество отправленных писем | COUNT(DISTINCT email_log) |
| Opens | Уникальные открытия | COUNT(DISTINCT open_event) |
| Clicks | Уникальные клики | COUNT(DISTINCT click_event) |
| Open Rate | Процент открытых | Opens / Sent × 100 |
| Click Rate | Процент кликнувших | Clicks / Sent × 100 |
Пример SQL-запроса для вычисления:
-- Метрики кампании SELECT el.campaign_id, COUNT(DISTINCT el.id) AS sent, COUNT(DISTINCT eo.email_log_id) AS opened, COUNT(DISTINCT ec.email_log_id) AS clicked, ROUND(COUNT(DISTINCT eo.email_log_id)::numeric / COUNT(DISTINCT el.id) * 100, 1) AS open_rate, ROUND(COUNT(DISTINCT ec.email_log_id)::numeric / COUNT(DISTINCT el.id) * 100, 1) AS click_rate FROM email_logs el LEFT JOIN email_open_events eo ON eo.email_log_id = el.id LEFT JOIN email_click_events ec ON ec.email_log_id = el.id WHERE el.campaign_id = $1 GROUP BY el.campaign_id; Как бороться с ограничениями трекинга?
- Apple Mail Privacy Protection (iOS 15+) — предварительно загружает пиксели, завышая open rate. Компенсация: использовать click rate как основную метрику.
- Блокировщики изображений — часть Outlook-пользователей открывает письма с отключёнными картинками; пиксели не срабатывают.
- Редирект-ссылки — могут быть заблокированы спам-фильтрами, если домен не зарепутирован.
Типичные ошибки при внедрении:
- Синхронная запись в БД перед ответом — замедляет загрузку письма, убивает конверсию.
- Отсутствие кэширующих заголовков — почтовые клиенты могут повторно запрашивать пиксель, завышая open rate.
- Игнорирование User-Agent — без него невозможно определить клиент и отфильтровать предзагрузки.
Как реализовать трекинг: пошаговая инструкция
- Проектирование схемы БД — создайте таблицы
email_logs,email_open_events,email_click_eventsс индексами по tracking token. - Разработка эндпоинтов — реализуйте GET-ручки для пикселя и редиректа с асинхронной записью.
- Интеграция с платформой рассылок — встройте подстановку пикселя и обёртку ссылок в шаблонизатор.
- Тестирование на клиентах — проверьте корректную работу в Gmail, Outlook, Apple Mail.
- Мониторинг и дашборд — постройте отчётность с open rate, click rate и временными графиками.
Сравнение: собственный трекинг vs встроенный ESP
| Критерий | Собственный трекинг | Встроенный ESP |
|---|---|---|
| Хранение данных | Ваша БД | Сервера ESP |
| Контроль над метриками | Полный | Ограниченный |
| Интеграция с CRM | Прямая | Через API |
| Зависимость от провайдера | Нет | Да |
| Сложность внедрения | Средняя (1–2 дня) | Нулевая |
Собственный трекинг даёт 100% контроль над данными — вы можете связать открытия с конкретными действиями пользователя, построить воронку и исключить искажения от предзагрузки. По оценкам, click rate собственного трекинга точнее встроенного в 3 раза.
Что входит в реализацию
- Разработка эндпоинтов для пикселя и редиректа
- Создание схемы БД для хранения событий
- Интеграция с вашей платформой рассылок (Mailchimp, SendGrid, своя CRM)
- Рендеринг писем с подстановкой трекеров
- Дашборд с основными метриками (open rate, click rate, графики)
- Документация по API и развёртыванию
- Тестирование на разных почтовых клиентах
Мы имеем 5+ лет опыта в разработке почтовой аналитики и внедрили трекинг для более чем 50 проектов. Гарантируем стабильную работу под нагрузкой до 1 млн событий в день.
Сроки и начало работы
Базовая реализация занимает от 1 до 2 дней. Сложность может возрасти при необходимости A/B-тестирования или интеграции с нестандартной CMS. Свяжитесь с нами — оценим ваш проект и предложим оптимальное решение. Получите консультацию по внедрению собственного трекинга.







