Skip to main content
Cal.com → MetaIntegration guide

Connecting Cal.com to Meta Conversions API

Cal.com holds the booking and, unusually, will let you self-host and query the database directly. Meta's pixel loses a large share of conversions to Safari, ad blockers and iOS, and the Conversions API exists because of it. The join between them succeeds or fails on one thing: whether the fbc and fbp values reaches the Cal.com booking before the conversion happens, because Meta can only match a conversion it can tie back to a click it recognizes.

Free30 minutesNo obligation

Specific to this pair

Cal.com to Meta CAPI: Schedule events from BOOKING_CREATED

Send Meta's Schedule event from Cal.com's BOOKING_CREATED webhook with hashed email and name, fbc and fbp from hidden booking questions, and an event_id derived from the booking uid. Fire any browser Schedule from the embed's booking-success listener with that ID, not a Cal.com pixel app. Add value for paid types, and send held meetings promptly.

Meta has a standard event built for this pair: Schedule. Fire it from the BOOKING_CREATED webhook with the attendee's email and name hashed, the fbc and fbp values passed into hidden booking questions through prefill parameters, and an event_id derived from the booking uid, so a pixel Schedule fired on your side deduplicates against it.

The cross-origin problem is sharper for Meta than elsewhere, because fbp is a first-party cookie on your domain and the Cal.com embed cannot read it. Without it Meta still matches on hashed email, but Event Match Quality drops. If you run a Meta pixel app inside Cal.com and a server send, the event_ids will not match, since the app knows nothing about your server's id. Run one or the other, or fire the pixel yourself from the embed's booking-success listener on your page, where you control the event_id.

For paid event types, add value and currency to Schedule, or send Purchase when the payment completes. Cancellations cannot be retracted in Meta, so if they are common, send a second custom event when the meeting is actually held and optimize on that, sending it right after the meeting ends with that time as event_time. A weekly batch of held meetings will hit Meta's seven-day limit on website events and lose the oldest.

Cal.com → Meta · what breaks

Why this join usually fails — Cal.com → Meta

  1. 01

    The fbc and fbp values never reaches Cal.com

    As with any hosted booking page, the identifier must be passed on the booking URL and captured into a booking question. Cal.com's routing forms add a second surface that also needs to carry it, and they are commonly missed.

  2. 02

    Routing forms are a second capture surface

    Cal.com routing forms sit in front of the booking and are easy to forget. An identifier captured on the booking page but not on the routing form leaves a hole in exactly the traffic that used routing.

  3. 03

    Double counting from broken deduplication

    Server and browser both fire, the event_id does not match, and Meta counts two purchases. Reported ROAS goes up, the business does not, and it can run for months before anyone reconciles against the store.

  4. 04

    Nothing reconciles afterwards

    Events Manager shows received events, the deduplication state and an Event Match Quality score per event. Events arriving is not the test — deduplicated, well-matched events arriving is. Compare Meta's reported purchases against your store's order count for the same window.

Cal.com → Meta · the fix

What working looks like — Cal.com → Meta

  • The fbc and fbp values on every booking

  • Conversions arriving in Meta

    Events appear in Events Manager with an Event Match Quality score, deduplicated against the pixel, and become usable for optimization and attribution.

  • Reconciled against the source

Cal.com → Meta · architecture

How Cal.com and Meta actually connect

  1. 1

    Cal.com holds the truth

    The booking carries the attendee, the event type, the time and any custom booking-question responses. Self-hosted instances give you direct database access, which makes reconciliation genuinely easy compared with every other booking tool.

  2. 2

    Meta Conversions API needs a click to match

    Meta matches server events to people using whatever identifiers you send, hashed with SHA-256 where required. There is no single mandatory key, which is why quality varies so much between implementations — a poorly matched event is accepted, reported, and worth much less than it appears.

  3. 3

    The identifier is the bridge

    The fbc and fbp values, captured at the visit and carried into the Cal.com booking.

  4. 4

    The event source decides reliability

    Send from your server on the webhook, and handle BOOKING_CANCELLED for reversals. Self-hosted instances can read from the database instead, which is the most reliable option available on any booking platform.

  5. 5

    Deduplication at the destination

    Meta deduplicates on the pair of event_name and event_id. The browser pixel and the server event must send the same event_id for the same conversion, within the deduplication window. Get this wrong and every purchase counts twice — which is by far the most common Conversions API failure and it inflates reported ROAS rather than reducing it.

Cal.com → Meta · normal or broken

Working vs. broken, side by side — Cal.com → Meta

Normal, not a fault

  • The fbc and fbp values present on the booking

  • Sent from the BOOKING_CREATED webhook

  • Deduplicated correctly

    Meta deduplicates on the pair of event_name and event_id. The browser pixel and the server event must send the same event_id for the same conversion, within the deduplication window. Get this wrong and every purchase counts twice — which is by far the most common Conversions API failure and it inflates reported ROAS rather than reducing it.

  • Reconciles with the source

Actually broken

  • The fbc and fbp values missing on most records

    As with any hosted booking page, the identifier must be passed on the booking URL and captured into a booking question. Cal.com's routing forms add a second surface that also needs to carry it, and they are commonly missed.

  • Sent from the browser

    Cal.com routing forms sit in front of the booking and are easy to forget. An identifier captured on the booking page but not on the routing form leaves a hole in exactly the traffic that used routing.

  • Counted twice, or not at all

    Server and browser both fire, the event_id does not match, and Meta counts two purchases. Reported ROAS goes up, the business does not, and it can run for months before anyone reconciles against the store.

  • Nobody has reconciled it

Cal.com → Meta · diagnose

Diagnostic order — Cal.com → Meta

  1. 01

    Count bookings carrying the fbc and fbp values

  2. 02

    Follow one real conversion end to end

  3. 03

    Query recent bookings for the identifier field

    Direct database query on self-hosted, API on cloud. Then repeat for bookings that came through a routing form specifically.

  4. 04

    Read Event Match Quality and the deduplication indicator

    In Events Manager, open the event and check both. A low match quality means weak identifiers; a missing deduplication indicator means your event_id pairing is broken.

  5. 05

    Read the match rate, not the success message

    Events Manager shows received events, the deduplication state and an Event Match Quality score per event. Events arriving is not the test — deduplicated, well-matched events arriving is. Compare Meta's reported purchases against your store's order count for the same window.

Cal.com → Meta · prove

How it gets proven — Cal.com → Meta

Source of truth

Cal.com's bookings list for the same window, with cancellations separated.

  • The fbc and fbp values confirmed present on a live booking.
  • Deduplication confirmed in Events Manager on a real purchase, with the browser and server events visibly paired rather than counted twice.
  • Coverage confirmed separately for direct bookings and for routing-form bookings.

Cal.com → Meta · free audit

What we check in the free audit

  • Count bookings carrying the fbc and fbp values
  • Follow one real conversion end to end
  • Query recent bookings for the identifier field
  • Read Event Match Quality and the deduplication indicator
  • Read the match rate, not the success message

Checked against

Cal.com's bookings list for the same window, with cancellations separated.

Get my free conversion tracking audit

Free30 minutesNo obligation

Cal.com → Meta · when not to buy

When you don't need this — Cal.com → Meta

  • Measure identifier coverage yourself first — pull your last hundred bookings and count how many carry the fbc and fbp values.
  • Self-hosting Cal.com already gives you the data. If you have engineering capacity in-house, this is one of the few integrations a competent developer can genuinely do alone.
  • If you are not running Meta ads at meaningful spend, the Conversions API is effort without payoff. It earns its cost when the optimization signal is worth improving.

Cal.com → Meta · what we deliver

What gets built — Cal.com → Meta

  • Identifier capture into Cal.com

    Add a hidden booking question, append the identifier via Cal.com's prefill query parameters, and verify through the API or directly in the database on a self-hosted instance.

  • Event source: the BOOKING_CREATED webhook

    Send from your server on the webhook, and handle BOOKING_CANCELLED for reversals. Self-hosted instances can read from the database instead, which is the most reliable option available on any booking platform.

  • Dispatch to Meta

    Server-side events to the Conversions API with the event_id matched to the pixel, action_source set correctly, and customer data hashed before it leaves your infrastructure.

  • Reversals where they exist

    BOOKING_CANCELLED and BOOKING_REJECTED both fire with the reference, so reversals are straightforward.

Written guarantee

95%+ tracking accuracy

Measured against Cal.com's bookings list for the same window, with cancellations separated.. Miss it and we keep working at no cost.

Get my free conversion tracking audit

From $400 · See packages

FAQ

Cal.com → Meta questions, answered

Schedule, from the BOOKING_CREATED webhook. Add a separate custom event for meetings actually held if no-shows are high.

Free · 30 min

Get Cal.com and Meta joined properly

Free30 minutesNo obligation