Site traffic and search demand
Site traffic is pulled from the PostHog API each time the dashboard is built. State and metro totals are true
daily uniques: a person visiting several of a state's pages in one day counts once. The per-page list (hover the
organic visits number on a card) counts a person once per page visited, so pages can sum to more than the total.
Search demand is Google Trends daily interest, measured in-state (queries made from within the state itself,
geo US-XX) or per metro. Keywords: wildfire {state}, fire {state}, fire {abbr}, "fire near me", and in metro view
"fire near {city}" (the metro's biggest city). Each area's keywords come from one Google Trends request, so they share
one scale (the area's best term-day = 100). They are directly comparable within an area, but not across areas. When
Google Trends returns zeros for many metros on the same day (unprocessed recent days), those metro-days are treated as
missing rather than as zero.
SEO health (the overview and card headers)
Everything that judges health uses the dates picked with the date button at the top, less the latest day, which is
still partial. For example, "Last 14 days" judges the 13 complete days in it.
- Search
- The average of an area's keyword indices over those days, as a multiple of its average over the
same number of days immediately before (1× = no change). "All data" has no earlier period, so it can't be judged.
- Visits
- In the table and on the cards ("Search → visits"): the same for our organic visits, i.e. visitors arriving
from a search engine (Google, Bing, DuckDuckGo, Yahoo, Ecosia, Brave), counted by PostHog. They track Search Console
clicks within a few percent. "Clicks" on this page always means Google Search Console clicks.
- Status
- Visits ÷ search, whether search rose or fell. Below 0.6× = missing demand (our traffic fell behind
search), above 1.25× = outperforming, otherwise tracking.
- Missed visits per week (estimate)
- (search multiple − our multiple) × our average day in the previous period × 7.
- What Search Console shows
- This dashboard's own labels (Google doesn't supply them), read from Search
Console over the same dates, up to its last complete day. Search Console runs about two days behind. Every multiple
compares with the previous period. For states missing demand:
- Losing visibility: our impressions fell well behind search (impressions ÷ search below 0.6). Points to
a ranking or indexing gap.
- Shown, not clicked: our clicks fell well behind our impressions (clicks ÷ impressions below 0.6). Points
to a title, snippet or position gap.
- Google clicks kept pace: our Google clicks rose with searching, so the shortfall is in other search
engines or in tracking.
- Visibility and clicks both slipped: none of the above.
- Can't judge yet
- Google Trends reports low-volume days as zero except for the most recent ~14 days of each
request. For states whose search history is mostly zero there is no reliable level to compare, so they are left out
of the health table.
Short windows react fastest but flip on noise. 14 days halves how often a status flips compared with 7, while a
real surge still registers the day after it starts. Longer windows show the season's overall picture. The card
headers' Search Console figures compare those dates with the same number of days immediately before them. The comparison
chart plots any two of these multiples on log axes, capped at 24×. States past the cap are drawn scaled down along
their own ray, so they stay on the correct side of the diagonal.
Chart dates
The date button at the top sets the window every state chart shows: the last 7, 14, 30 or 90 days, all data, or
any start and end day picked on its two calendars. SEO health (the overview and card headers) judges the same dates;
the surge list and opportunities keep their own fixed windows.
The left axis rescales to the largest value visible in the chosen dates, but index values don't change when you
pick dates. Traffic and Search Console impressions stay indexed to their own peak over the whole window, and the
search terms share one Google Trends scale per area (100 = the busiest term-day). Search Console average position and
CTR are plotted on the right-hand axis in their own units, sharing the left axis' gridlines. Position is inverted
(1 = top result at the top). With 7-day smoothing on, average position and CTR are impression-weighted over the
7 days.
Best position is, for each day, our best average position over the 7 days ending that day, among queries
that brought the state's pages (or, in a metro view, its city queries) at least 20 impressions in those 7 days. Brand
queries and likely-automated queries are left out, and the hover names the query. The trailing week keeps the line
continuous and steady, so it moves only when a ranking holds for days. It can sit below the average line
when our strongest rankings are all on low-volume queries, and the smoothing toggle doesn't change it. Google
withholds rare queries, so it only sees the queries Search Console reports.
Metro view
The dropdown on a state card narrows the chart to one metro area. Fire diamonds narrow too: only fires that started
inside the metro's counties in that state. Site traffic counts only visitors whose GeoIP location is within 50 miles
of the metro's biggest city (still viewing that state's pages), and search interest is fetched for the metro's own
Google Trends market (Nielsen DMA, e.g. geo US-OR-820 for Portland). A state's dropdown lists every DMA Google files
under that state. Cross-border markets (Denver appears under Nebraska and Wyoming too) use that state's keywords,
capturing spillover audiences.
Search Console
Impressions, clicks, CTR and average position come from the Google Search Console API for the
https://fires.cornea.is/ property (web search; image, video and news are under 1% of web), synced daily on the
maintainer's machine. The last 7 days are re-fetched every run, so Google's revisions and missed days are picked up.
State series use page-level totals, which are complete. Google withholds rare queries whenever query text is
requested (about half of impressions here), so query-based views (metro slices and Top search opportunities) cover
only the queries Google discloses. CTR is recomputed from summed clicks and impressions; average position is
impression-weighted (1 = the top result). Data lags about two days.
Top search opportunities
Queries from the last 14 complete Search Console days, grouped by the page they land on (brand and homepage
searches excluded). Extra clicks per week (potential clicks) = for each page, the clicks its queries would have
earned at this site's usual click-through rate for their position (for queries below page 1, at position 5), minus the
clicks they actually got. Shown per week; pages under 3 a week are left out. The usual click-through rate by position
is fitted from this site's last 28 days. Queries that drew thousands of impressions but never a single click, where
real searchers would have produced 10 or more, are treated as automated traffic and excluded. Page impressions and
their trend are the page's complete Search Console totals.
Metros surging now
For each metro, the term whose average this week is highest relative to last week, counting only terms averaging at
least 5 on the metro's own 0–100 index. A metro is shown when this week is 1.5× last week or more (each market listed
once). Both weeks come from the most recent stretch that Google Trends reports consistently. Capturing = our
visitors from that metro this week averaged at least 1.5× last week's.
Fire milestones
Orange diamonds straddling the baseline mark wildfire start dates in that state, sourced from the fire API
(fire-api-dev.web.app): wildfires only (prescribed burns excluded), >100 acres final size, started within the
window. A small number above a diamond counts multiple starts that day; hover the chart to see fire names, acreage,
and nearby population. A diamond's center sits on the fire's start date. Start date = the fire's created-on date
(UTC).
Impactful fires
A fire is impactful when at least P people live within R miles of its start point. Both are set with the sliders
under Settings (default 2k within 5 mi). Distance is measured from the fire's approximate edge: R plus the fire's own
radius if its final acreage were a circle (√(acres⁄640π) miles, which adds ~7 mi for a 100k-acre fire and ~0 for a
100-acre fire). Population = 2020 Census block-group centroids (national file, so state borders don't clip counts).
Solid diamond = impactful at the current thresholds, hollow = not; a day with several fires shows solid if any
qualifies. Block-group resolution makes counts step-shaped under ~2 miles, so the radius slider starts at 2 mi.
Caveats
- Site traffic is indexed to its own peak. Compare timing and shape against search, not absolute level.
- Abbreviation terms can be ambiguous to Google ("fire or", "fire co", "fire id" catch unrelated queries), which
inflates their baselines.
- A keyword line flat at zero means search volume stayed below Google's reporting threshold all window. That is not
missing data (state-restricted volumes are smaller, so this happens more often in in-state mode).
- The final day of the window is partial in Google's data.