An exposure map classifies each branch-period by its own rollout status and the rollout status of branches connected to it before outcomes are compared.
Direct and indirect exposure maps for branch rollouts
Define the interference boundary
North receives a triage screen in April. West shares staff and an overflow queue with North, so West may change even without the screen. A map built from pre-rollout staffing and routing records assigns each branch one of three states in a month: direct treatment, indirect exposure through a treated neighbor, or neither. This does not prove the map captures every channel. The comparison-pool lesson excludes indirectly exposed controls when estimating a direct contrast.
Keep the two effects distinct
A direct effect compares a branch with the screen against an otherwise comparable branch without the screen under a specified neighbor-exposure condition. An indirect effect compares untreated branches exposed to treated neighbors with untreated branches whose neighbors are also untreated. The populations, assumptions and actions differ. A rise in West’s breach rate caused by overflow would be an indirect effect, not a failure of North’s local workflow. Do not call one pooled treated-versus-untreated number both effects.
Freeze the network before assignment
The example uses an adjacency list created from pre-rollout operations. If a new queue route appears after the screen launches, using that later network to choose controls can condition on a consequence of treatment. Retain the pre-period map and separately audit actual post-rollout routing. A branch with several treated neighbors may need an exposure intensity rather than a binary flag; choose that mapping before inspecting outcomes.
Verify coverage and changes
For each month, count direct, indirect and unexposed branches. Every branch should occupy exactly one class. If all possible controls become indirectly exposed, a direct-effect comparison against unexposed branches has no support. A branch can move from unexposed to indirect when its neighbor adopts; its own adoption later moves it to direct. The spillover contrast uses the untreated categories only.
Do not assume a map identifies causality
Indirect exposure may be correlated with branch size, geography or staffing. Estimation needs a comparison trend argument or an assignment design, plus a stable outcome definition and no spillovers beyond the mapped boundary. Shared region shocks may make branches dependent even if the adjacency list has no edge. Report the map’s construction date and units with uncertain connections.
Implementation
def rollout_exposure(first_use_month, neighbors, month):
if month <= 0 or set(first_use_month) != set(neighbors):
raise ValueError("invalid month or incomplete network")
branches = set(first_use_month)
if any(branch in linked or not set(linked) <= branches
for branch, linked in neighbors.items()):
raise ValueError("invalid neighbor list")
treated = {branch for branch, first_use in first_use_month.items()
if first_use is not None and first_use <= month}
exposure = {}
for branch, linked in neighbors.items():
if branch in treated:
exposure[branch] = "direct"
elif set(linked) & treated:
exposure[branch] = "indirect"
else:
exposure[branch] = "unexposed"
return exposure
first_use = {"North": 4, "West": None, "South": None, "Harbor": 6}
network = {"North": ["West"], "West": ["North"],
"South": [], "Harbor": []}
states = rollout_exposure(first_use, network, 5)
assert states == {"North": "direct", "West": "indirect",
"South": "unexposed", "Harbor": "unexposed"}Performance and operating cost
For B branches and E neighbor links, classification costs O(B + E) expected time and O(B) output space beyond the input map. A large routing network needs versioned adjacency storage and an audit of cross-boundary connections.
Common Mistakes
- Do not infer that a branch is unexposed only from its own feature flag.
- Do not build the primary comparison network from post-rollout traffic.
- Do not combine direct and indirect effects without naming a new estimand.
Read next
- Spillover-aware comparison pools for branch rollouts
- A spillover difference-in-differences contrast
- Negative-control outcomes and placebo rollout checks
- Project: review a small branch rollout with spillovers
Continue the workflow: A spillover difference-in-differences contrast.
