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.
What anyone can know
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.
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.
| Platform | Where it counts | Events it wants | Source |
|---|---|---|---|
| Meta | Per ad set | About 50 per ad set per week | Meta, the learning phase |
| Google, Target CPA or Target ROAS | Per campaign | About 30 per campaign in 30 days | Google, 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.
Two short lists, each point linked to the platform's own page.
What goes wrong once it is running
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Want to see how your own ads read?
Send us your Facebook page and within a day a person sends back what you are running, the button on it, whether your page can book a time, and your offer next to your competitors'. Free.