upsell_skipped
Every time an upsell is skipped.
CODE
next.analytics.on('upsell_skipped', (event) => {});Triggered by upsell.skipped.
Data
Present: always; optional when it may be missing; campaign once the campaign is loaded; priced once the server priced the cart.
| Field | Type | Present | |
|---|---|---|---|
ref_id | string | always | The order the offer is for. |
page | string | always | The upsell page's path. |
selector_id | string | optional | The offer's selector, when it has one. |
option_id | string | optional | The picked option, for an offer with a selector. |
lines | CartItem[] | always | What the offer adds, at its quantity. Priced once the offer has a price. |
currency | string | optional | ISO 4217, such as USD. |
total | number | priced | What the offer costs after discounts. |
CartItem
A line of the cart. Its prices are there once the server priced the cart.
| Field | Type | Present | |
|---|---|---|---|
package_id | number | always | The package's ref_id in the campaign. |
quantity | number | always | Package quantity. |
is_upsell | boolean | optional | true for a line added after the order. |
properties | Record<string, string> | optional | Line properties, such as a variant picked in a bundle slot. |
product_id | number | campaign | The product in the store. |
product_title | string | campaign | The product's name as customers see it, as on an order line; the package's name for a package without one. |
variant_id | number | campaign | The product variant, for a product with variants. |
variant_title | string | campaign | The variant's name, such as Black / M, for a product with variants. |
sku | string | campaign | The product's Stock Keeping Unit. |
image | string | campaign | The package's image URL. |
price | number | priced | What one package costs after discounts. |
original_price | number | priced | What one package costs before discounts; equal to price when nothing is taken off. |
total_discount | number | priced | The discount on the line. |
total | number | priced | price × quantity. |
subtotal | number | priced | The line before discounts: total = subtotal − total_discount. |
discount_percentage | number | priced | total_discount ÷ subtotal × 100, to two decimals; 0 without a discount. |
discounts | Discount[] | priced | The discounts on the line. |
subscription | Subscription | campaign | For a package billed again every interval. |
Discount
A discount on the cart's products or on its shipping. Amounts are in the cart's currency.
| Field | Type | Present | |
|---|---|---|---|
name | string | always | The offer's name. |
amount | number | always | The amount taken off. |
source | "offer" | "coupon" | always | coupon for a code the shopper entered (it is in coupons); offer for an automatic offer or a bundle card's own code. |
code | string | optional | The code, for a coupon. |
offer_id | number | always | The offer that gave it. |
percentage | number | optional | The percentage the offer is set to take off, as the API reports it, such as 20. Its configured value, for a label such as “20% off”; the amount actually taken off is amount. |
Subscription
A package billed again every interval.
| Field | Type | Present | |
|---|---|---|---|
interval | "day" | "month" | always | The unit of the renewal interval. |
interval_count | number | always | How many intervals between renewals. |
price | number | priced | What each renewal charges, after discounts. |
original_price | number | priced | What each renewal charges before discounts. |
Example
The envelope next.analytics.on hands out, with data inside. See How analytics works for its fields.
CODE
{
"event_id": "3f2b8c1d9e7a4b6c8d5e2f1a0b9c8d7e",
"event_type": "upsell_skipped",
"object": "upsell",
"data": {
"ref_id": "R1",
"page": "/upsell/",
"lines": [
{
"package_id": 3,
"quantity": 1
}
]
},
"created_at": "2026-11-04T08:30:00.000Z",
"session_id": "0b8f3c2d1e4a4f6b9c7d5e3f2a1b0c9d",
"sdk_version": "0.5.0",
"context": {
"page_location": "https://shop.test/checkout/",
"page_title": "Olympus Earbuds",
"page_referrer": "",
"campaign": {
"id": 1310,
"name": "Olympus",
"currency": "USD",
"language": "en"
},
"session_id": "0b8f3c2d1e4a4f6b9c7d5e3f2a1b0c9d",
"attribution": {
"funnel": "Olympus"
},
"browser": {
"user_agent": "Mozilla/5.0 …",
"language": "en-US",
"device_type": "desktop"
}
}
}Sent to
| Destination | As |
|---|---|
| GTM | dl_skipped_upsell |
| GA4 | skip_upsell |
| Meta pixel | Not sent |
| RudderStack | Upsell Skipped |