[object Object]

← back to Ventura Claw Leads

yolo tick 17: per-vertical SEO landing pages + home FAQ section

8634cfdd9f1845cab497b6d187be8cabd8ca2294 · 2026-05-06 21:04:31 -0700 · Steve Abrams

PER-VERTICAL TITLE / H1 / META
- routes/public.js GET /find: when ?vertical= or ?city= is set (or both),
  build a custom <title>, meta description, and H1 specific to that filter.
  Eight vertical-keyed landing pages now distinguish themselves to Google
  ('Food & drink on Ventura Blvd' vs 'Beauty in Sherman Oaks on Ventura
  Blvd' vs the generic 'Find a business — Ventura Claw'). Long-tail SEO
  for every (vertical × neighborhood) combination — already in sitemap.xml
  from tick 4, just now actually distinct content.
- views/public/find.ejs: H1 swapped to <%= customH1 %>, route picks the right
  string. Fallback for the unfiltered case = 'Search Ventura Blvd'.

HOME FAQ
- views/public/home.ejs: 5-question FAQ section between featured grid and
  category browser, addresses the questions visitors actually have:
    · How does this differ from Yelp/Google Maps?
    · Why aren't doctors, lawyers, or contractors listed?
    · How do leads get to the business?
    · How much does it cost — for me, for the business?
    · I own a business on Ventura Blvd. How do I claim my listing?
- public/css/public.css: <details>/<summary> styling — brass + rotation
  on the indicator, max-width on the answer copy, semantic markup so the
  FAQ is searchable + accessible (collapse/expand via keyboard).

Verified live: /find?vertical=food → 'Food & drink on Ventura Blvd' title
+ H1; /find?vertical=beauty&city=Sherman+Oaks → 'Beauty in Sherman Oaks on
Ventura Blvd'. Home / shows FAQ. 46/46 tests still pass.

Files touched

Diff

commit 8634cfdd9f1845cab497b6d187be8cabd8ca2294
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 6 21:04:31 2026 -0700

    yolo tick 17: per-vertical SEO landing pages + home FAQ section
    
    PER-VERTICAL TITLE / H1 / META
    - routes/public.js GET /find: when ?vertical= or ?city= is set (or both),
      build a custom <title>, meta description, and H1 specific to that filter.
      Eight vertical-keyed landing pages now distinguish themselves to Google
      ('Food & drink on Ventura Blvd' vs 'Beauty in Sherman Oaks on Ventura
      Blvd' vs the generic 'Find a business — Ventura Claw'). Long-tail SEO
      for every (vertical × neighborhood) combination — already in sitemap.xml
      from tick 4, just now actually distinct content.
    - views/public/find.ejs: H1 swapped to <%= customH1 %>, route picks the right
      string. Fallback for the unfiltered case = 'Search Ventura Blvd'.
    
    HOME FAQ
    - views/public/home.ejs: 5-question FAQ section between featured grid and
      category browser, addresses the questions visitors actually have:
        · How does this differ from Yelp/Google Maps?
        · Why aren't doctors, lawyers, or contractors listed?
        · How do leads get to the business?
        · How much does it cost — for me, for the business?
        · I own a business on Ventura Blvd. How do I claim my listing?
    - public/css/public.css: <details>/<summary> styling — brass + rotation
      on the indicator, max-width on the answer copy, semantic markup so the
      FAQ is searchable + accessible (collapse/expand via keyboard).
    
    Verified live: /find?vertical=food → 'Food & drink on Ventura Blvd' title
    + H1; /find?vertical=beauty&city=Sherman+Oaks → 'Beauty in Sherman Oaks on
    Ventura Blvd'. Home / shows FAQ. 46/46 tests still pass.
---
 public/css/public.css | 15 +++++++++++++++
 routes/public.js      | 23 ++++++++++++++++++++---
 views/public/find.ejs |  2 +-
 views/public/home.ejs | 24 ++++++++++++++++++++++++
 4 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/public/css/public.css b/public/css/public.css
index ed6c43f..85432a6 100644
--- a/public/css/public.css
+++ b/public/css/public.css
@@ -120,6 +120,21 @@
 .long-form ul { font-size: 15px; line-height: 1.65; padding-left: 22px; }
 .long-form li { margin: 6px 0; }
 
+/* FAQ */
+.faq { padding: 32px 28px 56px; max-width: 720px; margin: 0 auto; }
+.faq h2 { margin: 0 0 20px; }
+.faq-item { border-bottom: 1px solid var(--border); padding: 14px 0; }
+.faq-item:last-child { border-bottom: none; }
+.faq-item summary {
+  font-family: var(--serif); font-size: 18px; font-weight: 500;
+  cursor: pointer; padding: 4px 0; list-style: none;
+  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
+}
+.faq-item summary::-webkit-details-marker { display: none; }
+.faq-item summary::after { content: '+'; color: var(--brass); font-weight: 400; flex-shrink: 0; transition: transform 0.15s; }
+.faq-item[open] summary::after { transform: rotate(45deg); }
+.faq-item p { font-size: 15px; line-height: 1.6; color: var(--fg-muted); margin: 12px 0 0; max-width: 64ch; }
+
 /* For-businesses tier cards */
 .tiers { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin: 32px 0; }
 .tier-card { padding: 24px; border: 1px solid var(--border); background: var(--bg); border-radius: 6px; }
diff --git a/routes/public.js b/routes/public.js
index 222fe63..d585212 100644
--- a/routes/public.js
+++ b/routes/public.js
@@ -79,11 +79,28 @@ router.get('/find', async (req, res, next) => {
        LIMIT 200
     `, params);
 
+    // Per-vertical custom title + H1 = real SEO value. Each vertical filter is
+    // a distinct landing page in Google's eyes — 8 vertical-specific URLs that
+    // can rank for "[vertical] sherman oaks" / "studio city [vertical]" etc.
+    const verticalLabel = v && BY_KEY[v] ? BY_KEY[v].label : null;
+    const cityLabel = city || null;
+    const titlePartsList = [verticalLabel, cityLabel ? 'in ' + cityLabel : null].filter(Boolean);
+    const customTitle = titlePartsList.length
+      ? `${titlePartsList.join(' ')} on Ventura Blvd · Ventura Claw`
+      : 'Find a business — Ventura Claw';
+    const customMeta = titlePartsList.length
+      ? `${businesses.length} ${verticalLabel ? verticalLabel.toLowerCase() : 'local'} businesses on Ventura Blvd${cityLabel ? ' in ' + cityLabel : ''}. Search by name or message a business directly — Ventura Claw routes leads with no markup.`
+      : `Browse ${businesses.length} local businesses on Ventura Blvd.${v ? ' Filtered by ' + (BY_KEY[v]?.label || v) + '.' : ''}`;
+    const customH1 = titlePartsList.length
+      ? `${titlePartsList.join(' ')} on Ventura Blvd`
+      : 'Search Ventura Blvd';
+
     res.render('public/find', {
-      title: 'Find a business — Ventura Claw',
-      metaDescription: `Browse ${businesses.length} local businesses on Ventura Blvd.${v ? ' Filtered by ' + (BY_KEY[v]?.label || v) + '.' : ''}`,
+      title: customTitle,
+      metaDescription: customMeta,
       businesses, q, v, city, verticals: VERTICALS,
-      sort: orderClauses[sortKey] ? sortKey : 'featured'
+      sort: orderClauses[sortKey] ? sortKey : 'featured',
+      customH1, verticalLabel
     });
   } catch (err) { next(err); }
 });
diff --git a/views/public/find.ejs b/views/public/find.ejs
index 3698653..d59c3a5 100644
--- a/views/public/find.ejs
+++ b/views/public/find.ejs
@@ -26,7 +26,7 @@
 
 <section class="find-page">
   <p class="kicker">Find a business</p>
-  <h1 class="display-sm">Search Ventura Blvd</h1>
+  <h1 class="display-sm"><%= customH1 %></h1>
 
   <form action="/find" method="get" class="find-filters" role="search">
     <div class="filter-row">
diff --git a/views/public/home.ejs b/views/public/home.ejs
index e4cebd0..e5685dc 100644
--- a/views/public/home.ejs
+++ b/views/public/home.ejs
@@ -59,6 +59,30 @@
   </div>
 </section>
 
+<section class="faq">
+  <h2>Common questions</h2>
+  <details class="faq-item">
+    <summary>How does this differ from Yelp or Google Maps?</summary>
+    <p>Ventura Claw is curated, narrow, and local — limited to small businesses on the Ventura Blvd corridor (Sherman Oaks → Woodland Hills). No reviews, no ranking algorithm, no ads on consumer surfaces. Just a clean way to find a business near you and message them directly.</p>
+  </details>
+  <details class="faq-item">
+    <summary>Why aren't doctors, lawyers, or contractors listed?</summary>
+    <p>State-licensed professions (medical, legal, financial, real estate, licensed trades) have their own referral and fee-splitting rules. Ventura Claw intentionally only lists businesses where the work is done by the business itself, not by a regulated individual. This keeps the platform structurally simple and our pricing structurally honest.</p>
+  </details>
+  <details class="faq-item">
+    <summary>How do leads get to the business?</summary>
+    <p>When you fill out a contact form on a business profile, your message routes to the business's email within five minutes via our lead-delivery cron. The reply-to is set to your email, so when they hit reply you get the response directly — Ventura Claw is never on the chain.</p>
+  </details>
+  <details class="faq-item">
+    <summary>How much does it cost — for me, for the business?</summary>
+    <p>For visitors: zero. Always. We never charge consumers anything. Businesses pay a monthly subscription ($0 free / $49 starter / $99 standard / $199 premier) for premium placement. We don't take a cut of any transaction between consumers and businesses.</p>
+  </details>
+  <details class="faq-item">
+    <summary>I own a business on Ventura Blvd. How do I claim my listing?</summary>
+    <p>Find your business in the <a href="/find">directory</a> and click "Claim this listing" on the profile page. We'll email you a confirmation link, you set a password, and you're in your dashboard with a lead inbox, profile editor, and tier picker. Free tier always available.</p>
+  </details>
+</section>
+
 <% if (featured && featured.length > 0) { %>
 <section class="find-page">
   <h2>Featured this week</h2>

← 53d59c1 yolo tick 16: profile activity badge (≥3 threshold) + /find  ·  back to Ventura Claw Leads  ·  yolo tick 18: per-business cover photo upload (multer + 2MB 65c0b91 →