A GLP-1 directory where the verified badge is checked against the state licensing board.
Search for a GLP-1 clinic near you and you get pages of listings nobody checked, ranked by whoever paid the most. We built the opposite. Every clinic here was found in the federal provider registry, then confirmed by crawling its own website for evidence it offers this care. In the states that publish a licensing registry, a named clinician is matched to an active credential before the badge appears.
Sponsorship can move a listing. It cannot create a verified badge.
The live homepage. The counter under the search box is read from the database, not typed into the design. Click to enlarge.
Counts from the published July 2026 build. Coverage grows state by state, and each state ships only after its verification pass finishes.
The Challenge
GLP-1 medications became one of the most searched health topics on the internet in about eighteen months, and the directories that appeared to meet that demand mostly work the same way. A list of businesses gets scraped, every entry gets a badge, and the top slot goes to whoever pays for it. Nothing in that process confirms the clinic offers GLP-1 care, and nothing confirms a licensed clinician works there.
That matters more here than in most categories. Someone comparing weight-care clinics is about to share their medical history and a payment method with a practice they found in a list, and the list gives them no way to tell a physician-led clinic from one that added the service last quarter. The clinics doing it properly get no credit for doing it properly.
So the brief set a harder bar. Verified had to mean something a reader could go check themselves, the money and the editorial calls had to be separated in the data model rather than in a disclaimer, and every claim on a listing had to trace back to a source. The open question was whether that survives contact with real data at national scale.
Five gates between a federal registry row and a published listing.
None of the interesting work is on the page. It is in the pipeline that decides what earns a page in the first place. A record has to clear all five of these gates, in order, and the ones that fail are kept along with the reason they failed.
Start with the federal registry
NPPES, the national provider registry, is the discovery pool. We filter it to obesity-medicine and endocrinology taxonomy codes and drop surgical practices. That leaves 15,823 unique NPIs: 4,258 organizations and 11,565 individual practitioners. Not one of them is a confirmed GLP-1 clinic yet, and the pipeline is built to never pretend otherwise.
Find the practice's real website
A registry record gives you a name and an address, not a URL. Google Custom Search resolves each record to a likely official site, following redirects to the canonical origin. Discovery is append-only and resumable by NPI, so rerunning a batch never repeats a paid search, and every match score and alternative is kept for auditing.
Crawl the site for actual evidence
A Playwright crawler reads the practice's own pages and looks for explicit GLP-1 service evidence on a non-blog page. An educational blog mention does not qualify. Every audit row keeps the visited URL, the matched terms, short evidence snippets, and the crawl timestamp. The crawler honors robots.txt and does not touch CAPTCHAs or access controls.
Check the clinician against the state licensing board
This is the expensive step, and it is the one the badge actually rests on. Where a state publishes a queryable registry, we take the clinician named on the clinic's site and match them to an active credential in the public record: data.wa.gov in Washington, the Department of Consumer Affairs in California. The listing keeps the credential number and the registry URL it was matched against.
Publish through a human review queue
Nothing goes live automatically. Candidates land in an admin queue where an editor publishes, holds, or suspends them. Publishing runs against the development deployment first, and a release script snapshots production and shows the diff before writing a single row.
Two tiers, because the states are not the same.
Washington publishes its credential data through data.wa.gov. California publishes through the Department of Consumer Affairs. In those states a clinic cannot be marked verified until a clinician named on its own website is matched to an active credential in that registry, and the listing records the credential number and the source URL used to match it. Across the directory that is 382 clinicians on 229 listings.
Oregon and Arizona have no queryable registry, and Arizona's MD, DO, NP, PA, and NMD boards each run their own. In those states a name matched to an active federal registry record publishes as a researched listing and the verified badge stays off. The directory keeps that difference visible instead of flattening it, so 292 of the 521 listings say on their face that they are researched but not license-verified.
Six physicians on one Glendale, California listing, each matched to an active credential in the state registry. The badge sits on the clinician it belongs to, not on the business.
A clinician check, not an endorsement
The verification page says out loud what the badge does not mean. It raises the floor for inclusion. It does not promise that a clinic, a medication, or a program is right for a particular person, and it never substitutes for a conversation with a clinician. In a category this heavily regulated, saying what you are not claiming matters as much as what you are.
Every fact on the page came from somewhere, and the page will tell you where.
A listing opens with the five things that decide whether it is worth a phone call: the medications the clinic names on its own site, whether care is physician-led, in-person or telehealth, insurance, and the real monthly price range. Below that sit the program tiers, the named care team with credential status, and a contact form that requires explicit consent before any detail reaches the clinic.
An unclaimed listing. The clinic has not touched this page, which is exactly why the badge at the top says so.
Claimed and unclaimed are different states
A clinic that has never heard of us still gets an accurate page, labeled unclaimed. Owners claim through a flow that verifies them by email domain, website control, or professional license document, and only then can they edit.
Consent before contact
The contact form will not submit without an explicit agreement to share the visitor's details with that specific clinic. The consent is stored with the lead, and the ZIP and email are validated server side.
Reviews that survive scrutiny
Patient reviews go through email verification with an expiring token before they publish, and the evidence behind each one is stored separately from the review text.
Prices as ranges, not teasers
Program tiers are listed individually with what each one includes, so a $25 membership does not get to look like the price of treatment.
The revenue model is designed so that buying it cannot corrupt the data.
The usual fix for this is a disclosure paragraph at the bottom of the page. Here the separation is enforced in the schema instead. Sponsorship is a placement record on a market, priced per metro or per state through Stripe. Verification is a status on a clinic, set only by the license audit.
Nothing in the billing path can write the verification field, and the online-provider methodology assigns sponsorship a literal zero points out of 100.
The membership product is drawn the same way. Any published clinic can receive a patient message whether or not it pays, and what the Featured membership buys is the ability to read that message in the dashboard. A clinic that has never paid a dollar still appears, still ranks on the evidence, and still gets the lead.
The Washington hub. Note the spotlight copy directly under the stats: a featured clinic "is held to the same evidence as every other listing," and promotion "does not create verification status." That disclosure sits on the page, not three clicks away in a policy document.
A ranking that shows its arithmetic.
Alongside the local directory, 20 national telehealth programs are scored out of 100 on a published formula: 55% program evidence, 25% cross-source customer ratings, 12% complaint history, 8% a dated community survey. Tiny review samples get pulled toward neutral and only reach full weight at 1,000 reviews.
The parts that matter are the tie-breaks. When two substantial review sources sharply disagree, the score loses points rather than quietly picking the flattering one, and a missing review match is disclosed as incomplete evidence instead of scored as good news.
"See the price that keeps billing." The whole comparison exists to separate the introductory offer from the number that hits the card every month afterward.
The rules that keep it defensible
- A complaint is an allegation, not a finding. Complaint records are labeled as consumer accounts, the two reporting systems are distinguished, and the source is linked so a reader can check it.
- The profile has to match the domain. Lookalike names and unrelated domains are never merged into a provider's reputation score.
- Every review is dated. Programs in this category change monthly, so each one carries the date it was last researched.
- Corrections are welcome, edits are not for sale. Providers can send corrections; the editorial side decides how a verified change affects the score.
Thirteen explainers, and a coverage dataset where every line carries its source.
People do not search for a clinic first. They search for whether semaglutide and tirzepatide are different, what compounded actually means, and why their insurance said no. The Learn library answers those questions on their own pages, which is also how the directory earns the traffic that reaches the listings. It is the same approach we run for the clinics themselves in our weight-loss clinic SEO work.
The state coverage data is the strictest part of the whole codebase. Every Medicaid coverage claim carries the source URL, the name of the policy document, and the date a human last read it, and the file header forbids adding a line without one. Coverage policy here changed repeatedly through 2025 and 2026, so a fact with no date attached is a liability, not content.
The Technical Edge
The whole thing is one custom application wearing a directory's clothes. Static where static is faster, live where the data genuinely changes, and nothing in between.
Fully prerendered Astro
There is no server rendering anywhere. All 745 URLs in the sitemap are built ahead of time and served from Cloudflare's edge as static assets, so a listing page opens instantly on a phone in a waiting room.
Convex for everything live
Claims, reviews, leads, placements, and the editorial queue run on Convex, reached straight from the browser. The static pages stay static; only the parts that genuinely change ship JavaScript.
React islands, not a React app
The claim flow, dashboard, account settings, and review widgets are React components hydrated individually. The 500 listing pages around them are plain HTML.
The admin is its own Worker
The editorial dashboard is a separate bundle on a separate Worker with its own config. None of it is reachable from the public site's JavaScript, and the admin bootstrap mutation is internal and cannot be called from a browser.
Auth and payments done properly
Better Auth handles clinic owner accounts; Stripe handles sponsorships and memberships with webhook events recorded idempotently. Secrets live in the deployment environment, never in the repo.
Canonical URLs the edge agrees with
Trailing-slash handling is resolved at the Cloudflare layer so that every canonical URL the site emits resolves directly, without a redirect hop. Small detail, and it is the difference between a clean crawl and a wasted budget.
Every one of these exists because something went wrong once.
A directory at this scale fails quietly. A clinic gets published twice, a clinician gets split into three people, a state hub builds at the wrong path, and nobody notices for a month. So the checks that catch those things run on every build, and they fail it.
The build fails when one clinic publishes twice
A duplicate-listing audit runs as part of every build. It found four clinics the directory was publishing under two slugs and 47 listings with the same clinician recorded several times. Now a duplicate is a failed build, not a support ticket.
The backend contract is fingerprinted
Convex function signatures and validators are hashed into a generated contract file. A test compares that fingerprint against the live deployment, so a frontend that expects an argument the backend no longer takes fails in CI instead of on a patient's screen.
Every internal link is audited
A link audit walks the built HTML and fails on anything pointing at a route that does not exist or that only resolves through a redirect. It is the reason a 745-URL sitemap can be trusted without hand-checking it.
One definition of every state
A duplicated state map once routed Arizona's listings to /az/ while its hub built at /arizona/. The state configuration now lives in exactly one module that both the verification runner and the expansion script import.
See it live
The fastest way to judge a directory is to open a listing and try to find something it is hiding. Start with a state hub and drill down, or go straight to the pages that explain the rules.
The hard part of a directory was never the design. It is deciding what you refuse to publish, and then building the pipeline that enforces that decision when there are 15,000 candidate records and an obvious shortcut sitting right there.
GLP-1 Clinics Nearby publishes 521 clinics out of that pool, marks 229 of them verified against a state licensing board, says plainly which ones are not, and structures its own revenue so that a sponsor cannot change either number. That is the whole product.
Related work: Hakia, the semantic search engine we built for degree programs, and Asymmetric Health, a GLP-1 and hormone clinic whose site and search program we run.
Building something where the data has to be right?
Directories, marketplaces, and comparison sites live or die on the pipeline behind them, and we build both halves. Tell us what you want to publish and we will walk you through what it takes to make it hold up.
Start Your Project