Most clinic websites in India already take appointments online. In a sample of 274 clinic sites that Mantis read, 66% had online booking, but 72% ran no ad pixel and 32% had no analytics at all.
If you build or audit websites for clinics, those are the three things worth checking first. You can check them yourself with about 60 lines of Python. This post builds a small script that fetches a page and reports:
- whether the site takes bookings (a widget such as Practo or Calendly, or "Book appointment" wording)
- whether it loads analytics (GA4 or Google Tag Manager)
- whether it loads an ad pixel (Meta pixel or a Google Ads tag)
- whether there is a WhatsApp button
- whether the final URL is HTTPS
The signatures
Every tool leaves a fingerprint in the HTML. A GA4 install loads gtag/js?id=G-.... The Meta pixel loads fbevents.js and calls fbq('init', ...). A Google Ads tag configures an AW- id. WhatsApp buttons link to wa.me or api.whatsapp.com/send.
import re import sys import requests SIGNALS = { "ga4": r"googletagmanager\.com/gtag/js\?id=G-|gtag\(\s*['\"]config['\"]\s*,\s*['\"]G-", "gtm": r"googletagmanager\.com/gtm\.js|GTM-[A-Z0-9]{4,}", "meta_pixel": r"connect\.facebook\.net/[^\"']*/fbevents\.js|fbq\(\s*['\"]init", "google_ads": r"gtag\(\s*['\"]config['\"]\s*,\s*['\"]AW-|googleadservices\.com", "whatsapp": r"wa\.me/|api\.whatsapp\.com/send|web\.whatsapp\.com/send", "booking_widget": r"practo\.com|calendly\.com|zocdoc|setmore\.com|simplybook|appointy|bookmyappointment|lybrate\.com", "booking_words": r"book (an )?appointment|book now|schedule (a|your) (visit|appointment)|request (an )?appointment", } Fetch and check
def fetch(url): headers = {"User-Agent": "Mozilla/5.0 (compatible; clinic-signal-check/1.0)"} r = requests.get(url, headers=headers, timeout=20, allow_redirects=True) return r.url, r.status_code, r.text def check(html): found = {} for name, pattern in SIGNALS.items(): found[name] = bool(re.search(pattern, html, re.IGNORECASE)) found["any_analytics"] = found["ga4"] or found["gtm"] found["any_ad_pixel"] = found["meta_pixel"] or found["google_ads"] found["takes_bookings"] = found["booking_widget"] or found["booking_words"] return found Turn signals into gaps
A list of "found" flags is less useful than a list of gaps, because the gaps are what you would actually raise with the clinic.
def report(url): final_url, status, html = fetch(url) s = check(html) gaps = [] if not final_url.startswith("https://"): gaps.append("no HTTPS") if not s["takes_bookings"]: gaps.append("no online booking") if not s["any_analytics"]: gaps.append("no analytics") if not s["any_ad_pixel"]: gaps.append("no ad pixel") if not s["whatsapp"]: gaps.append("no WhatsApp button") return final_url, status, s, gaps if __name__ == "__main__": for url in sys.argv[1:]: try: final_url, status, s, gaps = report(url) on = [k for k, v in s.items() if v] print(f"{final_url} [{status}]") print(" found:", ", ".join(on) or "nothing") print(" gaps: ", ", ".join(gaps) or "none") except requests.RequestException as e: print(f"{url}: request failed ({e.__class__.__name__})") Running it
pip install requests python clinic_signals.py https://www.olivaclinic.com http://example.com Output (12 November 2026):
https://www.olivaclinic.com/ [200] found: gtm, booking_words, any_analytics, takes_bookings gaps: no ad pixel, no WhatsApp button http://example.com/ [200] found: nothing gaps: no HTTPS, no online booking, no analytics, no ad pixel, no WhatsApp button The first result is a large skin and hair clinic chain: bookings and Tag Manager are on the page, but no pixel shows up in the HTML. That matches the pattern in the wider data: clinics have solved booking, and tracking is the gap.
Limits you should know
- Tag Manager hides things. If a site loads the Meta pixel through GTM, the pixel is not in the raw HTML. "gtm found, no pixel" means "check in a real browser", not "no pixel". To be sure, load the page with Playwright and watch network requests for
facebook.com/trorgoogleadservices.com. - Platforms match themselves. Run it on practo.com and it reports a "booking widget", because the string
practo.comis in Practo's own HTML. Skip directory and platform domains. - Words are fuzzy. "Book now" can appear on a page that only links to a phone number. Treat
booking_wordsas a hint andbooking_widgetas stronger evidence. - Be polite. One request per site, a clear User-Agent, and no crawling of whole sites.
Where the clinic numbers come from
The 66% / 72% / 32% figures come from Mantis, which reads clinic websites at scale with checks like these and publishes the totals by city. You can see them on the list of doctors and clinics in India. The city spread is wide: 96% of mapped clinics in Bangalore have a website, but 33% in Kota and 9% in Morena.
Full data write-up: Two in three Indian clinic websites take online bookings. 72% still run no ad pixel.
Disclosure: I work on Mantis. New accounts get 500 free credits once at signup, no card.

