A systematic review of 105 studies found that the average healthcare appointment no-show rate sits around 23%. That number comes from healthcare, but if you're running any appointment-based funnel (demos, consultations, in-person meetings), you're carrying a version of the same gap. And if your Google Ads account counts "booking confirmed" as a conversion, your cost-per-acquisition is lying to you by roughly that margin.

The fix isn't complicated in concept: track the appointment that actually happened, not just the one that got scheduled. In practice, it's a data-quality project that touches your forms, your CRM, your booking tool, and your upload pipeline.

Bookings and Attendance Are Two Different Signals

A booking is a lead signal. An attended appointment tells you demand was realized. Optimizing ad spend to bookings alone biases your budget toward channels that generate high booking volume without necessarily producing visits or downstream revenue.

The operational move: create two separate conversion actions in Google Ads. One for "appointment booked," one for "appointment attended." Keep both visible in reporting, but choose which one your bidding strategy optimizes toward. For most teams with enough volume, attendance is the better primary goal because it excludes no-shows and cancellations.

There's a real trade-off. If your appointment volume is low or your sales cycle is long, optimizing directly to attended appointments may starve the algorithm of conversion signals. In that scenario, track bookings for faster feedback loops while using attendance data for quality reporting and periodic optimization shifts.

The Identifier Chain That Breaks in Every Handoff

Google Ads needs a way to connect the ad click to the offline outcome. The standard method: capture the Google Click ID (GCLID) via auto-tagging and store it alongside the lead record in your CRM. When the appointment happens (or doesn't), you upload that outcome with the GCLID attached.

Sounds clean. In reality, the GCLID gets lost constantly. Redirects strip it. Separate booking domains drop the parameter. Spreadsheet transformations alter capitalization (GCLIDs are case-sensitive). A CRM merge kills the field. By the time the appointment is marked "attended" three weeks later, the identifier tying it to the click is gone.

The diagnostic: follow a complete booking journey with your developer. Click an ad, submit the form, open the saved CRM record, and trace the GCLID across each handoff. A populated hidden field on the landing page only proves collection worked at the start; you need it intact at the end.

Enhanced Conversions for Leads: Insurance, Not Magic

Google's Enhanced Conversions for Leads (ECL) adds a second matching layer. Instead of relying solely on the GCLID, you also pass hashed first-party data (email, phone) that Google matches against signed-in Google accounts. Google reports that advertisers using first-party data alongside GCLIDs saw a median 10% increase in conversions versus standard offline imports.

That median isn't guaranteed. ECL requires SHA-256 hashing with specific formatting: emails must be lowercased and trimmed; phone numbers need E.164 format. A formatting mismatch produces a hash that won't match, and you'll never get an error message telling you why. The failure is silent. Google provides a diagnostics report for ECL that surfaces missing identifiers and upload errors. Check it after every import.

Upload Discipline Determines Whether Any of This Works

Offline conversion imports require operational rigor most teams underestimate. Upload promptly after the offline event occurs. Use consistent conversion actions and timezones. Correct discrepancies when they surface rather than letting rejected events accumulate silently. If your front desk marks appointments complete two days late, your "daily" upload is still carrying stale data.

Validate the import before changing any bidding strategy. Inspect rejected events and their reasons. Route missing or malformed fields back to the source owner. A completed upload job doesn't mean every event was accepted.

The Hypothesis You're Testing

If you separate "booked" from "attended" as distinct conversion actions and optimize bidding toward attended appointments, then cost per qualified pipeline stage should decrease because you're removing no-shows and cancellations from the signal the algorithm uses to find more people like your converters.

Success: cost per attended appointment decreases or holds steady while attended volume remains stable. Guardrails: booking volume may drop (expected, not alarming). Stop-loss: if attended appointment volume falls more than 30% over two weeks with no corresponding quality improvement, revert to booking-based optimization and investigate data coverage gaps by location.

Industry benchmarks for no-show rates (often healthcare-derived) can mislead non-healthcare models. Compute your own show rates by channel, location, and appointment type before assuming the 23% figure applies to your funnel. Offline conversion tracking looks like an ads feature. It's actually a data-quality project that forces alignment on definitions, timestamps, deduplication, and identifier hygiene across marketing, ops, and the front desk. The teams that get it right don't just report better numbers. They stop arguing about whether the numbers mean anything.