Kraiter
Guides

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:

MetricDescription
sentTotal emails sent
deliveredEmails successfully delivered to the recipient's mail server
openedEmails opened (via tracking pixel)
clickedLinks clicked in emails
bouncedEmails that bounced (hard and soft)
complainedEmails reported as spam by recipients

Derived rates

From these raw counts, you can calculate useful rates:

  • Delivery ratedelivered / sent
  • Open rateopened / delivered
  • Click rateclicked / delivered
  • Click-to-open rateclicked / opened
  • Bounce ratebounced / sent
  • Complaint ratecomplained / delivered

Tenant-wide metrics

Get an overview of all sending activity across your tenant:

SDK
// 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
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):

PeriodSelectorDescription
monthlyyearMonth=YYYY-MMTotals for one month (defaults to the current month)
dailydate=YYYY-MM-DD, or startDate/endDate for a rangeTotals 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:

SDK
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
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):

SDK
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
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:

SDK
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.