> ## Documentation Index
> Fetch the complete documentation index at: https://docs.basaltic.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Email metrics

> Read sending, reputation, feedback, engagement, backlog, and latency through Telemetry.

Email publishes resource metrics to Telemetry. Open **Deliverability** to compare
all identities, or open an identity's **Metrics** tab. The shared chart controls
select a time range and refresh interval. Reading charts requires
`telemetry:ReadMetrics` in the selected account and region.

## Scope and sampling

Metrics carry `region` and `identity_id` labels, and are isolated by account and
organization. Always include the intended region in a query. For one identity,
match its UUID. Events without a resolved identity use
`00000000-0000-0000-0000-000000000000`; they contribute to account-wide charts.
Recipient addresses, URLs, and message IDs are not metric labels.

Samples are emitted approximately every 30 seconds. Counters persist across
worker restarts and message-history deletion. They start when metric collection
is enabled, with no historical backfill. A rate needs at least two samples.
Event metrics can lag sending metrics while feedback and engagement events arrive.

## Metric catalog

All names have the `basaltic_email_` prefix.

| Suffix | Type | Meaning |
| - | - | - |
| `messages_accepted_total` | Counter | Messages accepted for sending. |
| `messages_sent_total` | Counter | First SMTP acceptance for each message. |
| `messages_failed_total` | Counter | First recorded sending failure for each message. |
| `bytes_accepted_total` | Counter | Bytes in accepted message bodies. |
| `messages_queued` | Gauge | Messages waiting to be sent. |
| `messages_sending` | Gauge | Messages with an attempt in progress. |
| `oldest_queued_message_age_seconds` | Gauge | Age of the oldest queued message; zero for an empty backlog. |
| `send_duration_seconds_sum` | Counter | Accumulated time from queueing to first SMTP acceptance. |
| `send_duration_seconds_count` | Counter | Messages included in the latency sum. |
| `opens_total` | Counter | Recorded open events, including repeats. |
| `clicks_total` | Counter | Recorded click events, including repeats. |
| `rejections_total` | Counter | Send requests rejected before acceptance. |
| `bounces_total` | Counter | Recorded bounce feedback events. |
| `complaints_total` | Counter | Recorded complaint feedback events. |
| `reputation_sends_24h` | Gauge | Sends in the latest 24-hour reputation evaluation. |
| `reputation_bounces_24h` | Gauge | Bounce events in that evaluation window. |
| `reputation_complaints_24h` | Gauge | Complaint events in that evaluation window. |
| `reputation_bounce_ratio` | Gauge | Evaluated bounce events divided by sends; zero when there are no sends. |
| `reputation_complaint_ratio` | Gauge | Evaluated complaint events divided by sends; zero when there are no sends. |

Use a rate aggregation for counters. Mean SMTP latency is the rate of
`send_duration_seconds_sum` divided by the rate of `send_duration_seconds_count`.
Use the latest value for backlog gauges. When combining identities, preserve
`identity_id` while selecting the latest sample before summing backlog values.

## Reputation charts

The identity's **Metrics** tab charts the rolling 24-hour send, bounce, and
complaint counts, plus the bounce and complaint rates used by the sending policy.
These are gauges from the persisted reputation evaluation. Select the latest
sample in each chart bucket; do not apply a counter rate to them. Ratios are
fractions: multiply by 100 to display percentages. Keep ratios scoped to one
identity; summing or averaging identity ratios does not give an account rate.

Each point reflects the evaluator's latest 24-hour window, even when you select
a different chart range. Sampling does not trigger a new evaluation. No reputation
samples are emitted before the first evaluation, so an unevaluated identity shows no
data instead of a healthy zero. Suspension status and its reason remain visible
on the identity page.

## Interpret outcomes correctly

SMTP acceptance does not prove inbox placement. A message can be accepted and
later bounce or generate a complaint. Feedback counts events; it is not a count
of unique affected messages. Opens and clicks include automated clients and
repeat visits. Dividing these rates by sending rates does not produce a cohort
engagement rate, because the events may concern older messages.

Use message detail, per-message engagement, and per-identity DMARC reports for
investigation. Recipient-domain ranking is not exposed. See
[sending](/email/sending) for status meanings.

## Receiving and DMARC

| Metric suffix | Type | Meaning |
| - | - | - |
| `messages_received_total` | Counter | Accepted incoming messages, starting when this metric is enabled. |
| `bytes_received_total` | Counter | Complete encoded MIME bytes accepted, including attachments. |
| `received_spam_total` | Counter | Accepted messages marked as spam. |
| `received_malware_total` | Counter | Accepted messages quarantined for malware. |
| `received_unverified_total` | Counter | Accepted messages without authenticated sender alignment. |
| `receipt_notifications_pending` | Gauge | Unpublished receipt notifications whose messages have not expired. |
| `oldest_receipt_notification_age_seconds` | Gauge | Age of the oldest pending receipt notification. |
| `dmarc_reports_7d` | Gauge | Distinct reporter/report/interval combinations. |
| `dmarc_messages_7d` | Gauge | Message counts reported for those intervals. |
| `dmarc_pass_7d`, `dmarc_fail_7d` | Gauge | Reported messages passing either alignment check, or failing both. |
| `dmarc_dkim_aligned_7d`, `dmarc_spf_aligned_7d` | Gauge | Reported messages passing each alignment check. |
| `dmarc_quarantined_7d`, `dmarc_rejected_7d` | Gauge | Reported dispositions. |

DMARC gauges cover report periods ending during the preceding seven days at
each observation. Reports often arrive late: a new report changes subsequent
observations rather than rewriting earlier metric samples. Exact retransmissions
are deduplicated by reporter, report, interval, source IP and authentication
attributes. These gauges are not counters; use the latest value, not a rate.

Inspect source IP, reporter, interval, disposition, and authentication details with
`GET /v1/identities/{identity_id}/dmarc-reports`. Diagnostic records are retained for
180 days and support `from`, `to`, `limit`, and `marker`. The interval filters the
reported period end. Source IPs, recipients, report IDs, and message IDs are never
metric labels. Per-message engagement and rejection records remain separate from
aggregate charts.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.