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







