A plain-language guide to where every metric comes from, how it gets to your screen, and what math happens along the way.
Data moves left to right — from your platforms, through a data pipeline, into your dashboard.
Shopify processes an order, Google records a click, Klaviyo sends an email — activity happens in real time inside your tools.
Once a day, our pipeline pulls fresh numbers from all eight platforms and writes them into the database.
A cron runs every 6 hours to keep data fresh. If you land on the dashboard and the last refresh is still more than 6 hours old (missed cron, etc.), a fresh pull kicks off in the background. The Refresh Now button triggers both the weekly snapshot and the daily Shopify chart on demand.
When a fiscal week closes, the numbers for that week stop moving. The rolling renewal rate locks in Sunday 00:01 ET.
Every KPI card, goal panel, and metric on the dashboard uses one rule: your result is compared to how far through the period you are, and that drives whether the number shows green, orange, or red.
Your actual is at or above 95% of the paced target. You're keeping up with (or ahead of) where you need to be for this point in the period.
You're between 75% and 95% of the paced target. Not an emergency, but worth a look — one more soft day and this becomes a problem.
You're below 75% of the paced target. You're meaningfully off pace and need to either change something or have a clear reason why.
Each card explains the source, the calculation, and any caveats for the metric.
Click any card to expand. Tap the chevron or anywhere on the row.
This is your top-line sales number, after discounts and before shipping/tax. It's the "real" revenue figure.
order_net_salesThe total number of orders placed in a given week.
How much a customer spends per order, on average. A key lever — small AOV increases have outsized impact on revenue.
How many brand-new shoppers placed their first-ever order during the week. This is your top-of-funnel acquisition number — it pairs with CPA to tell you what you're paying to win each one.
customer.createdAt (in store timezone, America/Los_Angeles) falls in W AND they placed at least one order in W. Shopify creates a customer record the first time someone checks out, so createdAt is effectively "first-order date." This definition is time-invariant — historical weeks won't shift as customers come back.
order_customer_number_of_orders = 1 uses the customer's current lifetime order count. When a customer comes back and orders again, their Nov purchase retroactively stops being "new." Historical weeks decayed 22–33% under the old method; this one holds steady.
Lifetime value of customers who made their first order in a given week, tracked weekly out to 52 weeks. Replaces CPA as the headline acquisition metric — leadership cares about LTV, which measures long-term customer value more accurately than cost-per-acquisition.
weekly_snapshots.ltv_1yr_series (jsonb, 52 offsets).
How much you're spending on Google and what you're getting back. ROAS = "for every $1 spent, you got $X back."
spend, conversions, roasSame concept as Google — spend versus return, but for Facebook and Instagram ad campaigns.
spend, impressions, clicks, conversions/paid-media.
ROAS = Conversion Value / Spend
Your total ad spend across all channels, and how much it costs to acquire one customer. CPA is kept for operational context but LTV (1-yr) is the headline acquisition metric on /acquisition.
Revenue Klaviyo attributes to your campaigns and flows. Matches the number on Klaviyo's Business Performance Summary dashboard — the same one you pull on Monday mornings.
conversion_value for the date range; we sum both for the total.
/flows page now shows per-flow per-email-position metrics from weekly_flow_messages — funnel decay, RPR by position, subject lines, suggested actions per flow type.
Email Revenue = sum(Campaign.conversion_value) + sum(Flow.conversion_value)
How many real human visitors came to your online store. We explicitly filter out Shopify-classified bot traffic — which matters a lot during November–January, when bot waves can otherwise balloon raw session counts by 10–15× normal.
Revenue from recurring subscription orders, net of refunds.
Revenue from orders placed through your loyalty/rewards program, points earned/spent each week, and the tier breakdown across your ~182K enrolled members.
LL-* discount join/v2/orders (skip cancelled): total_paid − total_refunded./v2/activities rolled up — earned (positive approved values), spent (|negative|), distinct redeemers per week.discount_code:LL-*. Shopify is the ground truth for actual USD redeemed (LoyaltyLion has no /v2/rewards or /v2/tiers REST endpoint)./v2/customers scan on Hetzner Sun 01:01 ET (~19 min wall-clock).
Loyalty Rev = SUM(total_paid) − SUM(total_refunded)
The full picture of subscription health — how many active subs you have, how many new ones came in, how many cancelled, and what percentage of customers stay.
/subscriptions shows retention curves (d30/60/90/180/365 by acquisition month), first-90 cohort analysis with paid-share + outlier flags, and quarterly LTV-by-cohort heatmap. All compute on Hetzner Sun 01:31 ET.
Total product units sold in a week, with multi-pack products counted as individual units. A "3-Pack" counts as 3 units, a "6-Pack" as 6. Counted by Shopify order date — when the customer placed the order.
Breakdown of each week's units by SKU: 3-pack / 6-pack / single share of total units, average items per order, and the top products by units sold. Includes a configurable category taxonomy plus a Flagship cross-cut tag covering curated bestsellers.
weekly_product_breakdown in Supabase. Refreshed every 6 hours by the per-SKU cron, or manually via Refresh Now. Kit % and Units per Order are computed client-side from the raw per-SKU rows so multi-week rollups (MTD / QTD / YTD) compose correctly.
/units compare partial-week WTD totals to paced prior-week totals (priorTotal × paceFactor) — so Tuesday-morning reads stop showing phantom 45% drops.
/units/products — Weekly (last 3 fiscal weeks) + Monthly (last 3 calendar months) — honor the active category/flagship filter.
Kit % = SUM(net_units where pack_size=N) ÷ SUM(net_units)Visit /reports → pick a cadence + a closed period → AI-drafted commentary you can edit → preview + publish to Slack or save as PDF. Replaces the manual Monday-morning leadership memo.
report_commentary so revisits don't re-pay (~$0.075/run).SLACK_WEBHOOK_URL).The Intelligence Feed at the top of / is now live AI-generated summary of the most recent completed fiscal week. Replaces the old hardcoded sample feed.
claude-sonnet-4-5-20250929)/api/cron/weekly-insights) — generates insights for the most recent completed fiscal week. Persisted in weekly_insights table.weekly_snapshots + prior 4 weeks (WoW context), top 5 paid campaigns (Meta + Google) by spend, top 5 Klaviyo flows by RPR. Marketing-calendar context via Asana coming in v2.href drilling into the relevant sub-page.When a day's revenue moves more than ±15% from the 7-day rolling average, the dashboard surfaces a probable-cause note as a small color-coded dot above that bar on the /revenue daily chart. Hover the dot to see the headline + narrative.
claude-sonnet-4-5-20250929)/api/cron/daily-insights). Triggers only when |actual − rolling7DayAvg| / avg ≥ 15%.daily_snapshots + 14 days prior context, same-day Klaviyo campaign sends, Meta + Google daily spend deltas, Recharge renewal-wave size.The /alerts page is a notification inbox with a 🔔 bell + unread badge in the header. Alerts are framed as notification config rather than threshold rules — threshold rules are coming soon.
cron_run_log entry; alerts fire when a run fails or exceeds duration thresholds.SLACK_WEBHOOK_URL (graceful no-op when env missing). Configure at /settings/notifications with a "Send test" button.Every metric is validated against its source platform before shipping.
order_net_sales field — after discounts, before shipping and tax.
What it takes to keep the data pipeline running.