You own your domain outright, and you're blogging several times a week with content that reads like a real local practitioner wrote it. But you don't appear anywhere in 25 live map searches centered on your own office, your homepage tells every visitor it's still under construction, and every AI answer engine (ChatGPT, Claude, Perplexity) is blocked from ever seeing your 71 blog posts. None of this needs new content. It needs the switches flipped back.
The short version. You're not starting from zero: you're self-hosted, you genuinely blog, and your reviews are real. Your homepage still shows a "Website Update in Progress" banner to every visitor and to Google. And a Cloudflare default silently blocks GPTBot, ClaudeBot, and every other AI-answer crawler from your site, so ChatGPT and Perplexity can never cite the 71 posts you've already written. Every one of these is yours to fix directly: you own the domain, you own the hosting, there's no franchise platform standing in the way.
Teresa introduced us, and we ran the same audit we run for every agent she sends our way: technical crawl, on-page and schema review, blog content quality, and a Google Business Profile check. Every figure below traces to a page we actually fetched or a live API call; nothing here is guessed, and anything we couldn't verify is labeled as such rather than assumed.
Nathan has his own individual Google Business Profile, separate from the Keller Williams Lynchburg brokerage listing, which is the right structure for local-pack visibility. A prior draft of this report flagged the profile as pointing to a different address and a different website, sourced from a third-party review aggregator rather than the profile itself. On direct inspection that was wrong. We've removed it rather than leave a corrected number standing next to an error, and going forward this section is limited to what was checked directly.
25 live Google Maps searches on a 5×5 grid centered on his own Keller Williams Lynchburg office (2-mile spacing, roughly an 8-mile-wide area of Forest and Lynchburg VA), searched for "realtor." Nathan does not appear in the top 10 results at any of the 25 points, including the point centered exactly on his own office. Two firms take most of the map: Acree Brothers Realty Team holds the number one spot at 13 of 25 points (52%), Keeton & Co Real Estate at 6 of 25 (24%), and six other agents split one point each.
Nathan confirmed he used to work on the Acree Brothers Realty Team before Haefer Homes. That's very likely why they hold 13 of 25 points here: reviews, citations, and search authority built up under that team name didn't automatically follow him when he left. Worth checking directly in Google Business Profile Manager whether an old listing under Acree Brothers still has his name, phone, or photos attached, and whether any of his past client reviews are sitting on the wrong profile. Cleaning that up (or getting a referral link from the old listing to the new one) is a faster path to map pack visibility than starting an authority-building push from zero.
| Citation / profile | Status |
|---|---|
| Google Business Profile (agent-level) | exists, separate from the brokerage listing; not independently audited this pass, no live-browser access this session |
| Booking (Setmore) | NAP matches the website exactly |
| bot-walled, unverified | |
| lynchburgvarealtors.com directory | JS widget, unverified |
Regular Google and Bing search indexing is unaffected; standard organic search works fine. Two other things don't.
A Cloudflare default ("AI Crawl Control", almost certainly never touched on purpose) blocks GPTBot, ClaudeBot, Google-Extended, Applebot-Extended, Bytespider, CCBot, Amazonbot, and Meta's crawler with a flat Disallow: /. ChatGPT, Claude, and Perplexity can never crawl or cite any of your 71 blog posts. Reversing it is a dashboard toggle, not a code change.
Live PageSpeed Insights data (median of 3 runs): lab score 63/100, Largest Contentful Paint 9.8s against Google's 4s "Poor" cutoff. No CrUX field data yet (traffic is too low to qualify), so this is lab-measured, but the gap is large enough to matter regardless.
Checked the homepage plus a spread of blog posts: 0 of 4 direct checks had an H1 tag at all; the visible title renders as an H2 instead (an Elementor page-title widget issue). A broader sample of 12 posts found the same gap on 7 of 12. H1 is the single clearest "what is this page about" signal for both search and AI summarization; right now nothing carries it.
HSTS, X-Frame-Options, X-Content-Type-Options, Content-Security-Policy, Referrer-Policy, and Permissions-Policy are all absent. Add via Cloudflare Transform Rules: five minutes, no plugin needed.
/shop/ is a live, indexable, completely empty WooCommerce page ("No products were found"). Three URLs in your own submitted sitemap (/user/, /logout/, /members-2/) redirect straight to the homepage: broken entries Google is being told to crawl. And /vote-now/ shows an unrelated blog post's title instead of anything about voting.
| Check | Result |
|---|---|
| HTTP → HTTPS / www → apex redirects | clean, single-hop |
| Canonical tags | present, correct |
| Mobile viewport meta | present |
| Sitemap: directive in robots.txt | missing (both sitemaps still work if submitted via GSC) |
| WooCommerce product sitemap | 1 dead "preferred vendor" listing, unused plugin cruft |
Two plugins both inject business schema. We checked four page types directly (homepage, a listing page, a blog post, and the FAQ page) and found the same block, byte-identical, on all four, which points to a shared site-wide template rather than a one-page issue. One of these blocks is broken in a way that makes the whole entity invisible to Google.
The type is written as "RealEstate Agent" , with a space, which isn't a real schema.org type. Google silently drops it. The @id field is also just the literal string "LocalBusiness" instead of a URL. Net effect: despite the plugin having your real data, you currently have no functioning business schema at all.
servesCuisine, hasMenu, hasMap, priceRange all present as empty strings, clear evidence a generic "LocalBusiness" plugin template was never adapted for a real-estate business. The opening-hours field is one unformatted blob of raw tab and line-break characters copy-pasted from a spreadsheet, so it won't parse as structured hours either.
| Schema issue | Priority |
|---|---|
| Business address exists only in schema, never shown on the visible page | High |
| addressCountry: "USA" should be ISO "US" | Medium |
| 5.0/13-review rating claim not backed by visible on-page review count | Medium |
| No BreadcrumbList anywhere on the site | Medium (opportunity) |
| Two competing Organization/WebSite nodes from the two plugins | Low |
Blog post schema is the exception: Article/BlogPosting markup on your posts is well-formed, with real datePublished/dateModified matching the sitemap. No legacy FAQPage schema was found either, which is correct: Google restricts that rich result to gov/healthcare sites now, so there's nothing to add there.
This is the strongest part of the site, and it's worth saying plainly: the blog is not AI-slop. Sampled 12 of 71 posts directly: specific local dollar figures, named counties, real first-person practitioner voice, and consistent freshness signals (every post carries both a publish and an update date).
Posts from December 2024 through roughly May 2026 show auto-generated excerpts as their meta description ; one post even leaks a raw YouTube URL into the description. Only your two most recent posts (August and September 2026) have tight, hand-written descriptions, which is a real, dateable improvement; it just hasn't been applied backward across the archive yet.
| Content check | Result |
|---|---|
| Local specificity & quotable stats | strong, real prices, named counties, dated events |
| Freshness signals (published + modified dates) | present and consistent on every sampled post |
| Author bio / credentials | present but boilerplate, no license number |
| AI-slop phrasing | minimal, 2 of 12 posts, single instances each |
| H1 on post template | missing on 7 of 12 sampled, see Finding 06 |
You told us up front that most of the site "probably shows nothing" and that only the weekly Tuesday poll, new articles, and Open House sign-in are truly active. We tested that claim page by page.
The hero banner reads "Website Update in Progress: Better Experience Coming Soon!" This isn't a rendering bug, it's a deliberate message that's currently live to every visitor and to Google. A construction notice with no completion date reads as abandoned, not "coming soon," and it undercuts every other fix in this report, since the front door is telling people not to trust what they see.
The flip-calculator and rental-calculator pages are both hard-gated behind a "Pro Members" wall with no calculator underneath, despite being the headline cards on /investors/. And /vote-now/, the confirmed-active weekly poll, resolves to an unrelated blog post that only mentions voting on social media; there's no on-site voting mechanism at all.
/open-house-list/ is a completely blank page, nav straight to footer with nothing in between. /free-consultation/ says "fill out the form below" and there's no form, just empty space where one should be. /neighborhood-report/ promises a report form and shows only a sample video with no input fields anywhere on the page. All three read as an embed that never got wired up, not a content gap.
Checked /investors/, /selling/, and /home-buying/ directly in a browser: all three render as plain text links floating on a blank page, no icons, no images, no card borders, no visual hierarchy at all. This isn't a per-page content gap, it's the shared template every persona hub uses, so it very likely affects /renters/ and /home-owners/ too. The sub-pages these link to (like /selling/sell-my-home/) can still have real content once you click through; the hub itself just looks unfinished on every one of the five.
| Persona journey | Verdict |
|---|---|
| Seller hub (/selling/) | same broken template as every hub; the sub-page /selling/sell-my-home/ is genuinely good |
| Buyer hub (/home-buying/) | same broken template, confirmed live |
| Investor hub (/investors/) | same broken template, plus a member-gated dead end underneath |
| Renter / Home Owner hubs | not directly checked this pass; same shared template, very likely affected too |
| Open House sign-in (owner-confirmed active) | sign-in form looks complete |
| Open House list, Free Consultation form, Neighborhood Report | confirmed broken in a live browser; blank page and two missing form embeds |
| Weekly poll (owner-confirmed active) | no on-site voting mechanism found |
| Shop / cart / checkout | confirmed dead, empty WooCommerce install |
One more, worth a second opinion, not a hard finding: every page carries a search box in the header, ahead of the main navigation. For a lead-gen agent site where the job is booking a consultation, not searching articles, that's real header space that could go to a phone number or a clearer call-to-action instead. Your call whether it earns its spot.
You own your domain outright (registered through Namecheap, November 2024) and your own WordPress hosting, confirmed live, not a Keller Williams-controlled platform. There's no franchise gatekeeper standing between you and any item on this list, so you're free to fix any of it yourself, hand it to your own developer, or have us run the whole thing. If you hire MySEODesk under either plan in Section 08, we fix every row below, code-level items included, you don't touch any of it. The table shows what's realistically self-serve if you'd rather do some of it yourself first.
| Fix | Tier | Self-serve today |
|---|---|---|
| Remove or replace the "under construction" homepage banner | Content | Yes, Elementor text edit |
| Flip Cloudflare AI Crawl Control from Block to Allow | Settings | Yes, dashboard toggle |
| Decide: finish or pull the Investor calculators & on-site poll | Decision | Yes, your call either way |
| Fix the RealEstateAgent schema block (@type, @id, opening hours) | Code | No, needs plugin/JSON-LD access |
| Security headers (Cloudflare Transform Rules) | Code | No, needs Cloudflare config access |
| Fix the three broken form embeds | Code | No, needs the embed/plugin source |
| Rebuild the shared persona-hub card template | Code | No, one shared Elementor template |
| Sitemap cleanup, H1 template fix, image compression/lazy-load | Code | No, theme/plugin level |
Content = a text/copy edit in WordPress admin, no technical skill needed. Settings = a dashboard toggle outside WordPress (Cloudflare, GBP Manager), still no code. Code = requires editing plugin configuration, JSON-LD, template files, or platform-level settings only a developer would normally touch.
Every step below is tagged by tier: Content you can do yourself in WordPress admin right now, Settings a dashboard toggle outside WordPress, Code needs a developer touching plugin configuration, templates, or platform-level settings.
Every item on the plan above is yours to hand to any developer, including your own. If you'd rather we run it, here are the two ways to do that. Custom pricing, scoped to this report, not pulled from a rate card.
Every finding on this report fixed, then kept fixed: site work, GBP correction and management, analytics, plus one ad platform managed.
Everything in One Platform, with both ad channels running so leads come from search and social at the same time.
Ad spend is separate from the retainer and paid directly to the platform, never marked up. Full quote with terms and access checklist: haeferhomes-quote.pages.dev.
You're further along than most agents we audit at this stage: your own domain, your own hosting, a genuinely active blog, and real five-star reviews. The gap isn't content or strategy; it's a handful of switches (a Google Business Profile field, a Cloudflare toggle, one schema plugin setting, one homepage banner) that are currently pointed the wrong way. Flip those and everything else on this site starts pulling its weight.
Happy to walk through any of this, and just as happy if you or your developer take the list and run with it directly. Either way, thank Teresa for the introduction.