---
title: "Analytics"
description: "Campaign and account performance metrics."
---

Analytics rolls every send, open, click, reply, bounce, and complaint into rates you can act on, by workspace, campaign, and mailbox. For health bands and the thresholds Warmbly acts on, see [Deliverability](/guides/deliverability/).

## What is counted

| Metric | Counts | Feeds |
| --- | --- | --- |
| Sent | Emails actually sent | The denominator for every rate |
| Opens | Recipients who opened | Open rate |
| Clicks | Recipients who clicked a tracked link | Click rate |
| Replies | Human replies | Reply rate |
| Bounces | Hard and soft bounces | Bounce rate |
| Complaints | Marked as spam | Complaint rate |

Four rules govern the counts:

- **Tracking must be on.** Opens and clicks need open or link tracking enabled on the campaign, and a tracking host on the install. A [custom tracking domain](/guides/mailboxes/#custom-tracking-domain) per mailbox is optional; without one they go through the shared host and still count. With tracking off they stay at zero while sends and replies still count.
- **Replies are human replies.** Out-of-office and autoresponders never count, never stamp the contact as replied, and never trip stop-on-reply.
- **Bots are filtered.** Crawlers, CLI agents, prefetches, chat link previews, and security gateways that announce themselves are served normally but never counted. The ones that do not announce themselves are caught by what they do: an open or click inside ten seconds of the send (nobody reads that fast; the clock starts when the send is handed to the worker, before the mail has even been delivered) and clicks on two or more links of one email from the same source within five seconds (a scanner walking the message). Otherwise one corporate scanner would "click" every link seconds after delivery.
- **Auto-opens are labeled, not hidden.** Privacy proxies like Apple Mail Privacy Protection, and instant opens, still count (they confirm delivery) but are tagged and shown separately (`12 auto`). A later real open upgrades them to human. **Auto-opens never trigger opened-based branches or automations.**
- **A click is an open.** Opens need the mail client to load images, and many clients block them. A click by the person proves the email was read, so it counts as an open as well, and a lead can never read "clicked, not opened".
- **Auto-clicks are kept but never counted.** A click classified as automated is logged on the contact's activity with the link it hit and the rule that caught it, and the campaign overview shows how many steps had only automated clicks (`3 auto`). It never makes the step clicked, never fires a clicked branch or automation, and never sends a webhook. A person clicking the same link later counts normally. A burst is only recognisable from its second click, so a click that looks human waits for the burst window plus one second (six seconds) before it fires anything (clicked branches, automations, webhooks, the live feed): if a second link follows inside that window, both clicks are relabeled, the stamp is withdrawn and nothing fires.

## Workspace dashboard

Live, scoped by `7d`, `30d`, or `90d` tabs.

| Section | Shows |
|---------|-------|
| Headline rates | Total sent, open rate, reply rate, bounce rate |
| Email performance | One metric per day (sent, opens, clicks, replies), for spotting the day something moved |
| Breakdown | Raw window totals behind the rates |
| Account health | Mailboxes counted as Healthy, At risk, Issues |
| Top campaigns | Best performers with sent, open rate, reply rate, and a status dot |
| Recent activity | A live feed of individual sends, opens, clicks, replies, and bounces |

## Per-campaign

Each campaign reports its own totals: contacts, sent, pending, unique opens and clicks, replies, bounces, unsubscribes, and the four rates.

**Per-step stats** break sent, opens, clicks, replies, and bounces down by sequence step, which is how you find the touch pulling replies and the follow-ups that are dead weight. Daily stats drive the trend chart, and hourly stats show when sends land and get engagement. Campaigns can also be compared side by side on the same metrics.

**Who engaged, and from where** lists the countries, mail clients and devices people opened and clicked from, counting each contact once per bucket. Only human events feed it, so a security scanner's data centre never tops the country list.

### What is recorded per open and click

Every open and every click is kept as its own record, repeats included, with what the request said about itself: the mail client or image proxy when the user agent names one (Gmail, Apple Mail, Outlook), otherwise the browser, operating system and device type; the country, region and city resolved from the source network; for clicks the exact link; and whether it was the person or an automated fetch, with the rule that caught it. The address itself never leaves the tracking service: it publishes the network the address belongs to (the last IPv4 octet zeroed, an IPv6 address cut to its first 48 bits), which is enough for a city-level lookup and cannot single out a host, plus a keyed token of the full address used to tell one source from another, which cannot be turned back into the address. The consumer resolves the network to a location and stores neither. Location needs the GeoLite2 database on the consumer (`GEODB_PATH`); without it the country, region and city stay empty and everything else is still recorded. These records are kept for a year, then pruned; the counts and the first open and click per step live on the lead itself and are not affected.

These records back the engagement rows on a contact's [activity timeline](/guides/contacts-crm/#activity-timeline) and the per-campaign breakdown above.

## Per-mailbox

| Signal | What it tells you |
|--------|-------------------|
| Health | Healthy, warning, or error, with a score and specific issues |
| Daily usage | Campaign emails sent today against `campaign_limit` (default `50`/day), plus warmup sent and limit |
| Warmup status | Whether warmup is on, current volume, target, and max |
| Warmup health | Pool standing: healthy, watch, throttled, quarantined, or blocked, with spam score and block expiry |

Use this to find the one mailbox dragging down a campaign's bounce rate instead of blaming the campaign.

## A/B analysis

Variants can be scoped to one sequence step or the whole campaign. Traffic splits across the active arms, and the step's own email is the **Original** control arm, itself a first-class arm with its own share, so 70% Original against 30% of a new subject is a valid test. Drag the split bar or type exact percentages; shares always total 100%.

A/B is on by default in outreach settings, but a campaign only runs an experiment with at least two active variants.

**Assignment** is deterministic per contact and step for step-scoped variants, so the same contact sees the same variant across retries. Campaign-level variants assign on first send by weighted random draw and keep the contact there. Pausing a variant drops it from the split without deleting it.

### Picking a winner

The default winning rule is **reply rate**; you can rank by open or click rate instead. Warmbly will not call a winner on a tiny sample: it needs a minimum (default `30` sends for the leader) and reports confidence.

| Confidence | Meaning |
| --- | --- |
| `none` | No variant data yet |
| `low` | Leader below the minimum sample |
| `medium` | Leader reached the minimum |
| `high` | Leader at three times the minimum |

<Callout type="info" title="Let the test run">
A variant can look like the winner after a handful of sends and flip later. Wait for `medium` or `high` before promoting one. The minimum sample size is configurable in outreach settings.
</Callout>

## How to read your numbers

1. Check the four headline rates for your window.
2. If one looks off, switch the chart to that metric and find the day it moved. That usually points at one campaign or list.
3. Open that campaign and read per-step stats to see which touch is responsible.
4. For bounces or complaints, drop into the per-mailbox breakdown and [Deliverability](/guides/deliverability/) to find the sender at fault.
5. Use A/B analysis for copy decisions, and wait for real confidence.

A clean reply rate with low bounces and complaints beats a big open-rate screenshot every time.

## Related guides

<Cards>
  <Card title="Deliverability" href="/guides/deliverability/" />
  <Card title="Sequences" href="/guides/sequences/" />
  <Card title="Personalization & expressions" href="/guides/expressions/" />
</Cards>
