How ten sites and a daily rank check turned a luxury real estate portfolio into something measurable
Douglas Newby sells the architecturally significant homes of Dallas: estate properties in Preston Hollow and Highland Park, mid century houses by named architects, and the occasional landmark that only trades once a generation. The buyers searching for those homes do not use one vocabulary. Some search a street address, some search an architect, some search a neighborhood they are still deciding about.
We build and run the search side of that business: a portfolio of Next.js sites, one for each way people look, plus the measurement to know whether any of it is working.
Ten sites, one brand
Most of this business runs on a single site. The rest runs on nine more, each built around a subject people actually search for rather than a section of a brochure. A neighborhood someone is researching, a period of architecture they like, a single estate with a name of its own.
The reason to split them up is that search intent splits. Someone typing a neighborhood name is at a different point than someone typing a street address, and a page that tries to serve both usually serves neither. Each property gets to be the most specific answer to one kind of question.
The reason it works is that they are run as one system. Shared components, one deployment pipeline, one analytics account, and one place where every domain is tracked together. Adding a site is a configuration change, not a new project.
- Ten domains, each built on Next.js and deployed as static output
- One portfolio-wide view of search performance rather than ten separate dashboards
- Pages built around addresses, architects, neighborhoods, and architectural periods
What the search data actually says
Over a recent 28 day window the ten sites drew 228,180 impressions from Google between them. The largest single group was not a neighborhood or a service page. It was one street address, searched 22,882 times in a month by people who had seen the house and wanted to know about it.
That is the kind of thing you only find by looking. It changed what we build: address pages are not an afterthought on this portfolio, they are a primary page type, because that is how a meaningful share of the audience actually searches.
- Search impressions in 28 days, portfolio wide
- 0
- Domains tracked as one portfolio
- 0
- Keywords checked every day
- 0
Measurement we had to build
Google Search Console reports an average position over a window, only for queries that already earned impressions, and it lags a few days. That is useful for finding out what happened. It is not enough to answer where a keyword sat yesterday, or which of ten domains is carrying a given term.
So we built the missing piece: a scheduled job on Cloudflare Workers that checks true daily position for a curated keyword list and writes the history to a SQL database at the edge. It runs every morning before anyone is awake and costs a few cents a day.
- 107 keywords checked daily, deep enough to see a term sitting at position 30 rather than reporting it as absent
- Every domain in the portfolio scored against every keyword, so when two properties rank for the same term both are recorded
- A keyword nobody ranks for is stored as a real observation rather than a gap, which is what makes the trend line honest
- Results arrive by callback as each check finishes, with a scheduled second pass that collects anything the callback missed
The first full run recorded 92 positions across 57 keywords. Of the queries where the portfolio appeared at all, 43 sat in the top three.
Knowing where you stand, not just where you are
A position is not worth much on its own. Sitting at six looks fine until you learn a national brokerage holds one for the same term, and it looks very different again when you are the one at one.
The tracker scores the large national and regional brokerages on every keyword alongside the portfolio. This costs nothing extra: the search result has already been retrieved, so reading three more domains out of it is free. Price is driven by how many keywords you check and how deep, never by how many sites you compare.
The first competitive run put the portfolio ahead on 74 keywords and behind on 18. More usefully, it found 27 terms where a competitor ranks and the portfolio does not appear at all. That list is the work queue. It is a far better brief than a ranking report, because every line on it is a specific page that does not exist yet.
One morning of results
This is every keyword the tracker checked on one morning, not a selection. Each row is a keyword, each dot is where a domain sat in Google that day. The portfolio appears somewhere in the first thirty results for 92 of the 107. On 14 more a competitor ranks and it does not, and on the last 1 nobody does.
Where each brokerage ranked
All 107 keywords, captured 2026-09-03. Sorted by where the portfolio ranked. Hover any dot for its exact position.
The bottom of the list is the useful part. Losing a broad neighborhood term while winning every buying-intent version of the same phrase is a specific, fixable problem, and it is the sort of thing an average position across a month would hide completely.
What moved, day by day
A position on its own is a snapshot. The reason to check every morning is the second derivative: not where a keyword sits, but which direction it is going and how fast. Each cell below is coloured by the change from the day before, or, in a period view, by the change since the start of that period.
These are grouped by property rather than pooled, because the portfolio is the point. A keyword appears under every site that ranks for it, so where three properties hold three different positions for one query you can see all three. A keyword a given site does not rank for is left out of that site entirely rather than shown as an empty row.
Daily position by keyword
7 days tracked through 2026-09-03. Grouped by property. All days shows a week at a time; a period view compares its first day with the newest.
Most rows are flat, which is the honest and unglamorous truth of search: established rankings hold. The value is in the handful that are not, because a keyword sliding four positions in three days is a problem worth looking at while it is still small.

