SEO & GEO Strategy

How tahoeneurofeedback.com is built to be found — by search engines, AI systems, and patients who don't yet know what neurofeedback is.

SEO and GEO — what they mean here

SEO (Search Engine Optimization) is the practice of making a website appear in Google and Bing search results for relevant queries. It involves the words on the page, the technical structure of the HTML, and what other sites say about you.

GEO (Generative Engine Optimization) is a newer concern: making sure that AI assistants — Google AI Overviews, Perplexity, ChatGPT search, Microsoft Copilot — can accurately understand and cite this practice when a user asks something like "who offers neurofeedback in the Lake Tahoe area?" AI systems read the web differently from traditional search crawlers; they weight clarity, structured data, and purpose-built machine-readable files more heavily.

Both are addressed here with overlapping techniques.

Keyword strategy

The core finding

A Google Trends query for "neurofeedback in the Lake Tahoe area" returned zero neurofeedback-specific terms in the top 30 queries. The dominant terms were all "mental health services" variants — "mental health services near me" (index 100), "mental health counseling services" (96), with child/youth mental health terms trending strongly upward (+30–40%).

This means the practice faces a discoverability gap: patients who would benefit from neurofeedback are searching in "mental health services" language, not neurofeedback language. The site needs to speak both.

The bridging approach

Rather than optimizing purely for "neurofeedback" (low local search volume) or purely for "mental health services" (high volume but too generic), the site uses a bridging strategy:

  • Titles lead with neurofeedback + a condition or "mental health" to catch both informed and uninformed searchers. Example: Neurofeedback Therapy for ADHD & Mental Health – Lake Tahoe.
  • Descriptions use "mental health service" framing to match what patients actually type, then immediately introduce neurofeedback as the specific modality. Example: "…an evidence-based mental health service for ADHD, anxiety, sleep, trauma, and mood…"
  • Condition terms (ADHD, anxiety, sleep, trauma) appear in titles, descriptions, and body copy because they carry independent search volume that neurofeedback and mental health terms alone do not.

Geographic targeting

"Kings Beach" has very low geographic recognition outside the immediate area. "Lake Tahoe" is nationally recognized. The strategy uses:

  • "Lake Tahoe" in page titles and meta descriptions — highest recognition for out-of-area searches, tourists, and AI systems with limited regional knowledge.
  • "North Lake Tahoe" and "Tahoe Truckee region" in body copy and structured data — used by regional search and directory platforms, and more precise for local patients.
  • "Kings Beach" retained in the physical address everywhere — correct for Google Maps, Apple Maps, directions, and schema markup. Removing it from titles does not affect local pack ranking, which uses the registered address directly.

On-site implementation

The following features are implemented in the codebase. All page-level SEO is controlled through src/layouts/BaseLayout.astro and the individual page files in src/pages/.

1. Title tags

File: each src/pages/*.astro file defines a title constant. BaseLayout.astro appends | Tahoe Neurofeedback automatically if the brand name is not already present, keeping inner-page titles clean while ensuring brand presence everywhere.

Page Rendered title
/ Neurofeedback Therapy for ADHD & Mental Health – Lake Tahoe | Tahoe Neurofeedback
/services Neurofeedback Services & Fees | Tahoe Neurofeedback
/about About Dr. John Finnick, PsyD | Tahoe Neurofeedback
/faq Neurofeedback FAQ | Tahoe Neurofeedback
/what-to-expect What to Expect from Neurofeedback | Tahoe Neurofeedback
/contact Contact & Directions | Tahoe Neurofeedback
/for-practitioners For Referring Practitioners | Tahoe Neurofeedback

2. Meta descriptions

Each page has a distinct, manually written description (not auto-generated). All descriptions use "Lake Tahoe" as the geographic anchor and lead with either the service name or a condition term, followed by a brief bridging phrase. Descriptions target 140–160 characters to avoid truncation in most search result formats.

File: description constant at the top of each src/pages/*.astro file.

3. Structured data (JSON-LD)

Every page includes a <script type="application/ld+json"> block in the <head>. This machine-readable markup is the primary signal used by AI systems and rich result features in Google Search.

File: src/schema/jsonld.ts

Schema type Pages What it signals
Organization All pages Name, URL, phone, email, address
LocalBusiness All pages Physical location, price range — triggers local pack eligibility
WebSite All pages Site identity, publisher relationship
WebPage All pages Page URL, name, description, relationship to site
Person /about Practitioner name, credentials, employer — supports "Dr. Finnick" branded searches
Service /services Service name, description, price, provider, area served
FAQPage / Question / Answer /faq Eligible for FAQ rich results in Google Search; feeds AI answer boxes

4. llms.txt — GEO-specific

File: public/llms.txt

llms.txt is a machine-readable plain-text file that AI crawlers (used by Perplexity, ChatGPT, Anthropic, and others) read to understand a site's identity and key pages without parsing full HTML. It is analogous to robots.txt for traditional crawlers, but purpose-built for LLMs. The file is served at https://tahoeneurofeedback.com/llms.txt.

It currently contains: the practice name and summary, a list of all public pages with descriptions, service details, insurance policy, and contact information.

5. XML Sitemap

File: astro.config.mjs — generated automatically by the @astrojs/sitemap integration at build time.

Served at https://tahoeneurofeedback.com/sitemap-index.xml. All public pages are included. The portal and guide pages (/docs-and-guides, /google-listing-guide, etc.) are currently included in the sitemap — see the Known Gaps section below.

6. Canonical URLs

File: src/layouts/BaseLayout.astro

Every page includes a <link rel="canonical"> tag constructed from absoluteUrl(path) in src/site.ts. This prevents duplicate content issues if the site is ever accessible at multiple domains (e.g., while braintrainers.com redirects here).

7. Favicon

File: public/favicon.svg

An SVG favicon with a cream background (#f5efe5) and a terracotta (#c17757) EEG waveform. SVG is served as the primary favicon — it scales perfectly from 16×16 browser tabs to 512×512 OS-level icons and supports dark mode via CSS media queries if needed in future.

8. Theme color

File: src/layouts/BaseLayout.astro

<meta name="theme-color" content="#f5efe5"> sets the mobile browser address bar and tab strip to match the site's cream background. This matches the favicon background and creates a unified appearance in mobile Chrome and Safari.

9. LCP preload

File: src/pages/index.astro

The homepage hero image is preloaded with <link rel="preload" as="image" fetchpriority="high"> to minimize Largest Contentful Paint (LCP) time, which is a Core Web Vital that affects Google ranking.

Off-site actions

On-site technical SEO is necessary but not sufficient for local discovery. The following off-site actions are required and are documented in the guides accessible from the Docs & Guides portal.

Platform Why it matters Status
Google Business Profile #1 local discovery signal. Controls the map pin, "near me" results, and the knowledge panel. Not yet claimed
Apple Business Connect Apple Maps default on all iPhones (~50% of US smartphones). Not yet set up
Psychology Today Top Google result for therapy searches ~96% of the time. ~971K weekly US users. $29.95/mo. Not yet set up
Bing Places Feeds Bing Maps and Microsoft Copilot. Free; can import from Google. Not yet set up
Google Search Console Shows real query data — what people searched before clicking. Required for data-driven iteration. Not yet verified

Known gaps & action items

Stale "Kings Beach" in JSON-LD (technical — fix in code)

File: src/schema/jsonld.ts

The servicesPageGraph and faqPageGraph functions contain hardcoded description strings that still reference "Kings Beach, CA." The aboutPageGraph WebPage node description also has not been updated to match the revised about.astro page description. These strings are embedded in the JSON-LD emitted into each page's <head>, so they affect what Google and AI systems extract from the structured data.

Stale "Kings Beach" in llms.txt (technical — fix in code)

File: public/llms.txt

The opening line still reads "…Kings Beach, California…" — should be updated to "Lake Tahoe" consistent with the site-wide geographic strategy.

Internal guide pages are in the sitemap (technical — decide and act)

File: astro.config.mjs

The @astrojs/sitemap integration includes every page by default. The portal and guide pages (/docs-and-guides, /google-listing-guide, etc.) are currently being included in sitemap-index.xml, which means Google will crawl and potentially index them. This is unlikely to cause harm, but if you want to exclude them, add a customPages filter or per-page <meta name="robots" content="noindex">.

Open Graph / social meta tags not implemented (low priority)

File: src/layouts/BaseLayout.astro

og:title, og:description, og:image, and twitter:card tags are not present. These control how the site appears when a link is shared on Facebook, LinkedIn, iMessage, or Slack. Not a ranking factor, but affects click-through from shared links. Low priority for a local practice with no active social media.

Google Search Console not verified (high priority — do this at launch)

Without Search Console, there is no data on which queries are driving impressions or clicks. It should be verified as soon as the site is deployed to its production domain. Verification requires either adding a DNS TXT record (preferred) or placing a small HTML file in public/.

File reference

File What it controls
src/site.ts Canonical identity: name, tagline, phone, email, address, practitioner. Single source of truth for all pages and schema.
src/layouts/BaseLayout.astro All shared <head> tags: charset, viewport, theme-color, canonical, description, title, favicon, preload, JSON-LD.
src/pages/*.astro Per-page title, description, path, and schema graph passed to BaseLayout.
src/schema/jsonld.ts All structured data (JSON-LD) graph builders. Edit here to change schema output.
public/llms.txt Machine-readable site summary for AI crawlers (GEO).
public/favicon.svg EEG waveform SVG favicon. Cream background, terracotta stroke.
astro.config.mjs Production URL, sitemap generation, trailing slash policy.