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

# Metrics

> Analyze delivery volume, engagement rates, trends, and advisor signals

The **Metrics** page summarizes project email outcomes over a selected time window.
Use it to find changes, then open individual messages, domains, contacts, or suppressions for root-cause work.

## Time windows and granularity

Choose 24 hours, 7 days, 30 days, or 90 days.
The 24-hour view uses hourly buckets.
Longer views can use daily buckets.
Compare equivalent windows before calling a change a trend.

## Counts

Signal reports sent, delivered, opened, clicked, bounced, complained, failed, and unsubscribed outcomes.
Counts can arrive asynchronously as providers and tracking events report back.

## Rates

| Rate               | Interpretation                                                              |
| ------------------ | --------------------------------------------------------------------------- |
| Delivery rate      | Delivered messages relative to the relevant sent volume                     |
| Open rate          | Tracked opens relative to delivered messages                                |
| Click rate         | Tracked clicks relative to delivered messages                               |
| Click-to-open rate | Tracked clicks relative to tracked opens                                    |
| Bounce rate        | Bounces relative to sent volume                                             |
| Complaint rate     | Complaints relative to delivered or sent volume used by the metric contract |

<Note>
  Open and click metrics depend on tracking configuration and mail-client behavior.
  Privacy protections, image blocking, link scanning, and security gateways can affect them.
</Note>

## Volume timeline

Use the timeline to locate the hour or day where behavior changed.
Correlate that point with deployments, audience changes, domain changes, content changes, provider incidents, and quota pressure.

## Deliverability advisor

When enabled for the project, the advisor grades recent delivery health and recommends investigation areas.
The dashboard bands are **Healthy** at 90 or above, **Good** at 75 or above, **Needs attention** at 50 or above, and **Critical** below 50.
Treat the score as a summary of underlying evidence, not an independent delivery guarantee.

## Investigation sequence

1. Confirm whether total volume changed.
2. Separate bounce, complaint, failure, rejection, and suppression growth.
3. Narrow the time range.
4. Open affected message timelines.
5. Check domain authentication and tracking state.
6. Check the audience source and suppression behavior.
7. Record the change and watch the next equivalent window.

## SDK example

After creating an authenticated client with the matching [SDK setup guide](/signal/send-with/sdk-overview),
use the operation for your language or framework.

<CodeGroup dropdown>
  ```typescript TypeScript theme={"dark"}
  const summary = await signal.metrics.getProjectMetricsSummary(
    { window: "7d", projectId },
    { headers: { Authorization: `Bearer ${process.env.SIGNAL_API_KEY}` } },
  );
  ```

  ```python Python theme={"dark"}
  summary = signal.metrics.get_project_metrics_summary(
      window="7d",
      project_id=project_id,
  )
  ```

  ```go Go theme={"dark"}
  window := "7d"
  summary, err := client.Metrics.GetProjectMetricsSummary(ctx, &window, &projectID)
  if err != nil {
      panic(err)
  }
  ```

  ```ruby Ruby theme={"dark"}
  summary = signal.metrics.get_project_metrics_summary(
    query: { window: "7d", project_id: project_id }
  )
  ```

  ```ruby Rails theme={"dark"}
  summary = ApolloDeploySignalSdkRails.rails_client.metrics.get_project_metrics_summary(
    query: { window: "7d", project_id: project_id }
  )
  ```

  ```php PHP / Laravel theme={"dark"}
  $summary = $signal->metrics()->getProjectMetricsSummary('7d', $projectId);
  ```

  ```java Java theme={"dark"}
  var summary = signal.metrics().getProjectMetricsSummary("7d", projectId);
  ```

  ```kotlin Kotlin theme={"dark"}
  val summary = signal.metrics.getProjectMetricsSummary(
      window = "7d",
      projectId = projectId,
  )
  ```

  ```csharp .NET theme={"dark"}
  var summary = await signal.Metrics.GetProjectMetricsSummaryAsync(
      new Dictionary<string, object?>
      {
          ["window"] = "7d",
          ["projectId"] = projectId,
      });
  ```

  ```rust Rust theme={"dark"}
  let summary = signal.metrics.get_project_metrics_summary(
      Some("7d".to_string()),
      Some(project_id.to_string()),
  ).await?;
  ```

  ```elixir Elixir theme={"dark"}
  query = %ApolloSignal.Types.GetProjectMetricsSummaryQuery{
    window: "7d",
    project_id: project_id
  }

  {:ok, summary, _metadata} =
    ApolloSignal.Client.get_project_metrics_summary(client, query)
  ```

  ```swift Swift theme={"dark"}
  let summary = try await signal.metrics.getProjectMetricsSummary(
      window: "7d",
      projectId: projectId
  )
  ```

  ```zig Zig theme={"dark"}
  var metrics = client.metrics();
  var result = try metrics.getProjectMetricsSummary(.{
      .window = "7d",
      .projectId = project_id,
  }, .{});
  defer result.deinit();

  switch (result) {
      .success => |_| {},
      .api_error => return error.SignalApiError,
  }
  ```
</CodeGroup>
