---
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 open every link are served normally but never counted. Otherwise one corporate scanner would "click" every link seconds after delivery.
- **Auto-opens are labeled, not hidden.** Privacy proxies like Apple Mail Privacy Protection 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.**

## 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.

## 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>
