from Annette week two,
three weeks after the first look
Ben, you shipped all of it. Here's what happened.

Google found you. Now here's the one thing standing between you and page one.

Your site: hourhound.app I looked again: 31 July 2026 Since week one: 3 weeks What you built: 11 metros, 6,101 venues
01

The quick version

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.

Week-one fixes
All shipped
Content, ItemList, FAQ, sitemap, analytics, llms.txt. Plus 7 new metros.
Keywords ranking
942
From zero. Google has clearly crawled deep into the site.
In the top 3
0
And zero city pages ranking at all. That gap is section 04.

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.

02

Receipts: what you shipped

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.

City pages now have real server-rendered content
Fix number one, the big one. /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.
ItemList and CollectionPage schema on city pages
Present and valid, with BreadcrumbList alongside it. Machines can now tell your city pages are ranked local lists.
FAQPage schema, with visible matching answers
Three questions per city, answered with real numbers pulled from your own data ("1,373 venues with a classic happy hour", "298 spots run deals at 10pm or later"). That specificity is exactly what gets quoted by AI answers. Nicely done.
Sitemap live and clearly crawled
sitemap-index.xml is serving 6,127 URLs and robots.txt points at it correctly. Google has evidently worked through a lot of it.
Analytics running
Self-hosted Umami on your own subdomain. Cookieless, no consent banner, no third party getting your visitor data. Better call than the three options I gave you.
llms.txt, which I told you to skip
You added it anyway and I'm glad you did. It's genuinely well written, with explicit "free to cite with attribution" licensing. One thing: it says 5 metros and 3,100 venues, and you're now at 11 and 6,101. Worth regenerating from your build data so it never goes stale again.
Seven new metros, and 17 guide pages per city
Chicago, Houston, Miami, Orlando, Fort Lauderdale, Naples and Palm Beach. That covered all three Florida cities I'd flagged as the obvious next build, so that section of this note got deleted. You also invented something I didn't suggest: per-city guides like "Late-Night Happy Hours in Denver" and "Sushi Happy Hours in Denver". Those are good pages and I come back to them in section 07.
03

Did it work? Yes, at the bottom of the page

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."

Estimated organic visits
~287/mo
Third-party estimate across all 942 keywords. Your Umami numbers are the real ones.
Best keyword you hold
#5
"t-michaels happy hour", 70 searches a month. A venue page, naturally.
Highest-volume keyword
210/mo
And you sit at position 25 for it. Nothing you rank for is big yet.

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.

04

The pattern: you're winning bars and losing cities

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.

PositionKeywordMonthly searchesPage type
5t-michaels happy hour70Venue page
6cafe dufrain110Venue page
6postino lohi happy hour70Venue page
7los dos potrillos happy hour140Venue page
8big city tavern happy hour90Venue page
9babbo italian eatery arrowhead170Venue page
10happy hour thornton90Neighborhood page
18louisville co happy hour140Neighborhood 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:

30,880
Monthly searches you're built for and not getting
The 10 head terms above, added up. LOW competition  You currently capture an estimated 287 visits a month, from long-tail venue queries. The city terms are contributing roughly nothing.

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.

05

Why: you have zero backlinks, and your competitor has 59

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.

Who actually rankshappy hour denver

  1. reddit.com, an r/denverfood thread
  2. do303.com, a local events site
  3. denver.eater.com, an editorial list
  4. GoldenBuzz Social, a happy-hour directory
  5. coloradobites.com, a local blog list
  6. workfromdenver.com, a blog post from January 2023
  7. vesperdenver.com, a single bar's own site
  8. The Drink Nation, a happy-hour directory
  9. yelp.com

The gap, in one numberreferring domains

  • GoldenBuzz Social: ranks 4th. Advertises "over 200 happy hours". Has 59 referring domains.
  • The Drink Nation: ranks 8th, with 1,697 referring domains. Note it ranks below GoldenBuzz despite 28x the links, which tells you this is winnable without a huge number.
  • HourHound: not ranking. 1,627 Denver venues. Zero referring domains.

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.

06

The AI side: who ChatGPT quotes about Denver happy hours

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.

Sites ChatGPT cited"best brewery happy hours in denver?"

  • milehighhappyhour.com, cited most often
  • thehappyhourfinder.com, cited repeatedly
  • 303happenings.com
  • appyhourmobile.com
  • happyhoursdenver.com
  • ondenver.com, happyhourschedule.com, eatdrinkdeals.com
  • hourhound.app: not cited once

What it cited them forthe page type that wins

  • Almost every citation was a single-venue page, not a city list. Things like "Rock Bottom Brewery Happy Hour Specials, Central Downtown Denver".
  • That is exactly your page type, and yours are better: you have verified times, prices and live status where several of those sites have a stale paragraph.
  • The AI is looking for one clean fact per venue and citing whoever states it plainly. You already write that way.

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.

07

The next build, in the order I'd do it

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.

Do first
Your "Featured spots" list is sorted alphabetically, and it shows
On /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.
In Claude Code

"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."

Do
96% of your Denver page is one giant invisible attribute
The page is 468KB. About 451KB of that is a single 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.
In Claude Code

"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."

Do, this is the one that matters
Go get 20 to 40 links, by hand, over the next two months
Nothing else on this page moves you to position 4 for "happy hour denver". This does. You don't need an agency or a budget, you need about an hour a week of a semi-retired trader's time. Four things that actually work for a directory like yours, roughly in order of effort:
  • Give the venues a reason to link to you. You have 6,101 bars, each with a page about their own happy hour. Email a batch of them: "here's your HourHound page, it's live and free, here's a badge if you want to link it from your site." A small percentage will. That percentage is your whole link problem solved, and it's the one channel that scales with the asset you already built.
  • Publish the Happy Hour Index as a real report. You already have a /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.
  • Get listed where directories get listed. Local subreddits when someone asks (genuinely, not spam), city blogs, "best Denver apps" roundups, tourism and neighborhood association sites. Slow but real.
  • Reddit is ranking first for your main term. Read that thread. Be useful in it. Don't drop a link on day one.
In Claude Code

"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."

Cheap win
Push the 197 page-two keywords over the line
You have 197 keywords sitting at positions 11 to 20, nearly all venue pages, plus 250 more at 21 to 30. These are already relevant enough to index and just short on signal. Links from section 05 lift them all at once, and internal linking helps too: your guide pages ("Late-Night Happy Hours in Denver", "Sushi Happy Hours in Denver") are perfect for this, because every guide can link to the 30 venue pages it covers and every venue page can link back to the guides it belongs to. Free, and it's the kind of graph problem you'll enjoy.
In Claude Code

"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."

Two-minute fixes
Stale llms.txt, and no caching headers
Your llms.txt says 5 metros and 3,100 venues; you're at 11 and 6,101. Generate it from build data. Separately, nginx is sending 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.
In Claude Code

"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."

Still true, and worth saying again
  • 6,127 URLs statically rendered, indexed, and ranking inside three weeks
  • Your FAQ answers cite real counts from your own data, which is the good way to do it
  • Venue pages carry proper schema, real times, real prices, and a verified stamp
  • The guides are a genuinely smart addition nobody told you to build
  • Self-hosted analytics, so your visitor data stays yours
08

The first revenue step: start the newsletter now

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.

The build

"The best happy hours in Denver this week"

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.

  1. Put a signup box on every city and neighborhood page. One field, email only. "Denver happy hours, best of the week, every Thursday." Do this first, today. Every visitor you don't capture is gone.
  2. Generate the issue from your data, don't write it. Pick the week's best deals by whatever score you build in section 07, group by neighborhood, add the two or three newest venues you verified this week. That last part is your unfair advantage: nobody else can say "6 new spots added in Denver this week" with a straight face.
  3. Send it with something cheap and boring. Resend or Buttondown, both fine at your volume, both drivable from a script. This is a cron job, not a marketing job.
  4. The revenue arrives later, and it's obvious when it does. Once a city list has a few hundred real local subscribers, one sponsored slot per issue sells itself to a bar, because you're delivering people who have literally opted in to being told where to drink this week. That's a better ad product than your page views will be for a long time.

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.

If I were playing this like a trade, still

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.

09

If you want me to check the real numbers

Everything above is external estimates. Two things would make the next one much sharper, and both take you about a minute:

1

Add me to Search Console

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.

2

Or just screenshot two things

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 🐾