Resources · What Meta and Google do · and what to check on your own account

Conversion tracking for home services: what to send, what never to send, and six things that quietly go wrong

Tell Meta and Google about the booked estimate and the visit that happened, not the form. Here is what each platform needs, and how to set it up in five steps. Then six things that quietly go wrong once it is running, each with the fix.

Tracking By Lovro Lucic · 7 September 2026 · 8 min read

What anyone can know

What conversion tracking is, for a business that sells at the kitchen table

Meta and Google can see the click. They cannot see anything after it unless you tell them. Conversion tracking is the telling: a message back to the platform that says this click turned into something, with enough about the person for the platform to match it to the click it sold you.

The platform reports that message, which is the part you look at, and learns from it, which is the part that costs or makes you money. Every conversion you send is a lesson. Tell Meta that a form fill is the goal and it goes looking for people who fill in forms. Tell it that a booked estimate is the goal and it goes looking for people who book. For a bath remodeler, teach it the appointment on your calendar, and after that, the visit that happened. That is why the setup below sends two events, not one.

Which event your account can learn from

The deepest one it sees often enough. Both platforms need a minimum number of your chosen event before the bidding settles. Under that floor delivery goes uneven, the costs swing, and you conclude the ads do not work.

PlatformWhere it countsEvents it wantsSource
MetaPer ad setAbout 50 per ad set per weekMeta, the learning phase
Google, Target CPA or Target ROASPer campaignAbout 30 per campaign in 30 daysGoogle, Target CPA and Target ROAS

Say you book thirty estimates a month and a bit over half of them happen. That is four or five visits a week. An ad set told to optimise on visits never reaches fifty, so the booking has to carry the account while it is young. The visit that happened is the better lesson, and it becomes the target once there are enough of them. Can Meta learn from your bookings? takes your monthly numbers and tells you which event each platform can learn from today.

What to hand whoever runs your tracking

Two short lists, each point linked to the platform's own page.

For Meta

  • One event name and one id per booking. The browser pixel and the server both report the same booking under the same id. Meta counts it once, as long as the two arrive within 48 hours of each other. After 48 hours the same id is a new booking. Meta, deduplication.
  • The time it happened, not the time you sent it. Meta accepts a website event dated up to 7 days back and drops anything older. That window differs from the 48 hours above, and people mix the two up. Meta, server events.
  • Who the person is. Email and phone, scrambled before sending, are the two strongest keys. Zip helps beside them. The click id your landing page stored is the strongest key of all when it exists. Meta, customer information.
  • A value, only with its currency. Optional. With a value Meta weighs conversions by money; without one, every conversion weighs the same. Until you know what a visit is worth, send no value.

For Google

  • One click id, no more. Google hands out three kinds depending on where the click happened. Your landing page has to catch whichever one arrived and keep it with the lead. File it under the wrong kind and Google refuses it while reporting success, which has its own note. Google Ads, upload offline conversions.
  • One conversion action per event. A booking action and a visit action are two actions. Mark one of them primary, and expect to change which one as your volume grows.
  • The time of the event, with its time zone, set to when the homeowner booked or the visit happened, never to when you uploaded it. Otherwise a retry files it on the day of the outage.
  • An order id, your lead id with a suffix per event, so sending the same event twice reads as the same event.
  • Ask for partial failures. Then a bad row comes back described instead of the whole upload failing without a reason. Google can report success and refuse rows in the same reply, which is a failure with its own note.

How to set it up, in five steps

  1. On your landing page, catch the click ids as they arrive, from both platforms, and store them with the lead and the time it landed.
  2. Decide your two events, the confirmed estimate and the visit that happened, and name them. Use the same names in the browser pixel and on the server.
  3. In Google Ads, create one conversion action per event. In Meta's Events Manager, note your dataset and create a custom conversion on each event name.
  4. Send the booking from the server the moment the estimate confirms: the scrambled email and phone, the click id, the booking time, and your lead id as the event id. Send the visit when you know it happened, with its own id.
  5. Keep a record of which sends the platform accepted, and read it every week. Everything that record cannot see is the second half of this page.

What goes wrong once it is running

Six things that quietly go wrong, and the fix

What follows is not on any platform's page. Six things go wrong in a conversion pipeline that looks healthy. Two of them show up in the numbers. The other four show up nowhere until somebody goes looking. Each has its own note with the full account.

1. A moved appointment counted as two bookings

A homeowner books, then moves the visit eight days later, and the system sends the same booking again under the same id. Meta's 48 hours have passed, so it counts a second booking. Ads Manager says two, and the bidding learns that a no-show who rebooked is worth double. The fix is not a counter. It is to send only when your own record shows the platform has not already accepted that booking. The note.

2. A booking that left and never arrived

Most systems send the conversion once, in the same breath as the booking. A busy moment loses it without a sound: of two bookings minutes apart, one is accepted and the other meets silence. Nothing says which. The fix is a sweep that resends what your record owes, with the real booking time, and stops at 48 hours, because past that a resend of a booking that did land becomes a second one. The note.

3. A cancelled booking a sweep would have sent forever

A homeowner cancels 32 seconds after confirming, before anything has gone out for it. A sweep looking for "confirmed and never sent" then tells Meta about an appointment that no longer exists, every time it runs. A conversion is a lesson; send one for a cancellation and the ads go looking for people who cancel. The rule: only what is true today gets sent. The note.

4. The opt-out that only stopped half of the tracking

The homeowner's "do not sell or share" choice stops the browser pixel and nothing else. The server never looks at it and keeps sending the same person's scrambled phone and email with every booking. Both halves have to read the opt-out on every send, and record it against the person, not the one visit. The note.

5. Every client's bookings in one Meta dataset

An agency-style setup usually gets Google's side right per client, because a customer id is required, and reads one Meta dataset for everyone. Add a second client and their bookings go into the first client's account, so one company's ads learn from another company's customers. The dataset belongs on the client's own record, and a client without one sends nothing rather than sending to the wrong place. The note.

6. A value in the wrong currency

The value per visit goes out with the currency fixed to dollars in the code while the value itself is read from the client's row. A company working in forints would send 1,400,000 per visit. As dollars, that tells the bidding one visit is worth more than a decade of spend. A money figure is a pair; the currency has to travel with the value, and no value beats a wrong one. The note.

What a retry is for

A retry sends a booking that a busy moment lost. It sends what your own record owes, oldest first, with the real booking time, and never later than 48 hours after it. Past that, a resend can only create a duplicate, and one booking counted twice is worse than one missed.

What this does not cover

  • Google's enhanced conversions for leads, which match on email and phone without a click id. A different mechanism with its own consent questions.
  • Phone call tracking. This labels the appointment, not the call; a caller is a weaker lesson than a booker.
  • Taking a conversion back after it landed. Google can; Meta cannot without a mess, which is why point 3 above is a rule about what to send.
  • Any number above as a promise. The floors are the platforms' guidance; your own numbers will show what your account does.

Questions owners ask

Do I need both the browser pixel and the server send?

Yes, with the same id on both. The browser carries facts the server cannot; the server survives ad blockers and closed tabs. The shared id stops the two from counting as two.

Should the conversion be the booking or the visit that happened?

Both, as two events, and let volume decide which one the bidding optimises on. A young account cannot reach the platform floors on visits alone, so the booking carries it. The visit is the better lesson and becomes the target once there are enough of them.

Why does Ads Manager show more bookings than my calendar?

One of two things, in most cases. A moved appointment went out again after Meta's 48 hour window. Or a retry that read history instead of today sent a cancelled booking. Count one conversion per appointment, dated at the first confirmation. Only resend what the platform has not already accepted.

What happens when a homeowner opts out?

Nothing goes out, on either platform, from the browser or the server. Read the opt-out on the server as well as in the page, and record it against the person so a later visit from another device still honours it.

How long after the click can you still report a conversion?

On Meta, you can date an event up to 7 days back, and a resend under the same id only stays safe inside 48 hours. On Google, it lands if it falls inside the window set on the conversion action, keyed by the click id. Either way it must carry the time of the event, not the time of the upload.

Can I send a value with the conversion?

Only with its currency, read from the same place as the value. If you do not know what a visit is worth, send no value and let every conversion weigh the same. A value in the wrong currency is a bid off by a hundred times, not a rounding error.