Більшість 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. Зв'яжіться з нами — оцінимо ваш проект і запропонуємо оптимальне рішення. Отримайте консультацію щодо впровадження власного трекінгу.







