Track ad conversions
If you are paying for ads, the platform needs to know when a click turned into a booking. Marketing → Tracking connects Meta and GA4 so that happens without you touching a line of code.
What you need from each platform
Section titled “What you need from each platform”Meta
| Field | Where to find it |
|---|---|
| Pixel ID | Events Manager → Data sources → your pixel |
| Conversions API token | Pixel → Settings → Generate access token |
| Test event code | Optional. Routes events to Test Events instead of live reporting |
GA4
| Field | Where to find it |
|---|---|
Measurement ID (G-XXXXXXXXXX) |
Admin → Data streams → your web stream |
| Measurement Protocol API secret | Data stream → Measurement Protocol API secrets |
Both tokens are write-only once saved — they are credentials, so the app will not show them back to you. Re-paste to change one.
Then turn Conversion tracking on. Off, nothing is loaded and nothing is reported.
Where the scripts actually run
Section titled “Where the scripts actually run”This is the question worth answering precisely, because it is not everywhere.
The scripts are injected on your two public pages only:
- your booking page,
/book/your-business-name - your instant estimator,
/estimate/your-business-name
They are not loaded anywhere inside the app you and your team use, and not on any other page. Your own staff clicking around the dashboard generates nothing.
Two more things about the injection:
- With no ids configured, nothing is injected at all. A contractor who has not set up ads pays no script cost — the tags are not loaded and disabled, they are absent.
- Nothing loads inside the mobile app. The scripts are skipped when the page is running in the native app wrapper.
What gets reported
Section titled “What gets reported”Three events, and each one maps to both platforms:
| What happened | Meta event | GA4 event | Value sent |
|---|---|---|---|
| Booking page submitted | Schedule |
booking_submitted |
The job estimate |
| Instant estimate captured | Lead |
generate_lead |
The quoted price |
| Either page viewed | PageView |
page_view |
— |
The value matters more than it looks. A conversion reported with the quoted price lets the platforms optimise toward the jobs worth having rather than treating a $400 service call and a $14,000 system as the same win.
Why there are two halves, and why you are not double-counted
Section titled “Why there are two halves, and why you are not double-counted”Every conversion is reported twice: once from the browser, once from our server.
That is on purpose. The browser pixel alone loses a large share of paid-ad conversions to ad blockers, iOS tracking prevention and third-party cookie limits — so the platforms want the same event from the server, which nothing on the customer’s device can interfere with. That is what the Conversions API token and the Measurement Protocol secret are for; without them you get browser-side reporting only, which undercounts.
Both halves carry the same event id, which is how Meta and GA4 collapse the pair into one conversion rather than counting it twice. You do not need to configure anything for that.
It cannot break a booking
Section titled “It cannot break a booking”Conversion reporting never fails a customer’s submission. A wrong pixel id, a revoked token, a platform outage — all of it is swallowed and logged. A booking is worth more than its analytics, so the submission goes through and the conversion is what gets lost.
The practical consequence: a misconfigured pixel is silent. You will not see an error in the app; you will see nothing arriving in Events Manager. Which is why the test code exists.
Checking it works
Section titled “Checking it works”- Set the Test event code from Meta’s Test Events tab
- Open your own booking page and submit a request
- Watch it land in Test Events rather than your live numbers
- Clear the test code when you are done
For GA4, the same submission should appear in Realtime within a minute or two.
