Sales by fiscal period
Response curve
Why sales moved
Marginal return by channel
By period
scenario, with change vs. last year and the gap to the finance forecastHow the model works
The production version of this tool is a scenario model for the annual planning cycle: one full-year paid-search spend number, a handful of assumptions, and the sessions, conversion, AOV, and sales that land by fiscal period, next to the finance forecast so the gap can be socialized early. It is deliberately simple where the data cannot support more. This replica keeps that structure and plugs in two pieces that exist as research but are not in the production tool: per-channel response curves and cross-channel spillovers. Each section says which is which.
1. Structure
Sessions are built bottom-up from three buckets and rolled to twelve fiscal periods on a 4-4-5 calendar. Paid search is modeled from spend. Organic and the earned bucket (direct, email, affiliates, referral, organic social) are last year's sessions times an assumed change; the tool calls that an assumed contribution, and it is shown as a lever rather than hidden. Sales are sessions times conversion times AOV. Every ratio on the page is recomputed from summed totals, never averaged.
sales = sessions × conversion × AOV
2. Spend to sessions, by channel
In production: one aggregate spend number with unit pass-through, so 10% more spend buys 10% more paid sessions at last year's cost per session. That was a choice, not an oversight. A Hill curve was fitted (sessions = α·spendβ/(Kβ+spendβ), R² 0.74 on base weeks, local elasticity near 0.5) and rejected because it failed the second-half sanity check against the year's actuals, where spend fell 19.6% and paid sessions fell 18.9%, cost per session flat. The simple version matched reality; the sophisticated one did not.
In this replica: each channel gets its own curve from the sibling traffic engine, which models cost per click instead of sessions directly:
clicksc = spendc / CPCc sessionsc = clicksc × click-to-sessionc
The elasticity εc is how fast the auction price rises as you push more money in. It is estimated per channel by regressing log CPC change on log spend change over weekly year-over-year pairs, and kept only where the fit is convincing (R² at or above 0.7, which holds for brand and non-brand search at about 0.9). Shopping and local inventory do not clear that bar; they fall back to a fixed CPC ratio. Holiday weeks carry their own CPC premiums (brand about 1.27x). Backtest: 8.0% mean absolute error on quarterly traffic, against 10.5% for the Hill curve.
| Channel | CPC elasticity to spend | Sessions per extra dollar | Basis |
|---|---|---|---|
| Brand search | 0.85 | near zero past the ceiling | Fitted; plus the impression-share ceiling below |
| Non-brand search | 0.35 | falls as spend rises | Fitted, R² about 0.9 |
| Shopping | 0.25 | falls slowly | Fit too weak; fixed CPC ratio in production |
| Local inventory | 0.30 | falls slowly | Fit too weak; fixed CPC ratio in production |
The brand ceiling. Brand search cannot be bought past the searches that exist. Budget-lost impression share sat between 0.0% and 0.4% for twelve straight months; the core campaign already held 96% of its available impressions. A 6,000 campaign-day panel with campaign fixed effects and a demand control put the elasticity of clicks to CPC at +0.08 with a standard error of 0.11, which is zero. The naive regression on the same data reads +0.79, which is the number that makes "fund it back up" feel right. In the replica, brand sessions cap at last year's level plus the remaining impression share, and spend past that point buys a higher CPC and nothing else. The tool flags it.
3. Conversion and AOV
Conversion is not a constant. It falls when paid spend rises, because incremental paid traffic is lower intent than the base, and it falls when AOV rises, because pricier baskets convert less often. Both are fitted on weekly data:
Split by week type, the holiday coefficients differ (−0.66 and −1.01 pre-holiday), but the planning tool uses the base values everywhere, calibrated with a single constant from the median of actual over predicted. Backtest forecasting the year from the prior year: 5.4% mean absolute error, bias about zero. AOV is a lever here; in the production tool the second planning year uses a plateau model, a target AOV times a growth rate times last year's per-period seasonal index. A target row in production back-solves any lever from a typed full-year total; conversion solves in closed form, AOV by bisection because it feeds back into conversion.
4. Halo and cannibalization
Not in production. The production tool assumes spillover away and says so. The evidence exists, though, and this replica applies it as a matrix: a change in one channel's paid sessions moves other buckets by a fixed share. Where a value comes from a holdout it is solid; where it comes from a correlation model it is a placeholder with the right sign.
| Effect | Share applied | Evidence |
|---|---|---|
| Brand search → organic brand | −0.35 | Geo holdout: brand paid cut 61% in test markets, organic brand rose 9%. About 35% of brand paid clicks substitute for organic; 65% are incremental. |
| Brand search → direct | +0.25 | Same holdout: direct fell 25 points where brand paid was cut. Complementary, the opposite of the cannibalization story. |
| Non-brand search → organic and direct | +0.06 / +0.04 | Later brand demand created by non-brand exposure. Correlation and Granger evidence only; small and treated as such. |
| Shopping → organic | −0.06 | Product ads displace organic product results on the same page. Directional. |
| Brand search → other paid channels | 0 | Holdout difference-in-differences on shopping, local, and non-brand: no movement (p 0.63 to 0.86). |
| Display & video → organic and direct | sessions per $1M | Impression-based coefficients from the mix model. Flagged for possible reverse causality (retargeting follows visits). Lowest confidence on the page. |
The method stack behind those values: a full channel correlation matrix on daily sessions, first-difference and partial correlations to strip shared seasonality, Granger tests as a gate before any relationship is used, a mix model with autoregressive errors and a reduced set of controls, and holdouts overriding everything else when they exist. The toggle above lets you see how much the spillover layer changes the answer. For a typical scenario it is a few percent of sales, concentrated in brand search, which is exactly where the planning debates happen.
5. Calibration and what the model does not claim
- Last-year anchors come from the governed daily mart; channel shares come from the attribution pipeline. Rendered totals are checked against the Python model before anything ships.
- The finance forecast is a reference line, not a target. In the production year it missed two periods by 11% and 18%, which is why the tool exists.
- Blended efficiency (sales per paid dollar) rises mechanically when paid share falls. Read the marginal table, not the blended number, when deciding where the next dollar goes.
- Store sales are out of scope. This is ecommerce only. The store side lives in the attribution work.
- Elasticities are this year's. They get re-fitted every planning cycle, and the naive-versus-controlled trap in the brand panel is the reason the fitting is not left to a spreadsheet.