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