Open & click tracking
Open and click tracking in the wemail API: enable it per domain or per message, use a branded tracking domain, and read opens and clicks from events.
Tracking is enabled per-domain or per-message. wemail rewrites links and injects a 1×1 pixel only when both your domain and the message permit it.
Per-domain defaults
Set defaults in the Console under Domains → Tracking. Use a tracking subdomain (e.g. track.acme.io) so links display your brand instead of wemail.io.
Per-message override
{ "tracking": { "opens": false, "clicks": true } }HTTPS for tracking
wemail provisions a free Let's Encrypt certificate for your tracking subdomain via the verification CNAME. Renewals are automatic.
Links that are never tracked
Unsubscribe and opt-out links always keep their original URL, so unsubscribing never depends on the tracking host. wemail recognises them by the destination (any unsubscribe / opt-out URL, including list-manager links such as …task=unsubscribe) or by the link text (“Unsubscribe”, “Opt out”, “Manage email preferences”, “Απεγγραφή”). Clicks on these links are not counted.
To keep any other link untracked, add the data-wm-notrack attribute to it:
<a href="https://example.com/terms" data-wm-notrack>Terms</a>Code examples
curl -G https://api.wemail.io/v3/events \
-H "Authorization: Bearer afn_live_…" \
--data-urlencode "tag=welcome" \
--data-urlencode "event=delivered" \
--data-urlencode "since=2026-05-01"const events = await wemail.events.list({
tag: "welcome",
event: "delivered",
since: "2026-05-01",
});
for (const e of events) console.log(e.recipient, e.timestamp);events = wemail.events.list(tag="welcome", event="delivered", since="2026-05-01")$events = $wemail->events->list(['tag' => 'welcome', 'event' => 'delivered']);events = wemail.events.list(tag: "welcome", event: "delivered")events, _ := client.Events.List(ctx, &wemail.EventParams{Tag: "welcome", Event: "delivered"})wemail.events().list(EventParams.builder().tag("welcome").event("delivered").build());var events = await wemail.Events.ListAsync(new EventParams { Tag = "welcome", Event = "delivered" });{
"items": [
{
"id": "evt_01HBYE7Q…",
"type": "delivered",
"message_id": "msg_01HBYE7K9Z4PMQDR3W",
"recipient": "alex@example.com",
"timestamp": "2026-05-10T09:42:21.000Z",
"tags": ["welcome", "v2"],
"metadata": null,
"created_at": "2026-05-10T09:42:21.412Z"
}
],
"has_more": true,
"next_cursor": "2026-05-10T09:42:21.000Z|evt_01HBYE7Q…",
"total_count": 1842
}