Skip to main content
View Categories

Conversion tracking event reference

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.

SettingWhat it controls
HomeRunner plugin · Advanced settings · Analytics
Trigger Events for GA4On: events go straight to GA4 through gtag. Off (default): events are pushed to the data layer for Tag Manager.
Trigger Purchase on InquiryOn: every reservation fires purchase. Off (default): inquiries and requests fire generate_lead.
GA4 Transaction ID SourceCentral 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 LoadedTick when the gtag.js script is already on the page, so it is not loaded twice.
HomeRunner Toolkit · Conversion Tracking
GA4 Measurement IDYour property, used when Trigger Events for GA4 is on. Replaces HomeRunner’s default property.
GTM Container IDYour container, used when Trigger Events for GA4 is off. Replaces HomeRunner’s default container.
HomeRunner TagOn (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 IDLoads the Pixel base code and switches on every Meta event in the table.
Consent Mode v2Off (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[] arrayOff (default). On: begin_checkout and purchase keep only the property in items; taxes and fees move to their own parameters.
Emit per-fee custom paramsOn (default). With Clean items on, adds one parameter per fee, named after the fee.
Fire add_to_cart on quoteOn (default).
Fire generate_lead on Gravity Forms submissionOn (default).
Fire begin_checkout on hosted handoffOn (default). Inert on sites with the on-site checkout.
Fire purchase on booking return redirectOn (default). Inert unless the PMS’s after-booking redirect points back to your site.
HomeRunner Toolkit · Self-Managed Analytics
Module switched onRemoves every HomeRunner-owned tag and container. The data layer pushes keep flowing to whatever you load yourself.
Every setting that changes which events fire, where they go, or what they carry.

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.

EventFires whenParametersMeta Pixel
view_item_listPluginSearch results render in the property explorer, on each page of resultsitems, item_list_id (explorer_search_results), item_list_nameAlso: nights_selectednone
select_itemPluginGuest clicks a property card in the resultsitems (one entry)Also: nights_selectednone
property_searchPluginGuest submits, resets, sorts or filters a search. A custom event, not a GA4 recommended onetrigger (submit, reset, sort or additional_filter)Also: nights_selectedSearch
view_itemPluginProperty page loadsitems (one entry)ViewContent
add_to_cartToolkit · Fire add_to_cart on quoteBooking widget returns a price for the selected datescurrency, value, itemsAddToCart
begin_checkoutPluginCheckout page loads with a quotecurrency, value, tax, itemsAlso: nights_selected. With Clean items on: fees_total and one parameter per feeInitiateCheckout
add_payment_infoToolkitCard number, expiry and CVC all complete on the checkout form, once per checkout page. Fires from toolkit 3.288.14; see the notes belowpayment_type (credit_card)No currency, value or itemsAddPaymentInfo
purchasePluginConfirmation page loads for a confirmed bookingtransaction_id, currency, value, tax, itemsAlso: formValues in Tag Manager mode. With Clean items on: fees_total and one parameter per feePurchase
generate_leadPlugin and Toolkit · Fire generate_lead on Gravity Forms submissionConfirmation 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, currencyLead
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 toocurrency, value, itemsInitiateCheckout
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 todaytransaction_id (the OwnerRez booking ID), value (0), currencyPurchase

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.

Contract 1.0: every event a HomeRunner site fires today, with its trigger and parameters.

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_filter
view_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 on
add_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 parameters
Open an event to see its push. The same illustrative booking runs through every sample: villa marisol, seven nights, 1,960 EUR in total.

What 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.

Results
view_item_list, select_item
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
Property page
view_item
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
Checkout and confirmation
begin_checkout, purchase, generate_lead
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
add_to_cart and the hosted begin_checkout send one entry: item_id, item_name, price equal to the quoted total, quantity 1. The hosted purchase sends no items.
The items array as each part of the site builds it today. The property is always the first entry.

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 #

Eventprice on the property itemvalue
view_item_list, select_item, view_itemAverage nightly rate for the propertyNot sent
add_to_cartThe quoted total for the selected datesThe quoted total
begin_checkout, purchase, generate_lead (confirmation)Rent per night, or total rent with Clean items onThe booking total: rent, fees and taxes as quoted. tax carries the taxes alone
add_payment_info, generate_lead (form)No itemsNot sent
purchase (hosted return)No items0

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.

EventGA4 referenceHomeRunner sends
add_payment_infoitems required; currency required when value is sentpayment_type only
begin_checkout and purchase, the value parameterThe sum of item prices, without taxThe 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.

  1. view_item_list when the results load
  2. select_item when you open a property from the results
  3. view_item on the property page
  4. add_to_cart when the booking widget shows a total for your dates
  5. begin_checkout when the checkout page loads
  6. 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.