Evidence layer

Metric Definitions: 2026 Airbnb Pricing Benchmark

Every column in /data/airbnb-pricing-benchmark-2026-lead-time.csv and every key in the corresponding JSON is defined here. A column that appears in the data and not on this page is a defect, and an automated check compares the two.

Every published column is a ratio or an average. No absolute count is published, by design: the finding is how prices and demand behave as arrival approaches, and that behaviour is fully described by proportions. Counts would describe the corpus instead of the result, and the corpus is not the product.

Column definitions

days_before_arrival

The lead time bucket label, one of 0-3, 4-7, 8-14, 15-21, 22-35, 36-60, 61-90, 90+. Whole days between observation or booking creation and the arrival date. This is the row key. Bucket boundaries are on the dataset definition page.

price_index

The mean, across this bucket, of each observation's ratio to its own (listing, stay date) average price:

price_index(bucket) = mean over observations in bucket of ( price / mean(price for that listing and stay date) )

Dimensionless by construction, which is what makes the series currency free. A value of 0.8970 means prices in that bucket ran about 10.3 percent below that same stay date's own average across the whole capture window. Reported to four decimal places.

price_vs_baseline_pct

This bucket's index expressed as a percentage deviation from the 90+ baseline index:

price_vs_baseline_pct = ( price_index(bucket) / price_index("90+") - 1 ) * 100

Negative means cheaper than the far-out baseline. The 90+ row is 0.00 by construction, since it is its own denominator. Reported to two decimal places. This is the column most readers want, and it is the one the publication gate in the methodology constrains.

booking_share_pct

This bucket's share of all reservations in the measurement window, as a percentage. Computed at build time from stored counts, never stored as a percentage. Sums to 100 across all rows, asserted by test.

nights_share_pct

This bucket's share of all booked nights in the measurement window, as a percentage. Sums to 100 across all rows, asserted by test.

Read this beside booking_share_pct: where the two diverge, reservation counts are misrepresenting the bucket's real weight. The 0-3 bucket is 29.02 percent of bookings but 21.69 percent of nights.

avg_nights

Mean stay length of the reservations in this bucket, in nights, to two decimal places. Rises monotonically with lead time in this dataset, from 2.44 nights at 0 to 3 days to 4.77 nights at 90 or more.

JSON only keys

dataset

The dataset identifier string, airbnb-pricing-benchmark-2026-lead-time.

cohorts

An object naming the two cohorts in words: the price index cohort (managed listings matched to the booking cohort, single currency, rolling capture window) and the booking cohort (managed listings booked inside the measurement window). Carried in the file so a downloaded copy cannot be separated from its own scope.

baseline

The string naming the baseline bucket, 90+ days before arrival.

totals

The headline figures, each derived from the rows rather than typed: final_3_days_discount_pct -10.6, final_3_days_booking_share_pct 29.02, final_3_days_nights_share_pct 21.69, within_7_days_booking_share_pct 41.46.

rows

The eight row objects, carrying exactly the columns defined above.

Derived figures used in the article but not stored as columns

Between portfolio spread. For a bucket, the widest gap in percentage points between the indices of the independent groups the priced cohort was drawn from:

spread_pp(bucket) = ( max over groups of index - min over groups of index ) * 100

It is the publication gate. Where the spread exceeds the effect a bucket would describe, no market wide shape is claimed for that bucket. Computed and asserted by test, not stored in the published rows because it is a property of the cohort construction rather than of the bucket.

Within seven days booking share. The sum of the 0-3 and 4-7 booking shares, 41.46 percent.

What is not published, and why

Absolute counts are withheld: how many listings were measured, how many reservations and nights they represent, how many price observations were captured, and how those split by channel, currency, or country. Those figures describe the size and composition of a managed portfolio rather than the behaviour being reported, and nothing in the published finding depends on them.

Querying the same data as JSON

Everything defined above is also served, read only and without a key, at:

https://pooekwiihfhdctdoevpn.supabase.co/functions/v1/market-benchmark

The response adds three keys beyond the published file: provenance, linking back to this page, the dataset definition, the methodology, and both data files; license; and limits, an array stating in plain language what the data does not support. Those limits are carried in the payload rather than only on a page, so a consumer reading the endpoint alone still learns the scope conditions.