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:
| 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 |
The backend (main.py) assembles campaign-level stats in two steps:
email, sms) filtered by scheduled_at date range. Builds a lookup map of campaign_id → {name, send_date, channel}.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).
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.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.
Total attributed revenue generated by Email campaigns in the selected 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.
Total attributed revenue generated by SMS campaigns in the selected 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.
Weighted-average open rate across all Email campaigns in the period. Always Email-only — SMS does not support open tracking.
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%.
Weighted-average click-through rate across campaigns in the selected period and 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.
Weighted-average revenue earned per recipient across campaigns in the period. A useful proxy for campaign monetization efficiency — higher is better.
Unlike open rate, RPR respects the active channel filter (All / Email / SMS).
Net new email subscribers added during the selected period.
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.
Net new SMS subscribers added during the selected period.
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.).
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.
Per-date weighted-average click rate, respecting the active channel filter.
Per-date weighted-average RPR showing how efficiently each send monetized its audience over time.
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.
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.
| Series | Definition | Direction |
|---|---|---|
| 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 |
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.
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).
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 | Definition | Source |
|---|---|---|
| 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 |
A monthly grid view showing which days had campaign sends. Useful for visualizing send cadence and identifying gaps or over-sending periods.
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.A sortable row-level table of every campaign sent in the selected period. Each row is one campaign send.
| Column | Definition | Notes |
|---|---|---|
| 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. |
| Control | Options | What It Affects | Notes |
|---|---|---|---|
| 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. |
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).
| Quarter | Month | Weeks |
|---|---|---|
| Q1 | January (FM 1) | 5 weeks |
| Q1 | February (FM 2) | 4 weeks |
| Q1 | March (FM 3) | 4 weeks |
| Q2 | April (FM 4) | 5 weeks |
| Q2 | May (FM 5) | 4 weeks |
| Q2 | June (FM 6) | 4 weeks |
| Q3 | July (FM 7) | 5 weeks |
| Q3 | August (FM 8) | 4 weeks |
| Q3 | September (FM 9) | 4 weeks |
| Q4 | October (FM 10) | 5 weeks |
| Q4 | November (FM 11) | 4 weeks |
| Q4 | December (FM 12) | 4 weeks |
| Mode | Date 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. |
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.
| Mode | Comp Start | Comp End | Example (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 | — |