-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdoordash-switchback-framework.html
More file actions
181 lines (164 loc) · 23.8 KB
/
Copy pathdoordash-switchback-framework.html
File metadata and controls
181 lines (164 loc) · 23.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DoorDash switchback experiments — handling marketplace interference</title>
<link rel="stylesheet" href="framework.css">
<style>
/* Page-accent — overrides framework.css fallback */
:root{--page-accent:var(--blue);--page-accent-soft:var(--blue-soft)}
/* problem diagram */
.problem{background:#fff;border:1px solid var(--line);border-radius:12px;padding:20px 24px;margin:14px 0;box-shadow:var(--shadow);border-left:5px solid var(--page-accent)}
.problem h3{margin:0 0 6px;font-family:Georgia,serif;font-size:17px}
/* switchback grid */
.switch{background:#fff;border:1px solid var(--line);border-radius:12px;padding:22px;box-shadow:var(--shadow);margin:14px 0;text-align:center}
.swgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin:10px auto;max-width:520px}
.swrow-h{font-size:11.5px;color:var(--ink-soft);font-weight:700;letter-spacing:.04em;text-transform:uppercase}
.cell{padding:11px 6px;border-radius:6px;font-size:12.5px;font-weight:700;color:#fff}
.cell.t{background:var(--page-accent)}
.cell.c{background:#7a8aa3}
.axislbl{font-size:11.5px;color:var(--ink-soft);font-weight:700;letter-spacing:.04em;text-transform:uppercase;margin:8px 0}
@media(max-width:680px){.swgrid{grid-template-columns:repeat(3,1fr);max-width:340px}}
</style>
</head>
<body>
<nav class="sitenav">
<details>
<summary>📑 Jump to</summary>
<div class="navmenu">
<div class="navgrp"><h4>Start here</h4>
<a href="index.html"><b>← Home (goal & map)</b></a>
<a href="impact-saas-companies.html">SaaS / B2B field study</a>
<a href="impact-consumer-companies.html">Consumer-tech field study</a>
<a href="methodologies-comparison.html"><b>All methods compared →</b></a>
<a href="experiment-trustworthiness.html">How 40k tests actually work →</a>
<a href="jargon.html">Jargon (glossary)</a>
</div>
<div class="navgrp"><h4>Scoring & Input modeling</h4>
<a href="rice-framework.html">RICE (Intercom)</a>
<a href="north-star-framework.html">North Star (Amplitude / Slack)</a>
</div>
<div class="navgrp"><h4>Goal-laddering / Define first</h4>
<a href="v2mom-framework.html">V2MOM (Salesforce)</a>
<a href="pyramid-of-clarity-framework.html">Pyramid of Clarity (Asana)</a>
<a href="pr-faq-framework.html">PR-FAQ / Working Backwards (Amazon)</a>
<a href="heart-framework.html">HEART (Google)</a>
<a href="dibb-framework.html">DIBB (Spotify)</a>
</div>
<div class="navgrp"><h4>Experimentation (SaaS)</h4>
<a href="microsoft-exp-framework.html">Microsoft ExP / CUPED</a>
<a href="linkedin-xlnt-framework.html">LinkedIn T-REX</a>
</div>
<div class="navgrp"><h4>Experimentation (Consumer)</h4>
<a href="netflix-experimentation.html">Netflix · ABlaze</a>
<a href="booking-experimentation.html">Booking.com</a>
<a href="airbnb-erf-framework.html">Airbnb ERF</a>
<a href="uber-xp-framework.html">Uber XP</a>
<a class="cur" href="doordash-switchback-framework.html">DoorDash switchback</a>
<a href="lyft-experimentation.html">Lyft</a>
<a href="pinterest-ab-framework.html">Pinterest</a>
</div>
<div class="navgrp"><h4>AI labs</h4>
<a href="anthropic-pm-on-ai-exponential.html">Anthropic · PM on AI exponential</a>
<a href="google-customer-zero-2026.html">Google · "Customer zero" 2026</a>
</div>
<div class="navgrp"><h4>Written discipline</h4>
<a href="stripe-shaping-framework.html">Stripe shaping</a>
</div>
</div>
</details>
</nav>
<div class="wrap">
<header class="masthead">
<p class="kicker">Methods · Deep-dive · Experimentation</p>
<h1>DoorDash switchback experiments — measuring causally on a shared marketplace <span class="srcyr">2018</span></h1>
<p class="sub">In a marketplace, users share resources (Dashers, restaurants, supply). A normal A/B test gets <strong>contaminated</strong>: changing one user's experience affects others.</p>
<p class="sub">DoorDash's published answer — <strong>switchback testing</strong> on region × time blocks — gives unbiased causal estimates despite the interference. First publicly described in the <a class="cite" href="https://doordash.engineering/2018/02/13/switchback-tests-and-randomized-experimentation-under-network-effects-at-doordash/">DoorDash Engineering blog post of February 13, 2018</a>.</p>
<div class="goal"><span>Goal</span><br>Decide features by data-backed expected impact — choose by outcome, not by to-do list or opinion.</div>
</header>
<div class="eli">
<div class="lbl">🎓 8th-grade version</div>
Normally an A/B test gives half of users the new thing and half the old thing, then compares. But on DoorDash, the half with a "new pricing" idea pulls Dashers away from the other half — so the "old" half is also affected by the new pricing, and the test is lying about how much the new thing actually helped. DoorDash's trick: <b>switch the whole region</b> on for 30 minutes, then off for 30 minutes, then on again, etc. — so everyone in the region has the same experience at any given moment, and you can compare "on" windows to "off" windows. This is a <b>switchback</b> test, and it's how you get honest answers when everyone shares the same pool of resources.
</div>
<nav class="toc">
<a href="#headline">Honest headline</a>
<a href="#problem">The interference problem</a>
<a href="#anatomy">What a switchback looks like</a>
<a href="#mechanism">How it picks work</a>
<a href="#apply">Apply to a sheet</a>
<a href="methodologies-comparison.html" style="color:var(--blue);font-weight:700">Comparison table →</a>
</nav>
<div class="finding" id="headline">
<h2>The honest headline: a marketplace breaks ordinary A/B tests</h2>
<p>If you randomly assign half of <em>users</em> to a new pricing algorithm in a shared Dasher pool, the new algorithm changes Dasher availability for the <em>control</em> users too. The control group is no longer truly "without the change" — they're affected by it through the shared resource. The measured lift is biased — by an amount, and in a direction, that depends on how the shared resource gets reallocated. In DoorDash's worked example (SOS pricing), control users also benefit indirectly from treatment-group Dashers being motivated, so the measured treatment lift comes out understated.</p>
<p>DoorDash's contribution: switch the whole region's algorithm on/off on a rotating schedule, then compare the two states <em>within the same region</em>. The shared resource is now part of the unit being tested. This is the standard playbook for marketplace experiments (Lyft and Uber publish related variants) and DoorDash's <b>Dash-AB engine</b> (the central statistical library behind the <em>Curie</em> experimentation platform) standardises the analysis.</p>
</div>
<!-- PROBLEM -->
<h2 class="sec" id="problem">The interference problem in one paragraph</h2>
<div class="problem">
<h3>Why naive A/B fails on a marketplace</h3>
<p style="margin:6px 0">DoorDash's own example, paraphrased from the 2018 post: imagine you ship a new <b>SOS pricing</b> algorithm (the surcharge DoorDash applies when Dashers are undersupplied) to 50% of consumers in San Francisco. The other 50% still see the old algorithm. <em>But all 100% of consumers compete for the same Dashers.</em> The treatment-group consumers see SOS-induced demand-throttling and motivated Dashers, but those Dashers <em>also</em> serve control-group orders — so the control group quietly inherits part of the benefit. The result: the A/B reads a lift, but the lift number is biased; you don't know by how much, and you can't fix it just by analysis. In DoorDash's version of the story the bias is downward; in other marketplace shapes the direction can flip.</p>
<p style="margin:6px 0;font-size:13.5px;color:var(--ink-soft)">The technical name: <b>SUTVA violation</b> (<a class="j" href="jargon.html#sutva">Stable Unit Treatment Value Assumption</a>). It applies to any marketplace, two-sided platform, or shared-resource feature.</p>
</div>
<!-- ANATOMY -->
<h2 class="sec" id="anatomy">What a switchback experiment actually looks like</h2>
<p class="secsub">Instead of randomising <em>users</em>, randomise <em>region × time window</em>. The whole region runs the new algorithm for 30 minutes, then the old algorithm for 30 minutes, then new, etc. Compare across windows.</p>
<div class="switch">
<div class="axislbl">Time →</div>
<div class="swgrid">
<div class="swrow-h">SF</div><div class="swrow-h">9:00</div><div class="swrow-h">9:30</div><div class="swrow-h">10:00</div>
<div class="cell" style="background:#465065">Region</div>
<div class="cell t">Treatment</div>
<div class="cell c">Control</div>
<div class="cell t">Treatment</div>
<div class="cell" style="background:#465065">NYC</div>
<div class="cell c">Control</div>
<div class="cell t">Treatment</div>
<div class="cell c">Control</div>
<div class="cell" style="background:#465065">LA</div>
<div class="cell t">Treatment</div>
<div class="cell c">Control</div>
<div class="cell c">Control</div>
</div>
<p style="font-size:12.5px;color:var(--ink-soft);margin:12px 0 0">Each cell = the entire region runs that algorithm for that time window. Treatment/control assignment is randomised across the (region × window) grid. Effect is estimated by comparing aggregate metrics in treatment cells vs control cells, with <a class="j" href="jargon.html#cluster-robust-se">cluster-robust standard errors</a>.</p>
</div>
<div class="src">Sources: <a class="cite" href="https://doordash.engineering/2018/02/13/switchback-tests-and-randomized-experimentation-under-network-effects-at-doordash/">DoorDash Engineering — "Switchback Tests and Randomized Experimentation Under Network Effects at DoorDash" (February 13, 2018)</a> · <a class="cite" href="https://careersatdoordash.com/blog/meet-dash-ab-the-statistics-engine-of-experimentation-at-doordash/">"Meet Dash-AB — DoorDash's Experimentation Statistics Engine"</a> · Academic follow-up: <a class="cite" href="https://arxiv.org/abs/2009.00148">Bojinov, Simchi-Levi & Zhao — "Design and Analysis of Switchback Experiments" (2020)</a>.</div>
<!-- MECHANISM -->
<h2 class="sec" id="mechanism">How DoorDash's switchback decisions get made</h2>
<div class="step"><div class="num">1</div><div><h3>Diagnose: is this a marketplace-shared feature?</h3><p>If the feature changes the shared pool (Dasher allocation, pricing, dispatch) → marketplace test. If not (UI, copy, button colour) → ordinary user-level A/B. This routing decision is the first thing.</p></div></div>
<div class="step"><div class="num">2</div><div><h3>Pick the unit: region × time window</h3><p>Choose grid granularity. Too small → not enough Dashers per cell, noisy. Too coarse → few cells, low statistical power. DoorDash's choice depends on the metric's natural cadence.</p></div></div>
<div class="step"><div class="num">3</div><div><h3>Randomise treatment/control across cells</h3><p>Dash-AB handles the assignment; the platform ensures balanced regions and times so no cell systematically gets the morning rush.</p></div></div>
<div class="step"><div class="num">4</div><div><h3>Run, then analyse with sandwich / cluster-robust SE</h3><p>Cells inside the same region/time aren't independent — observations cluster. The 2018 switchback post uses a <b>sandwich estimator of variance</b>; the Dash-AB engine (2022) generalises this as cluster-robust standard error inside a regression-based variance calculation, so significance isn't overstated.</p></div></div>
<div class="step"><div class="num">5</div><div><h3>Read the OEC. Ship, kill, or iterate.</h3><p>Same decision rule as ordinary A/B — the difference is that the lift estimate is <em>unbiased</em> for marketplace effects.</p></div></div>
<!-- APPLY TO A SHEET -->
<h2 class="sec" id="apply">Apply to a feature sheet</h2>
<p class="secsub">Switchback adds two DoorDash-specific columns to the standard experiment ledger: <em>marketplace flag</em> (does this change a shared resource? routes the design) and <em>switchback grid</em> (region × time-window cells, with cluster-robust SE). User-level features go through ordinary A/B; marketplace-level features must use switchback or the lift estimate is biased.</p>
<div class="note" style="background:var(--teal-soft);border-left-color:var(--teal)"><b>Try it Monday morning (30 minutes).</b> List your team's last 5 shipped experiments. For each one, ask: <em>could a user in the treatment group affect a user in the control group through any shared resource</em> — supply, ranking, inventory, support queue, social graph, ads inventory? If yes for any, your A/B test was likely biased — and you don't know in which direction. You don't need to immediately switch to switchback; the first step is just <em>tagging</em> these experiments so future readouts mark the bias risk on the spreadsheet.</div>
<div class="note" style="background:var(--blue-soft);border-left-color:var(--blue);font-size:13.5px"><b>Quick glossary for the columns below.</b> <b>SUTVA</b> = Stable Unit Treatment Value Assumption — the textbook A/B requirement that one user's outcome can't depend on another user's treatment. Marketplaces, social graphs, and shared inventories routinely break this. <b>Switchback</b> = randomization at the <em>(region × time-window)</em> level rather than the user level, so the shared resource is part of the unit being tested. <b>Cluster-robust SE</b> = a standard-error correction that accounts for observations inside a cell not being independent of each other (DoorDash uses these because lots of orders happen in one region-window). <b>Cell</b> = one (region × time-window) combination.</div>
<h3 style="font-family:Georgia,serif;font-size:18px;margin:18px 0 8px">Worked example — an experiment ledger snapshot (DoorDash-style)</h3>
<p style="font-size:13.5px;color:var(--ink-soft);margin:0 0 12px">Eight tests, mostly marketplace-shared. The first column tags whether interference matters; the rest follows.</p>
<div style="overflow-x:auto;margin:14px 0">
<table style="border-collapse:collapse;width:100%;font-size:13px;background:#fff;border:1px solid var(--line);border-radius:10px;overflow:hidden">
<thead><tr style="background:var(--ink);color:#f3efe6;font-size:11.5px;letter-spacing:.05em;text-transform:uppercase"><th style="padding:9px 10px;text-align:left">Feature</th><th style="padding:9px 10px;text-align:left">Marketplace?</th><th style="padding:9px 10px;text-align:left">Design</th><th style="padding:9px 10px;text-align:left">OEC</th><th style="padding:9px 10px;text-align:left">Grid (regions × windows)</th><th style="padding:9px 10px;text-align:left">Result</th><th style="padding:9px 10px;text-align:left">Decision</th></tr></thead>
<tbody>
<tr style="background:#e6ecf6"><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-weight:600">New dispatch algorithm</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Yes</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Switchback</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Deliveries/hour</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">40 × 30-min</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">+0.9% sig</td><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-family:Georgia,serif;color:var(--blue);font-weight:700">Ship</td></tr>
<tr style="background:#e6ecf6"><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-weight:600">New Dasher prioritization</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Yes</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Switchback</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Dasher utilization</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">30 × 60-min</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Util +1.4pp</td><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-family:Georgia,serif;color:var(--blue);font-weight:700">Ship</td></tr>
<tr style="background:#e6ecf6"><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-weight:600">SOS-pricing variant</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Yes</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Switchback</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Deliveries/hour</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">25 × 30-min</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Del/hr OK, support OK</td><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-family:Georgia,serif;color:var(--blue);font-weight:700">Ship</td></tr>
<tr style="background:#e6ecf6"><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-weight:600">AI ETA promise</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">No (display only)</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">A/B</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Order conversion</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">300k users</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Conv +0.4%, accuracy +5pp</td><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-family:Georgia,serif;color:var(--blue);font-weight:700">Ship</td></tr>
<tr><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-weight:600">Aggressive batching</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Yes</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Switchback</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Deliveries/hour</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">40 × 30-min</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">+2% del/hr BUT delays +8%</td><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-family:Georgia,serif;color:var(--gold);font-weight:700">Iterate — tighter rules</td></tr>
<tr><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-weight:600">New order-routing variant</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Yes</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Switchback</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Deliveries/hour</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">25 × 30-min</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Mean lift OK, variance high</td><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-family:Georgia,serif;color:var(--gold);font-weight:700">Iterate — needs more cells</td></tr>
<tr><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-weight:600">Two-zone batching pilot</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Yes</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Switchback</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Deliveries/hour</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">8 × 30-min</td><td style="padding:9px 10px;border-bottom:1px solid var(--line)">Too few cells, under-powered</td><td style="padding:9px 10px;border-bottom:1px solid var(--line);font-family:Georgia,serif;color:var(--ink-soft);font-weight:700">Extend run / add regions</td></tr>
<tr><td style="padding:9px 10px;font-weight:600">Bigger delivery radius</td><td style="padding:9px 10px">Yes</td><td style="padding:9px 10px">Switchback</td><td style="padding:9px 10px">Deliveries/hour</td><td style="padding:9px 10px">30 × 60-min</td><td style="padding:9px 10px">−0.6% del/hr</td><td style="padding:9px 10px;font-family:Georgia,serif;color:var(--accent);font-weight:700">Kill</td></tr>
</tbody>
</table>
</div>
<div class="note" style="background:var(--accent-soft);border-left-color:var(--accent)"><b>The most important reading skill on this page.</b> Look at the <em>"Marketplace?"</em> column. Of the 8 features, 7 are "Yes" and one is "No" (the AI ETA promise — pure UI display). The "No" row uses ordinary A/B and works fine. The 7 "Yes" rows all require switchback — and for each, the alternative wasn't "do A/B with a footnote about bias"; it was "use the wrong design and silently believe the wrong number." The transferable insight isn't switchback as a technique; it's the <em>routing decision in the first column</em>. A team that doesn't ask "does this share a resource?" routinely mis-measures features for years and never knows.</div>
<div class="note"><b>Decision rule.</b> The first decision is <em>which design</em>, not which feature. Anything that changes a shared resource (dispatch, surge, Dasher allocation, batching) <strong>must</strong> use switchback or the lift estimate is biased — likely by enough to flip ship/kill. The aggressive-batching row shows the dual-OEC pattern (delivery throughput up, customer delay up — the second guardrail kills the win). The two-zone pilot's "Extend" verdict is the under-powered case: not a fail, just not enough cells yet.</div>
<div class="note"><b>The transferable insight: design before stats.</b> The wrong analysis can't rescue the wrong experimental design. The DoorDash lesson is to <b>diagnose interference first</b> — most teams don't, and quietly mis-measure marketplace features for years. Even at small scale, asking "does this change a shared resource between users?" is free, and it changes the design.</div>
<footer>
Companion to <a href="impact-consumer-companies.html#measure">← Consumer case studies · Measure don't estimate</a> · <a href="methodologies-comparison.html">All methods compared</a> · siblings: <a href="uber-xp-framework.html">Uber XP</a> · <a href="lyft-experimentation.html">Lyft marketplace experiments</a> (the other published marketplace approaches)<br>
<b>Grounded in</b> the original <a href="https://doordash.engineering/2018/02/13/switchback-tests-and-randomized-experimentation-under-network-effects-at-doordash/">DoorDash Engineering post "Switchback Tests and Randomized Experimentation Under Network Effects at DoorDash" (Kastelman & Ramesh — February 13, 2018)</a>, the <a href="https://careersatdoordash.com/blog/meet-dash-ab-the-statistics-engine-of-experimentation-at-doordash/">"Meet Dash-AB" post (Huang & Tang — May 24, 2022)</a>, and the academic follow-up <a href="https://arxiv.org/abs/2009.00148">Bojinov, Simchi-Levi & Zhao (2020)</a>. <b>Verbatim from DoorDash:</b> "SOS pricing" as the published example, switchback at the (region × time-window) level, "30 minute switchback periods using certain geographic divisions roughly at the city-level," sandwich estimator of variance in the 2018 post (and cluster-robust SE inside regression-based variance in the 2022 Dash-AB post), and the <em>Curie</em> + <em>Dash-AB</em> platform names. The 2018 post also notes the agricultural origin (cow-lactation experiments). <b>Added by us, not in DoorDash's posts:</b> the specific 4×3 grid visualization (illustrative — actual DoorDash grid sizes vary by metric cadence), the 8-row worked-example ledger, the Ship/Iterate/Kill/Extend verdict labels, the in-page glossary, and the "Try it Monday" exercise. The careersatdoordash.com URL the page formerly cited is a republished version (April 2025) of the same content.<br>
<em>Note: a 2026-05-26 rewrite replaced an earlier reference to "Surge pricing" (an Uber/Lyft term) with DoorDash's actual published term "SOS pricing," and softened a "biased downward (often by a lot)" generalisation — the direction of bias depends on how the shared resource is reallocated; the 2018 SOS example happens to bias downward but the source doesn't generalise that direction.</em>
</footer>
</div>