WFE SEO Dashboard

State by state

Search demand, Google visibility and our traffic in each state over the chosen dates. Pick a metro on a card to zoom in.
How to read these charts
Methodology and data sources

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.