Insights
Twelve neighborhood guides and one valuation form

A ZIP-code market report and a neighborhood guide fail in opposite directions. The report is accurate, updates itself, and reads like every other report ever written for that ZIP code. The guide is unrepeatable and starts going stale the day it goes up. Grace Tarnasky's site carries thirteen of the first and twelve of the second, and a five-digit number is the only thing joining them. I wrote up the week the site was built in August, and the finished thing is a case study. This is about the layer underneath both.
She messaged me on a Thursday. The site was standing on a staging domain by Saturday, and on 9 August production was code-and-data identical to staging and launch-ready behind a construction gate. It went public on 19 August, on her word. Built and launch-ready inside the week; the public switch waited for her, not for the work.
What are the two page types for?
One answers a price question. The other answers a living question.
/market/97058 exists because somebody types "97058 home values" into a search box at eleven at night. It carries eight stat tiles, a five-year trend chart, a plain-language read of what those numbers mean, and a set of questions and answers. Nobody edits it. It refreshes when the data does.
/neighborhoods/cherry-heights exists because somebody wants to know whether the acreage up Cherry Heights and Mill Creek Road comes with water they can rely on. It carries Grace's answers about wells, septic, access and easements, about what the county actually permits as opposed to what a listing implies, and about the parts of Wasco County that sit inside the Columbia River Gorge National Scenic Area, where what you build and where you put it can go through a review that has nothing to do with a standard county permit. It changes when she has something new to say.
Each page type covers the other's weakness. Numbers alone are a commodity: the same ZHVI value is available to every agent in the county and to Zillow itself. Editorial alone ages out, because a guide written in August still says August in March. Put them on the same domain and cross-link them and the visitor gets the price and the place in two clicks, which is the actual question they arrived with.
Where is the join?
In one field of one JSON blob.
A guide is not a special table and not a special template engine. It is a row in pages whose slug begins neighborhoods/, whose meta.kind is neighborhood, and whose meta.zip is five digits. That ZIP is the whole wiring. It pulls the live stats onto the guide, it pulls the guide's teaser onto the market report, it decides which listings show up on both, and it feeds the data-backed half of the questions and answers.
foreach (Neighborhoods::published() as $p) {
$meta = json_decode($p['meta'] ?? 'null', true) ?: [];
if (preg_replace('/\D/', '', (string) ($meta['zip'] ?? '')) !== $zip) continue;
$out[] = $p;
}
Every surface reads Neighborhoods::published(), which is why publishing is the only switch. A draft guide is invisible on the hub, invisible as a teaser on its market report, invisible in the index, invisible in the sitemap. There is no second place to remember, and no way to half-launch one.
Where do the numbers come from, and how old are they?
Two feeds, running on two different clocks.
The value comes from the Zillow Home Value Index. Zillow's own ZHVI user guide defines it as narrowly as this:
The Zillow Home Value Index or ZHVI is a smoothed, seasonally adjusted measure of the typical home value and market changes across a given region and housing type. It reflects the typical value for homes in the 35th to 65th percentile range.
That is a middle-of-the-market index, not an appraisal and not a comp, which is exactly why the tile that carries it is labeled "Typical home value (Zillow)" and not "your home's value". The public wide CSV has always shipped every month back to 2000; the importer used to keep only the newest column and now keeps sixty, which is what makes a five-year chart possible without a chart library. On 4 September 2026 the 97058 page reported a typical value of $395,056 for July 2026, up 2.6% year over year and 14.5% over five years, tracing from $345,095 in August 2021.
The sales half comes from Redfin's data center, imported by hand rather than on a cron. It lags. On the same day, the same page showed a median sale price of $399,250, a median 31 days on market, $248 per square foot, 47 homes on the market, 62 sold in the most recent month, sellers getting about 98.4% of asking and 23% of sales closing above list, all from sales data through May 2026 while the Zillow value was current to July.
Those two vintages print separately because they once printed together, and the correction was less finished than I thought. The header band was fixed in August; the questions and answers under it, and the data band on the guides, were not, so Redfin's sentences went on carrying the Zillow month, in the prose and in the FAQPage schema underneath it, which is a false claim about provenance dressed as a formatting shortcut. I found it on 4 September, reading the page to check the figures for this post, and the fix went out the same day: each source now states its own period, and the two collapse into one phrase only when they genuinely match. The guard is small and worth reading, because the bug it prevents is worse than the one it fixed:
/* an empty period must yield NOTHING, not today: strtotime('-01') is truthy
and would have printed the current month as if it were the data's vintage */
Both tables live in their own database, separate from the one holding pages and the one holding leads. A monthly market refresh cannot reach a page, a listing or a lead, no matter how badly it goes.
What keeps a set of ZIP pages from being a doorway?
Restraint about coverage, and silence where there is nothing to say.
Google's spam policies name the failure directly. From Search Central, updated 28 August 2026:
Scaled content abuse is when many pages are generated for the primary purpose of manipulating search rankings and not helping users.
Coverage on this site is a setting, not a crawl. Thirteen ZIPs, chosen because they are the ones she works and the ones her market actually spans, both banks of the river included. It would have been trivial to generate every ZIP in two states, and every one of those pages would have been the same template with a different number in it.
The harder half is what a page does when the data runs out. Four of the thirteen ZIPs have no Redfin sale statistics at all, because too few homes change hands there in a month for Redfin to publish. Those pages show the Zillow value and its history, and then say so in plain words rather than filling the hole. The function that writes the buyer-or-seller verdict refuses to run without sales rows, and the comment above it is the rule:
/** Rule-based, data-specific verdict copy - unique per page, no boilerplate.
* Returns '' where there is no Redfin sales data to reason from: every
* sentence below is built out of sales figures, and a verdict invented
* without them would be the one thing these pages must never do. */
The failure mode of a scaled page set is not thin content. Thin content is embarrassing. Confident content, a market verdict generated for a ZIP with two sales in it, is the one that gets somebody's price wrong. If you are building this pattern, the empty state is the part to write first, because it is the part you will be tempted to fill.
What can a neighborhood guide not say?
It cannot rank a school, discuss crime, or characterize the people who live somewhere.
Six of the twelve guides are street-level inside The Dalles, and they were written from Grace's own pocket guide, the notes she uses with buyers. Two lines in those notes did not travel to the website. One named a best elementary school. One described certain pockets of town as harder. Neither is improper in a private note between an agent and her client. A published page is a different instrument, and the Fair Housing Act is explicit about which one it is regulating. From 42 U.S.C. 3604(c), it is unlawful:
To make, print, or publish, or cause to be made, printed, or published any notice, statement, or advertisement, with respect to the sale or rental of a dwelling that indicates any preference, limitation, or discrimination based on race, color, religion, sex, handicap, familial status, or national origin, or an intention to make any such preference, limitation, or discrimination.
So the guides publish which district serves an area, because that is a fact, and they name the private school that sits on Cherry Heights, because that is also a fact. They do not rank schools, compare them, or reach for the adjectives that do the ranking for you. Nothing about crime appears. Nothing characterizes residents. Where a buyer wants a judgment call, the copy hands them to Grace, to the school district, and to a third-party ratings site instead of asserting one on her behalf.
The generalizable version: the fair-housing exposure in a page set like this is almost never in the market data. It is in the adjectives, and bulk-drafted copy is where adjectives arrive unsupervised.
Is a guide the same offer as a market report?
No, and the difference is a licensing question rather than an editorial one.
Her coverage spans the Columbia, which means Washington ZIPs. When I built those pages I believed she was licensed in Oregon only, and I went looking for the problem in the wrong place. The data was never the risk: publishing a home-value index for Bingen is publishing a number, and numbers are not an offer of service. The risk was at the bottom of the page, where every ZIP report ended by inviting the reader to find out what their home was worth. That call to action is an offer to represent somebody in a transaction, and it was appearing in a state where, as I understood it that day, she could not.
She holds both licenses, so that particular constraint lifted, and both numbers are in her footer now. The rule survived the correction anyway: on any multi-state coverage, audit the call to action, not just the copy. A market report reads as information. A guide, and any button under it, reads as an offer.
What happens after someone submits the valuation form?
One row, one notification, one confirmation, and no estimate.
The message box asks for at least ten words and the form will not submit without them, which is the cheapest quality filter I know: it costs a serious seller a sentence and it costs a scraped-form spammer a rewrite. There is a CSRF token on the post, and a Cloudflare Turnstile widget that has to pass before a row is written.
Turnstile being the only bot gate is a deliberate correction. The engine used to carry a hidden honeypot field as a hard block: a form input invisible to humans, so anything filling it was a bot. Browser autofill fills hidden fields. Real people were being silently dropped, and I found it because my own test submissions went missing. The gate came out on 5 August. The honeypot is still there and still watched, but it no longer decides anything:
/* honeypot retired as a hard gate (2026-08-05): browser autofill fills
hidden fields for real humans, which silently ate their leads - Eric's
own test submissions vanished this way. Turnstile below is the actual
bot check. A filled legacy field (cached pages) is logged as a signal
only; the submission proceeds. */
A spam control that fails closed on a real person costs more than the spam it catches, and it costs it invisibly, which is the part that makes it dangerous. There is no bounce, no error, no queue to inspect. The lead simply never existed. Any gate in front of a contact form should be reviewed by asking what it does when it is wrong about a human, not by asking how much spam it stopped.
What this post does not measure
No rankings, no traffic, no Search Console. I have none of those figures in front of me, and an implied result is still a result, so there is no chart at the end of this. What I can show is what is on the pages, how they are joined, and where the guardrails are. Whether it earns a position is separate work with its own evidence, which is the argument in making an SEO agent show its receipts, and the answer-engine half is its own question again.
What is still missing
There are no Washington guides. The market reports for the Washington ZIPs have values, histories and, in four cases, an honest note saying the sales data does not exist, but nobody has written what it is like to live in those towns, and I am not the person who can. The twelve that exist say "updated July 2026" under the breadcrumb because that is the vintage of the data on them, not the age of the prose, and the two ages will keep drifting apart until somebody writes.
The dashboard is hers, the guide editor is hers, and the rule I hold myself to on every client build is that if a client can see it on their page they must be able to change it without me. The next guide is a text box and a save button away. It just has to come from somebody who has driven those roads, which was always the point of writing them this way.
Common questions
What is the difference between a market page and a neighborhood guide?
A market page answers a price question and refreshes itself from housing data. A neighborhood guide answers a living question in the agent's own words and only changes when she has something new to say. Running both, joined by a ZIP code, covers the weakness in each: data alone is a commodity, and editorial alone goes stale.
How many neighborhood guides does a small agent site need?
Fewer than you can generate. Grace Tarnasky's site covers thirteen ZIP codes and carries twelve guides, chosen because they are the places she actually works. A page set generated for every ZIP in the state is the shape Google names as scaled content abuse, and the guide is the part that cannot be copied.
Can a real estate neighborhood guide talk about schools?
It can publish which school district serves an area, because that is a fact. Ranking schools, comparing them, discussing crime, or characterizing the people who live somewhere are steering, and the Fair Housing Act reaches published statements about the sale of a dwelling. Send the judgment call to the agent and to the district instead.
How current is the housing data on a ZIP market page?
Two feeds on two clocks. The Zillow Home Value Index lands within weeks; the Redfin sale statistics lag it by a month or two, and thin ZIP codes are not published at all. Each source has to state its own period on the page. Printing one month for both sources is a false claim about the data's vintage.
What happens after somebody submits a home valuation form?
On this site: a Turnstile check, then one row in the leads table, a notification to the agent, and an instant confirmation to the sender. No automatic estimate. A number generated from area medians is frequently wrong for a specific house, and the sender remembers the number rather than the disclaimer.
Related