This page lists every Google Analytics 4 and Meta Pixel event a HomeRunner site fires, when each one fires, and what it carries. Hand it to whoever runs your Tag Manager container or your ad accounts. It is the companion to How conversion tracking works on HomeRunner, which explains why the events fire on your own domain in the first place.
It covers WordPress sites running the HomeRunner plugin. Events marked Toolkit need the Conversion Tracking module in the HomeRunner Toolkit switched on. The page describes what ships today, as contract 1.0. The changelog at the end records every later change to a name, a trigger or a parameter, so a container built against this page keeps working.
Pick one delivery path #
Events reach GA4 in one of two ways, and one setting in the HomeRunner plugin decides which: Trigger Events for GA4, under Advanced settings, Analytics.
- Switched on, the plugin sends each event straight to GA4 through gtag, with no Tag Manager in the middle. Enter your GA4 Measurement ID in the Toolkit’s Conversion Tracking module and the site reports to your property.
- Switched off, the plugin pushes each event into the page’s data layer for your Tag Manager container to read. Enter your GTM Container ID in Conversion Tracking, or switch on Self-Managed Analytics and load the container yourself. The triggers and GA4 event tags on the container side are walked through in How to configure Google Tag Manager to forward ecommerce events to GA4.
Never run GA4 on both paths at once. A GA4 configuration tag inside Tag Manager on a site that also loads the direct gtag counts every event twice. The reverse failure is quieter. When a gtag for the same Measurement ID is already on the page from outside the container, GA4 event tags inside the container can stop sending while other tags on the same trigger keep firing, and Tag Manager’s preview shows nothing wrong. The pushes themselves are identical in both modes, so switching paths later changes no triggers.
| Setting | What it controls |
|---|---|
| HomeRunner plugin · Advanced settings · Analytics | |
| Trigger Events for GA4 | On: events go straight to GA4 through gtag. Off (default): events are pushed to the data layer for Tag Manager. |
| Trigger Purchase on Inquiry | On: every reservation fires purchase. Off (default): inquiries and requests fire generate_lead. |
| GA4 Transaction ID Source | Central Reservation ID (default) or PMS Reservation ID. Which ID purchase sends as transaction_id. |
| gtag() Function Defined Previously? | Tick when another snippet on the site already defines gtag, so it is not defined twice. |
| GA4 Script Loaded | Tick when the gtag.js script is already on the page, so it is not loaded twice. |
| HomeRunner Toolkit · Conversion Tracking | |
| GA4 Measurement ID | Your property, used when Trigger Events for GA4 is on. Replaces HomeRunner’s default property. |
| GTM Container ID | Your container, used when Trigger Events for GA4 is off. Replaces HomeRunner’s default container. |
| HomeRunner Tag | On (default): HomeRunner’s own tag or container loads when the matching ID above is empty. Off: only your tagging is on the page. |
| Facebook Pixel ID | Loads the Pixel base code and switches on every Meta event in the table. |
| Consent Mode v2 | Off (default). On: sets the four consent types to denied before any tag loads and waits half a second for your consent tool to update them. |
| Clean items[] array | Off (default). On: begin_checkout and purchase keep only the property in items; taxes and fees move to their own parameters. |
| Emit per-fee custom params | On (default). With Clean items on, adds one parameter per fee, named after the fee. |
| Fire add_to_cart on quote | On (default). |
| Fire generate_lead on Gravity Forms submission | On (default). |
| Fire begin_checkout on hosted handoff | On (default). Inert on sites with the on-site checkout. |
| Fire purchase on booking return redirect | On (default). Inert unless the PMS’s after-booking redirect points back to your site. |
| HomeRunner Toolkit · Self-Managed Analytics | |
| Module switched on | Removes every HomeRunner-owned tag and container. The data layer pushes keep flowing to whatever you load yourself. |
The events #
Every event below fires on the guest’s browser, on your domain. Parameters in bold are always present. Values follow the GA4 recommended-event names, so a standard GA4 event tag with ecommerce data switched on reads them without mapping.
| Event | Fires when | Parameters | Meta Pixel |
|---|---|---|---|
| view_item_listPlugin | Search results render in the property explorer, on each page of results | items, item_list_id (explorer_search_results), item_list_nameAlso: nights_selected | none |
| select_itemPlugin | Guest clicks a property card in the results | items (one entry)Also: nights_selected | none |
| property_searchPlugin | Guest submits, resets, sorts or filters a search. A custom event, not a GA4 recommended one | trigger (submit, reset, sort or additional_filter)Also: nights_selected | |
| view_itemPlugin | Property page loads | items (one entry) | |
| add_to_cartToolkit · Fire add_to_cart on quote | Booking widget returns a price for the selected dates | currency, value, items | |
| begin_checkoutPlugin | Checkout page loads with a quote | currency, value, tax, itemsAlso: nights_selected. With Clean items on: fees_total and one parameter per fee | |
| add_payment_infoToolkit | Card number, expiry and CVC all complete on the checkout form, once per checkout page. Fires from toolkit 3.288.14; see the notes below | payment_type (credit_card)No currency, value or items | |
| purchasePlugin | Confirmation page loads for a confirmed booking | transaction_id, currency, value, tax, itemsAlso: formValues in Tag Manager mode. With Clean items on: fees_total and one parameter per fee | |
| generate_leadPlugin and Toolkit · Fire generate_lead on Gravity Forms submission | Confirmation page loads for an inquiry or a request (plugin), or a Gravity Forms form completes (Toolkit) | Confirmation: the same parameters as purchase. Form: form_id, currency | |
| begin_checkout hosted checkoutToolkit · Fire begin_checkout on hosted handoff | Guest clicks the checkout button on a property that takes payment on the PMS’s own page. add_to_cart still fires there too | currency, value, items | |
| purchase OwnerRez returnToolkit · Fire purchase on booking return redirect | Guest lands back on your site from OwnerRez’s after-booking redirect. Guesty hosted checkout has no purchase event today | transaction_id (the OwnerRez booking ID), value (0), currency |
Plugin events fire on every HomeRunner site. Toolkit events need the Conversion Tracking module; the setting named under the event switches that event on or off. Meta Pixel events need a Facebook Pixel ID in the same module, and PageView then fires on every page. Search mirrors property_search in Tag Manager mode only.
Five things the table cannot say in a cell.
purchase and generate_lead on the confirmation page are one event with two names. A confirmed booking fires purchase. An inquiry, or a request the manager still has to accept, fires generate_lead with the same payload, transaction ID included, so you can count leads without inflating revenue. Switch on Trigger Purchase on Inquiry in the plugin and every reservation fires purchase instead. A reservation whose status is closed fires nothing either way.
generate_lead also fires from the Toolkit when a Gravity Forms form completes, carrying the form’s ID. That one has no items and no value.
Sites whose PMS takes payment on its own page never render the checkout page. On those, add_to_cart still fires on the property page, and the Toolkit fires begin_checkout the moment the guest clicks the checkout button, with one item priced at the quoted total. The return purchase exists for OwnerRez only. It needs OwnerRez’s booking ID in the return address and the guest arriving from OwnerRez’s domain, and it carries that booking ID as the transaction ID with a value of 0, enough to count conversions and to join against PMS data, not enough for value-based bidding. A Guesty hosted checkout has no purchase event today.
add_payment_info fires on the standard checkout from toolkit 3.288.14 (September 29, 2026), once per checkout page, when the card number, expiry and CVC fields are all complete. Earlier toolkit versions never fired it there: the card number field marks completion with a different class than the expiry and CVC fields, and the old check waited for all three under one class. It sends payment_type only, no items and no value.
Not fired today: add_shipping_info, add_to_wishlist, sign_up, remove_from_cart, view_cart, search, form_start and form_submit. GA4’s enhanced measurement can produce the two form events on its own if you switch it on. Anything added later appears in the changelog.
Sample pushes #
One sample per event, in both modes. Values are illustrative. In Tag Manager mode the results-page pushes clear the previous ecommerce object first; the checkout and confirmation pushes do not, so leave “Send Ecommerce data” off on any tag that fires on add_payment_info or property_search, or it will pick up the previous event’s items.
view_item_listresults render
// Tag Manager mode
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: "view_item_list",
nights_selected: 7,
ecommerce: {
item_list_id: "explorer_search_results",
item_list_name: "Explorer Search Results",
items: [
{ item_id: "5824", item_name: "villa marisol", item_brand: "seaside stays",
item_category: "villa", index: 0, price: 240, currency: "EUR" },
{ item_id: "5831", item_name: "casa del sol", item_brand: "seaside stays",
item_category: "apartment", index: 1, price: 165, currency: "EUR" }
]
}
});
// Direct gtag mode
gtag("event", "view_item_list", {
nights_selected: 7,
item_list_id: "explorer_search_results",
item_list_name: "Explorer Search Results",
items: [ /* same items */ ]
});select_itemguest opens a property from the results
// Tag Manager mode
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: "select_item",
nights_selected: 7,
ecommerce: {
items: [
{ item_id: "5824", item_name: "villa marisol", item_brand: "seaside stays",
item_category: "villa", index: 0, price: 240, currency: "EUR" }
]
}
});
// Direct gtag mode
gtag("event", "select_item", { nights_selected: 7, items: [ /* same item */ ] });property_searchsearch submitted, reset, sorted or filtered
// Tag Manager mode
window.dataLayer.push({ event: "property_search", nights_selected: 7, trigger: "submit" });
// Direct gtag mode
gtag("event", "property_search", { nights_selected: 7, trigger: "submit" });
// trigger is one of: submit, reset, sort, additional_filterview_itemproperty page
// Tag Manager mode
window.dataLayer.push({
event: "view_item",
ecommerce: {
items: [
{ item_id: "5824", item_name: "villa marisol", index: 0, item_brand: "Seaside Stays",
item_category: "Villa", price: 240, currency: "EUR" }
]
}
});
// Direct gtag mode
gtag("event", "view_item", { items: [ /* same item */ ] });add_to_cartbooking widget returns a price
// Tag Manager mode
window.dataLayer.push({
event: "add_to_cart",
ecommerce: {
currency: "EUR",
value: 1960,
items: [ { item_id: "5824", item_name: "villa marisol", price: 1960, quantity: 1 } ]
}
});
// Direct gtag mode
gtag("event", "add_to_cart", {
currency: "EUR", value: 1960,
items: [ { item_id: "5824", item_name: "villa marisol", price: 1960, quantity: 1 } ]
});begin_checkoutcheckout page loads
// Tag Manager mode
window.dataLayer.push({
event: "begin_checkout",
ecommerce: {
nights_selected: 7,
currency: "EUR",
value: 1960, // rent 1680 + cleaning fee 120 + taxes 160
tax: 160,
items: [
{ item_id: "5824", item_name: "villa marisol", quantity: 7, price: 240 },
{ item_id: "taxes", item_name: "taxes", price: 160, quantity: 1 },
{ item_id: "cleaning-fee", item_name: "cleaning fee", price: 120, quantity: 1 }
]
}
});
// Direct gtag mode: the ecommerce object is sent as the parameters
gtag("event", "begin_checkout", {
nights_selected: 7, currency: "EUR", value: 1960, tax: 160,
items: [ /* same */ ]
});begin_checkoutwith Clean items[] array on
// Same trigger; items keeps the property only, fees move up a level
window.dataLayer.push({
event: "begin_checkout",
ecommerce: {
nights_selected: 7,
currency: "EUR",
value: 1960,
tax: 160,
fees_total: 120,
cleaning_fee: 120, // one parameter per fee, with Emit per-fee custom params on
items: [
{ item_id: "5824", item_name: "villa marisol", quantity: 1, price: 1680 }
]
}
});
// purchase takes the same shape when Clean items is onadd_payment_infocheckout page, card fields complete
// Tag Manager mode
window.dataLayer.push({ event: "add_payment_info", payment_type: "credit_card" });
// Direct gtag mode
gtag("event", "add_payment_info", { payment_type: "credit_card" });purchaseconfirmation page, confirmed booking
// Tag Manager mode
window.dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "184201", // HomeRunner reservation ID, or the PMS ID (see below)
currency: "EUR",
value: 1960,
tax: 160,
items: [
{ item_id: "5824", item_name: "villa marisol", price: 240, quantity: 7 },
{ item_id: "taxes", item_name: "taxes", price: 160, quantity: 1 },
{ item_id: "cleaning-fee", item_name: "cleaning fee", price: 120, quantity: 1 }
]
},
formValues: {
firstName: "Ana", lastName: "Ruiz", email: "ana@example.com", phone: "+34 600 000 000",
roomType: "Villa", bedrooms: "3", bathrooms: "2",
checkInDate: "2026-10-03", checkOutDate: "2026-10-10",
cleaningfee: 120, taxes: 160, totalPrice: 1960, currency: "EUR"
}
});
// Direct gtag mode: no formValues
gtag("event", "purchase", {
transaction_id: "184201", currency: "EUR", value: 1960, tax: 160,
items: [ /* same */ ]
});generate_leadconfirmation page, inquiry or request
// Identical to purchase, under the other name
window.dataLayer.push({
event: "generate_lead",
ecommerce: {
transaction_id: "184202", currency: "EUR", value: 1960, tax: 160,
items: [ /* as purchase */ ]
},
formValues: { /* as purchase */ }
});
// Direct gtag mode
gtag("event", "generate_lead", {
transaction_id: "184202", currency: "EUR", value: 1960, tax: 160,
items: [ /* as purchase */ ]
});generate_leadGravity Forms form completes
// Tag Manager mode
window.dataLayer.push({ event: "generate_lead", form_id: "3", currency: "USD" });
// Direct gtag mode
gtag("event", "generate_lead", { form_id: "3", currency: "USD" });hosted checkoutbegin_checkout on the handoff click, purchase on the return
// Guest clicks the checkout button on a property that pays on the PMS's page
window.dataLayer.push({
event: "begin_checkout",
ecommerce: {
currency: "USD",
value: 1960,
items: [ { item_id: "5824", item_name: "villa marisol", price: 1960, quantity: 1 } ]
}
});
// Guest lands back on your site from OwnerRez's after-booking redirect (OwnerRez only today)
window.dataLayer.push({
event: "purchase",
ecommerce: { transaction_id: "ORB123456", value: 0, currency: "USD" }
});
// Direct gtag mode sends the same objects as the parametersWhat items contains #
Every ecommerce event carries an items array with the property as its first entry. The fields differ a little by page, because three parts of the site build them.
- item_id
- The listing ID from your PMS
- item_name
- Property title, lowercase
- item_brand
- Your site name, lowercase
- item_category
- Property type, lowercase
- index
- Position in the results
- price
- Average nightly rate
- currency
- Property currency
- item_id
- The listing ID from your PMS
- item_name
- Property title, lowercase
- index
- Always 0
- item_brand
- Your site name
- item_category
- Property type
- price
- Average nightly rate
- currency
- Property currency
- item_id
- The listing ID from your PMS
- item_name
- Property title, lowercase
- quantity
- Number of nights
- price
- Rent per night
- taxes
- A second entry: item_id taxes, quantity 1, price the taxes
- cleaning-fee
- One entry per fee: item_id from the fee name, quantity 1, price the amount
With Clean items[] array on in Conversion Tracking, begin_checkout and purchase keep only the property line, at quantity 1 and a price equal to the total rent. Taxes stay in the tax parameter and fees are summed into fees_total. With Emit per-fee custom params also on, each fee arrives as its own parameter named after the fee, cleaning_fee or pet_fee for instance. Leave both off if your GA4 reports were built on the original shape.
What price and value mean #
| Event | price on the property item | value |
|---|---|---|
| view_item_list, select_item, view_item | Average nightly rate for the property | Not sent |
| add_to_cart | The quoted total for the selected dates | The quoted total |
| begin_checkout, purchase, generate_lead (confirmation) | Rent per night, or total rent with Clean items on | The booking total: rent, fees and taxes as quoted. tax carries the taxes alone |
| add_payment_info, generate_lead (form) | No items | Not sent |
| purchase (hosted return) | No items | 0 |
Currency is the property’s currency on every event except the form generate_lead, which always reports USD.
Where the payload differs from GA4’s reference #
GA4 accepts every event above as it is. Two places differ from Google’s own reference, and the difference shows up in reports rather than in Tag Manager, so build your tags around what the site sends.
| Event | GA4 reference | HomeRunner sends |
|---|---|---|
| add_payment_info | items required; currency required when value is sent | payment_type only |
| begin_checkout and purchase, the value parameter | The sum of item prices, without tax | The booking total, fees and taxes included. tax is also sent on its own |
In the original items shape the taxes and fees also appear as items, so item revenue adds up to value. With Clean items on, item revenue is the rent alone and value stays the booking total.
Reconciling purchases with your PMS #
The transaction ID on purchase is the HomeRunner reservation ID by default. Set GA4 Transaction ID Source to PMS Reservation ID in the plugin’s Analytics settings and the event carries your PMS’s own reservation ID instead, which lets you join a GA4 export against Guesty, Hostfully or Track. When a booking has no PMS ID yet, that one falls back to the HomeRunner ID. No coupon parameter is sent. A discount line on the booking appears in formValues as discount, and in the original items shape as its own entry.
With Conversion Tracking on, purchase fires once per transaction per browser. Reloading the confirmation page, or opening it again from the confirmation email within 30 days, does not send a second purchase. The guard keys on the transaction ID under both names, so when a guest sees the confirmation page for an inquiry and the manager confirms it later, that reservation’s purchase does not fire in the same browser within those 30 days. The generate_lead already sent is the record of it. The Meta Purchase has no such guard and fires on every load of the confirmation page, and its content_ids list carries the property and each fee entry from the original items shape.
In Tag Manager mode the confirmation push also carries a formValues object beside ecommerce: the guest’s name, email and phone, the stay dates, the property type and bedroom count, the totals and each fee. Read it with a Data Layer Variable for enhanced conversions or custom dimensions. The direct gtag path does not send it.
Verifying a site #
Open Tag Assistant, or GA4 DebugView with debug mode on, and make a test booking. This is the order you should see.
- view_item_list when the results load
- select_item when you open a property from the results
- view_item on the property page
- add_to_cart when the booking widget shows a total for your dates
- begin_checkout when the checkout page loads
- purchase on the confirmation page, or generate_lead for an inquiry
If purchase does not appear on a second test in the same browser, that is the once-per-transaction guard at work. Use a new booking, or clear the site’s storage. A few sites run a bridge script that forwards a fixed list of events and parameters to GA4 and drops keys it does not know. If a new event or parameter reaches the data layer but never reaches your property, check the bridge before the site. In Meta Events Manager the same walk shows PageView, ViewContent, AddToCart, InitiateCheckout and Purchase or Lead under Test Events.
Need an event that is not here? #
Send us the data layer push you want, with placeholders for the values, the moment it should fire in plain words, and the pages it applies to. We will tell you what the site can supply and what it takes to add it.
Changelog #
- 1.0, September 28, 2026. First published. Documents the events, parameters and settings shipping today.
- 1.0, same day. add_payment_info marked as not firing on the standard checkout. The hosted return purchase scoped to OwnerRez.
- 1.0.1, September 29, 2026. add_payment_info fires on the standard checkout from toolkit 3.288.14. Same payload as documented; no other event changes.