Большинство 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. Свяжитесь с нами — оценим ваш проект и предложим оптимальное решение. Получите консультацию по внедрению собственного трекинга.







