You did every single thing on the week-one list, and then you went and doubled the site. Three weeks ago you had 4 metros and 2,747 venues, and your city pages were basically blank to Google. Today you have 11 metros, 6,101 venues, real server-rendered content, list schema, FAQ schema, guides, analytics, and an llms.txt. Google has indexed you and you are already ranking for 942 keywords. That's a genuinely fast start.
Here's the interesting part, and it's the whole point of this note: every one of those rankings is a venue page. None of them are your city pages. You're winning "tocko frisco" and losing "happy hour denver." That's not a content problem anymore. You fixed the content. It's a trust problem, and it has a specific, boring, very fixable cause.
One honest caveat up front: you haven't sent me Search Console access, so none of these numbers are your real traffic. Everything here is third-party estimated data (DataForSEO, same source as week one), which is good at "what position does this URL hold" and only a rough guess at visits. Your Umami dashboard and Search Console know the truth. If you send me either one, I'll redo this section with your actual numbers, and they'll be better than my estimates.
I checked all of this against your live HTML this morning rather than taking your word for it, because that's more fun. Every item from week one is done.
/denver/ now ships an H1, a real intro paragraph, a neighborhood breakdown with counts, a venue list, and a guides block, all in the raw HTML before any JavaScript runs. Went from roughly 70 characters of text to about 2,600.sitemap-index.xml is serving 6,127 URLs and robots.txt points at it correctly. Google has evidently worked through a lot of it.This is the shape of a site Google has found, indexed, and not yet decided to trust. 942 keywords is a real footprint for three weeks old. But look at where they sit.
Read it like this. The 35 keywords in positions 4 to 10 are your only real traffic today. The 197 sitting in 11 to 20 are page two: fully indexed, judged relevant, ranked just below the fold. Those are worth almost nothing right now and would be worth a lot at position 8. That band is the cheapest win on the whole site and it's section 07. Everything from 21 down is Google saying "I can see this page and I don't yet have a reason to prefer it."
Source: DataForSEO ranked-keywords and domain rank overview for hourhound.app, US, pulled 31 July 2026. "Estimated organic visits" is a modeled figure derived from position and search volume, not measured traffic.
I pulled your top 40 rankings and sorted them. The result is so consistent it's almost funny. Here are the ones where you sit highest.
| Position | Keyword | Monthly searches | Page type |
|---|---|---|---|
| 5 | t-michaels happy hour | 70 | Venue page |
| 6 | cafe dufrain | 110 | Venue page |
| 6 | postino lohi happy hour | 70 | Venue page |
| 7 | los dos potrillos happy hour | 140 | Venue page |
| 8 | big city tavern happy hour | 90 | Venue page |
| 9 | babbo italian eatery arrowhead | 170 | Venue page |
| 10 | happy hour thornton | 90 | Neighborhood page |
| 18 | louisville co happy hour | 140 | Neighborhood page |
Out of the 40 keywords where you rank highest, 39 are venue pages. One is a neighborhood page. Zero are city pages. Same story in the 11 to 20 band: 44 of 45 are venue pages. Your city hubs, the pages you just spent three weeks fixing, are not ranking for their own city term at all.
Which matters, because the city terms are where the money is. This is the head-term demand across the 11 metros you now cover:
DataForSEO Google Ads search-volume API, US, pulled 31 July 2026. Palm Beach is not shown because the tool returned no clean figure for it. These are head terms only and exclude "best happy hour [city]", "[city] happy hour", and the whole "near me" family, so the real addressable number is larger.
This is the actual answer, and I want to give you the number rather than the theory, because the number is the encouraging part.
A backlink is just another website linking to yours. Google treats each one as a small vote that you're a real thing worth showing people. It's the main way it decides between two pages that both look relevant, which is exactly the situation your city pages are in. Your venue pages rank because nobody else is competing for "tocko frisco". Your city pages don't rank because ten other sites want "happy hour denver" and all of them have votes and you have none.
So: a site with 200 happy hours and 59 links outranks a site with 1,627 happy hours and no links. You have eight times the data of the site sitting at position 4. What you don't have is anyone vouching for you. That's the entire gap, and 59 is a small, human, reachable number. This isn't a "spend two years building authority" situation. It's a few dozen good links.
The other thing worth noticing in that list: a blog post from January 2023 is still on page one. That's Google saying it doesn't have a better option. It does now, it just doesn't know yet.
SERP pulled live for Denver, Colorado on 31 July 2026. Backlink counts from the DataForSEO backlinks index, same date. Local pack results (the three map pins above the blue links) are excluded because those are individual bars and a directory can't rank there.
You added an llms.txt, so let's check whether it's doing anything yet. I pulled real ChatGPT conversations where people asked about Denver happy hours, and looked at which sites it cited back.
So the good news and the bad news are the same fact. You're not being cited, and the reason isn't your content, it's that these models mostly cite pages that already rank. The llms.txt isn't wasted, it just isn't a shortcut. Fix the ranking problem in section 05 and the citations follow, because your venue pages are already better than the ones getting quoted. Regenerate that stale llms.txt while you're at it.
Source: DataForSEO LLM mentions index, real ChatGPT responses, US, sampled 31 July 2026. Query volumes here are small (roughly 70 a month for the brewery question), so treat this as a directional read on how you're perceived, not a traffic channel yet.
Two of these are small code changes you'll enjoy, one is the unglamorous one that actually decides whether this works. I've put the code ones first because they're quick and they make the third one land better.
/denver/, the one server-rendered list of venues, the one Google reads and the one your ItemList schema mirrors, currently opens with "@ Cheers", "/pôr/ wine house", "12 Spirits Tavern", "24 Carrot Bistro". It's the first 24 venues by ASCII sort. You're telling Google "here are Denver's featured happy hours" and leading with punctuation. Rank that list by something real, and show more of them: 24 out of 1,627 is a thin sample for your most important page.
"On my Astro city pages the 'Featured spots' list and the matching ItemList JSON-LD are sorted alphabetically, so they start with punctuation-prefixed venue names. Rank them instead by a quality score (deal strength, number of days with specials, whether the venue has a late-night or all-day deal), take the top 50, and make sure the visible list and the ItemList schema use the same order. Keep the neighborhood links as they are."
props attribute on the astro-island for the React map, holding all 1,627 venues serialized as escaped JSON, and it sits above your H1 in the source. Every phone that loads Denver downloads the entire dataset as page markup before it reaches your actual content. It's gzipped in transit so it's not a disaster, but it's slow to parse on a phone, and page speed is a ranking factor. Fetch the venue data as JSON after load instead, and move the island below your content.
"My Astro city pages pass the entire venue dataset (1,600+ records) into a client-only React island via the props attribute, which makes /denver/ a 468KB HTML page where 451KB is one escaped-JSON attribute above the H1. Change it so the island receives only a small config object, and fetches the full venue list from a static /data/{city}.json file generated at build time. Move the island below the server-rendered content in the DOM. Keep the map's behavior identical."
/reports/ page. Turn it into a proper annual piece: cheapest happy hour city, which metro runs the latest, average deal window, how Denver compares to Chicago. Local news and city blogs link to that kind of thing because it's a number they can quote and nobody else has the data. This is the single best use of your dataset for links."Build me a venue outreach script. From my venue dataset, pull every venue that has a website URL, and generate a personalized email per venue: their name, their HourHound page URL, their current listed happy-hour times, and a one-line offer of a free 'Featured on HourHound' badge with an embed snippet. Output as a CSV I can review before anything sends, batched 100 at a time, and log which ones I've already contacted."
"Add reciprocal internal links between my guide pages and venue pages: each guide page lists every venue it covers with a link, and each venue page shows a 'also in' row linking to every guide and neighborhood page it qualifies for. Generate it from the venue data at build time so it stays in sync."
cache-control: no-cache on fully static pages, so returning visitors re-download everything. Set a long cache lifetime on your hashed assets and a short one on HTML. Putting Cloudflare in front (still free, still the tip from week one) does most of this for you.
"Generate llms.txt at build time from my actual venue and metro counts so it can't go stale. Then update my nginx config to send long cache-control max-age with immutable for hashed assets in /_astro/, and a short max-age for HTML, replacing the current blanket no-cache."
Week one I said the per-city newsletter and the data license were your asymmetric bets, because neither depends on traffic you don't have. That's even more true now, since we've established your traffic is three weeks from arriving rather than here. Here's what I'd actually do.
One email, one city, once a week, generated from data you already have. You are uniquely positioned for this because you're the only person in the market who can send it automatically. Everyone else is hand-writing a listicle. You have a database and a build pipeline.
And it makes the SEO work compound instead of leak. Right now every visitor Google eventually sends you arrives, gets their answer, and vanishes. A newsletter is how you keep them.
Your position hasn't really changed since week one, it's just better capitalized: you own a genuinely hard-to-rebuild dataset, and the market still hasn't priced it because nobody's linking to you yet. The link work in section 07 is the catalyst, and it's the only thing on this page that is. The newsletter is the position you build while you wait for it, at close to zero cost. The data license is still sitting there unexercised, and honestly, at 6,101 verified venues across 11 metros it's a more sellable asset this month than it was three weeks ago. Featured listings become real the moment a bar can see traffic from you, which the links turn on. Ads stay last.
Everything above is external estimates. Two things would make the next one much sharper, and both take you about a minute:
In Search Console, go to Settings, then Users and permissions, then Add user, and add my email with Full or Restricted access. Then I can see what you actually rank for, what's indexed versus discovered-not-indexed, your real impressions and clicks, and which queries are showing you in position 11 to 20 where a nudge pays. Estimated data can't tell me any of that.
If sharing access is a hassle, the Performance report for the last 28 days and the Pages report (indexed versus not indexed) as images get me 80% of the way. Same for your Umami dashboard. WhatsApp is fine.
Honestly, Ben, you shipped more in three weeks than most people I look at ship in six months, and you built the guides thing on your own initiative, which is the part I'd have been most pleased about if I were you. The zero-backlinks finding sounds like bad news and isn't: it means nothing is wrong with what you built, you just haven't told anyone about it yet. The venue outreach is the move. You already have 6,101 businesses who each have a page about themselves on your site, which is the easiest link ask that exists.
Come find me on WhatsApp when you've got Search Console open and we'll look at the real numbers together.
, Annette 🐾