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 |
unsubscribed | Recipients who unsubscribed after receiving the email |
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:
const metrics = await kraiter.metrics.tenant({
period: 'daily',
from: '2025-06-01',
to: '2025-06-30',
});
for (const day of metrics.items) {
console.log(`${day.date}: ${day.sent} sent, ${day.delivered} delivered, ${day.opened} opened`);
}curl "https://api.kraiter.com/metrics?period=daily&from=2025-06-01&to=2025-06-30" \
-H "Authorization: Bearer YOUR_API_KEY"Periods
| Period | Description |
|---|---|
daily | One data point per day |
monthly | One data point per month |
Sequence-level metrics
View metrics for a specific sequence to understand how your automated workflow is performing:
const metrics = await kraiter.metrics.sequence('onboarding', {
period: 'daily',
from: '2025-06-01',
to: '2025-06-30',
});
for (const day of metrics.items) {
const openRate = day.delivered > 0 ? (day.opened / day.delivered * 100).toFixed(1) : '0.0';
console.log(`${day.date}: ${day.sent} sent, ${openRate}% open rate`);
}curl "https://api.kraiter.com/metrics/sequences/onboarding?period=daily&from=2025-06-01&to=2025-06-30" \
-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 metrics = await kraiter.metrics.template('welcome-email', {
period: 'monthly',
from: '2025-01-01',
to: '2025-06-30',
});
for (const month of metrics.items) {
console.log(`${month.date}: ${month.sent} sent, ${month.bounced} bounced`);
}curl "https://api.kraiter.com/metrics/templates/welcome-email?period=monthly&from=2025-01-01&to=2025-06-30" \
-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
All metrics endpoints return the same response structure:
{
"items": [
{
"date": "2025-06-01",
"sent": 1250,
"delivered": 1230,
"opened": 410,
"clicked": 85,
"bounced": 15,
"complained": 2,
"unsubscribed": 8
},
{
"date": "2025-06-02",
"sent": 980,
"delivered": 970,
"opened": 340,
"clicked": 62,
"bounced": 8,
"complained": 1,
"unsubscribed": 5
}
]
}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 generateWeeklyReport() {
const now = new Date();
const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
const metrics = await kraiter.metrics.tenant({
period: 'daily',
from: weekAgo.toISOString().split('T')[0],
to: now.toISOString().split('T')[0],
});
const totals = metrics.items.reduce(
(acc, day) => ({
sent: acc.sent + day.sent,
delivered: acc.delivered + day.delivered,
opened: acc.opened + day.opened,
clicked: acc.clicked + day.clicked,
bounced: acc.bounced + day.bounced,
}),
{ sent: 0, delivered: 0, opened: 0, clicked: 0, bounced: 0 },
);
console.log('Weekly Report');
console.log(`Sent: ${totals.sent}`);
console.log(`Delivery rate: ${(totals.delivered / totals.sent * 100).toFixed(1)}%`);
console.log(`Open rate: ${(totals.opened / totals.delivered * 100).toFixed(1)}%`);
console.log(`Click rate: ${(totals.clicked / totals.delivered * 100).toFixed(1)}%`);
console.log(`Bounce rate: ${(totals.bounced / totals.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.