Skip to content

Sojern Pixel Integration

If you are running advertising campaigns through Sojern, you can connect your Sojern account to Wink by entering your Sojern GTM Container ID in the Wink portal. Once connected, Sojern’s tracking pixel fires automatically for your property — covering the full guest journey from search through to completed booking.


  1. Get Your GTM Container ID from Sojern

    Contact your Sojern account manager and request your GTM Container ID. It follows the format GTM-XXXXXXX. This is different from your Sojern Pixel ID — make sure you ask specifically for the GTM Container ID.

  2. Enter It in the Wink Portal

    Log into my.wink.travel, select your account, and go to the Customizations tab. Paste your Sojern GTM Container ID into the Sojern field and save. Your integration is now live.

  3. Confirm with Your Sojern Account Manager

    Let your Sojern account manager know the integration is active. They can verify from their side that the pixel is firing correctly on wink.travel for your property and that data is flowing into your Sojern account.


For transparency, here is what Wink configures to make this integration work:

  • A Sojern GTM Container ID field is available in the Customizations tab of your Wink portal. When you enter your Container ID, Wink validates the format and stores it securely against your property.
  • On every page where your property is active on Wink, your Sojern GTM Container ID is rendered into the page and Wink’s tag management system dynamically loads your Sojern container alongside its own. This happens automatically — no manual steps are required from the Wink team per property.
  • Your Sojern container is loaded asynchronously, meaning it does not affect page load performance for your guests.
  • Wink’s own tracking and your Sojern pixel run in parallel, reading from the same shared event data. Every booking event that Wink tracks is simultaneously available to your Sojern container.
  • When your property is not being viewed — for example, when a guest is browsing a different hotel on Wink — your Sojern container is not loaded. This ensures Sojern only receives data relevant to your property.

Wink pushes GA4-compatible events to the dataLayer throughout the guest journey. Your GTM container reads from this same shared dataLayer, so any trigger or variable you configure has access to all properties described below.

Each event follows the standard GA4 Enhanced Ecommerce structure: a top-level event string and an ecommerce object. Before every push, Wink clears the previous ecommerce payload to prevent stale data from bleeding into new triggers.


These events fire automatically as a guest moves through the booking funnel. Configure your GTM triggers as Custom Event triggers matching the event names below.

StepEventWhen It Fires
1view_item_listHotel inventory grid or list loads
2view_itemGuest views a specific property page
3add_to_cartGuest adds a room to the shopping cart
4begin_checkoutCheckout / payment page loads
5add_payment_infoGuest selects a payment method
6loginGuest authenticates via SSO
7purchaseBooking is confirmed
8refundBooking is cancelled

Fires when a hotel inventory grid or list is rendered.

{
"event": "view_item_list",
"ecommerce": {
"item_list_id": "featured_hotels",
"item_list_name": "Featured Hotels",
"items": [ ]
}
}

Fires when a guest views a specific property.

{
"event": "view_item",
"ecommerce": {
"currency": "USD",
"value": 299.00,
"items": [ ]
}
}

Fires when a guest adds a room to their cart.

{
"event": "add_to_cart",
"ecommerce": {
"currency": "USD",
"value": 299.00,
"items": [ ]
}
}

Fires when the checkout / payment page loads.

{
"event": "begin_checkout",
"ecommerce": {
"currency": "USD",
"value": 299.00,
"coupon": "SUMMER10",
"items": [ ]
}
}

coupon is only present when a discount code was applied.


Fires when the guest selects or confirms a payment method.

{
"event": "add_payment_info",
"ecommerce": {
"currency": "USD",
"value": 299.00,
"coupon": "SUMMER10",
"payment_type": "STRIPE",
"items": [ ]
}
}

payment_type is populated from the payment acquirer type. coupon is only present when a discount code was applied.


Fires when a guest authenticates via single sign-on.

{
"event": "login",
"ecommerce": {
"method": "IAM"
}
}

Fires when a booking is confirmed.

{
"event": "purchase",
"ecommerce": {
"currency": "USD",
"transaction_id": "bc-a1b2c3d4",
"value": 299.00,
"coupon": "SUMMER10",
"shipping": 0.00,
"tax": 0.00,
"items": [
{
"item_id": "rr-xyz789",
"item_name": "Deluxe Ocean Suite",
"item_brand": "Grand Resort",
"item_category": "GUEST_ROOM",
"price": 299.00,
"quantity": 1,
"property_id": "prop-abc123",
"property_name": "Grand Resort Maldives",
"property_brand": "Grand Collection",
"property_chain": "Luxury Hotels International",
"city_name": "Malé",
"country_code": "MV",
"start_date": "2026-06-01",
"end_date": "2026-06-05",
"num_adults": 2,
"num_children": 0,
"cancellation_policy": "Refundable",
"rate_plan_id": "rp-summer2026",
"room_rate_id": "rr-xyz789",
"room_rate_name": "Summer Escape — Bed & Breakfast",
"num_perks": 2,
"room_location": "Overwater",
"room_view": "Ocean",
"room_classification": "Suite"
}
]
}
}

transaction_id is the unique booking contract identifier. coupon, shipping, and tax are only present when applicable.


Fires when a booking is cancelled.

{
"event": "refund",
"ecommerce": {
"currency": "USD",
"transaction_id": "bc-a1b2c3d4",
"value": 299.00,
"coupon": "SUMMER10",
"shipping": 0.00,
"tax": 0.00,
"items": [ ]
}
}

transaction_id matches the purchase event for the same booking. coupon, shipping, and tax are only present when applicable.


All events that include an items array share the same item schema. Every property is optional unless marked required.

These fields are natively understood by GA4 and appear in standard ecommerce reports without any additional configuration.

PropertyTypeRequiredDescription
item_idstringYesUnique identifier for the room or product
item_namestringName of the room or product
affiliationstringAffiliate or seller name
couponstringCoupon code applied to the item
currencystringISO 4217 currency code (e.g. USD)
creative_namestringCreative name used in a promotion
creative_slotstringSlot position of the promotion creative
discountnumberDiscount amount applied
indexnumberPosition in the list (1-based)
item_brandstringHotel or brand name
item_categorystringProduct type — e.g. GUEST_ROOM, ACTIVITY, ATTRACTION, MEETING_ROOM, RESTAURANT, SPA
item_list_idstringIdentifier of the list this item belongs to
item_list_namestringDisplay name of the list
location_idstringGeo-coordinates of the property
pricenumberUnit price
promotion_idstringIdentifier of the promotion
promotion_namestringDisplay name of the promotion
quantitynumberQuantity (defaults to 1)

These parameters carry Wink-specific booking context. GA4 does not automatically surface them in reports — you must register each one as an item-scoped custom dimension in your GA4 property before it appears in explorations or standard reports. See Custom Dimensions in GA4 below for setup instructions.

PropertyTypeDescription
property_idstringWink property identifier
property_namestringProperty display name
property_brandstringBrand the property belongs to
property_chainstringChain the property belongs to
property_url_namestringURL-friendly slug for the property
city_namestringCity where the property is located
country_codestringISO 3166-1 alpha-2 country code
start_datestringCheck-in date in YYYY-MM-DD format
end_datestringCheck-out date in YYYY-MM-DD format
num_adultsnumberNumber of adults in the booking
num_childrennumberNumber of children in the booking
cancellation_policystringOne of: Refundable, Non-Refundable, Refundable-With-Restrictions, Non-Refundable-With-Restrictions
rate_plan_idstringIdentifier of the rate plan
room_rate_idstringIdentifier of the specific room rate
room_rate_namestringDisplay name of the room rate
num_perksnumberNumber of perks included with the rate
room_locationstringLocation descriptor for the room (e.g. Overwater, Garden)
room_viewstringView descriptor for the room (e.g. Ocean, City)
room_classificationstringRoom classification or tier (e.g. Suite, Standard)
bed_typestringBed configuration for the room (e.g. King, Twin)

GA4 ignores custom item parameters in reports until you explicitly register them as item-scoped custom dimensions. You only need to register the parameters you intend to use in reports — you do not need to register all 20.

  1. Open Custom Definitions

    In GA4, go to Admin (bottom-left gear icon) → select your property → Data displayCustom definitions.

  2. Create a new custom dimension

    Click Create custom dimensions.

  3. Fill in the dimension details

    • Dimension name — the human-readable label that appears in GA4 reports (see table below)
    • Scope — select Item
    • Event parameter — the exact parameter name as it appears in the dataLayer (see table below)
    • Description — optional but recommended
  4. Save and repeat

    Click Save, then repeat for each parameter you want to track.

Use the following table as your reference when creating custom dimensions. The Event parameter value must match exactly — GA4 is case-sensitive.

Dimension nameEvent parameterType
Property IDproperty_idText
Property nameproperty_nameText
Property brandproperty_brandText
Property chainproperty_chainText
Property URL nameproperty_url_nameText
City namecity_nameText
Country codecountry_codeText
Check-in datestart_dateText
Check-out dateend_dateText
Number of adultsnum_adultsNumber
Number of childrennum_childrenNumber
Cancellation policycancellation_policyText
Rate plan IDrate_plan_idText
Room rate IDroom_rate_idText
Room rate nameroom_rate_nameText
Number of perksnum_perksNumber
Room locationroom_locationText
Room viewroom_viewText
Room classificationroom_classificationText
Bed typebed_typeText

The following events are available in the Wink dataLayer but are not part of the standard booking funnel. They may be fired by other interactions on the platform.

{
"event": "add_to_wishlist",
"ecommerce": {
"currency": "USD",
"value": 299.00,
"items": [ ]
}
}
{
"event": "remove_from_cart",
"ecommerce": {
"currency": "USD",
"value": 299.00,
"items": [ ]
}
}
{
"event": "select_item",
"ecommerce": {
"item_list_id": "featured_hotels",
"item_list_name": "Featured Hotels",
"items": [ ]
}
}
{
"event": "view_cart"
}

No ecommerce payload is included with this event.

{
"event": "view_promotion",
"ecommerce": {
"creative_name": "Summer Banner",
"creative_slot": "hero",
"promotion_id": "promo_001",
"promotion_name": "Summer Sale",
"items": [ ]
}
}
{
"event": "select_promotion",
"ecommerce": {
"creative_name": "Summer Banner",
"creative_slot": "hero",
"promotion_id": "promo_001",
"promotion_name": "Summer Sale",
"items": [ ]
}
}
{
"event": "search",
"ecommerce": {
"search_term": "beachfront resort"
}
}
{
"event": "select_content",
"ecommerce": {
"content_type": "hotel",
"content_id": "prop_12345"
}
}
{
"event": "share",
"ecommerce": {
"method": "copy_link",
"content_type": "hotel",
"item_id": "prop_12345"
}
}
{
"event": "sign_up",
"ecommerce": {
"method": "email"
}
}
{
"event": "generate_lead",
"ecommerce": {
"currency": "USD",
"value": 0.00
}
}
{
"event": "join_group",
"ecommerce": {
"group_id": "group_abc"
}
}
{
"event": "earn_virtual_currency",
"ecommerce": {
"virtual_currency_name": "WinkPoints",
"value": 100
}
}
{
"event": "spend_virtual_currency",
"ecommerce": {
"virtual_currency_name": "WinkPoints",
"value": 50,
"item_name": "Room Upgrade"
}
}
{
"event": "level_start",
"ecommerce": {
"level_name": "Gold"
}
}
{
"event": "level_end",
"ecommerce": {
"level_name": "Gold",
"success": true
}
}
{
"event": "level_up",
"ecommerce": {
"level": 2,
"character": "traveler"
}
}
{
"event": "post_score",
"ecommerce": {
"score": 980,
"level": 2,
"character": "traveler"
}
}
{
"event": "unlock_achievement",
"ecommerce": {
"achievement_id": "first_booking"
}
}
{
"event": "tutorial_begin",
"ecommerce": {}
}
{
"event": "tutorial_complete",
"ecommerce": {}
}

This is a custom Wink event — not part of the standard GA4 event set. It is pushed on every page navigation and carries device and session context. It does not include an ecommerce object.

{
"event": "virtualPageView",
"device": "Desktop",
"deviceAgent": "Mozilla/5.0 ...",
"os": "MacOS",
"path": "/hotels/grand-resort",
"title": "Grand Resort — Wink",
"userId": "user_abc123",
"startDate": "2026-06-01",
"endDate": "2026-06-05",
"guests": "2",
"rooms": "1"
}
PropertyDescription
deviceDetected device type — Desktop, Android, iPhone, iPad, or similar
deviceAgentRaw user agent string
osDetected operating system — Windows, MacOS, Linux, UNIX
pathCurrent page path
titleCurrent page title
userIdAuthenticated user identifier (omitted when not logged in)
startDateCheck-in date from the current search session
endDateCheck-out date from the current search session
guestsNumber of guests from the current search session
roomsNumber of rooms from the current search session