Ezra Jackson Bailey
← Back to home
Case Study · 01

Quietly fixing a ghost website for a Colorado Springs counselor.

My dad is a Licensed Professional Counselor. He had a Wix site that rendered a black screen with three words on it, told Google he was in Spring, Texas, and had zero structured data for a medical practice. I audited it, then built the replacement he actually needed: an Astro site with real content, real schema, split specialty pages, and a local-SEO program to go with it.

Client
Matthew Bailey, LPC
Scope
Site rebuild · Local SEO · AEO
Stack
Astro · Cloudflare Pages · Resend
Timeline
April 2026
The Before

The site, as Google found it.

Faithful recreations of all four pages of the Wix site as they existed the day I audited it — same copy, same structure, same (lack of) content. Switch tabs to flip between pages; hover an amber pin to see what was wrong on each one.

https://www.matthewbaileycounseling.com/
719-510-3168

Matthew
Bailey
LPC

Licensed Professional Counselor in Colorado Springs

Online or in-person

Licensed in Colorado and Texas

• Tap or hover the pins •

The Search Result

What Google was showing the world.

One string in Wix's SEO panel, unchanged for years. Every Google result, every iMessage unfurl, every LinkedIn preview — all of them ended on the wrong state.

The site's meta description read “…a male counselor in Spring, Texas.” Spring, TX is roughly 900 miles from Matthew's actual office in Colorado Springs. That string hadn't been updated since the Wix site first launched.
The Audit

Page by page, the same failures.

The homepage wasn't an outlier. Each of the four published pages repeated the pattern — a Wix template that looked fine in the editor and collapsed under the weight of what it was supposed to do. Below: every pin on the recreation above, grouped by page, plus the issues that spanned the whole site.

Home

The page most new clients landed on first.

H1

Meta description pinned to the wrong state

Wix's SEO panel held “…a male counselor in Spring, Texas.” That's the string Google served to every organic impression, and every social unfurl inherited it.

H2

Truncated site name in previews

The og:site_name rendered as “Matthew Bailey Couns”. Every Facebook, LinkedIn, and iMessage card read as broken on arrival.

H3

H1 split with forced line breaks

The home H1 used <br> tags to stack name over credential. Screen readers flattened it into three separate headings — Matthew. Bailey. LPC.

H4

259 characters of body text, total

Roughly forty words on the entire homepage. No mention of EMDR, Christian counseling, trauma, teens, fees, or insurance. Effectively invisible to search.

H5

No MedicalBusiness or Person schema

Two generic LocalBusiness JSON-LD blocks, nothing clinical. For a counselor, the schema type that matters is MedicalBusiness + Person with specialties attached.

H6

Footer reduced to a single email link

No NAP repeat, no hours, no social, no legal disclosure. A counselor's footer should reinforce identity on every page — this one whispered.

About Me

The page where trust gets made or broken.

A1

No meta description, no schema

Google auto-generated a bad snippet from form labels and heading fragments. Crawlers saw zero structured data for the page.

A2

H1 was “Get to know me”

No name, no credential, no city. Zero SEO value. Compare to About Matthew Bailey, LPC — EMDR Counselor in Colorado Springs — same space, dramatically more signal.

A3

Stale facts in the bio

Said “almost 30 years” in ministry (he's at 30+) and “married 25 years” (26 now). The page hadn't been touched in over a year.

A4

A smiley in professional copy

A :) next to the bio about his grandson — minor, but the only punctuation quirk on the page, and the kind of detail that breaks a counselor's tone.

A5

Raw YouTube URL pasted in body copy

The EMDR section ended with a 60-character link ending in &feature=youtu.be. Not an embed. Not a styled link. Pure 2018 energy.

A6

URL was /about-me-1

The trailing -1 means an abandoned /about-me exists somewhere in Wix's history — a classic footgun that scatters link equity across orphaned pages.

Location

One line of address, shipped as 370 KB.

L1

Zero headings on the page

No H1, no H2 — no Hours, no Parking, no What to expect. Invisible to every structured-content crawler that's looking for local signals.

L2

56 characters of body text

The address, and nothing else. 370 KB of HTML to deliver one line — a markup-to-content ratio that crawlers read as near-empty.

L3

No hours, no phone, no email

A client landing here from a Google search couldn't call, couldn't book, couldn't tell if he saw patients on Fridays. The page offered no next step.

L4

Map with no context

A raw Google Maps iframe, dropped on the page with nothing around it — no “Get directions,” no parking note, no what-to-expect for a first visit.

L5

No CTA, no next step

No Request an appointment button, no Get directions link. The page answered “where” and then ended.

L6

No LocalBusiness schema

The one page Google should be able to mine for address, hours, and geo had nothing structured for it to read. A wasted local-SEO signal.

Contact

The step before a client ever picks up the phone.

C1

No meta description

Google auto-generated something forgettable from the form labels — the one page where intent is highest, and the SERP preview said nothing.

C2

No HIPAA / confidentiality disclaimer

Clients will absolutely paste clinical details into a counselor's contact form. This one was unencrypted and didn't say so — a liability and a trust gap.

C3

Half the page was a repeated photo

The right 50% was the same B&W headshot already on the home page. No map, no hours, no consult mention, no insurance info — pure decorative real estate.

C4

No response-time expectation

“I typically reply within 24 hours” builds trust. Silence on that makes a form feel like a void a client is throwing a message into.

C5

No insurance or telehealth mention

Matthew takes six major plans and is licensed in CO + TX. The form surfaced neither — so the two most-asked client questions went unanswered at the exact moment they mattered.

C6

No visible anti-spam

No captcha, no honeypot, no per-field validation. A medical-practice contact form indexed by Google is a magnet for scraped spam.

Site-wide

Issues that repeated across every page.

S1

No Open Graph image, anywhere

Every shared link on Facebook, LinkedIn, iMessage, or Slack rendered as a broken preview box — no card image, truncated site name, sometimes no description at all.

S2

Render-blocking Wix chrome in the head

10 render-blocking scripts and 366 KB of HTML to deliver 259 characters of text — roughly a 1,400:1 markup-to-content ratio on the homepage alone.

S3

No sitewide CTA or call button

No Request an appointment, no Free 15-minute consultation, no tap-to-call on mobile. The only way to reach Matthew was to find the email at the bottom of the footer.

S4

Editing friction kept the site stale

Wix's editor made small copy fixes feel like a chore, so they didn't happen. Stale facts, unfixed typos, and a years-old meta description all traced back to the same root cause.

By The Numbers

The delta on the homepage alone.

Directional snapshot taken from the DOM of both sites on the day of cutover.

SignalBefore (Wix)After (Astro)
Meta description"…in Spring, Texas"Per-page, Colorado Springs + specialties
OG / social preview imageNone1200×630 custom card
Schema.org JSON-LD blocks2 (both generic)MedicalBusiness + Person + FAQPage
Body text on home259 chars~2,900 chars, structured
H2 headings on home02
Specialty pages05 (EMDR · Christian · Trauma · Teens · Anxiety/Depression)
FAQ with FAQPage schema6 Q&As
Sitemap & robots.txtWix defaultGenerated sitemap-index + llms.txt
Contact form4 fields, no validation, no anti-spamCloudflare Function → Resend, honeypot + validation
HTML weight (homepage)~366 KB~11 KB
Render-blocking scripts (head)100
Annual hosting cost~$200–400~$10 (registrar only)
The Rebuild

What actually got shipped.

A static site is the right shape for a one-counselor practice: fast, durable, cheap, and trivially editable. The work was mostly deciding what to put on it — then getting out of its way.

Astro 5 static site

File-based routing, zero JavaScript on the page by default, builds to flat HTML. Served from Cloudflare Pages.

A single source of truth

Phone, address, license states, insurance plans, session rate — all live in one site.ts file that flows through every page, schema block, and footer.

Five split specialty pages

EMDR, Christian counseling, trauma, teens & young adults, anxiety & depression — each with its own URL, its own copy, its own keywords.

Real schema.org markup

MedicalBusiness and Person on home. FAQPage on FAQ. Per-page canonical, Open Graph, and Twitter cards.

A contact form that actually works

Cloudflare Pages Function → Resend API → Matthew's inbox. Phone auto-formatting, email validation, confidentiality note, honeypot anti-spam, insurance + telehealth copy above the form.

An LLM-friendly overview

Hand-written llms.txt so AI answer engines (ChatGPT, Perplexity, Claude) can cite the practice with accurate specialties, licensure, and contact info.

Google Business Profile rebuild

Description expanded from 19 chars to 489. Seven custom services added. Photos, categories, and attributes audited and fixed.

Directory + NAP cleanup

Psychology Today phone fixed (pointed to a stale call-tracking number), Headway confirmed correct, pipeline for Bing Places + Apple Business Connect + TherapyDen queued.

The After

See the live site.

The rebuilt site is live at Matthew's domain. Same business, same counselor, same phone number — everything Google, LinkedIn, and real humans land on has been redrawn.

matthewbaileycounseling.com Archived before state ↗

Have a site that's not doing what it should?

I take on a small number of these a year — usually for people whose practice or small business has outgrown its site without anyone noticing. If that sounds familiar, say hi.

[email protected]