Analytics
Track sending metrics with tenant-wide, sequence-level, and template-level reporting.
Kraiter provides analytics at multiple levels — tenant-wide, per-sequence, and per-template. Metrics are aggregated into daily and monthly rollups, giving you a clear picture of your email performance over time.
Metric types
Kraiter tracks the following metrics across all levels:
| Metric | Description |
|---|---|
sent | Total emails sent |
delivered | Emails successfully delivered to the recipient's mail server |
opened | Emails opened (via tracking pixel) |
clicked | Links clicked in emails |
bounced | Emails that bounced (hard and soft) |
complained | Emails reported as spam by recipients |
Derived rates
From these raw counts, you can calculate useful rates:
- Delivery rate —
delivered / sent - Open rate —
opened / delivered - Click rate —
clicked / delivered - Click-to-open rate —
clicked / opened - Bounce rate —
bounced / sent - Complaint rate —
complained / delivered
Tenant-wide metrics
Get an overview of all sending activity across your tenant:
// Aggregated totals for a month (defaults to the current month)
const result = await kraiter.metrics.getTenantMetrics({
period: 'monthly',
yearMonth: '2025-06',
});
const { metrics } = result;
console.log(`${result.yearMonth}: ${metrics.sent} sent, ${metrics.delivered} delivered, ${metrics.opened} opened`);curl "https://api.kraiter.com/api/metrics?period=monthly&yearMonth=2025-06" \
-H "Authorization: Bearer YOUR_API_KEY"Periods
Metrics are pre-aggregated into daily and monthly rollups. Select which with the period parameter (defaults to monthly):
| Period | Selector | Description |
|---|---|---|
monthly | yearMonth=YYYY-MM | Totals for one month (defaults to the current month) |
daily | date=YYYY-MM-DD, or startDate/endDate for a range | Totals for a single day, or an array of daily rollups across a range |
Sequence-level metrics
View metrics for a specific sequence to understand how your automated workflow is performing:
const result = await kraiter.metrics.getSequenceMetrics('onboarding', {
yearMonth: '2025-06',
});
const { metrics } = result;
const openRate = metrics.delivered > 0 ? (metrics.opened / metrics.delivered * 100).toFixed(1) : '0.0';
console.log(`${result.yearMonth}: ${metrics.sent} sent, ${openRate}% open rate`);curl "https://api.kraiter.com/api/metrics/sequences/onboarding?yearMonth=2025-06" \
-H "Authorization: Bearer YOUR_API_KEY"Sequence-level metrics help you identify which sequences are performing well and which need attention. Compare open and click rates across sequences to find your most engaging content.
Template-level metrics
View metrics for a specific template across all sends (both transactional and sequence):
const result = await kraiter.metrics.getTemplateMetrics('welcome-email', {
yearMonth: '2025-06',
});
const { metrics } = result;
console.log(`${result.yearMonth}: ${metrics.sent} sent, ${metrics.bounced} bounced`);curl "https://api.kraiter.com/api/metrics/templates/welcome-email?yearMonth=2025-06" \
-H "Authorization: Bearer YOUR_API_KEY"Template-level metrics let you compare the performance of different email designs and content. Use this data to iterate on your templates.
Response format
A tenant, sequence, or template metrics request returns the selected period plus the aggregated metrics object:
{
"period": "monthly",
"yearMonth": "2025-06",
"metrics": {
"sent": 38200,
"delivered": 37600,
"opened": 12500,
"clicked": 2600,
"bounced": 420,
"complained": 45
}
}A daily range request (startDate/endDate) instead returns metrics as an array, with one entry per day.
Monitoring key indicators
Bounce rate
Keep your bounce rate below 5%. A sustained rate above this threshold indicates list quality issues:
- Remove contacts who consistently bounce
- Use double opt-in to validate new email addresses
- Regularly clean your contact list
Complaint rate
Keep your complaint rate below 0.1%. ISPs take complaints seriously:
- Make unsubscribe easy and visible
- Only send to contacts who have opted in
- Set clear expectations about email frequency during signup
Open rate benchmarks
Open rates vary by industry and email type, but typical ranges are:
- Transactional emails: 60-80% (password resets, order confirmations)
- Welcome sequences: 40-60%
- Marketing sequences: 15-30%
- Re-engagement campaigns: 10-20%
Remember that open tracking has limitations (see the Tracking guide), so treat these as directional metrics rather than exact measurements.
Using the metrics API in your application
You can build custom dashboards and reporting by pulling metrics from the API:
async function generateMonthlyReport(yearMonth: string) {
const { metrics } = await kraiter.metrics.getTenantMetrics({
period: 'monthly',
yearMonth,
});
console.log(`Report for ${yearMonth}`);
console.log(`Sent: ${metrics.sent}`);
console.log(`Delivery rate: ${(metrics.delivered / metrics.sent * 100).toFixed(1)}%`);
console.log(`Open rate: ${(metrics.opened / metrics.delivered * 100).toFixed(1)}%`);
console.log(`Click rate: ${(metrics.clicked / metrics.delivered * 100).toFixed(1)}%`);
console.log(`Bounce rate: ${(metrics.bounced / metrics.sent * 100).toFixed(1)}%`);
}Best practices
- Monitor daily. Check your metrics dashboard regularly to spot trends and issues early.
- Act on bounces quickly. A spike in bounces indicates a problem — stale list, misconfigured domain, or DNS issue.
- Compare across sequences. Use sequence-level metrics to identify your best-performing content and replicate what works.
- Track over time. Monthly rollups show long-term trends that daily data can obscure. Look at both.
- Set alerts for thresholds. Use the metrics API to build automated alerts when bounce or complaint rates exceed acceptable levels.