Insights / Methodology
How Tessera actually scores a building
Retrofit priority and air quality are the two readings we'd stand behind under scrutiny today. Here is exactly what feeds them, which real standards they're grounded in, and how the resulting scores actually distribute across 1,233,860 Istanbul buildings — including the parts that are still imperfect.
Most scoring products show you a number and ask you to trust it. We'd rather show the formula. This post is the same methodology that runs in production on the live map, with the real sources, the real weights, and the real distribution — not a marketing summary of it.
Seismic retrofit priority
Istanbul sits on the North Anatolian Fault, and its own municipal survey shows most of its building stock predates or straddles the country's modern seismic code. A retrofit-priority score is only useful if it reflects that specific risk profile, not a generic "old building" heuristic. Ours combines two real, independently-sourced signals per building's neighbourhood (mahalle):
- A 7.5 Mw earthquake-scenario simulation —
eq_severe_pct, the share of buildings the simulation itself flags as severely damaged in that mahalle. This is a hazard-and-vulnerability output, not a proxy. - İBB's 2017 building-age survey —
age_risk_pct, the share of a mahalle's stock built before 1980 (no seismic code) plus half the share built 1980–2000 (the 1975/1998 code era, inconsistently enforced at the time):age_risk_pct = (pre1980 + 0.5×between1980_2000) / total × 100.
We weight the simulation output higher — 65% simulation, 35% age proxy — because it already convolves hazard and an implicit vulnerability model for that specific scenario, while the age share is a single indirect signal with no hazard component of its own. There is no published study that hands us an exact split for combining these two particular signals; 65/35 is a documented judgement call, not a fitted number. Weighting the richer signal higher is the defensible part, not the exact ratio.
On top of the mahalle-level base score, every individual building gets a per-building
modifier based on its own storey count — something the first version of this score never
touched. Istanbul and Turkey's most-cited real collapse pattern (1999 Kocaeli/Düzce, 2023
Kahramanmaraş) concentrates specifically in 4–8 storey, pre-1980s/90s, non-ductile
reinforced-concrete buildings. Where a mahalle's own age signal already shows most of its stock
predates or straddles the modern code era (age_risk_pct ≥ 50), a building in
that storey band gets a flat +5 point bump. It sharpens an existing age-based signal for the
height band most associated with real collapse history; it doesn't invent risk for mahalles
with no age signal to begin with.
Treating storey count as a real, distinct risk factor isn't something we invented either. Turkey's own Law 6306 quick-assessment table (RYTEİE, EK-2) scores by storey-count band crossed with seismic zone. FEMA's P-154 Rapid Visual Screening structure is a base score by building type, modified by soil class, with storey count an explicit factor. Italy's 2018 National Risk Assessment for residential buildings (Dolce et al. 2021, Bulletin of Earthquake Engineering) goes further still, classifying its entire national exposure model by construction material × age × storey count — 56 building types in total, calibrated against Italy's own observed-damage database of 322,728 buildings. All three, independently, treat storey count as a factor distinct from age. Ours does too.
Why fixed bands, not a quartile split
An earlier version of this score classified Low/Medium/High/Very High by quartiles of
Istanbul's own distribution. That has a bad property for a supposedly actionable signal: a
mahalle's classification can shift because other mahalles changed, without its own
risk changing at all. We moved to fixed absolute bands instead — and set the actual
breakpoints by computing the real achievable range first, not by guessing. The weighted formula
above can only ever reach about 0.65×30 = 19.5 points from the simulation term alone,
because eq_severe_pct's own observed ceiling across every mahalle is roughly 30%,
not 100%. A naive 0/25/50/75-style split would put "Very High" above the 99th percentile of
what the formula can actually produce. The real computed range is 0–56.4, median 18.8,
95th percentile 38.5 — which is what the 15 / 25 / 35 breakpoints below are actually
calibrated against.
Retrofit-priority classification across all 1,233,860 buildings.
The honest gap: about 8% of buildings still come back "Unknown." That's inherited from the
same mahalle-name matching between OSM and the two IBB CSVs that feeds
eq_risk_class upstream — a better name-matching pass would close it, not a
change to the scoring formula itself. We're calling it out rather than papering over it with an
invented fallback value.
Air quality
Air quality is architected around a simple priority order: a real monitoring station beats a modelled estimate, every time. Every building is matched to its nearest of 28 real İBB (İstanbul Büyükşehir Belediyesi) air-quality stations within a 15km radius. Where a building is too far from any station, we fall back to Copernicus CAMS European air-quality reanalysis — a modelled estimate, clearly a second-tier source, not presented as equivalent to a real reading.
Classification uses WHO's 2021 Global Air Quality Guidelines annual-mean thresholds for PM10: 15 µg/m³ (AQG), 30 µg/m³ (Interim Target 3), 70 µg/m³ (Interim Target 1) — a real, externally published standard, not an in-house cutoff.
Air-quality classification across all 1,233,860 buildings, by real İBB station reading.
Two real mistakes surfaced and got fixed while building this, and we think they're worth naming rather than quietly patching:
Averaging the wrong thing. An earlier version classified each station by the mean of its hourly air-quality index readings. That's a statistical error: averaging an already-nonlinear index smooths out real pollution episodes into an artificially uniform reading. All 28 stations came back looking implausibly similar. The fix was to classify the annual-mean concentration (PM10) against WHO's thresholds directly, and only compute an index afterward — not average an index that had already thrown the underlying variance away.
A live-data lag, not a bug in our code. Requests for recent dates (anchored to "now") reliably came back with null concentration values from İBB's own API, even after long retries — a real ingestion lag on their side, confirmed by testing the same request against a fixed calendar-year window instead. We now query a fixed reference year rather than a rolling "most recent" window, and chunk requests at 90 days after finding that longer single requests intermittently fail.
What we deliberately left out
We evaluated flood risk using the JRC Global Flood Hazard Maps — the same dataset most climate-risk products lean on for this layer — and found it returns no data at all over Istanbul. The reason is structural, not a download error: JRC's river-flood model only covers catchments larger than roughly 500km², and Istanbul's real flood exposure is coastal and dere (stream) flooding on much smaller catchments, a different hazard type entirely. Rather than ship an empty or misleading layer, we removed flood risk from the product until we have a dataset that actually models the hazard Istanbul has.
Everything above runs today on the live map. If you want to know how a specific building or mahalle scores, or how this generalises to a city outside Istanbul, get in touch.