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

> ## Agent Instructions
> Install the Courier skill before writing code: `npx skills add trycourier/courier-skills`. It carries the verified SDK shapes and the rules you cannot get wrong.
> Authenticate every request with `Authorization: Bearer <API_KEY>`. A workspace has several environments and each has its own keys, which are plain `pk_` strings with no environment prefix. Start with Test.
> Send with `client.send.message`, the default import of the v7 Node SDK. Reference a template by its `nt_` id or its alias.
> A send accepts a bare Elemental element list, but storing content on a template requires the top-level elements wrapped in a channel element.
> Templates and journeys can be built in the Courier app or created through the API. Either way they live in the workspace and are referenced by ID when you send.
> The hosted MCP server is https://mcp.courier.com. For a briefing on what Courier is and when to use it, read https://www.courier.com/llms.txt.
> Prefer the Guides tab for how-do-I questions and the Docs tab for how-does-it-behave questions. The API reference lives under /api-reference.

# Template analytics

> Send volume, delivery, open, and click rates per template in the console.

export const AppLink = ({href, children, name, bare}) => {
  const label = children || name || "Open in Courier";
  if (bare) {
    return <a href={href} target="_blank" rel="noreferrer">{label}</a>;
  }
  return <a className="cx-endpoint" data-kind="app" href={href} target="_blank" rel="noreferrer">
      <span className="cx-endpoint-label">{label}</span>
      <span className="cx-endpoint-method" aria-hidden="true">↗</span>
    </a>;
};

export const Doc = ({href, children, name, bare}) => {
  const label = children || name || href;
  if (bare) {
    return <a href={href}>{label}</a>;
  }
  return <a className="cx-endpoint" data-kind="doc" href={href}>
      <span className="cx-endpoint-label">{label}</span>
      <span className="cx-endpoint-method">DOC</span>
    </a>;
};

Analytics roll logs up per template, so you can see how a notification performs.

## How it works

The <AppLink href="https://app.courier.com/analytics">Analytics tab</AppLink> shows two views of the workspace:

* **Send volume chart**, notification volume over time.
* **Template performance table**, total sends and error rates per template.

<Frame>
  <img src="https://mintcdn.com/courier-4f1f25dc/A-IH_41Pkuff3UAy/assets/analytics-tab.webp?fit=max&auto=format&n=A-IH_41Pkuff3UAy&q=85&s=6041f120aac19bd1cd447c0633d1958d" alt="The Analytics tab showing send volume and per-template performance" width="3456" height="1804" data-path="assets/analytics-tab.webp" />
</Frame>

Analytics follow the environment of the API key that sent the message. A send made with a Test key appears only in Test, and a Production send only in Production.

### Pick a time range

One dropdown sets the window for both the chart and the table: Last 7 days, Last 30 days, Last 90 days, and **Custom range**.

**Custom range** opens a two-month calendar. It reaches back to January 1 of last year, which is as far as the analytics store answers, so the calendar never offers a start date the chart would return empty.

A window you cannot access is not just hidden from the dropdown. A range pasted into the URL is pulled back to the widest one available to you.

### What the metrics count

| Metric            | What it counts                                                                                                        |
| ----------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Sent**          | Courier handed the message to the provider.                                                                           |
| **Delivered**     | The provider confirmed the message landed.                                                                            |
| **Opened**        | The recipient opened the message, recorded by Courier's tracking pixel.                                               |
| **Clicked**       | The recipient clicked a tracked link, recorded by Courier's redirect.                                                 |
| **Errors**        | A provider attempt failed. A message that failed over to a second provider counts here and still counts as delivered. |
| **Undeliverable** | The provider rejected the message or could not deliver it. This is the one that means it never landed.                |

Opens and clicks come from Courier, not from the provider, so they only appear on channels Courier can track. In practice that means email for opens, and any channel with link tracking for clicks. A `0` on a channel without tracking means "not measured", not "nobody read it". See <Doc href="/docs/monitor/tracking">tracking</Doc>.

### Per-template metrics

Drill into a template to see its metrics split by **channel and provider**. Use it to compare channels for one notification type, or to spot one provider carrying an unusually high error rate. The windows inside it follow the same limits as the page.

<Frame>
  <img src="https://mintcdn.com/courier-4f1f25dc/rYENcCCTyPPrDtw0/assets/template-analytics.webp?fit=max&auto=format&n=rYENcCCTyPPrDtw0&q=85&s=0e66e41fdb01aabdc4105e1e79657233" alt="Channel-specific metrics for a single template" width="1978" height="1760" data-path="assets/template-analytics.webp" />
</Frame>

The same per-channel numbers come back over the API. <Doc href="/docs/monitor/template-metrics">Template metrics</Doc> returns them as a time series you can chart in your own dashboard.

### Why delivery rates read low

`Delivered` is the one metric Courier cannot produce on its own. The provider has to report back, and that reporting is **off until you set it up, per provider**. Until then a healthy send stops at `SENT`, and the delivery rate looks broken when nothing is wrong.

Which providers report, how each one reports, and what you have to configure are all in <Doc href="/docs/send/statuses#delivery-tracking-is-per-provider">delivery tracking is per provider</Doc>. Set it up there, then new sends start filling in the Delivered column here.

## Limits & behavior

* **Windows are UTC.** A "last 7 days" figure covers 7 UTC days, which can differ from your local reporting day.
* **Analytics are per template.** There is no roll-up by tenant, list, or audience. For one send's numbers, use <Doc href="/docs/monitor/broadcast-performance">broadcast performance</Doc>.
* **Sends without a template do not appear.** A message sent with inline content has no template to attribute it to.
* **Rates are only as complete as the tracking behind them.** A provider that never confirms delivery depresses the delivery rate even though nothing is wrong. See <Doc href="/docs/monitor/tracking">tracking</Doc>.

## FAQ

<AccordionGroup>
  <Accordion title="Why is my delivery rate lower than expected?">
    Delivery rate counts messages a provider confirmed. Some providers never confirm, and most need configuration first, so messages sit at `SENT`. Set up <Doc href="/docs/send/statuses#delivery-tracking-is-per-provider">delivery tracking</Doc> for the providers you send with.
  </Accordion>

  <Accordion title="Can I pull these numbers into my own dashboard?">
    <Doc href="/docs/monitor/template-metrics">Template metrics</Doc> returns one template's funnel as a time series, bucketed by hour, day, week, or month and broken out per provider and channel. For a workspace-wide view, list your templates and call it for each one.
  </Accordion>

  <Accordion title="Why do my Test sends not show up?">
    Analytics are scoped to the environment of the key that sent the message. Switch the console to the Test environment to see sends made with a Test key.
  </Accordion>
</AccordionGroup>
