Field notes · Teardowns
A dental group paying $4,000 a month for a website nobody can book on
Four locations, strong rankings, and a booking widget that fails silently on iPhones. Nobody on the team had tried to book an appointment from a phone in two years. Here’s what the teardown found and what I told them to fix first.
By Yishai — thirty years in search
What the owner thought was wrong
A four-location dental group in the Midwest came to me convinced they had a rankings problem. Their agency was charging $4,000 a month, mostly for content and “local SEO maintenance.” The practice manager told me they weren’t showing up enough. New patient numbers had been flat for eleven months while the reports showed steady green arrows.
The theory inside the practice was that a competitor down the road had gotten better at SEO. That’s almost always the theory. It’s rarely true.
I ran the rankings before the first call, because I don’t take a client’s word for their own visibility. They ranked in the top three for “dentist” plus city in three of their four markets. They held the map pack in all four. They ranked first for six different implant and Invisalign phrases in their largest market. The traffic was there. Around 9,400 sessions a month across the four location pages and the blog.
So the rankings were fine. Better than fine. Which meant the money was leaking somewhere between the click and the chair.

What was actually wrong
I do every teardown on a phone first. Not an emulator, not a resized browser window. An actual iPhone, an actual Android, on cellular, not office wifi.
The booking widget was a third-party scheduling tool embedded as an iframe. On desktop Chrome it worked. On Android Chrome it worked. On iOS Safari it loaded the header, spun for about four seconds, and rendered a blank white box roughly 600 pixels tall. No error. No fallback. No phone number inside the box. Just white space where the appointment calendar was supposed to be.
Their analytics said 54 percent of sessions came from iOS. Call it half.
Half of nearly ten thousand monthly visitors were arriving at a page that ranked first, reading a headline that promised online booking, scrolling to a white rectangle, and leaving. The site never recorded an error because nothing errored. The iframe was serving a response. It was serving a broken one.
The cause was mundane. The scheduling vendor had shipped an update that set a cookie inside the iframe, and Safari’s cross-site cookie blocking dropped it, and the widget’s script threw inside its own sandbox where nothing in the parent page could see it. This had been true, by my best reconstruction from cached versions, for somewhere between fourteen and nineteen months.
Nobody tested it. Not the agency, not the vendor, not the practice. Every person on that team booked their own appointments through the internal practice management software. None of them had ever been a patient on their own website.
The second problem was smaller in dollars but bigger in wasted effort. The four location pages were the same page with the city name swapped. Same 340 words, same three paragraphs about “gentle, comprehensive care,” same stock hero, same service list. The only unique elements were the address block, the embedded map, and eleven instances of a find-and-replace on the city name. Three of the four pages didn’t name a single dentist who actually worked at that office.
They ranked anyway, because the map pack does a lot of heavy lifting for local dental, and because their citations and reviews were clean. But they ranked at the ceiling of what a duplicate page can reach, and they converted like a page that tells you nothing.

What they were doing right
Their reviews operation was genuinely good, and I told them so before I told them anything else.
Every hygienist had a laminated card at the chair with a QR code that went to the correct location’s review profile. Not a generic one. The correct one. Someone had thought about that. They were pulling 30 to 45 new reviews a month across four offices, averaging 4.8, and the front desk was replying to negative reviews within a day in plain human language rather than corporate boilerplate.
That is the single hardest thing to fake in local search and they had built it without me. I don’t touch systems that work. When a client is doing something well, my job is to keep my hands off it and say so out loud, because otherwise they’ll assume everything I didn’t mention is broken.
Their site speed was also fine. Largest contentful paint under 2 seconds on mobile. The agency deserved credit for that, and I gave it.
What I'd do first, second, third
First: rip out the iframe. Not fix it. Rip it out. I gave them a two-week bridge in the meantime, which was a large tap-to-call button above the fold on every location page with the correct local number, plus a plain HTML form with four fields that emailed the front desk. Ugly, fast, and functional on every device made since 2015. That went live in three days.
Then rebuild booking as a native page on their own domain, using the scheduling vendor’s API rather than their embed. If the vendor doesn’t have an API, change vendors. A booking flow you don’t control is a revenue system you’re renting from someone with no incentive to test it.
Second: real location pages. Each one gets the actual dentists at that office with names and photos, the actual hours including the Thursday the north office closes at noon, the actual parking situation, the insurance plans that office takes, and two or three sentences that could only be written about that building. That is maybe 700 words of genuinely local content per page. Not spun. Written by someone who has stood in the lobby.
Third, and only third: monthly device testing as a standing process. Someone books a fake appointment from an iPhone, an Android, and a desktop on the first Monday of every month and writes the date in a shared sheet. Fifteen minutes. This is the cheapest insurance in the business and almost nobody does it.
A booking flow you don’t control is a revenue system you’re renting from someone with no incentive to test it.
What I declined to sell them
The agency had pitched them a blog program: eight articles a month at $1,400 of the $4,000, covering things like “5 Foods That Stain Your Teeth.”
They asked me whether they should keep it or move it to me. I told them to kill it and hire nobody to replace it. Informational dental content ranks against Mayo Clinic, WebMD, and every dental association in the country, and it converts at close to nothing even when it wins, because a person reading about staining foods is not a person choosing a dentist this week. Four excellent location pages and one working booking flow are worth more than 200 blog posts. I could have sold them a content retainer. I’d rather they spent the money on a hygienist.
I also declined to touch their schema markup in month one. It was incomplete but not wrong, and fixing incomplete schema on a site where half the visitors can’t book is rearranging deck furniture.

What I estimate it's worth
Their average new patient is worth about $1,900 in first-year revenue, which is a number they gave me and which is conservative for a practice doing implants.
Before the fix, they were converting roughly 1.4 percent of location page traffic into a booking request. Their desktop-only conversion rate, isolated, was 2.9 percent. If iOS traffic converts anywhere near desktop after the fix, that’s roughly 45 additional booking requests a month. At their historical 62 percent show rate, call it 28 new patients.
I don’t promise that number. I promise the mechanism. Half your qualified traffic currently cannot complete the action your page exists to produce, and that is fixable in under a week for less than the cost of one month of the retainer they were already paying.
The location pages are a smaller, slower win. Better conversion on pages that already rank, plus some room to move on the two markets where they sit fourth or fifth. I’d budget six months before that shows up cleanly.
The blog cancellation saves $16,800 a year immediately, which is real money that requires no growth at all to realize.
That’s the whole teardown. One broken iframe, four duplicate pages, and a content program funding nothing. The rankings were never the problem. They almost never are.
Want this pointed at your site?
The Revenue Audit tells you what’s actually wrong in two weeks. $3,500, and it’s yours whatever you decide to do next.