GreyStone Counseling
A statewide telehealth practice needed a calm, credible home for the hardest conversations in mental health — and the search visibility to be found by the people having them. We designed the brand system, built a 27-page Astro site with programmatic local SEO, wired up domain and mail infrastructure from scratch, and kept it running through two real production incidents on launch day.
The production homepage at greystonebh.com — live.
Findable for the searches that matter most.
GreyStone Counseling, PLLC is a solo telehealth practice run by Tara Ross, M.A., LPC, LSOTP, based in Weatherford, TX and licensed to see clients anywhere in Texas. Her specialties sit in the corners many practices avoid — grief and bereavement, anticipatory grief, court-ordered counseling, and LSOTP treatment for problematic sexual behavior.
That work depends on two things at once: being findable by people searching for it, and a site that reads as steady, not clinical. The build had to serve both — a brand that feels calm and credible on a hard day, and search infrastructure that puts the practice in front of the right person at the right moment, statewide.
One tokens file. Every color, typeface, and spacing value traces back to it.
A warm cream ground, a serif for headlines paired with a clean sans for body copy, and a clay terracotta reserved only for the call to action — never body text, never decoration.
Tokens — public/brand/tokens.css
One layout owns every page's SEO head and schema.
A single Astro layout owns every page's SEO head and JSON-LD schema, so nothing drifts page to page. Local reach comes from a data-driven city template: one file generates a unique landing page per Texas metro from an ~80-city dataset, each with its own intro and local framing rather than templated filler.
Core
- /
- /about
- /contact
- /investment
- /fine-print
Service focus
- /focus/mental-health
- /focus/court-services
- /focus/unmanageable-behaviors
Local SEO — [city].astro × 19
- /dallas-online-counseling
- /houston-online-counseling
- /austin-online-counseling
- /fort-worth-online-counseling
- /san-antonio-online-counseling
- + 14 more
Remaining ~60 tracked cities render as a linked service-area list today — a straightforward data-driven expansion when the client is ready.
A strong base, with the remaining gaps closed.
An audit against the live site found a genuinely strong technical base — valid HTTPS, correct sitemap and robots.txt, one H1 per page, MedicalBusiness and Person schema site-wide. The remediation pass closed the remaining gaps.
| Before | After |
|---|---|
| Homepage title 68 chars — truncates in SERP |
Online Grief & Anxiety Therapy Across Texas — GreyStone |
| Unmanageable Behaviors title 77 chars — truncates |
Trimmed to fit SERP display width |
| About meta description ~200 chars — truncates |
Trimmed to ≤160 chars |
| Homepage structure No keyword-bearing H2 |
H2 added under H1 |
| Homepage + Investment No FAQ content |
FAQ blocks + FAQPage schema |
| Headshot images Eager-loaded |
loading="lazy" |
| Search engine indexing Not submitted |
IndexNow — 27 URLs, 202 Accepted |
DNS, TLS, and redirects verified end to end.
Moved the domain into the client's own registrar account, connected it to Netlify, and verified the full chain end to end — rather than stopping at "it resolves."
greystonebh.com transferred into client's Porkbun account.
ALIAS + CNAME → Netlify, verified on authoritative NS.
Let's Encrypt cert issued, Force HTTPS on.
http→https and www→apex confirmed 301.
Domain property verified via DNS TXT.
Two real incidents. Both root-caused and resolved the same day.
One on the site, one on the client's business email — surfaced during this engagement.
Full-site outage — every route 404'd.
Cause: Server-side deploy had no root netlify.toml, so the build published a stale local publish path baked into a cached config instead of dist/.
Detected: Immediate post-deploy verification sweep — every route, including the raw .netlify.app subdomain, returned 404.
Fix: Added a canonical netlify.toml (build command, publish = "dist", pinned Node version) and redeployed.
Verified: All 27 routes re-checked at 200, shipped SEO changes confirmed live in the response body.
Business email stopped receiving mail.
Cause: The domain account transfer reset DNS, silently wiping all MX, SPF, and DMARC records — no mail routing existed at all.
Diagnosed: Ruled out the registrar's native email service, confirmed the client's real provider was Microsoft 365, and validated the tenant by resolving Microsoft's standard MX hostname pattern to live Exchange Online Protection IPs before touching DNS.
Fix: Restored MX (priority 0), SPF, and autodiscover CNAME records to spec.
Verified: Caught an early false alarm — a backend DNS sync delay, not a bad record — then confirmed all three records live on both the registrar's authoritative nameservers and public resolvers.
The unglamorous half of a launch — DNS, mail, a deploy that goes sideways at the worst moment — is the half that actually determines whether a client's business stays reachable. We treat it with the same rigor as the design.
Screenshots.
The project in the wild — UI from the live product.
We build for practices where trust is the whole product.
Brand systems, local SEO, and infrastructure that holds up on launch day — for telehealth, counseling, and other practices where the site has to be found and has to be right.
Need a site that's still up after launch day?
Design and DNS both matter. Tell us what you're running and we'll scope what it would take to get it right — brand, build, and the infrastructure underneath it.
Let's Talk