Appendix A

FOR YOUR ANALYST

The formulas behind the three tools, and the queries that feed them.

The formulas

ForFormulaNotes
Natural process limitsX̄ ± 2.66 × mR̄X̄: average of the baseline weeks. mR̄: average of |Xt − Xt−1|. 2.66 = 3 / 1.128.
Moving range limit3.268 × mR̄Only rule for the moving ranges: a point above it.
Signal rules1 point outside; 3 of 4 beyond X̄ ± 1.33 mR̄; 8 in a row on one side1.33 mR̄ is halfway from the central line to a limit.
Chance-alone range1.96 × √(p(1 − p) / n); counts: 1.96 × √n95% range from sampling alone.
Share of a lead that holdsw = (s² − p̄(1 − p̄)/m) / (s² − p̄(1 − p̄)/m + p̄(1 − p̄)/n)s: spread of past rates; m: typical past audience; n: the winner’s audience. Floor the numerator at 0. Expected = p̄ + w(observed − p̄).
Reference-class adjustmentμ = ln(median) + r(ln(forecast) − ln(median))σ = (ln P80 − ln P20) / 1.683; residual σ√(1 − r²). Range: exp(μ ± 1.2816 × residual). Plan figure: exp(μ − 0.6745 × residual).

Weekly series, with limits

-- weekly revenue and orders, excluding promotion weeks from the baseline
-- orders: order_id, created_at, total_price, cancelled_at
-- promo_weeks: week_start (one row per promotion week)
WITH weekly AS (
  SELECT DATE_TRUNC('week', created_at)::date AS week_start,
         COUNT(*)                            AS orders,
         SUM(total_price)                    AS revenue
  FROM orders
  WHERE cancelled_at IS NULL
  GROUP BY 1
),
base AS (
  SELECT w.*, ABS(revenue - LAG(revenue) OVER (ORDER BY week_start)) AS mr
  FROM weekly w
  WHERE week_start NOT IN (SELECT week_start FROM promo_weeks)
    AND week_start < DATE_TRUNC('week', CURRENT_DATE)
  ORDER BY week_start DESC
  LIMIT 12
)
SELECT AVG(revenue)                     AS central_line,
       AVG(revenue) - 2.66 * AVG(mr)    AS lower_limit,
       AVG(revenue) + 2.66 * AVG(mr)    AS upper_limit,
       3.268 * AVG(mr)                  AS moving_range_limit
FROM base;

The moving ranges here are computed before the twelve weeks are chosen, so the oldest week’s range reaches back one normal week; that’s fine. If a promotion week sits between two normal weeks, the range spans it, which is also fine. Swap revenue for orders or a rate to chart the others. Refunds belong in a separate series from the refunds table, not netted into revenue, so a returns problem shows on its own chart.

Campaign spread, for the estimator

-- last 30 email campaigns: order rate per recipient, its spread, typical audience
-- campaign_sends: campaign_id, channel, sent_at, recipients
-- campaign_orders: campaign_id, order_id (orders attributed to the campaign)
WITH c AS (
  SELECT s.campaign_id, s.recipients,
         COUNT(o.order_id)::numeric / NULLIF(s.recipients, 0) AS rate
  FROM campaign_sends s
  LEFT JOIN campaign_orders o USING (campaign_id)
  WHERE s.channel = 'email'
  GROUP BY s.campaign_id, s.recipients, s.sent_at
  ORDER BY s.sent_at DESC
  LIMIT 30
)
SELECT AVG(rate) * 100          AS avg_rate_pct,
       STDDEV_SAMP(rate) * 100  AS spread_pts,
       AVG(recipients)          AS typical_audience
FROM c;

Use the same attribution window for every campaign. Mixing sends to the whole list with sends to small segments inflates the spread; run it separately for each.

Launch reference class

-- first-90-day revenue against plan, for every launch
-- launches: launch_id, product_id, launched_on, plan_revenue_90d
-- order_lines: order_id, product_id, price, quantity; orders: order_id, created_at
WITH actual AS (
  SELECT l.launch_id, l.plan_revenue_90d,
         SUM(ol.price * ol.quantity) AS revenue_90d
  FROM launches l
  JOIN order_lines ol ON ol.product_id = l.product_id
  JOIN orders o       ON o.order_id = ol.order_id
                     AND o.created_at >= l.launched_on
                     AND o.created_at <  l.launched_on + INTERVAL '90 days'
  WHERE l.launched_on < CURRENT_DATE - INTERVAL '90 days'
  GROUP BY 1, 2
)
SELECT PERCENTILE_CONT(0.2) WITHIN GROUP (ORDER BY revenue_90d) AS p20,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY revenue_90d) AS median,
       PERCENTILE_CONT(0.8) WITHIN GROUP (ORDER BY revenue_90d) AS p80,
       PERCENTILE_CONT(0.5) WITHIN GROUP
         (ORDER BY revenue_90d / NULLIF(plan_revenue_90d, 0))    AS median_actual_to_plan,
       CORR(LN(plan_revenue_90d), LN(revenue_90d))              AS forecast_tracking
FROM actual
WHERE revenue_90d > 0 AND plan_revenue_90d > 0;

forecast_tracking is the tracking figure for the tool in chapter 9. With fewer than about ten launches it’s rough; round it down.

Rank persistence

-- does last quarter's ranking by cost per first order hold this quarter?
-- channel_quarters: channel, quarter, spend, first_orders
WITH r AS (
  SELECT channel, quarter,
         RANK() OVER (PARTITION BY quarter
                      ORDER BY spend / NULLIF(first_orders, 0)) AS rnk
  FROM channel_quarters
  WHERE quarter IN ('2026-Q1', '2026-Q2') AND first_orders >= 30
)
SELECT CORR(a.rnk, b.rnk) AS rank_persistence
FROM r a
JOIN r b ON a.channel = b.channel
WHERE a.quarter = '2026-Q1' AND b.quarter = '2026-Q2';

The same query works for creators, ad sets or campaign types; change the table. The first-orders floor keeps tiny channels, whose rank is almost pure chance, out of the comparison.

If this is your store

See where your first-time buyers stall.

The free Klaviyo audit reads your own account and scores it. Start with your store’s address. A read-only key gets the full report.

Get the free audit →

Written by Andrew Lauchner, a growth and retention operator for consumer brands. The paid work is one ninety-day Sprint.

This is one chapter of The Noise Floor, which is free and readable in full on a single page with no form in front of it.