Email Open and Click Tracking Setup
Open tracking works via pixel—transparent 1×1 px image embedded in email. Click tracking uses redirect links. Most ESPs do this automatically, but sometimes custom implementation stores data in your own database.
Pixel Tracking (Opens)
// GET /api/email/track/open/:token
app.get('/api/email/track/open/:token', async (req, res) => {
const { token } = req.params;
// Don't await—don't block response
trackEmailOpen(token, {
ip: req.ip,
userAgent: req.get('User-Agent') ?? '',
timestamp: new Date(),
}).catch(console.error);
// Return 1x1 transparent 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.emailOpens.create({
email_log_id: emailLog.id,
ip: meta.ip,
user_agent: meta.userAgent,
opened_at: meta.timestamp,
});
}
Click Tracking (Redirects)
// GET /api/email/track/click/:token?url=...
app.get('/api/email/track/click/:token', async (req, res) => {
const { token } = req.query.url;
const targetUrl = req.query.url;
trackEmailClick(token, {
url: targetUrl,
ip: req.ip,
timestamp: new Date(),
}).catch(console.error);
res.redirect(targetUrl);
});
Email Template Integration
<!-- In your email template -->
<img src="https://your-app.com/api/email/track/open/{{trackingToken}}"
alt="" width="1" height="1" style="display:none;"/>
<a href="https://your-app.com/api/email/track/click/{{trackingToken}}?url={{urlencoded(cta_url)}}">
{{cta_text}}
</a>
Timeline
Basic implementation—1–2 days. With dashboard and cohort analysis—3–5 days.







