The practice was getting traffic. It was not getting appointments.
The goal was more calls and appointment requests from existing traffic, without raising ad spend. The problems turned out to be specific and fixable. On mobile, the primary booking CTA was not sticky, so anyone who decided halfway down the page had to scroll back to the top to act. The homepage hero had several content blocks competing for attention and no clear value proposition. The doctor’s credentials sat below the fold. There was no social proof anywhere on the homepage. And performance was poor enough to be costing visitors before the page finished rendering.

A structured CRO and UX audit produced 16 issues, sorted into critical, high-priority, and medium-priority. Five were critical, six were high-priority engagement gaps, five were medium-priority refinements. That ordering is what made the work sequenceable: the items that touched the booking path got fixed first, and the polish waited.
Client approval gated each round. Later rounds were driven by recorded session behavior rather than opinion, once analytics were in place to supply it.

Put the phone number one tap away. Added a sticky mobile CTA plus a floating click-to-call control, and moved the number into the sticky header on desktop. For a single-location practice, the phone is usually the highest-converting element on the site.
Standardized every button around one action. The site carried a mixed set of “Contact Us” labels pointing at inconsistent destinations, including one that said Contact and opened a form instead of scheduling. All of it was consolidated into a single “Request an Appointment” action, with a short reassurance line beneath it.
Rebuilt the top of the homepage. Redesigned the banner, moved the doctor’s introduction and credentials above the fold, added a contact form to the hero, and lifted the second-opinion section up from the menu onto the page.
Built seven new pages. Five condition-specific service pages covering bunion correction, heel pain management, ankle sprain rehabilitation, pediatric podiatry, and diabetic foot care, each with an embedded contact form so a visitor can convert without leaving. Plus a dedicated plantar fasciitis landing page for high-intent search, and an Insurance and Coverage page added to the main navigation.

Made insurance answerable before the call. Insurance details had been buried in the FAQ. Replaced a vague “contact us to verify” line with a grid of accepted carrier logos, added In-Network copy, and kept a “don’t see your plan” prompt for the exceptions.
Followed the client’s read on social proof, then found the better asset. Google testimonials went up first and came down at the client’s request. The practice’s own ZocDoc profile carried roughly 3,000 reviews, a far stronger trust signal for a medical practice, so those were integrated across the homepage and service pages and the Yelp widget was retired.
Ran a full performance pass. CSS and JavaScript minification, image optimization, caching configuration.
Investigated the unidentified script on the site. The audit flagged a beacon script nobody could account for. It turned out to be a legitimate click-fraud and bot-detection tool, behaving as designed. Sucuri and Google Safe Browsing scans came back clean and no injected redirects were found. One real finding did come out of it: two-factor authentication was off for admin users, and we recommended turning it on.
Fixed the measurement before trusting it. Google Ads, GA4, and Tag Manager were all firing, but conversions were being counted twice, because three separate forms shared one thank-you page. We identified the cause and flagged that until it was corrected, the reported numbers should be read as roughly double the true figure. Call tracking was confirmed at a 180-second threshold, so a misdial no longer counts the same as a real patient call.
Installed session recording and acted on what it showed. Microsoft Clarity surfaced two mobile issues that no audit had caught: the sticky call CTA appeared above the fold where a call CTA already existed, cluttering the view, and the live chat label overlapped page content while scrolling. Both were fixed.

Real-world load time of approximately 2 seconds, with GTmetrix and Pingdom scoring 60 to 70 after the first optimization round. Worth naming the caveat: PageSpeed Insights, which simulates a throttled network and a constrained device, still scores lower than the field measurements. Both readings are true, and they measure different things.
The starting position was genuinely poor. PageSpeed Insights recorded 55 on mobile and 33 on desktop, with Largest Contentful Paint at 16.3 seconds on mobile and 7.9 seconds on desktop, against a 2.5-second recommendation. Desktop Total Blocking Time was 16,350ms. Page weight ran 3.5 to 3.8 MB.
Seven new pages published, each with a direct conversion path. Five condition-specific service pages, a plantar fasciitis landing page, and an Insurance and Coverage page. Every one carries an embedded form, so a visitor arriving from search on a specific condition never has to navigate to convert.
One appointment action across the whole site. A scattered set of buttons with inconsistent labels and destinations became a single consistent request, which removes decision points from the booking path and makes the tracking meaningful.
Measurement that can be trusted. Conversion double-counting diagnosed and its cause identified, call tracking verified at a three-minute threshold, and session recording in place so the next round of changes comes from observed behavior rather than assumption.

Tools & technologies
verified