Conversion tracking for self-hosted Easy!Appointments
Easy!Appointments is open source and runs on your own server, which removes the problem most hosted schedulers have: the booking pages can live on your own domain or a subdomain, inside your cookie scope. Since v1.4 a GA4 Measurement ID entered in settings loads on every public booking page, and v1.5 added Matomo. Neither tells Google Ads or Meta about a booking, and when the app is iframed into WordPress from a different host, much of the advantage of self-hosting is lost.
Free30 minutesNo obligation
Easy!Appointments · what breaks
What goes wrong on self-hosted Easy!Appointments
- 01
Booking app on a different host from the site
An iframe from another domain cuts off your cookies, even though you control both.
- 02
GA4 configured, ads still blind
The built-in Measurement ID gives you analytics, not Google Ads or Meta conversions.
- 03
Funnel steps without a confirmed booking
Step views in GTM don't prove the appointment was saved.
- 04
Upgrades overwrite custom code
Tracking patched into core files disappears with the next release.
Easy!Appointments · the fix
What self-hosting makes possible — Easy!Appointments
Bookings sent from the database, not the browser
Your server knows an appointment exists the moment it is saved.
Booking pages served first-party
On your domain or a subdomain, with no iframe crossing hosts.
Tracking that survives upgrades
Kept outside core files, so a new version does not break it.
Easy!Appointments · architecture
What Easy!Appointments actually lets you do
Self-hosting changes what is possible. Here is what the project documents and what is yours to check.
- 1
GA4 Measurement ID in settings
From v1.4, applied to all public booking pages under Settings > Integrations.
- 2
Matomo tracking
From v1.5, with a tracker URL and site ID; useful if you avoid Google for analytics.
- 3
Funnel tracking through GTM
Described on the project's blog for following visitors through the booking steps.
- 4
Your own server and database
Appointments are stored where you can read them, which is the basis for server-side conversions.
- 5
Check whether your version offers webhooks
If it does, they are the cleanest trigger; if not, a scheduled read of the database does the same job.
Easy!Appointments · diagnose
Debugging an Easy!Appointments install, in order
Self-hosted setups tend to break in ways only the person who installed them knows about, so the checks start with the install itself.
- 01
Check which version is running
GA4 support needs v1.4 and Matomo needs v1.5.
- 02
Check where the booking pages are served from
A different domain inside an iframe explains most missing conversions.
- 03
Look for tracking edits in core files
They are often what stopped working after an upgrade.
- 04
Compare the appointments table to reported conversions
Per row, over a closed window.
- 05
Check that customer details never reach analytics
Name, email and phone are typed on a page your tags can read.
Easy!Appointments · prove
The QA evidence — Easy!Appointments
Done on your live install, with a real appointment saved to the database.
Source of truth
The Easy!Appointments appointments table: booked and cancelled, by date and service
- A booking made from an ad-tagged URL, with the click identifier stored alongside the appointment.
- The server-side conversion confirmed once per appointment, deduplicated with the browser.
- Booking pages confirmed on your own domain with first-party cookies set.
- Customer details confirmed absent from GA4 and Matomo hits.
- An appointment deleted or cancelled in the admin panel shown to retract its conversion.
- Reconciled per appointment against the database over a closed window.
- Re-run after the next Easy!Appointments upgrade, and 30 days later.
Easy!Appointments · free audit
What we check in the free audit
- Check which version is running
- Check where the booking pages are served from
- Look for tracking edits in core files
- Compare the appointments table to reported conversions
- Check that customer details never reach analytics
Checked against
The Easy!Appointments appointments table: booked and cancelled, by date and service
Free30 minutesNo obligation
Easy!Appointments · when not to buy
When you don't need this on Easy!Appointments
If you self-host your booking app, you may be able to do this yourself. Here is when you should.
- If you only need booking analytics, the built-in GA4 or Matomo setting does that with no extra work.
- If you are not running paid ads, server-side conversions solve a problem you don't have.
- If you are comfortable with PHP and GTM, sending a booked appointment from your own server is within reach, and we will happily say so.
- If bookings are low enough that you know every new client personally, a monthly look at the database may be all the attribution you need.
Easy!Appointments · what we deliver
The event map on Easy!Appointments
Service selected
First funnel step: which service and provider the visitor picked.
Date and time chosen
Second step. Drop-off here usually points at availability, not ads.
Customer details entered
Third step. Nothing typed here goes to analytics.
Appointment booked
The conversion, sent from the server, with the service price as value where you have set one.
Appointment cancelled or rescheduled
Cancelled reverses; rescheduled does not.
Written guarantee
95%+ tracking accuracy
Measured against The Easy!Appointments appointments table: booked and cancelled, by date and service. Miss it and we keep working at no cost.
From $400 · See packages
FAQ
Easy!Appointments questions, answered
Yes, from v1.4: you enter a GA4 Measurement ID in the integration settings and it loads on all public booking pages. That is analytics, not ad conversions.
Yes, v1.5 added Matomo with a tracker URL and site ID. Ad conversions still have to be sent to Google and Meta separately.
On your domain or a subdomain of it, yes. Self-hosting lets you keep it inside your cookie scope, which an iframe from another host undoes.
Not if it lives outside core files. Edits to core get overwritten, which is the most common reason Easy!Appointments tracking stops.
From your own install: the appointment record your server saves, via webhooks if your version has them or a scheduled read of the database.
More on Easy!Appointments
- Birdeye AppointmentsConversion tracking for Birdeye Appointments
- GoDaddy Online AppointmentsConversion tracking for GoDaddy Online Appointments
- Odoo AppointmentsConversion tracking for Odoo Appointments
RELATED GUIDES
Booking tools beside Easy!Appointments, and what their bookings feed
- MotoPress Appointment BookingConversion tracking for MotoPress Appointment Booking
- FluentBookingFluentBooking conversion tracking that reaches your ad accounts
- Hostinger Website BuilderConversion tracking for Hostinger Website Builder bookings
- Meta · PhotographyMeta Ads conversion tracking for photography businesses
- Google Ads · PhotographyGoogle Ads conversion tracking for photography businesses
- Meta × Appointment SystemHow to reconcile Meta Ads against your practice or scheduling system
- Meta · Lead → booked callHow to track lead to booked call for Meta Ads
- PhotographyConversion tracking for photographers, measured in booked shoots
Free · 30 min
Get Easy!Appointments tracking done properly
Free30 minutesNo obligation
