Demand driver attribution
Leadership sees a spike and asks why. Support sees the spike and often answers with
the last thing that changed — a release, a email, a price update. Coincidence is not
attribution.
The common failure is narrating causality from a line chart. Volume moved the same
week as a campaign; therefore the campaign caused it. Without a counterfactual, shared
calendar, and confounder check, that story is gossip. This skill ties contacts to business
events defensibly — and states clearly what you cannot conclude.
Start with a calendar, not a model
Maintain one demand calendar owned by ops, fed by product, marketing, billing and
engineering:
| Event type |
Examples |
Lead/lag to record |
| Product release |
App version, API change, feature flag |
Ship date + same-day hotfix window |
| Marketing |
Sends, promotions, lifecycle triggers |
Send time + channel |
| Billing |
Invoice run, dunning, price change |
Run date + retry schedule |
| Policy |
Refund rule, shipping change |
Effective date |
| Operational |
Outage, carrier delay, fraud sweep |
Start/end timestamps |
| Seasonal |
Known retail peaks |
Dates from prior year as hypothesis only |
If an event is not on the calendar, do not attribute to it retroactively without
adding it and noting the gap. Missing calendar discipline is the main reason attribution
debates repeat monthly.
Unit of analysis
Attribute at the granularity decisions use:
- Contact driver tags — if taxonomy is trustworthy; audit before trusting spike splits.
- Product area / queue / SKU — when release is scoped.
- Customer segment — enterprise vs self-serve, region, plan tier.
- Interval — day often enough; hour for sends and outages.
Align volume series and event timestamps in one timezone, documented. Misaligned clocks
fake attribution.
Difference-in-differences mindset
You rarely have a randomised experiment. DiD is the disciplined informal frame:
- Treated — customers or segments exposed to the event (got the email, on the new
version, billed this cycle).
- Control — similar customers not exposed, or the same segment before the event.
- Before / after — same group's baseline vs post.
- Difference of differences — did treated move more than control?
Example structure (not a formula to worship — a checklist):
Effect ≈ (After_treated − Before_treated) − (After_control − Before_control)
If only treated moves, evidence strengthens. If everyone moves, the event is not the
story — look for seasonality, outage, or macro shock.
Practical controls when you lack a clean holdout
| Situation |
Control strategy |
| Email to segment A |
Segment B with similar history not emailed |
| Gradual rollout |
Regions or flags still on old version |
| Global release |
Pre-release baseline of same length as post window |
| Billing run |
Cohort billed this month vs cohort billed off-cycle |
| Outage |
Same DOW hour from prior weeks (weak — label as approximate) |
Weak controls must be labelled weak. A same-week last-year comparison is not DiD; it
is seasonal naive with extra steps.
Confounders that fake attribution
Check these before presenting a driver:
- Seasonality and DOW — Tuesday after a holiday is not "release effect."
- Overlapping events — release plus campaign plus billing in one window; default
answer is shared uplift, split unproven.
- Routing and tagging changes — volume moved queues or tags, not customers.
- Deflection and channel shift — chat down, email up, total contacts flat; channel
spike is not demand spike.
- Repeat contact inflation — policy change causes re-opens; unique customers flat.
- Internal backlog release — batch close/open mimics demand.
- External shocks — competitor news, weather, regulator — not on your calendar but
moves everyone.
Report confounders ruled in or out, not only the favourite hypothesis.
What you can and cannot conclude
Can conclude (with evidence):
- Treated segment volume rose relative to control over the same window.
- Tagged driver share increased and tag quality was stable through the window.
- Event timing aligns with interval-level lift in the expected queue/product.
- Effect decay pattern matches mechanism — send spike fades in days; bug persists until fix.
Cannot conclude without stronger design:
- Exact percentage of total spike "caused by" event X when events overlap.
- Long-run churn or revenue impact from a one-week contact lift.
- Attribution from coincident spikes with no control and one historical instance.
- Per-customer causality from aggregate counts alone.
- That correlation will repeat next time — only that it did once, under stated
conditions.
Use language that matches strength: associated with, consistent with, likely
contributor — reserve caused for randomised or clean natural experiments.
Workflow
- Define the spike — metric, window, baseline rule (prior 4 weeks same DOW, not
arbitrary "last month").
- Pull calendar events overlapping window ± lead/lag buffer.
- Decompose volume — channel, driver tag, product, segment — vs baseline.
- Run DiD or best available control for top one to two hypotheses only; ignore the
long tail until primary candidates fail.
- Check confounders — overlap table, repeat contact, routing changes.
- Write attributed / unexplained split — unexplained is an honest output, not failure.
- Recommend calendar or process fix — owner for next event, forecast adjustment, comms
timing — separate from the attribution paragraph.
Traps
- Single-day baseline — noise dominates.
- MAPE-style attribution on small queues — percentages swing wildly.
- Trusting driver tags during taxonomy projects — tag spike may be relabelling.
- Attributing to release without version exposure data — customers on old build still
contacting disprove product cause.
- Presenting unexplained as zero — forces false confidence.
Present results to the user
- Spike definition — metric, window, baseline method.
- Event calendar table for the window — with overlap flags.
- Decomposition — where volume landed (channel, segment, tag, product).
- Attribution assessment for top hypotheses — DiD or control used, confounders
checked — with strength of evidence language.
- Attributed vs unexplained volume — ranges if overlap prevents point estimates.
- What we cannot conclude — explicit list.
- Actions — forecast calendar update, comms timing, product fix, tagging — owned and
dated separately from the story.
1---2name: cx-demand-driver-attribution3description: Use to attribute contact volume spikes to product releases, campaigns, billing events and operational changes — with a shared calendar, difference-in-differences thinking and explicit limits on causal claims. Trigger for "what caused the volume spike", demand driver attribution, release drove tickets, campaign contact uplift, billing run volume, event calendar for support, difference in differences volume, or when leadership asks what drove the spike without confounders ruled out.4---56# Demand driver attribution78Leadership sees a spike and asks **why**. Support sees the spike and often answers with9the last thing that changed — a release, a email, a price update. Coincidence is not10attribution.1112**The common failure is narrating causality from a line chart.** Volume moved the same13week as a campaign; therefore the campaign caused it. Without a counterfactual, shared14calendar, and confounder check, that story is gossip. This skill ties contacts to business15events defensibly — and states clearly what you cannot conclude.1617## Start with a calendar, not a model1819Maintain one **demand calendar** owned by ops, fed by product, marketing, billing and20engineering:2122| Event type | Examples | Lead/lag to record |23| --- | --- | --- |24| Product release | App version, API change, feature flag | Ship date + same-day hotfix window |25| Marketing | Sends, promotions, lifecycle triggers | Send time + channel |26| Billing | Invoice run, dunning, price change | Run date + retry schedule |27| Policy | Refund rule, shipping change | Effective date |28| Operational | Outage, carrier delay, fraud sweep | Start/end timestamps |29| Seasonal | Known retail peaks | Dates from prior year as hypothesis only |3031If an event is not on the calendar, **do not attribute to it retroactively** without32adding it and noting the gap. Missing calendar discipline is the main reason attribution33debates repeat monthly.3435## Unit of analysis3637Attribute at the granularity decisions use:3839- **Contact driver tags** — if taxonomy is trustworthy; audit before trusting spike splits.40- **Product area / queue / SKU** — when release is scoped.41- **Customer segment** — enterprise vs self-serve, region, plan tier.42- **Interval** — day often enough; hour for sends and outages.4344Align volume series and event timestamps in **one timezone**, documented. Misaligned clocks45fake attribution.4647## Difference-in-differences mindset4849You rarely have a randomised experiment. **DiD is the disciplined informal frame:**5051- **Treated** — customers or segments exposed to the event (got the email, on the new52 version, billed this cycle).53- **Control** — similar customers not exposed, or the same segment before the event.54- **Before / after** — same group's baseline vs post.55- **Difference of differences** — did treated move *more* than control?5657Example structure (not a formula to worship — a checklist):5859```60Effect ≈ (After_treated − Before_treated) − (After_control − Before_control)61```6263If only treated moves, evidence strengthens. If everyone moves, the event is not the64story — look for seasonality, outage, or macro shock.6566### Practical controls when you lack a clean holdout6768| Situation | Control strategy |69| --- | --- |70| Email to segment A | Segment B with similar history not emailed |71| Gradual rollout | Regions or flags still on old version |72| Global release | Pre-release baseline of same length as post window |73| Billing run | Cohort billed this month vs cohort billed off-cycle |74| Outage | Same DOW hour from prior weeks (weak — label as approximate) |7576Weak controls must be **labelled weak**. A same-week last-year comparison is not DiD; it77is seasonal naive with extra steps.7879## Confounders that fake attribution8081Check these before presenting a driver:8283- **Seasonality and DOW** — Tuesday after a holiday is not "release effect."84- **Overlapping events** — release plus campaign plus billing in one window; default85 answer is **shared uplift, split unproven**.86- **Routing and tagging changes** — volume moved queues or tags, not customers.87- **Deflection and channel shift** — chat down, email up, total contacts flat; channel88 spike is not demand spike.89- **Repeat contact inflation** — policy change causes re-opens; unique customers flat.90- **Internal backlog release** — batch close/open mimics demand.91- **External shocks** — competitor news, weather, regulator — not on your calendar but92 moves everyone.9394Report **confounders ruled in or out**, not only the favourite hypothesis.9596## What you can and cannot conclude9798**Can conclude (with evidence):**99100- Treated segment volume rose relative to control over the same window.101- Tagged driver share increased **and** tag quality was stable through the window.102- Event timing aligns with interval-level lift in the expected queue/product.103- Effect decay pattern matches mechanism — send spike fades in days; bug persists until fix.104105**Cannot conclude without stronger design:**106107- Exact **percentage** of total spike "caused by" event X when events overlap.108- **Long-run churn or revenue impact** from a one-week contact lift.109- Attribution from **coincident spikes** with no control and one historical instance.110- **Per-customer causality** from aggregate counts alone.111- That correlation **will repeat** next time — only that it did once, under stated112 conditions.113114Use language that matches strength: **associated with**, **consistent with**, **likely115contributor** — reserve **caused** for randomised or clean natural experiments.116117## Workflow1181191. **Define the spike** — metric, window, baseline rule (prior 4 weeks same DOW, not120 arbitrary "last month").1212. **Pull calendar events** overlapping window ± lead/lag buffer.1223. **Decompose volume** — channel, driver tag, product, segment — vs baseline.1234. **Run DiD or best available control** for top one to two hypotheses only; ignore the124 long tail until primary candidates fail.1255. **Check confounders** — overlap table, repeat contact, routing changes.1266. **Write attributed / unexplained split** — unexplained is an honest output, not failure.1277. **Recommend calendar or process fix** — owner for next event, forecast adjustment, comms128 timing — separate from the attribution paragraph.129130## Traps131132- **Single-day baseline** — noise dominates.133- **MAPE-style attribution on small queues** — percentages swing wildly.134- **Trusting driver tags during taxonomy projects** — tag spike may be relabelling.135- **Attributing to release without version exposure data** — customers on old build still136 contacting disprove product cause.137- **Presenting unexplained as zero** — forces false confidence.138139## Present results to the user1401411. **Spike definition** — metric, window, baseline method.1422. **Event calendar table** for the window — with overlap flags.1433. **Decomposition** — where volume landed (channel, segment, tag, product).1444. **Attribution assessment** for top hypotheses — DiD or control used, confounders145 checked — with strength of evidence language.1465. **Attributed vs unexplained volume** — ranges if overlap prevents point estimates.1476. **What we cannot conclude** — explicit list.1487. **Actions** — forecast calendar update, comms timing, product fix, tagging — owned and149 dated separately from the story.