WHA Docs
Measurement

Conversions

How named events become GA4 key events and Google Ads conversions, the conversions WHA counts, and the boundary of what's measurable.

Event Tracking covers how the site emits events. This page covers what happens next: how those events become conversions in GA4 and Google Ads, which ones WHA counts, and where the measurable funnel ends.

Destinations

FreshPaint is the tag layer. The site emits clean, named events to FreshPaint, which forwards them to three integrations:

DestinationRole
Google Analytics 4 (proxy)Behavioral analytics; the source for key events that Google Ads can import
Meta Conversions APIPaid-social conversions
Google AdsSEM conversions

GA4 and Meta are downstream of FreshPaint, not direct adapters — see the adapter and consent model.

Making an event a Google Ads conversion

There are two ways an event becomes a Google Ads conversion:

  1. Import from GA4 — Ads pulls in a GA4 conversion. The event has to exist in GA4 and be marked there as a key event, with GA4 and Ads linked. If it isn't a GA4 key event, Ads won't let you select it.
  2. Add a transformation in FreshPaint — assign a conversion_label to the event and send it to the Google Ads integration. FreshPaint posts the conversion to Ads directly; GA4 isn't involved.
    1. Create (or open) the conversion action in Google Ads: Goals → Conversions → new conversion action. Google gives you a Conversion ID and a conversion label. For a conversion that already exists, the label already exists — reuse it.
    2. Add a transformation in FreshPaint: on the event you want to count (e.g. schedule_an_appointment_complete), add a Modify Data transformation → Send Constant Property conversion_label = <the label>, targeting the Google Ads integration.

Pick one path per conversion — never both. A single event sent to Ads both as an imported GA4 key event and a FreshPaint conversion_label transformation counts twice and inflates bidding signal. When repointing a conversion, retire the old path as you wire up the new one.

To revive a dead conversion, reuse the same label the dead event carried — attach it to the live named event, and the existing Ads conversion action keeps counting from the new trigger. No new conversion action needed in Ads. (See the migration to-do list for the conversions that currently need this.)

What WHA counts

The booking funnel and CTA events the theme emits in code are the stable backbone, preferred for any conversion the theme already fires because they survive redesigns and carry useful properties. The highest-value ones:

  • schedule_an_appointment_complete — the booking handoff to MyHealth. This is the primary appointment conversion (see the boundary below).
  • cta_click (with type), phone_call, directions, form_submit — intent signals usable as secondary conversions.

See Event Tracking for the full event list and their properties.

Filtering to one service? The event stores the service as an ID, not a name. Look it up in the visit-types list — each entry's term_id is the value to match type_id against.

Match on path or named event, never full URL. Exact full-URL matches ($current_url Equals …) silently exclude paid traffic carrying ?gclid= / UTM params. Define URL-rule events on path, not the full query string.

Where measurement ends

Measurement boundary

Appointments are booked on MyHealth, a separate system on another domain, and that booking data isn't available. The booking handoff (schedule_an_appointment_complete) is the furthest we can measure. Treat it as "reached the booking handoff," a strong intent signal, not a confirmed visit. Define conversions on handoffs + tracked calls + key form submits, not on booked appointments. Measuring true booked appointments needs data from MyHealth itself.

Conversions reflect the consented subset only. A booking handoff or call from a visitor who declined analytics is kept in the first-party log but not forwarded to GA4 / Ads so conversions rates will be below true activity. See Consent for how the gating works.

On this page