Methodology
A quarterly index of how worth it food and grocery delivery work is across cities globally. Scored on purchasing power, housing reach, and benchmarks against local wages.
Scope
This index covers app-based food and grocery delivery couriers: workers earning income through DoorDash, Uber Eats, Grubhub, Instacart, Deliveroo, Glovo, Swiggy, Zomato, Rappi, iFood, foodpanda, Gojek, and equivalent local platforms.
Not covered: general courier and last-mile package delivery (DoorDash Drive, Uber Direct), pharmacy/prescription delivery, flower delivery, alcohol-only delivery, and non-app-based gig work (rideshare driving, in-person grocery shopping for personal customers, home services). Earnings rates, mandated minimums, and platform structures differ meaningfully across these verticals.
Where city-level data sources cover a slightly broader set (e.g. Indeed's "delivery driver" pages aggregate restaurant, grocery, and general delivery), this is noted in the per-city source citations.
The question
Is food and grocery delivery work worth it in your city? Answered with comparable, transparent numbers across cities worldwide. Numbers update quarterly. The current release is the Q2 2026 baseline.
The Composite Score
Each city gets a 0–100 score combining four sub-metrics. Each sub-metric is the percentile rank of a base ratio across all 46 rated cities. A city scoring 0.75 on a sub-metric outranks 75% of rated cities on that dimension.
| Sub-metric | Formula |
|---|---|
| Purchasing Power | percentile_rank(gross_hourly ÷ meal_usd) |
| Housing Reach | 1 − percentile_rank(rent_1br_center ÷ gross_hourly) |
| vs Min Wage | percentile_rank(gross_hourly ÷ min_wage_hourly) |
| vs Median Wage | percentile_rank(gross_hourly ÷ median_wage_hourly) |
The composite score is the weighted average of available sub-metrics, scaled to 0–100. Weights vary by mode (see below). Cities missing min wage or median wage data still score on the available metrics. The weighted average is renormalized so missing metrics don't penalize the city.
Mode presets
The same data answers different questions depending on what you weight. The index offers four modes via the dropdown at the top of the home page. All modes use the same underlying numbers; only the weights differ.
| Mode | Question it answers | Weights (PP/HR/MinW/MedW) |
|---|---|---|
| Cost of living (default) | Can I afford to live here on this pay? | 50 / 30 / 12 / 8 |
| Pay vs other jobs | How does gig pay compare to traditional employment? | 40 / 25 / 20 / 15 |
| Best take-home | Where do I take home the most after costs? (favors low-cost cities) | 70 / 30 / 0 / 0 |
| Survival floor | Can I keep a roof over my head doing this full-time? | 40 / 50 / 10 / 0 |
Why multiple modes: different audiences want different answers. A driver thinking about relocating cares about "cost of living". A researcher comparing gig economies across countries cares about "pay vs other jobs." The dropdown lets each user pick the framing relevant to them instead of the index pretending one weighting is universally correct.
What changes when you switch modes: ranks, scores, score colors on the map, structured insights ("Top 3 globally," etc.). What doesn't change: the city's actual numbers (gross hourly, rent, etc.) and the "What this means" bottom-line paragraph, since those describe the city's real situation independent of how the index weights it.
Housing
Rent uses Numbeo's "1 bedroom apartment outside of city centre" figure, not the city-center figure. This is the more realistic housing reference for gig delivery workers, who overwhelmingly do not live in central neighborhoods.
Why this choice matters: in cities like NYC, London, and Hong Kong, city-center rent can exceed 100% of a full-time delivery worker's monthly net earnings. Using the center figure would make the index more dramatic but less honest about what working in delivery actually looks like. Workers commute, share housing, or live in outer zones. Using outside-center rent reflects that.
City-center rent is still shown in each city's detail panel as a secondary reference. It informs but does not drive the score.
Even with the more lenient figure, in many markets full-time delivery does not cover a 1BR outside the center on its own. The index tells you how the math shakes out. It does not promise that any of these cities offer a livable wage on delivery alone. Read the "Side-hustle territory" insights on city detail panels for context.
Rent burden: gross vs. net
Rent burden percentages on city pages are shown two ways: as a percent of gross monthly earnings (matching HUD's federal definition for housing affordability) and as a percent of net take-home pay (what a worker actually has available to spend). HUD's “cost-burdened” (30 to 50 percent of gross income) and “severely cost-burdened” (over 50 percent) bands are derived from the gross figure. The net figure is shown alongside because it reflects practical purchasing power and matches the take-home dollars displayed in the on-page calculator.
After tax & expenses calculation
Gross hourly is the canonical earnings figure. We also display an estimated after-tax-and-expenses hourly that deducts country-specific tax rates plus operating costs:
net = gross × (1 − country_tax_rate) − fuel_per_litre × 0.4 − data_per_GB ÷ 30
Country tax rates reflect typical effective burden for self-employed or independent-contractor gig workers at delivery income levels, combining national income tax + social security/payroll contributions where applicable. Each city panel shows the rate applied with a clickable source link to the relevant tax authority. Sample rates: United States ~25%, United Kingdom ~26%, Germany ~32%, Denmark ~38%, India ~5%, Hong Kong ~5%, Singapore ~10%, Indonesia ~5%, Australia ~22%.
Limitations: the rates assume formal-sector compliance. Where gig workers operate informally (parts of LATAM, India, Indonesia, etc.) effective tax paid is often lower. Rates also do not account for individual deductions, tax credits, mileage write-offs, or location-specific surcharges. Treat the net figure as directional, not as personalized tax advice.
The fuel deduction (0.4 L per hour) reflects realistic urban delivery driving (~6 to 12 miles per hour at ~25 mpg). Mobile data is amortized assuming 1 GB per month over 30 hours of work. Both are cost-of-living-adjusted via Numbeo per city.
For countries where tax research is not yet complete, the net figure deducts only fuel and data (no tax applied). The city panel explicitly flags this so users know the figure is pre-tax for that city.
Source Priority Rules
Standard source per metric, applied uniformly across all cities. We do not average across sources or interpolate. If the primary source is unavailable, we fall back through the priority list. Where no source applies, the city is unrated.
| Metric | Standard source | Notes |
|---|---|---|
| Cost of living (meal, rent, fuel, data, beer, movie) | Numbeo | Per-city URL on detail panel; contributor count and last-update date cited |
| Minimum wage | Official government source | Per-city: gov.pl, dol.gov, mintrab.gob.cl, etc. 4 cities (Denmark, Italy, Singapore, Sweden) have no statutory minimum; collective bargaining noted |
| Median wage | National statistics office | Per-city: BLS, GUS, ISTAT, INE, etc. |
Earnings tier hierarchy (per city)
- TIER 1 gov_mandate: Government-mandated rate (e.g. NYC DCWP $22.13, Seattle PayUp/OLS, BC Reg 18.2, Singapore Platform Workers Act, MA AG settlement). Sufficient alone for HIGH confidence.
- TIER 2 fairwork / union_agreement / gov_data: Fairwork country report, sectoral collective bargaining agreement, or large-N government survey. Needs 1 cross-source for HIGH.
- TIER 3 industry_survey / academic_survey: Indeed/Glassdoor with n ≥ 200, ERI SalaryExpert, academic rider survey, named-worker investigation. Needs 2 cross-sources from different orgs for HIGH.
- If none, the city is unrated.
Derivation rules (when value isn't stated verbatim)
For some cities, the displayed gross hourly USD is not a number you'll find verbatim in any single source. It is a documented derivation from the primary source, calculated using a rule applied uniformly. Each derivation is flagged in the master proof CSV as verified_value_match: derived and explained in the city's confidence rationale.
| Derivation type | Rule | Example |
|---|---|---|
| California Prop 22 cities (SF, LA) | 120% × current local city minimum wage = engaged-time floor | SF: 1.20 × $19.18 = $23.02. LA: 1.20 × $17.87 = $21.44. |
| BC mandate (Vancouver) | BC Reg 18.2 mandated rate × USD/CAD FX | $20.88 CAD × 0.72 = $15.03 USD. |
| Australia MSO (Sydney/Melbourne) | TWU+Uber+DoorDash MSO rate × USD/AUD FX, adjusted for non-engaged hours | AUD $25.40 × 0.65 = $16.51 USD. |
| Foreign-currency Fairwork/union cities | Local rate × current USD FX rate | Stockholm SEK 155.90 × 0.094 = $14.65 USD. Copenhagen DKK 145 × 0.143 = $20.83 USD. |
| Multi-source triangulation cities | Weighted midpoint of named sources, with sample-size weighting | DC: Salary.com $24 + Glassdoor n=216 $25 → $22 (accounting for non-engaged time). |
| Government-survey reporting cities | Median of survey distribution × USD FX | Hong Kong: HK C&SD ~13,000 worker survey distribution → HK$73/hr median = $9.40 USD. |
| Verbatim-stated cities | Number cited directly in source | NYC: $22.13 (DCWP). Seattle: $19.98 (Seattle OLS pay-for-time-online avg). |
The FX rates used are documented at the bottom of the LEDGER (April 2026 rates). Where a derivation requires judgment (e.g. accounting for non-engaged hours), the city's rationale field shows the assumption made.
Currency
All figures are in USD. The index is built on cross-city USD comparability; that is the load-bearing premise. We don't offer a currency toggle because it would either be cosmetic (multiplying USD by current FX) or break the comparison promise.
Data verification process
Every city has source URLs for its four core metrics: earnings, minimum wage, median wage, and Numbeo cost-of-living. CI rejects any change that leaves these blank or malformed. What additionally applies depends on whether the city is verified.
Verified cities (the HIGH set). When sources.urls_verified is true, four extra constraints kick in: each populated source URL must have a matching Wayback Machine archive URL on web.archive.org; the cited value on the page must match what the index publishes; the URL must sit on a recognized tier-1 (government mandate) or tier-2 (named union agreement, Fairwork country report, large government wage survey) domain; and any change to the city's substantive data is locked behind a snapshot hash that requires a corresponding entry in data/data_log.md before CI will accept the merge. The lock catches silent edits; the log entry forces explicit justification.
Enforcement. The CI workflow at .github/workflows/data-validation.yml runs on every push and pull request that touches the dataset, the validation scripts, or the workflow itself. The validator at scripts/validate-data.mjs runs structural checks (required URLs, archive presence on verified cities, confidence-tier consistency, the aggregator blocklist, and a staleness check that warns when urls_verified_date is over 90 days old and errors at 180); the snapshot-lock job at scripts/snapshot-verified.mjs enforces the verified-data lock; the content check at scripts/verify-content.mjs fetches each cited source for HIGH-confidence cities and confirms the published value actually appears in the page text. A separate non-blocking job HEAD-fetches every URL on every run and reports dead links as warnings.
Auto-archive. Before validation runs, CI calls scripts/archive-sources.mjs, which submits any verified URL still missing an archive to web.archive.org and writes the resulting Wayback URL back into cities.json. Contributors don't have to remember to archive sources manually; if Wayback is unreachable, validation surfaces the missing-archive errors as normal.
Aggregator blocklist. Self-reported wage aggregators (Glassdoor, Indeed, ZipRecruiter, Salary.com, PayScale) are not valid primary sources for hourly delivery wages and are blocked at two layers. A blocklisted domain in earnings_url fails CI at HIGH or MEDIUM. A blocklisted aggregator named in the description text (even if the URL itself points to a respectable source) also fails CI at HIGH (and warns at MEDIUM). This second check exists because we found cases in earlier verification rounds where the URL pointed at mass.gov but the description admitted the cited number actually came from Glassdoor.
Why archive URLs. Source pages disappear, get rewritten, or change their URL structure. This happens regularly with government wage pages and with company-specific gig-platform pages. The Wayback Machine snapshot is a third-party-timestamped receipt that the cited number existed at that URL on that date. Even if the original source vanishes tomorrow, the archive URL preserves the evidence.
Confidence levels
Every city carries a confidence label that reflects how rigorously its earnings data has been verified for the current snapshot. Look for the labelled pill on the detail panel, the three small dots next to the score in the city list, and the marker style on the map. Distribution as of 2026-Q2:
| Level | Meaning |
|---|---|
| High (10 cities, 22%) | Live-verified and archived. urls_verified=true; the primary source URL has been fetched in this snapshot, the cited value cross-checked against the page, a Wayback Machine archive captured, and the URL is on a recognized tier-1 (government mandate) or tier-2 (named union agreement, Fairwork country report, large government wage survey) domain. Substantive data on these cities is locked behind a snapshot hash. Any change requires a matching entry in data/data_log.md. |
| Medium (31 cities, 67%) | Sourced but not yet live-verified in this snapshot. A named primary source URL is on file, but the source page has not been re-fetched, cross-checked, and archived in the current verification round. Aggregator mentions in description text are warned but not blocked at this tier. Treat values as directional. |
| Low (5 cities, 11%) | Source quality below the tier-2 bar. Examples: a self-reported aggregator (Glassdoor, Indeed, ZipRecruiter, etc.) is admitted in the rationale, the cited URL turned out not to apply to food and grocery delivery specifically (general courier wages, rideshare-only pages), or the figure is a derived blend without a tier-1/2 anchor. Useful for cross-city orientation; not for making individual decisions. |
| Unrated (0 cities, 0%) | Earnings could not be verified from any source meeting the minimum bar. The city is excluded from ranks and composite scores until verified data is available. |
The audit trail. Every HIGH-confidence city has a public per-city audit on the verification page documenting what was directly verified against the source page, what was assumed, what would invalidate the claim, and the re-verify-by date. Internal change logs live in data/data_log.md; the user-facing subset of changes appears on the errata page. Together with the *_archive_url fields and git history, these provide a full chain of custody for every verified figure.
Engaged-time floor vs. actual earnings
The headline gross hourly we display is, where one exists, a regulatory floor or contracted rate, not always a measurement of what drivers actually take home. The distinction matters most for U.S. cities and is worth reading carefully.
Los Angeles and San Francisco derive their cited gross hourly from California Proposition 22's engaged-time formula (120% of local minimum wage). This is a legal floor for the time a driver is actively on a delivery, not a measurement of full-shift earnings. UC Berkeley's 2024 study of California delivery drivers found actual median earnings of $4.98–$11.43 per hour after expenses, well below the engaged-time floor. The number we display reflects the law; the number a working driver in those cities is likely to see is lower.
New York and Seattle differ in kind. Their cited rates are enforced minimums backed by mandatory company reporting (NYC DCWP under Local Law 115, Seattle OLS under PayUp), audited and revised on a fixed schedule. Drivers in those cities are much closer to actually receiving the cited number, because the regulator has visibility into platform earnings reports and can penalize underpayment.
Why we don't average actual-earnings studies into the headline. Studies aren't comparable across cities: sample frame, expense definition, and engaged-vs-total-time treatment vary too much to combine into a single number that holds up across 46 cities. Where the cited rate is a derived legal floor rather than a measured median, the city's source rationale documents this as verified_value_match: derived with the derivation rule. Read the headline as “regulatory floor or contracted rate where one exists; measured median elsewhere”, and read the per-city source rationale on the detail panel for which applies.
Snapshot date vs. source date
The index itself is dated by quarter. The current release is Q2 2026. This is when the snapshot was assembled and published.
The underlying sources have their own publication dates, which often pre-date the snapshot. For some cities, particularly those covered by Fairwork country reports or worker association surveys, the most recent authoritative source may be from 2023 or 2024. We use the most recent available data per city, even when that means the source date is older than the snapshot.
This is standard practice for global comparison indices. The World Bank's 2026 World Development Report uses GDP figures from 2024. The OECD's annual wage comparisons cite source years per country. Numbeo timestamps each city page with its last update date, which varies. We follow the same convention.
Each city's detail panel shows the source date next to the source link. When a source is from a prior year, it's labeled “source: 2024”. Mandated rates are shown with their effective date (e.g. “effective Apr 2026” for NYC).
What changes quarter-over-quarter: mandated rates that adjust (NYC inflation indexing), Indeed/Glassdoor figures (re-sampled each quarter), cost of living from Numbeo (continuously updated), and FX-sensitive figures (Argentina). What doesn't change quarterly: deeply-researched survey data (Fairwork, Aliança Bike, IBGE) which only refresh annually or bi-annually.
Updates
The index refreshes every quarter. Standard collection windows: Q1 (Jan 13–19), Q2 (Apr 13–19), Q3 (Jul 13–19), Q4 (Oct 12–18). Each release is a snapshot. Historical quarters are preserved for trend analysis in future versions.
Limitations
- Cities without a published statutory minimum wage (Denmark, Sweden, Singapore, Italy) skip the vs-min-wage component, which can inflate their composite score relative to cities that get penalized for low earnings vs minimum.
- Net hourly assumes self-employed contractor status with no benefits. Cities where couriers are employees (Spain post-Riders Law, Denmark via 3F agreement) effectively get more than the listed net.
- Tips and surge bonuses are partly captured in earnings sources (Indeed, Fairwork) but not separately broken out.
- The 0.4 L/hour fuel model is a single global assumption. Bike-only markets (much of India, SE Asia) may slightly under-state net.
- This is a global comparison index, not a primary research source. For city-specific policy decisions, use the underlying sources directly. Links per city in the detail panel and on the sources page.
2026-Q2 release · 46 cities · 10 HIGH, 31 MEDIUM, 5 LOW · Next refresh: July 2026