Events reference for Loomi for Shopify
Events capture both what happens in Shopify and how shoppers interact with your storefront. Loomi for Shopify tracks two event types:
- Server-side events reflect Shopify data changes such as orders, carts, customers, and consent updates.
- Web events capture browser-side behavior such as page views, searches, checkout steps, and widget interactions. Web tracking is powered by the Bloomreach Web SDK in the Shopify app embed and uses Data hub event streams in Loomi for Shopify setups. For more information, see Set up web tracking for Loomi AI for Shopify.
Server-side events
cart_update
cart_updateTriggers when a shopper's cart is created or changed. Use it for abandoned cart messages and real-time offers.
| Property | Type | Description | Example |
|---|---|---|---|
_created_at | timestamp | Cart creation time (Unix) | 1718000000 |
action | string | What happened to the cart: "create", "update", or "empty" (cart cleared) | "update" |
domain | string | Shopify store domain | "mystore.myshopify.com" |
integration_id | string | Integration UUID | "abc-123-..." |
integration_name | string | Integration display name | "My Store" |
integration_type | string | Always "shopify" | "shopify" |
integration_version | string | Integration version | "3.1" |
product_ids | array of strings | Deduplicated list of product IDs in the cart | ["12345", "67890"] |
product_list | array of objects | Products with quantities | [{"product_id": "12345", "quantity": 2}] |
sku_ids | array of strings | Deduplicated list of SKUs in the cart | ["TSH-BLU-L"] |
sku_list | array of objects | SKUs with quantities | [{"sku": "TSH-BLU-L", "quantity": 2}] |
total_price | number | Cart total in store currency | 59.98 |
total_price_local_currency | number | Cart total in the customer's presentment currency | 55 |
total_quantity | integer | Total number of items in the cart | 2 |
variant_ids | array of strings | Deduplicated list of variant IDs in the cart | ["111", "222"] |
variant_list | array of objects | Variants with quantities | [{"variant_id": "111", "quantity": 1}] |
Customer identifier: cart_id, the Shopify cart token.
_customer_change
_customer_changeTriggers when a customer record changes in Shopify: create, update, enable, disable, or delete. Loomi for Shopify uses this event to update customer profiles.
| Property | Type | Description | Example |
|---|---|---|---|
action | string | What triggered the event: "create", "update", "enable", "disable", "delete" | "update" |
domain | string | Shopify store domain | "mystore.myshopify.com" |
Customer identifier: shopify_id, the Shopify customer ID.
purchase
purchaseTriggers when an order is placed or changed: on order created, paid, cancelled, fulfilled, partially_fulfilled or refunds/create.
Note
purchase.product_listis a compact order-level summary, not the full per-item payload. Use it for product IDs and quantities at the order level.If you need item-level details such as title, variant, SKU, price, discount, or fulfillment-related values, use the
purchase_itemevents. Loomi for Shopify emits onepurchase_itemevent per line item alongside thepurchaseevent.
| Property | Type | Description | Example |
|---|---|---|---|
_app_id | string | Shopify app ID that created the order | "580111" |
_discount_code_list | array of strings | Discount codes applied | ["SUMMER10"] |
_financial_status | string | Legacy field with the same value | "paid" |
_fulfillment_status | string | Legacy field with the same value | "fulfilled" |
_landing_site | string | URL of the landing page | "/collections/sale" |
_name | string | Shopify order name (human-readable order number) | "#1042" |
_referring_site | string | URL of the referring site | "https://google.com" |
_subtotal_price | number | Subtotal before shipping and tax | 75 |
_total_discounts | number | Total discount amount applied | 10 |
_total_line_items_price | number | Sum of all line item prices before discounts | 85 |
_total_weight | integer | Total weight in grams | 500 |
cancel_reason | string | Reason for cancellation | "customer" |
cancelled_at | timestamp | Time the order was cancelled, if applicable | 1718100000 |
created_at | timestamp | Order creation time (Unix) | 1718000000 |
currency | string | Store base currency code | "USD" |
domain | string | Shopify store domain | "mystore.myshopify.com" |
financial_status | string | Payment status | "paid" |
fulfillment_status | string | Shipping fulfillment status | "fulfilled" |
integration_id | string | Integration UUID | "abc-123-..." |
integration_name | string | Integration display name | "My Store" |
integration_type | string | Always "shopify" or "shopify_core" | "shopify" |
integration_version | string | Integration version | "3.1" |
local_currency | string | Customer's presentment currency | "EUR" |
payment_type | string | Payment gateway used | "shopify_payments" |
product_ids | array of integers | List of all product IDs in the order | [12345, 67890] |
product_list | array of objects | Products with quantities | [{"product_id": "12345", "quantity": 2}] |
purchase_id | string | Shopify order ID | "5678901234" |
purchase_source_type | string | Channel the order came from | "web" |
purchase_status | string | Combined financial and fulfillment status label: "created", "cancelled", "fulfilled", "partially_fulfilled", "refund_created", "partial_refund_created" | "created" |
shipping_city | string | Shipping destination city | "New York" |
shipping_company | string | Company name on the shipping address | "Acme Corp" |
shipping_country | string | Shipping destination country | "United States" |
shipping_region | string | Shipping destination state or province | "New York" |
shipping_street | string | Street address | "123 Main St" |
shipping_zip | string | Shipping postal code | "10001" |
tags | array of strings | Order tags | ["vip", "subscription"] |
tags_list | string | Comma-separated order tags | |vip|subscription| |
tax_value | number | Total tax amount | 7.2 |
total_price | number | Total charged to the customer in store currency | 89.99 |
total_price_local_currency | number | Total in the customer's presentment currency | 79.99 |
total_price_without_tax | number | Total price minus tax | 82.79 |
total_quantity | number | Total number of items ordered | 3 |
variant_ids | array of integers | List of all variant IDs in the order | [111, 222] |
variant_list | array of objects | Variants with quantities | [{"variant_id": "111", "quantity": 2}] |
purchase_item
purchase_itemTriggers once per line item in an order, alongside purchase. Each item in the order gets its own purchase_item event. Use it for items analysis and build recommendations.
NoteConfigured product and variant metafields are included only in
purchase_itemevents.
| Property | Type | Description | Example |
|---|---|---|---|
_app_id | string | Shopify app ID | "580111" |
_financial_status | string | Legacy field with the same value | "paid" |
_fulfillment_status | string | Legacy field with the same value | "fulfilled" |
_grams | number | Item weight in grams | 200 |
_name | string | Full item name, including variant | "Classic T-Shirt - Blue / Large" |
_requires_shipping | boolean | Whether the item needs physical shipping | TRUE |
_variant_title | string | Variant label (for example, size or color) | "Blue / Large" |
brand | string | Product brand or vendor | "Nike" |
cost_per_unit | number | Price multiplied by quantity, in store currency | 59.98 |
cost_per_unit_local_currency | number | Price multiplied by quantity, in presentment currency | 55 |
created_at | timestamp | Order creation time (Unix) | 1718000000 |
currency | string | Store base currency | "USD" |
discount_amount | number | Total discount applied to this line item | 5 |
domain | string | Shopify store domain | "mystore.myshopify.com" |
financial_status | string | Payment status | "paid" |
fulfillment_status | string | Item fulfillment status | "fulfilled" |
integration_id | string | Integration UUID | "abc-123-..." |
integration_name | string | Integration display name | "My Store" |
integration_type | string | Always "shopify" | "shopify" |
integration_version | string | Integration version | "3.1" |
local_currency | string | Customer's presentment currency | "EUR" |
original_price | number | Price before any discounts | 39.99 |
price | number | Unit price in store currency | 29.99 |
price_local_currency | number | Unit price in the customer's presentment currency | 27.5 |
product_id | string | Shopify product ID | "12345" |
product_tags | array of strings | Product-level tags | ["new-arrival", "sale"] |
product_tags_list | string | Comma-separated product tags | |vip|subscription| |
purchase_id | string | Shopify order ID (links back to the purchase event) | "5678901234" |
purchase_source_type | string | Order channel | "web" |
purchase_status | string | Order payment status | "paid" |
quantity | number | Number of units purchased | 2 |
sku | string | Product SKU | "TSH-BLU-L" |
tags | array of strings | Order-level tags | ["vip", "subscription"] |
tags_list | string | Comma-separated order tags | ` |
title | string | Product title | "Classic T-Shirt" |
total_price | number | Total line item price after discounts | 59.98 |
variant_id | string | Shopify variant ID | "111" |
variant_title | string | Variant label (same value, non-prefixed) | "Blue / Large" |
shopify_consent
shopify_consentTriggers when a customer's email or SMS consent changes. Use it to track consent and manage suppression lists.
| Property | Type | Description | Example |
|---|---|---|---|
action | string | Consent decision: "accept" or "reject" | "accept" |
category | string | Consent category ID mapped to the Shopify marketing channel | "email_newsletter" |
email | string | Email address of the consented user | "[email protected]" |
integration | string | Integration type label: "shopify-v3" or "unified-shopify" | "shopify-v3" |
integration_id | string | Integration UUID | "abc-123-..." |
shopify_domain | string | Shopify store domain | "mystore.myshopify.com" |
sms | string | Phone number of the consented user | "+12025550147" |
valid_until | string | Consent expiry — always "unlimited" for Shopify | "unlimited" |
Customer identifier: shopify_id.
Web events
Common properties
All events include the following properties:
| Property | Type | Description | Example |
|---|---|---|---|
customer_locale | string | Customer/storefront locale for the current page or session, if available | "en-AL" |
domain | string | Shopify store domain | "mystore.myshopify.com" |
integration_id | string | Integration UUID | "abc-123-..." |
integration_type | string | Always "shopify" | "shopify" |
location | string | Full homepage URL | "https://mystore.com" |
page_title | string | Title of the current page | "Classic T-Shirt | My Store" |
referrer | string | URL of the referring page | "https://www.google.com/" |
add_to_cart
add_to_cartTriggers when a shopper adds a product to their cart, from either a product page or a quick view.
This event is available for customers with Search enabled.
| Property | Type | Description | Example |
|---|---|---|---|
product_id | string | Shopify product ID | "12345" |
title | string | Product name | "Classic T-Shirt" |
total_price | number | Total price of items inside a cart | 1999.99 |
variant_id | string | Selected variant ID | "111" |
widget_id | string | Widget identifier | "similar-products-pdp" |
widget_query | string | Query value of the widget response, such as the shopper’s search term | "turtleneck" |
widget_response_id | string | Unique ID of the widget response, attributes the add-to-cart action to a specific widget result set | "abcd123" |
widget_type | string | Type of recommendation widget | "item_based" |
conversion
conversionTriggers when a purchase completes. This is the Loomi equivalent of the webhook-based purchase event, tracked through the Shopify Web Pixel for immediate browser-side capture.
This event is available for customers with Search enabled.
Enabled by: purchase_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
local_currency | string | Store currency, mapped as currency in Search | "USD" |
price_local_currency | number | Price in local currency | 100.99 |
product_list | array of objects | Line items, each item includes product_id, quantity; optionally, variant_id, title, price | [{"product_id": "12345", "quantity": 2}] |
purchase_id | string | Shopify order ID, mapped as order_id in Search | "5678901234" |
total_price | number | Total order value | 89.99 |
checkout
checkoutTriggers when a shopper starts checkout. Maps to Shopify's checkout_started standard pixel event. Carried over unchanged from the previous Shopify web pixel integration.
Enabled by: checkout_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
currency | string | Store currency code | "USD" |
domain | string | Shopify store domain | "mystore.myshopify.com" |
shipping_city | string | City where the order is being shipped | "Paris" |
shipping_cost | number | Total shipping cost | 49.99 |
shipping_country | string | Country where the order is being shipped | "France" |
step_title | string | Current checkout step/state | "checkout_started" |
total_price | number | Checkout total in store currency | 89.99 |
Customer identifier: cookie (browser cookie), linked to email_id or shopify_id when the shopper is logged in.
search_submit
search_submitTriggers when a shopper submits a search query, either by pressing Enter or clicking the search button. Replaces the legacy search event.
Enabled by: search_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
catalogs | array of objects | List of catalogs searched for this query. Each catalog includes name; optionally, view_ids for the catalog views used on the page | [{"name":"products_en","view_ids":["en_US"]}] |
q | string | Search term submitted | "blue sneakers" |
suggest
suggestTriggers when a shopper interacts with the Loomi for Shopify autosuggest dropdown, either by seeing suggestions as they type or selecting one.
Autosuggest clicks don't follow the same event pattern for every suggestion type.
- Clicking a product suggestion doesn’t trigger a separate search submission event.
- Product suggestion attribution can be carried in the destination URL instead of relying on a
suggestevent on click. - Search-results page view behavior remains separate from autosuggest interaction tracking.
If you are validating this behavior in an existing storefront, confirm it against the currently deployed integration behavior because this area was recently adjusted.
Enabled by: suggest_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
aq | string | Current input text that triggered autosuggest | "blue sn" |
q | string | The suggestion that was shown or selected | "blue sneakers" |
view_category
view_categoryTriggers when a shopper views a collection page. Maps to Shopify's collection_viewed standard pixel event. Carried over unchanged from the previous Shopify web pixel integration.
Enabled by: view_category_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
category_id | string | Shopify collection ID | "270573969570" |
title | string | Collection display name | "Summer sale" |
Customer identifier: cookie.
view_homepage
view_homepageTriggers when a shopper views the store's homepage.
Enabled by: view_homepage_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
domain | string | Shopify store domain | "mystore.myshopify.com" |
integration_id | string | Integration UUID | "abc-123-..." |
location | string | Full homepage URL | "https://mystore.com" |
view_item
view_itemTriggers when a shopper loads a product detail page. Records a product impression before it is sent.
Enabled by: view_item_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
_vendor | string | Shopify product vendor | "Acme" |
available | boolean | Whether the variant is available for sale | true |
brand | string | Product brand name | "Acme" |
price | number | Product price | 29.99 |
product_id | string | Shopify product ID | "12345" |
stock_level | number | Current inventory quantity for the item | 100 |
tags | array | Product tags | ["summer","sale"] |
title | string | Product title | "Classic T-Shirt" |
variant_id | string | Shopify variant ID | "111" |
variant_inventory | number | Current inventory quantity for the selected variant | 20 |
view_quickview
view_quickviewTriggers when a shopper opens a quick view panel for a product without navigating to the product detail page.
Enabled by: quick_view_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
product_id | string | Shopify product ID | "12345" |
title | string | Product name | "Classic T-Shirt" |
variant_id | string | Selected variant ID | "111" |
view_search_results
view_search_resultsTriggers when the search results page loads. This is a separate event from search_submit, so you can analyze zero-result searches and result-to-click funnels.
Enabled by: view_search_results_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
catalogs | array of objects | List of catalogs searched for this query. Each catalog includes name; optionally, view_ids for the catalog views used on the page | [{"name":"products_en","view_ids":["en_US"]}] |
search_term | string | Search term the results are for | "blue sneakers" |
widget_click
widget_clickTriggers when a shopper clicks a product inside a recommendations widget.
Enabled by: widget_click_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
product_id | string | Product that was clicked | "12345" |
widget_id | string | Widget identifier | "similar-products-pdp" |
widget_query | string | Query value of the widget response, such as the shopper’s search term | "turtleneck" |
widget_response_id | string | Unique ID of the widget response | "abcd123" |
widget_type | string | Type of recommendation widget | "item_based" |
widget_view
widget_viewTriggers when a recommendations set renders and becomes visible on a page.
Enabled by: widget_view_tracking = true
| Property | Type | Description | Example |
|---|---|---|---|
widget_id | string | Widget identifier | "similar-products-pdp" |
widget_query | string | Query value of the widget response, such as the shopper’s search term | "turtleneck" |
widget_response_id | string | Unique ID of the widget response | "abcd123" |
widget_type | string | Type of recommendation widget | "item_based" |
Migrating from legacy search tracking
The previous Shopify web pixel integration tracked search with a single search event. Loomi for Shopify replaces it with two separate events: search_submit and view_search_results. Update any campaign triggers or segments that use search when you migrate.
Key differences from legacy Shopify tracking
| / | Legacy Shopify integration | Loomi for Shopify |
|---|---|---|
| Pixel | Marketing SDK Web Pixel | Bloomreach Web SDK (app embed) |
search event | Single search event | Split into search_submit and view_search_results |
| Search and recommendation events | Not available | widget_view, widget_click, suggest, view_search_results |
| Data routing | Direct to Bloomreach | Through Data hub event streams |
view_item enrichment | Server-side | Pure view_item events without server-side enrichment |
Event timestamps
Loomi for Shopify doesn't use one timestamp rule for every event type.
purchaseandpurchase_itemuse the Shopify ordercreated_attimestamp.- Post-purchase changes that update the same order state still follow the order
created_attimestamp unless noted otherwise in a specific event payload. - Consent events use the source event timestamp when Shopify provides it. If that timestamp isn't available, Bloomreach falls back to the time the consent data was imported.
Timestamp behavior stays aligned with the legacy Shopify integration.
Updated 3 minutes ago

