Tracking & metrics
The Metrics page in the Bird dashboard is where you see how your SMS is doing: how much of it reached the handset, whether your failure rate is drifting toward trouble, how many segments you're sending, and what it's costing you. This guide walks through that page — what each number means and when to act on it.
Metrics are the aggregate view across everything your workspace sends. For the lifecycle of a single message — did this number receive it — see the SMS log and events.
Read your metrics
The Metrics page lives at SMS → Metrics in the Bird dashboard. Every number respects the range picker in the top right (last 24 hours, 7, 30, or 90 days) and updates as new events arrive, so a report you open now reflects sends and delivery receipts up to the last few seconds.
Rates are computed against event time, not send time — a delivery receipt that arrives today for a message accepted yesterday lands in today's numbers. accepted is the denominator for both rate cards: it's the count of messages Bird admitted in the range, and every rate is measured against it.

The summary tiles
The row of tiles at the top is your at-a-glance health check:
- Delivery rate — delivered messages as a share of accepted. Bird marks it Healthy at or above 95%; below that, something is failing to reach handsets (bad numbers, blocked content, or routing problems) and the failure breakdown below tells you which. The tile also shows the change versus the previous period.
- Failure rate — the share of accepted messages that ended undelivered, failed, or expired. The tile shows your rate against a 5% limit with a progress bar; crossing it flips the tile to Risk. A sustained high failure rate usually means list-quality or content problems.
- Accepted — the raw count of messages accepted in the range, with the number handed on to carriers (sent) and the change versus the previous period.
- Segments — the total billable segments sent and the spend behind them, with the change versus the previous period. Because a message can be several segments, this is usually higher than your accepted count — a gap that widens means longer messages or a shift to the UCS-2 encoding.
The 95% and 5% thresholds are the guardrails Bird uses to color the tiles. They're deliberately conservative — a tile can read Healthy and still have room to improve.
Delivery over time
The delivery chart plots accepted, delivered, and failed volume across the range so you can spot trends and one-off spikes — a bad campaign, a number-list import gone wrong, a route that degraded. The failed series here rolls up every non-delivery outcome (undelivered, failed, and expired) into one line. The bucket size follows the range (hourly for 24 hours, daily for longer windows).
Failure rate and its causes
Below the chart, a failure-rate line charts the per-bucket failure rate across the range, and an outcome histogram breaks your non-deliveries down by cause, so a rising failure rate points you at the fix:
- Undelivered — a non-permanent non-delivery: the handset was off, unreachable, or the content was blocked by the carrier.
- Failed — a permanent failure; the message will not be delivered.
- Expired — the message's validity window elapsed before a delivery receipt arrived.
- Rejected — Bird refused the message before it reached a carrier (a validation or policy rejection).
Each bucket shows its count and its share of accepted messages. One thing to note when reconciling the numbers: the Failure rate tile counts undelivered, failed, and expired, while rejected is shown in this histogram but sits outside the failure-rate math — a rejected message never reached a carrier, so it's tracked separately from delivery failures.
Delivery latency
The latency table shows how long messages take to move through the pipeline, split into Processing (Bird accepting the message and handing it to a carrier), Delivery (the carrier delivering to the handset), and Total (end to end), each at the p50, p95, and p99 percentiles. Use p95/p99 to catch the slow tail — a healthy median with a slow p99 usually points at one carrier or destination lagging. Latency is a whole-window figure; where a percentile has no data for the range it shows —.

The stats API
The dashboard reads the same numbers you can pull programmatically:
- GET /v1/sms/stats/summary — the single-row aggregate behind the tiles: the lifecycle counts, delivery_rate, failure_rate, the latency percentiles, and spend (total segments and cost) for a range. Pass compare=previous_period to get the deltas the tiles show.
- GET /v1/sms/stats/daily and GET /v1/sms/stats/hourly — one row of lifecycle counts per day or hour, for charting over time. Daily covers up to a year; hourly up to 30 days.
Each endpoint can slice the range by one dimension per request — originator, country, category, or carrier — and takes a timezone so day and hour buckets line up with your reporting calendar.
Next steps
- SMS log — the per-message view behind the aggregate numbers
- Events — the per-message event stream the metrics are derived from
- Sending SMS — categories, tags, and the segment model behind segment and spend counts