Work Omnia Physical Therapy

Where the lead pipeline is the product

The pages were never the hard part. The work was the path from a paid click to a contact the clinic can actually follow up on, recorded accurately enough that the advertising spend can be judged against it.

Role
Sole developer — build, CRM integration, and ongoing Google Ads
Stack
Next.js 16 · React 19 · TypeScript · Tailwind CSS · Sanity · GoHighLevel · GA4 · Google Ads · Vercel
01

Resolve by name, not by id

Submissions are normalized and upserted into the CRM, then an opportunity is opened in the intake pipeline. Pipelines and stages resolve by name rather than by hardcoded id, so renaming or reordering a stage surfaces as a clear failure instead of quietly filing leads wherever an old id still points.

Upsert rather than create: a repeat enquiry updates one contact instead of littering the CRM with duplicates of the same person.

02

An API that accepts your mistakes

The CRM accepts an unrecognized custom-field key with a 200 response and silently discards the value — so a typo looks exactly like success while losing the data. Every field key is copied from the CRM's own settings rather than guessed, and the reasoning is documented at the point of use so the next person does not have to re-learn it.

The API version header is equally unforgiving: the documentation and the live sub-accounts disagree about which value is current, so the integration tries the documented one and falls back once.

03

Double-counted conversions corrupt the bid signal

The conversion event on the paid-traffic landing page is guarded by a module-level flag, so a double submit or a re-render cannot report the same lead twice.

This matters more than it sounds. An inflated conversion count is worse than a missing one, because the Ads account optimizes bids against that signal — a number wrong in the optimistic direction quietly spends more money for fewer real leads.