Email & SMS Tab — Data & Metrics Wiki

Every metric defined. Every source traced. No guessing.
Last updated: March 2026 Source: Klaviyo REST API v2024-02-15 Dashboard: performance-tracking/index.html

Contents

1 Tab Overview

The Email & SMS tab consolidates all owned-channel (retention) marketing performance into a single view. It is powered exclusively by Klaviyo data — campaigns, automated flows, and subscriber lists — with no Snowflake or ad-platform data on this tab.

The tab answers four core questions:

  • Revenue: How much did Email and SMS each generate this period?
  • Engagement: Are subscribers opening and clicking? Is that trend improving?
  • List health: Is the list growing or shrinking? Which channel is winning?
  • Campaign/flow mix: Which sends drove results and which underperformed?
All data on this tab is scoped to the selected fiscal period (top-left date picker). Changing the period re-fetches live data from Klaviyo. Subscription history is always a rolling 52-week view regardless of the selected period.
2 Data Sources
API Endpoint What It Returns Used By Cache TTL
/api/klaviyo/campaigns
?start=&end=
All Email & SMS campaigns with scheduled_at in the date range. Includes send-level stats (recipients, open rate, click rate, revenue, RPR, orders). KPI cards, Engagement Trends, Campaign Calendar, Campaigns Table 5 min
/api/klaviyo/flows
?start=&end=
All active flows with aggregate stats for the period (recipients, open/click/CVR rates, revenue, orders). Flow Performance Table 5 min
/api/klaviyo/subscribers
(no date params)
Weekly net subscription counts for Email and SMS going back 52 weeks. Each row: week_start, email_subs, email_unsubs, sms_subs, net_email, net_sms. Subscription Trend Chart, Net Subs KPI cards 5 min
Backend: How Klaviyo Data Is Assembled

The backend (main.py) assembles campaign-level stats in two steps:

  1. Metadata fetch (GET): Retrieve all campaigns by channel (email, sms) filtered by scheduled_at date range. Builds a lookup map of campaign_id → {name, send_date, channel}.
  2. Stats fetch (POST): POST to Klaviyo's campaign-values-reports endpoint for the same timeframe. Returns engagement stats for all campaigns. Joined to the metadata map by campaign_id.

Revenue per campaign = revenue_per_recipient × total_recipients, aggregated across all message variants (Klaviyo splits A/B test sends into chunks).

Klaviyo's campaign-values-reports endpoint is aggressively rate-limited (~1 request per 30 seconds). The backend uses exponential back-off retries and a 5-minute in-memory cache to absorb this. If Klaviyo data looks stale, a hard refresh (Cmd+Shift+R) will bust the browser cache — but the server cache persists for 5 minutes.
3 KPI Cards

Six summary cards appear at the top of the tab. Each shows the current period value, a % delta badge vs. the comparison period, and the previous period's absolute value.

Email Revenue Klaviyo

Total attributed revenue generated by Email campaigns in the selected period.

Email Revenue = Σ (campaign.revenue) for all Email campaigns with send_date in period

Campaign-level revenue is pre-computed by the backend as revenue_per_recipient × recipients, sourced from Klaviyo's campaign-values-reports endpoint. Klaviyo attributes revenue using a 5-day last-click attribution window — any purchase made within 5 days of clicking an email is credited to that campaign.

Channel filter: Email only. SMS campaigns are excluded even if "All" is selected.
SMS Revenue Klaviyo

Total attributed revenue generated by SMS campaigns in the selected period.

SMS Revenue = Σ (campaign.revenue) for all SMS campaigns with send_date in period

Uses the same Klaviyo attribution model as Email Revenue (5-day last-click). SMS attribution window may differ in your Klaviyo account settings — verify in Klaviyo > Analytics > Attribution.

Channel filter: SMS only. Unaffected by the Email/SMS/All channel toggle.
Open Rate Klaviyo  

Weighted-average open rate across all Email campaigns in the period. Always Email-only — SMS does not support open tracking.

Open Rate = Σ (campaign.open_rate × campaign.recipients) / Σ campaign.recipients
for all Email campaigns in period

Weighting by recipients ensures large campaigns have proportional influence. A campaign with 50,000 recipients and a 30% open rate outweighs a 500-recipient campaign at 60%.

Klaviyo open rate = unique opens / unique recipients. It uses machine-open filtering (Apple MPP and bot traffic are excluded from Klaviyo's open counts by default in accounts using Klaviyo's intelligent open tracking).
Click Rate (CTR) Klaviyo   All channels

Weighted-average click-through rate across campaigns in the selected period and channel filter.

CTR = Σ (campaign.click_rate × campaign.recipients) / Σ campaign.recipients
for campaigns matching the active channel filter

If the channel filter is "Email", only email campaigns are included. If "SMS", only SMS. If "All", all campaigns are included and the weighted average is computed across both channels.

Klaviyo CTR = unique clicks / unique recipients. For SMS, a "click" is a link click in the message body. For Email, it is any tracked link click.
RPR — Revenue Per Recipient Computed

Weighted-average revenue earned per recipient across campaigns in the period. A useful proxy for campaign monetization efficiency — higher is better.

RPR = Σ (campaign.rpr × campaign.recipients) / Σ campaign.recipients
campaign.rpr is sourced from Klaviyo as revenue_per_recipient

Unlike open rate, RPR respects the active channel filter (All / Email / SMS).

RPR is influenced by send frequency. A week with 3 sends may show lower RPR per campaign than a week with 1 large send, even if total revenue is higher.
Net Email Subs Klaviyo  

Net new email subscribers added during the selected period.

Net Email Subs = Σ net_email for weeks overlapping the selected period
net_email = email_subs − email_unsubs (per week)

Sourced from the /api/klaviyo/subscribers endpoint which returns Klaviyo's weekly list growth metrics. Weeks that partially overlap the period are included in full.

Unsubscribes include both manual unsubscribes and hard bounces processed by Klaviyo. SMS opt-outs (STOP keyword) are counted in Net SMS Subs, not here.
Net SMS Subs Klaviyo   SMS

Net new SMS subscribers added during the selected period.

Net SMS Subs = Σ net_sms for weeks overlapping the selected period
The subscriber endpoint returns weekly granularity only. There is no daily SMS subscription breakdown available from Klaviyo's current API. "Daily" granularity on the dashboard still renders at weekly resolution for this data.
4 Engagement Trends Chart

A time-series line chart showing campaign engagement over the selected period. Toggle between three metrics using the buttons above the chart. A dashed comparison line shows the same metric for the previous period, aligned by index position (first send to first send, etc.).

Available Metrics
Open Rate trend

Per-date (or per-week, per-month) weighted-average open rate. The channel filter is overridden to Email-only for this metric regardless of the global channel selector.

For each date bucket:
Open Rate = Σ (campaign.open_rate × campaign.recipients) / Σ campaign.recipients
only campaigns where channel === "Email"
If a day or week has only SMS sends (no email), the open rate will appear as a gap (null) in the chart rather than 0%. This prevents the chart from incorrectly showing a 0% open rate on SMS-heavy days.
Click Rate trend Respects channel filter

Per-date weighted-average click rate, respecting the active channel filter.

For each date bucket:
CTR = Σ (campaign.click_rate × campaign.recipients) / Σ campaign.recipients
Rev / Recipient (RPR) trend Respects channel filter

Per-date weighted-average RPR showing how efficiently each send monetized its audience over time.

For each date bucket:
RPR = Σ (campaign.rpr × campaign.recipients) / Σ campaign.recipients
Granularity

Controlled by the global Daily / Weekly / Monthly buttons in the filter bar. "Weekly" groups campaigns by the Monday of their send week. "Monthly" groups by calendar month.

📌
Comparison line: The dashed line shows the same metric for the comparison period. Data points are aligned by position (1st send vs. 1st send), not by calendar date. The tooltip reveals the actual comparison send date on hover.
5 Subscription Trend Chart

A line chart showing the volume of email subscribes, email unsubscribes, and SMS subscribes over time. Uses a rolling 52-week window (independent of the period selector) to show list health trajectory.

Metrics in This Chart
SeriesDefinitionDirection
Email Subs
Blue line
New email subscribers added per period. Includes sign-ups from all sources: website popups, checkout, Klaviyo forms, list imports. Higher = better
Email Unsubs
Red line
Email subscribers removed per period. Includes manual unsubscribes, spam complaints processed by Klaviyo, and suppressed hard bounces. Lower = better
SMS Subs
Amber line
New SMS subscribers (opt-ins) added per period. Higher = better
Channel Selector (Subscription-only)

The Both / Email / SMS toggle above the subscription chart is independent of the global Email/SMS/All channel filter. It only controls which series appear in this chart and does not affect any other panel.

Granularity

Controlled by the same global Daily/Weekly/Monthly selector as Engagement Trends. However, the underlying API data is already weekly — selecting "Daily" will produce the same chart as "Weekly" because no daily breakdown is available from Klaviyo. "Monthly" rolls up weeks into calendar months (~12 data points vs. 52).

6 Flow Performance Table

Flows are Klaviyo's automated email/SMS sequences (e.g., Welcome Series, Abandoned Cart, Post-Purchase). Unlike campaigns, flows send continuously based on triggers. The Flow Performance table shows aggregate stats for the selected period.

Column Definitions
ColumnDefinitionSource
Flow The flow name as configured in Klaviyo. Klaviyo API
Category Flow category tag. Used for filtering. Categories:
Acquisition Revenue Recovery Transactional Retention Returns Other
Klaviyo API
Recipients Unique profiles who received at least one message from this flow during the period. Klaviyo API
Open Rate Unique opens / unique recipients for Email messages in this flow. Flows with only SMS messages show 0% or — for open rate. Klaviyo API
CTR Unique clicks / unique recipients across all messages in the flow. Klaviyo API
CVR Orders attributed to this flow / unique recipients. Klaviyo's attribution model (5-day click or 1-day open) is used. Klaviyo API
Orders Total orders attributed to this flow in the period. Klaviyo API
Revenue Total revenue attributed to this flow in the period. Klaviyo API
RPR Revenue Per Recipient = flow.revenue / flow.recipients. Shows monetization efficiency of the flow. Computed
📌
"Active flows only" toggle: Hides flows with 0 recipients in the period. Useful for decluttering — Klaviyo returns all configured flows even if they triggered no sends.
7 Campaign Calendar

A monthly grid view showing which days had campaign sends. Useful for visualizing send cadence and identifying gaps or over-sending periods.

  • Each dot on a day represents one campaign send.
  • Dots are colored by channel:   SMS
  • The calendar automatically navigates to the first month of the selected period when the period changes.
  • Use ‹ / › buttons to navigate to other months.
  • The search box above the calendar filters which campaigns are shown.
📌
The calendar shows campaigns based on send_date (actual scheduled date), not the end of a 5-day attribution window. A campaign sent on March 5 appears on March 5, even if it generates revenue through March 10.
8 All Campaigns Table

A sortable row-level table of every campaign sent in the selected period. Each row is one campaign send.

Column Definitions
ColumnDefinitionNotes
Date The campaign's scheduled_at date (send date). Sorted descending by default.
Campaign Campaign name as entered in Klaviyo. Searchable via the search box.
Channel Email or SMS. Filterable via channel toggle.
Recipients Unique recipients this campaign was sent to. For A/B tests, this is the total across all variants.  
Open Rate Unique opens / unique recipients. Only meaningful for Email campaigns — SMS shows 0%. Email-only metric.
CTR Unique clicks / unique recipients.  
CVR Orders attributed to this campaign / recipients. Indicates what % of recipients eventually purchased (within attribution window). Low CVR with high RPR = high-AOV buyers.
Orders Total orders attributed to this campaign within Klaviyo's attribution window.  
Revenue Total revenue attributed to this campaign. = revenue_per_recipient × recipients.  
RPR Revenue Per Recipient for this individual campaign. = campaign.revenue / campaign.recipients. Best indicator of per-send efficiency.
9 Filters & Controls
ControlOptionsWhat It AffectsNotes
Channel All / Email / SMS KPI cards (CTR, RPR), Engagement Trends, Campaign Calendar, Campaigns Table Open Rate KPI and trend always use Email-only regardless of this filter.
Granularity Daily / Weekly / Monthly Engagement Trends chart, Subscription Trend chart Weekly bins campaigns by Monday of send week. Sub data is natively weekly — Daily = same as Weekly.
Sub Channel Both / Email / SMS Subscription Trend chart only Completely independent of the global Channel filter. Stored in a separate state variable.
Flow Category All / Acquisition / Revenue Recovery / Transactional / Returns / Retention / Other Flow Performance Table only  
Active Flows Only Toggle Flow Performance Table only Hides flows with 0 recipients in period.
Campaign Search Free text Campaign Calendar, Campaigns Table Case-insensitive substring match on campaign name.
Period Fiscal Week, Fiscal Period, WTD, MTD, Last N days, Custom Everything on the tab (triggers full re-fetch) See §10 for fiscal calendar details.
Comparison Mode Prev Period / Prev Week / Prev Month / Prev Year / Custom KPI badge deltas, Engagement Trends comp line See §11 for how comp dates are calculated.
10 Periods & Fiscal Calendar

Jack Archer uses a 4-5-4 retail fiscal calendar. Weeks start on Monday and are grouped into fiscal months. The fiscal year begins in late December (approximately week 1 = last week of December).

Fiscal Calendar Structure
QuarterMonthWeeks
Q1January (FM 1)5 weeks
Q1February (FM 2)4 weeks
Q1March (FM 3)4 weeks
Q2April (FM 4)5 weeks
Q2May (FM 5)4 weeks
Q2June (FM 6)4 weeks
Q3July (FM 7)5 weeks
Q3August (FM 8)4 weeks
Q3September (FM 9)4 weeks
Q4October (FM 10)5 weeks
Q4November (FM 11)4 weeks
Q4December (FM 12)4 weeks
Period Selector Modes
ModeDate Range
Fiscal Week (FW) Monday – Sunday of the selected fiscal week (7 days).
Fiscal Period (FP) All weeks in the current fiscal month (28 or 35 days).
WTD Monday of the current calendar week through today (ET timezone).
MTD First day of the current calendar month through today.
Last N Days Rolling N-day window ending today.
Custom User-specified start and end dates.
All date logic uses Eastern Time (ET). "Today" is always evaluated in ET. Campaign send dates from Klaviyo are also stored in ET.
11 Comparison Period Logic

Every KPI badge shows a % delta vs. a comparison period. The comparison period dates are computed client-side based on the current period and the selected comparison mode.

ModeComp StartComp EndExample (Current: Mar 2–8)
Prev Period Current start − length of period Current start − 1 day Feb 23 – Mar 1
Prev Week Current start − 7 days Current end − 7 days Feb 23 – Mar 1
Prev Month Current start −1 calendar month Current end −1 calendar month Feb 2 – Feb 8
Prev Year Current start −1 calendar year Current end −1 calendar year Mar 2, 2025 – Mar 8, 2025
Custom User-specified User-specified
📌
The badge color follows the direction convention: green = improvement, red = decline. For metrics where lower is better (e.g. Unsubscribes), this direction is inverted. For RPR and Revenue — higher is always better.
12 Known Caveats & Gotchas
🚫
SMS has no Open Rate. Klaviyo does not track SMS opens (text messages don't have a pixel mechanism). Any open-rate metric on this tab is always Email-only. An SMS campaign will show 0.0% open rate in the raw table — this is expected, not a bug. The KPI card and Engagement Trend always enforce Email-only filtering for open rate regardless of the channel selector.
🚫
Attribution overlap between Campaigns and Flows. Klaviyo can attribute the same order to both a campaign and a flow if the customer clicked both within the attribution window. This means summing campaign revenue + flow revenue may overcount total Email/SMS revenue. The KPI cards use campaign data only; flows are shown separately for reference.
Subscription Trend uses a rolling 52-week window, not the selected period. The period selector does not scope the Subscription Trend chart. The chart always shows the past year of list growth. The KPI cards (Net Email Subs, Net SMS Subs) do reflect the selected period.
Comp line in Engagement Trends is index-aligned, not date-aligned. If the current period had 3 sends and the comp period had 5, the chart aligns send #1 to send #1 etc. Sends beyond the shorter period's count are dropped. This means the comp line shows relative cadence pacing, not an exact calendar overlay.
First fiscal week of a new period may show 0 campaigns. If the current fiscal week just started and no campaigns have been sent yet, the campaign data will be empty. The dashboard uses a 30-day rolling fallback pool (filtered to the last active week) to avoid completely blank KPI cards in this edge case.
📌
Klaviyo attribution model: All revenue numbers use Klaviyo's default attribution settings, which are typically a 5-day click window + 1-day open window. If your Klaviyo account has custom attribution settings configured, those will be reflected here instead. To verify, check Klaviyo → Analytics → Attribution Settings.
📌
"Daily" granularity looks the same as "Weekly" for Subscription Trend. The underlying subscriber API returns weekly data — there is no daily granularity available from Klaviyo. Selecting "Daily" will render at weekly resolution for the subscription chart. Only "Monthly" produces a visibly different aggregation.
Jack Archer Analytics — Internal Use Only Data source: Klaviyo REST API · Backend: FastAPI / Snowflake · Dashboard: performance-tracking/index.html