Google Analytics 4
ga4Google Tag Manager
gtmGoogle Ads
googleAdsMeta Pixel
metaPixelTikTok Pixel
tiktokPixelOpenAI Pixel
openaiPixelWhen a visitor edits an existing booking, Restoo Connect suppresses funnel and
conversion events. It continues to forward
action_taken,
customer_identified, and customer_signed_out to every platform, and
booking_updated to GA4 and Google Tag Manager only. An edit is not a new
conversion, so it never reaches Google Ads, Meta, TikTok, or ChatGPT Ads.Acquisition model
Restoo measures bookings as lead acquisition, not as ecommerce. A booking is not treated as a purchase, but as capturing and qualifying a potential customer. Every booking that gets created fires exactly one conversion, chosen by the status it is created with:
The two are mutually exclusive. A confirmed booking fires the confirmed-booking conversion and not the lead one; a pending booking fires the lead conversion and not the confirmed-booking one. Added together they equal the total bookings created, so no booking is ever counted twice.
With a cancellation policy, the booking does not exist until the guest signs the
policy, so the conversion is emitted then and not when the form is submitted. If
they abandon the signature page, no conversion is counted. The status the booking
is created with still decides which of the two fires: a booking with a
cancellation policy can also end up pending confirmation or on a waiting list.
- It doesn’t pollute your revenue. Bookings are never counted as sales, so they don’t distort revenue reports or get mixed up with actual product sales such as gift cards.
- It reflects the real business. A booking is an intention to visit, not a closed transaction, and the lead model represents that faithfully.
- Campaigns optimize correctly. Each platform optimizes for booking acquisition, with no bias toward the bookings that happen to carry a prepayment.
The rest of this page documents every event each platform receives, including the behavioral ones, and the exact data sent with each.
What Restoo deliberately omits
Some fields you might expect are absent from every payload documented here. That is by design, so it is worth knowing before you go looking for them. Catalogue names. Experiences, add-ons and list items are identified by ID —best_burger:experience:7 — never by name.
An experience name is free text written by the business, and special-category data can be inferred from it: a gluten-free menu suggests health, a halal dinner suggests religious belief, a themed experience can suggest sexual orientation. Under the GDPR that requires explicit, separate consent that this flow does not collect, and Meta’s and Google’s terms prohibit receiving it — sending it would put the ad account at risk.
If your reports need readable labels, keep your own ID-to-name mapping.
Customer fields no destination reads. The identity payload carries only a hashed email and phone, because those are the only two fields any destination consumes. A name, postal code and country used to travel with it and were removed: hashing is pseudonymization, not anonymization, so a field nobody reads is personal data exposed for no purpose.
Money on conversions. Conversions carry no value or currency — see Acquisition model.
These fields are removed at the source, not per destination. Every widget event
is broadcast to the page that embeds the widget, so any third-party script
running there can read it. Filtering inside a destination would protect Meta and
TikTok while leaving that channel wide open.
Google Analytics 4
Withga4 enabled, Restoo Connect calls gtag("event", eventName, data). Standard GA4 event names are used when there is a suitable equivalent. Restoo-specific events use the restoo_ prefix.
Every call carries send_to with the measurement ID of the property configured in your account, so events reach that property and no other destination configured on the page. The examples below leave it out, since it is the same in all of them.
Standard events
These events use names defined by GA4. The table links to the exact payload sent for each mapping, including any additional Restoo parameters.
For the meaning of these event and item parameters, see Google’s recommended events reference and ecommerce documentation.
Restoo custom events
These events have no direct GA4 equivalent. Their names use therestoo_ prefix so they can be identified as custom events.
The
booking_*, action_*, and availability_outcome fields are also custom parameters. See GA4 custom event parameters for how to expose them in reports.
generate_lead and qualify_lead do not include value or currency: a reservation is modeled as a lead, not an ecommerce purchase.
GA4 booking start data
When the booking start page is shown, Restoo Connect sends the custom event without parameters:search, with a synthetic search term:
pax_{guests}_day_{weekday}_shift_{shift}; children are included in the guest count.
GA4 item-list data
select_item sends the same structure plus the amount the guest chose: quantity carries the number of experience tickets, or the add-on units. A list being shown has no quantity yet, so view_item_list never includes it. List IDs are scoped to the account and list type.
Prices are converted from the currency’s smallest unit to decimal units.
GA4 item-detail data
item_category is floor_plan_area.
GA4 booking details form and booking data
The three guest-details form events —restoo_booking_details_form_viewed when it is shown, form_start when the guest begins filling it in, and form_submit when they submit it — include the same fixed form identifiers and the current booking context:
generate_lead, qualify_lead, and the other Restoo-specific booking events receive the same booking fields without form_id and form_name. Fields whose source value is null or undefined are omitted.
See BookingFunnel for the source booking fields and BookingStatus, ShiftType, and CancellationPolicyType for enum definitions.
GA4 no-availability data
GA4 action data
action_taken always emits the Restoo-specific event:
select_content for a concrete contact channel:
content_type is availability_fallback and content_id is the selected option. Opening the contact menu (option: "open") or using a generic one-step action (option: "click") does not emit the contact select_content event.
GA4 customer data
Before the identification events are sent, Restoo Connect sets the available hashed email and phone as globaluser_data:
restoo_customer_identified is only sent when a hashed email or phone is available; login is always sent. When the identified customer has neither, user_data is set to {} so no earlier visitor’s identity is left behind. On sign-out, Restoo Connect always clears user_data — that removal needs no consent — and, when this property’s own consent requirement is met, also sends restoo_customer_signed_out:
user_data is not event data. GA4 only ingests it when user-provided data collection is enabled for the property.
Google Tag Manager
Withgtm enabled, Restoo Connect pushes objects to window.dataLayer. Event names mirror the direct GA4 destination, but booking data is nested under restoo and item data is nested under ecommerce.
Standard events
ThesedataLayer events mirror the standard GA4 mapping. They can be used as Custom Event triggers for GA4 or other tags in GTM.
Restoo custom events
These events have no direct standard equivalent. Their names use therestoo_ prefix. Events with additional data store it under the restoo key.
See Google’s data layer documentation for how GTM processes the
event field and other variables in each push. The nested restoo objects are Restoo-specific variables that you can expose with Data Layer Variable definitions in GTM.
GTM booking start pushes
GTM item pushes
select_item uses the same ecommerce object. view_item uses the GA4 item-detail data under ecommerce.
GTM booking details form and booking pushes
restoo_booking_details_form_viewed and form_start use the first structure, changing only the event. qualify_lead uses the second with event: "qualify_lead" and booking_status: "CONFIRMED". The complete set of booking fields is shown in GA4 booking details form and booking data.
GTM Restoo-specific booking pushes
Restoo-specific events include a fuller booking context. The event name changes according to the mapping table; therestoo structure remains the same.
null, except booking_add_ons, which is an empty array when nothing was added. Monetary fields use decimal currency units. See CancellationPolicyAmountType for the possible amount types.
restoo_booking_no_availability_viewed adds availability_outcome to the same restoo object.
GTM action pushes
GTM customer pushes
window.dataLayer.push({ user_data: {} }); login is still emitted.
Sign-out is two separate pushes, not one carrying both keys. The user_data reset goes without an event and always happens, because removing data needs no permission; the event goes on its own, and only when GTM’s own consent requirement is met:
user_data on the sign-out event will not find the key in that push, because it arrived in the previous one.
Before every event push, Restoo Connect first clears the transient
restoo,
ecommerce, form, search, content, and method fields so values from a previous event
are not reused. user_data persists until it is replaced or cleared.Google Ads
WithgoogleAds enabled, Restoo Connect sends conversions through gtag("event", "conversion", data) and manages hashed customer data through gtag("set", "user_data", data).
Standard conversions
All conversion events use Google Ads’ standardconversion event name. booking_lead, booking_confirmed, and contact identify the configured conversion action, not custom event names sent to Google Ads.
Customer data updates
These calls update global matching data; they are not events or conversions.
See Google’s conversion setup guide for how Google Ads interprets conversion actions and Enhanced Conversions documentation for customer matching data.
Restoo Connect does not send Restoo custom events to Google Ads.
Google Ads conversion data
Every conversion sends only its configured destination:value, no currency, and no transaction_id. The booking’s own reference would be the natural transaction ID, but that reference is also the key to the guest’s personal data, so it never leaves the widget.
Google Ads customer data
gtag("set", "user_data", {}). Customer data enriches a conversion when available but is not required for it to fire.
Set up conversion destinations
1
Create the conversion actions
In Google Ads, go to Goals → Conversions → New conversion action →
Website. Create the
booking_lead, booking_confirmed, and contact actions you want to
track and choose manual setup with the Google tag. Use these as the
conversion action description:Each booking fires only one of the first two. Configure both even if your venue
confirms instantly: a time slot that fills up switches to request or waiting
list, and without
booking_lead those bookings would go unmeasured.2
Copy the conversion ID and each label
Open Tag setup for the conversion action and copy its conversion ID and
its label. See how to find the ID and
label. The conversion
ID belongs to the account and is the same for all three actions; the label is
different in each one.
3
Map them in your Restoo account
Paste the conversion ID once, and each label into the action it belongs to, in
your Google Ads integration settings.Only actions with a label configured are emitted, and a page cannot point
them somewhere else:
connect accepts only false, to turn a whole
destination off.Meta Pixel
WithmetaPixel enabled, Restoo Connect sends events through fbq("trackSingle", pixelId, eventName, data) — and fbq("trackSingleCustom", …) for custom ones — and manages Advanced Matching by reinitializing your pixel through fbq("init", pixelId, userData). The pixel ID is held in your Restoo account and is required to enable this destination at all.
Standard events
All tracking events sent to Meta use standard Meta Pixel event names.Restoo custom events
Funnel stages are sent as custom events rather than standard ones: Meta’s standard events are optimizable, and none of these stages is a conversion. Meta does not count them as conversions unless you build a custom conversion on top of them (see standard and custom website events). They are all sent withfbq("trackSingleCustom", pixelId, …).
Customer data updates
Both calls require the pixel ID configured in your account. They update Meta Advanced Matching data; they are not Pixel events.
See Meta’s Pixel event reference for the meaning and expected parameters of its standard events.
Of
action_taken, only contact through a concrete channel travels here. Every other action — add to calendar, invite guests, get directions, recommend, share, modify, cancel — happens once the booking is already made, so it feeds no audience and counts as no conversion: those stay in GA4 and GTM.
Meta search and content data
When the booking start page is shown, Restoo Connect sends the custom event without parameters:Search, with a synthetic search term; an experience detail sends a ViewContent:
ViewContent, with booking content:
content_ids contains the account ID followed by the selected experience and add-on IDs.
Meta item-list data
RestooBookingItemSelected sends the same structure with the items the guest chose. Neither carries content_name nor quantities: the item IDs are all that attribution and audiences need.
Meta no-availability data
content_ids may contain only the account ID. See AvailabilityOutcome for the possible values and their meanings.
Meta Lead and Schedule data
Schedule and the custom events for the details form, the booking conditions, and the cancellation policy receive the same content.
Meta events carry no prices, value, currency, or event ID. Because there is no event ID, Meta cannot match these events against a server-side Conversions API integration, so do not report the same bookings from both — see Avoiding duplicate conversions.
Meta contact and customer data
em and ph contain normalized SHA-256 hashes. The identification call is only made when at least one hashed value is available. On sign-out, Restoo Connect sends fbq("init", pixelId, {}).
TikTok Pixel
WithtiktokPixel enabled, Restoo Connect sends events through ttq.instance(pixelId).track(eventName, data) and manages customer matching data through ttq.instance(pixelId).identify(data). Both are scoped to the pixel configured in your account, so a page with more than one pixel installed only receives them on that one.
Standard events
All tracking events sent to TikTok use standard TikTok Pixel event names.TikTok renamed
SubmitForm to Lead and keeps the old name working, converting
it on its backend. Restoo sends SubmitForm, which is the one still listed in
the standard events reference, and you will see it as Lead in your reporting
and optimization. See TikTok’s updated standard
events.Restoo custom events
Funnel stages are sent as custom events rather than standard ones: none of them is a conversion. TikTok uses custom events for reporting and audiences, but they cannot be chosen as a campaign optimization goal (see custom events).Customer data updates
These calls update TikTok matching data; they are not Pixel events.
See TikTok’s standard events reference and parameter reference for the meaning and expected format of its standard fields.
Of
action_taken, only contact through a concrete channel travels here. Every other action — add to calendar, invite guests, get directions, recommend, share, modify, cancel — happens once the booking is already made, so it feeds no audience and counts as no conversion: those stay in GA4 and GTM.
TikTok search and content data
When the booking start page is shown, Restoo Connect sends the custom event without parameters:Search, with a synthetic search term; an experience detail sends a ViewContent:
ViewContent, with booking content:
TikTok item-list data
RestooBookingItemSelected sends the same structure with the items the guest chose. Neither carries content_name nor quantities: the item IDs are all that attribution and audiences need.
TikTok no-availability data
content_ids may contain only the account ID. See AvailabilityOutcome for the possible values and their meanings.
TikTok SubmitForm and Schedule data
Schedule and the custom events for the details form, the booking conditions, and the cancellation policy receive the same content.
TikTok events carry no prices, value, currency, or event ID. As with Meta, that means these events cannot be matched against a server-side Events API integration — see Avoiding duplicate conversions.
TikTok contact and customer data
email and phone_number contain normalized SHA-256 hashes. Identification is only sent when at least one value is available. On sign-out, Restoo Connect sends ttq.instance(pixelId).identify({}).
OpenAI Pixel
WithopenaiPixel enabled, Restoo Connect sends events to the ChatGPT Ads pixel through oaiq("measureSingle", pixelId, eventName, data, options) and sets customer matching data through oaiq("init", { pixelId, user }). Both are scoped to the pixel configured in your account, so a page with more than one pixel initialized only receives them on that one: measure, the call that broadcasts to every pixel, is never used.
On this destination the event name and the shape of its data travel separately: every standard event requires a specific data.type, and the SDK drops the whole event if data carries a field it does not document for that type. The data in the tables below is exactly what fits.
Standard events
ChatGPT Ads has no standard search event and no standard form event, so the
availability search and the details form —
Search and ViewContent on Meta
and TikTok — travel here as custom events.Restoo custom events
Funnel stages are sent as custom events — thecustom event, with the name in custom_event_name — rather than standard ones: none of them is a conversion. ChatGPT Ads accepts them for measurement, but not as a campaign’s optimization goal. Contact travels as a custom event too, because no standard event describes it. They carry the restoo_ prefix because they share the pixel with whatever custom events your own site sends.
Customer data updates
These calls set the pixel’s matching data; they are not events.
See OpenAI’s supported events and pixel reference for the meaning and expected format of its fields.
Of
action_taken, only contact through a concrete channel travels here. Every other action — add to calendar, invite guests, get directions, recommend, share, modify, cancel — happens once the booking is already made, so it feeds no audience and counts as no conversion: those stay in GA4 and GTM.
OpenAI Pixel booking data
When the booking start page is shown, Restoo Connect sends the custom event with no contents:name; the other items are identified by ID, for the reasons in what Restoo deliberately omits. No item carries amount or currency.
Two values that Meta and TikTok do receive never travel to this destination: the synthetic search term of Search and the availability_outcome of the no-availability stage. Neither is a field the SDK documents, and carrying them would drop the whole event.
OpenAI Pixel list data
items_added sends the same structure with the items the guest chose, and an item’s detail sends contents_viewed with that single item. None carries name or quantities: the item IDs are all that attribution and audiences need.
OpenAI Pixel conversion data
lead_created sends exactly the same. The customer_action type, which is the one these two events require, does not accept contents, so the conversion carries no booking IDs: they travel in the funnel stages that precede it.
OpenAI Pixel events carry no prices, amount, currency, or event ID. As with Meta and TikTok, that means they cannot be matched against a server-side integration of OpenAI’s Conversions API — see Avoiding duplicate conversions.
OpenAI Pixel contact and customer data
custom event accepts no fields of its own on the pixel. email_sha256 and phone_number_sha256 contain normalized SHA-256 hashes; the phone one is the MSISDN format, the same one Meta receives (see Customer identity). Identification is only sent when at least one value is available. On sign-out, Restoo Connect sends oaiq("init", { pixelId, user: {} }), which retracts the identity from the pixel.
Next steps
Bidding and optimization
Choose which events your campaigns optimize toward on each platform.
Consent
What each destination needs to receive an event, signal by signal.