{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-contents/checkout/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Upsell on Confirmation Page","description":"Explore our documentation and API and start integrating Kustom Checkout","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"upsell-on-confirmation-page","__idx":0},"children":["Upsell on Confirmation Page"]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This page explains how to enable and integrate the Kustom Upsell feature, which displays product recommendations on the order confirmation page after a purchase is completed."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Upsell must be enabled for your merchant account before use. Contact Kustom to activate it."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Upsell lets you present product recommendations to shoppers immediately after they complete a purchase. Because payment is already authorized, shoppers can add items to their existing order with a single tap — no re-entering payment details."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Kustom handles the UI widget, payment authorization increase, and order updates. You control what products are shown and when."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"enabling-upsell","__idx":2},"children":["Enabling upsell"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"enable-per-order","__idx":3},"children":["Enable per order"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["options.confirmation_page_upsell"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," when creating a checkout order. This is the recommended approach for A/B testing or selective rollout."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"options\": {\n    \"confirmation_page_upsell\": true\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The flag can be updated on the order until it reaches status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["checkout_complete"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"enable-for-all-sessions-global","__idx":4},"children":["Enable for all sessions (global)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Kustom can enable upsell at the merchant ID level so all eligible sessions show the widget without any per-order flag. You can still override per order using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["options.confirmation_page_upsell: false"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Contact Kustom to enable global activation."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When upsell is not applicable — for example if it is disabled or the payment method is unsupported — the confirmation push fires immediately with no delay to your existing flow."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"choosing-a-recommendation-engine","__idx":5},"children":["Choosing a recommendation engine"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Kustom supports two recommendation modes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"kustom-ai-engine-recommended","__idx":6},"children":["Kustom AI engine (recommended)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Provide a Google Shopping feed URL and Kustom handles enrichment, model training, and serving. No ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_urls.upsell"]}," endpoint is needed."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Parameter"},"children":["Parameter"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Details"},"children":["Details"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Feed format"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Google Shopping XML or CSV — public URL"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sync frequency"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Every 2–4 hours"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["One feed per"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Market / currency pair (e.g. SE-SEK, DE-EUR)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Recommended filter"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["min_stock=50"]}," to avoid out-of-stock recommendations"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The AI model works from day one without historical data and improves with every interaction."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"your-own-endpoint","__idx":7},"children":["Your own endpoint"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_urls.upsell"]}," to your recommendation endpoint. Kustom calls it before the confirmation page loads and you return the list of products to display."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"merchant_urls\": {\n    \"upsell\": \"https://www.example.com/api/upsell\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Your endpoint must respond within 2–3 seconds. A slow or failed response results in no widget being shown and the push notification fires immediately."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The sections below on request/response structure apply only when using your own endpoint."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"upsell-callback","__idx":8},"children":["Upsell callback"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_urls.upsell"]}," is set, Kustom sends a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST"]}," request to that URL before the confirmation page loads."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"request--upsell_request","__idx":9},"children":["Request — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_request"]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_possible"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["boolean"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," if the payment method does not support upsell."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["max_upsell_amount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Maximum additional amount that can be authorized, in minor units. Pre-filter your recommendations by this value."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["order_lines"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["array"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Current items in the order."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["selected_shipping_option"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The shipping option selected by the customer. Use to filter out items that would break the selected shipping method."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["billing_address"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use for tax rate and locale-aware filtering."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["shipping_address"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use for tax rate and locale-aware filtering."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["purchase_currency"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["ISO 4217 (e.g. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SEK"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EUR"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["USD"]},")."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["locale"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["RFC 1766 (e.g. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sv-SE"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["en-US"]},")."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your merchant ID."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["session_id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The order/session ID. Use to map the request to your internal order model."]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The callback is made even when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_possible"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},". Return an empty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_lines[]"]}," array in that case to short-circuit."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These fields enable you to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Price products correctly based on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["purchase_currency"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["locale"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Apply correct tax rates based on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["billing_address"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["shipping_address"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Pre-filter candidates using the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["max_upsell_amount"]}," authorization headroom"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Consider shipping compatibility via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["selected_shipping_option"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"response--upsell_service_response","__idx":10},"children":["Response — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_service_response"]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Required"},"children":["Required"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_lines"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["array"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["List of products to display. Return an empty array to show no widget."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_upsell_time"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["ISO 8601 datetime when the upsell window expires. If omitted, Kustom uses the MID-level timeout."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["notification_uri"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["URL for push notifications when the order is updated with upsell items. Use as a trigger to re-read the order from the Order Management API (Method 1)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["empty"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["boolean"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Signal no upsell without returning lines."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"upsell-line-fields--upsell_line","__idx":11},"children":["Upsell line fields — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_line"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Required fields:"]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product name (max 255 characters)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Default offered quantity. See note below."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unit_price"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Minor units, includes tax."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tax_rate"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Two implicit decimals. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2500"]}," = 25%."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["total_amount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Minor units, includes tax and discount. Must equal ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unit_price × quantity"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["total_tax_amount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Minor units."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["max_allowed_quantity"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Maximum quantity the shopper can add."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Strongly recommended fields:"]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reference"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU or article number."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["image_url"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product card image URL (max 1024 characters). Required to render product cards."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["product_url"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Link to the product page (max 1024 characters)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["description"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product description (max 1024 characters)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["product_identifiers"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product identifiers such as GTIN or ISBN."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["shipping_attributes"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Weight, dimensions, and tags for shipping compatibility checks."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["feedback_url"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Item-level signal URL called when a shopper adds the item."]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Number validation"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unit_price × quantity"]}," must equal ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["total_amount"]},". Kustom re-validates and recalculates when a shopper adds an item."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"understanding-the-quantity-field","__idx":12},"children":["Understanding the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity"]}," field"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity"]}," is the default offer quantity you are proposing, not the shopper's final selection. If you are unsure, set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity: 1"]}," and control the upper bound via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["max_allowed_quantity"]},". Kustom recalculates totals and re-validates authorization when the shopper adds items."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"name\": \"Matching Phone Case\",\n  \"quantity\": 1,\n  \"unit_price\": 19900,\n  \"max_allowed_quantity\": 5,\n  \"tax_rate\": 2500,\n  \"total_amount\": 19900,\n  \"total_tax_amount\": 3980\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"example-response","__idx":13},"children":["Example response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"upsell_lines\": [\n    {\n      \"name\": \"Baseball Cap\",\n      \"reference\": \"CAP-SAND-001\",\n      \"quantity\": 1,\n      \"unit_price\": 40000,\n      \"tax_rate\": 2500,\n      \"total_amount\": 40000,\n      \"total_tax_amount\": 8000,\n      \"max_allowed_quantity\": 3,\n      \"image_url\": \"https://www.example.com/images/cap-sand.jpg\",\n      \"product_url\": \"https://www.example.com/products/cap-sand\"\n    }\n  ],\n  \"last_upsell_time\": \"2024-01-01T12:05:00Z\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"upsell-validation-callback-optional","__idx":14},"children":["Upsell validation callback (optional)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_urls.upsell_validation"]}," to control whether a specific item add is allowed before Kustom processes it. This callback is not required — by default, items are added without a validation callback."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"merchant_urls\": {\n    \"upsell_validation\": \"https://www.example.com/api/upsell-validation\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The request body is the same as the standard order API model, with one addition: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_order_lines"]},", which contains the list of upsell lines being requested for addition. The model is the same as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["order_lines"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2xx"]}," to allow the add. Any other status code blocks it."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Do not rely on this callback as the final confirmation. The payment authorization increase can still fail after this callback returns. Use the confirmation push to finalize the order state."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"integration-methods","__idx":15},"children":["Integration methods"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Because items can be added after the initial payment, you need to decide how your backend handles order creation. There are two approaches."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/upsell-integration-methods.04ea02dca8752532fb10c21250c9b1aa4cc485d7208aa315374e2e6ff37d4d2b.f02f6a03.png","alt":"Integration methods for upsell on confirmation page"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"method-1--create-on-redirect","__idx":16},"children":["Method 1 — Create on redirect"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create the order immediately when the shopper is redirected to the confirmation page, then accept updates as items are added."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Payment is authenticated — KCO marks the checkout order as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CHECKOUT_COMPLETE"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["KCO redirects to your confirmation page URL."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your backend reads the order and creates it in your system, placed on hold."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You load the KCO confirmation iframe."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["KCO calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_urls.upsell"]}," to fetch recommendations."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Shopper adds items — KCO triggers the upsell validation callback if configured, increases authorization, and updates the order."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Upsell timeout expires — KCO sends the confirmation push."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your backend reads the final order state and releases the hold for fulfilment."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Best for merchants who need immediate order visibility in their systems or who handle high-value items where instant inventory reservation is critical."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Fulfilment timing"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The order must be updatable during the upsell timeout window. Do not send it to your warehouse or trigger confirmation emails until the confirmation push arrives."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"method-2--create-on-push-recommended","__idx":17},"children":["Method 2 — Create on push (recommended)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Do not create the order in your system until the confirmation push arrives. This avoids mid-session order modifications entirely."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Payment is authenticated — KCO marks the checkout order as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CHECKOUT_COMPLETE"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["KCO redirects to your confirmation page URL."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your backend reads the order but does ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," create it yet."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You load the KCO confirmation iframe."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["KCO calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_urls.upsell"]}," to fetch recommendations."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Shopper adds items — KCO handles authorization and updates the order."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Upsell timeout expires — KCO sends the confirmation push with the final ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["order_lines"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your backend creates the order once from the push payload."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Best for most integrations — simpler logic, no order modification needed, faster go-live."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"determining-which-flow-applies","__idx":18},"children":["Determining which flow applies"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The confirmation push is only delayed if upsell is enabled for the session ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["and"]}," the payment method supports upsell. If either condition is false, the push fires immediately — you do not need to wait."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can determine whether upsell is active by:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Checking ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["options.confirmation_page_upsell"]}," on the order object"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Observing the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_possible"]}," field in the upsell callback request"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Checking whether the upsell widget appears in the iframe"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"payment-method-support","__idx":19},"children":["Payment method support"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Payment method"},"children":["Payment method"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Upsell supported"},"children":["Upsell supported"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Klarna BNPL / Pay Later"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Swish"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Direct bank transfer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_possible"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},", the widget is not shown and the push fires immediately with no change to your existing flow."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Kustom can increase Klarna authorization limits on a per-merchant basis. Contact Kustom to discuss your limits. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["max_upsell_amount"]}," in your recommendations endpoint to pre-filter products to amounts that can be authorized."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"upsell-timeout","__idx":20},"children":["Upsell timeout"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The upsell window is configured at the merchant ID level by Kustom, with a maximum of 15 minutes. The timeout cannot be set via the API — contact Kustom to configure your preferred duration."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Upsell is compatible with the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["minimal_confirmation"]}," GUI option. The upsell widget overrides it automatically when upsell is enabled."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"shipping-and-upsell","__idx":21},"children":["Shipping and upsell"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_request"]}," always includes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["selected_shipping_option"]}," when available. Use this to filter out recommendations that would break the selected shipping method."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["shipping_attributes"]}," on your upsell lines to specify weight, dimensions, and tags. This is the recommended way to ensure suggestions are compatible with the selected shipping method."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"shipping_attributes\": {\n    \"weight\": 500,\n    \"dimensions\": {\n      \"width\": 100,\n      \"height\": 150,\n      \"length\": 200\n    },\n    \"tags\": [\"standard\", \"non-fragile\"]\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Shipping information is only included in the upsell request if you use Kustom Shipping Assistant. Without it, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["selected_shipping_option"]}," will not be present."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If your shipping platform requires re-rating after cart changes (for example when using a third-party TMS), you have two options:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pre-filter (recommended):"]}," Perform a soft compatibility check in your upsell endpoint before returning candidates. Only propose items that keep the current shipping method valid."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Post-upsell re-rate:"]}," After an upsell is accepted, re-rate and handle any method changes per your policy. You can optionally use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["shipping_option_update"]}," callback for this."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"tracking-upsold-items","__idx":22},"children":["Tracking upsold items"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Compare ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["order_lines"]}," in the original checkout order with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["order_lines"]}," in the final confirmation push to identify which items were added via upsell. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["feedback_url"]}," on each ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_line"]}," for item-level add signals."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Recommendations are fetched once before the confirmation page loads and cannot be refreshed during the upsell window. Return your best candidates in the initial response."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"faq","__idx":23},"children":["FAQ"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What does the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity"]}," field mean in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_line"]},"?"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["It is the default offer quantity you are proposing, not the shopper's final selection. Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity: 1"]}," and use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["max_allowed_quantity"]}," to control the upper bound. Kustom recalculates totals and re-validates authorization when the shopper adds items."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["When should we create the order — on redirect or after the push?"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Both are supported. Method 2 (create on push) is simpler for most integrations. Method 1 (create on redirect) is better when immediate inventory reservation is required. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#integration-methods"},"children":["Integration methods"]}," above."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["How do we know if we should wait for a delayed push?"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The push is only delayed if upsell is enabled and the payment method supports it. Check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["options.confirmation_page_upsell"]}," on the order or the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsell_possible"]}," field in the upsell request."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What happens if our upsell endpoint is slow or times out?"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The confirmation page loads normally, the upsell widget is not shown, and the push fires immediately. Optimize your endpoint to respond within 2–3 seconds."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Can we A/B test recommendation variants?"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Yes. You can swap your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchant_urls.upsell"]}," endpoint at any time to test variants against each other or against the Kustom AI engine."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Can we show free shipping thresholds in the widget?"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["No. Real-time free shipping threshold tracking within the upsell widget is not currently supported. Handle threshold logic on your side when processing the final order after the push."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What happens if the upsell amount exceeds the authorization?"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Kustom validates authorization when the shopper adds items and blocks additions that exceed the limit. Pre-filtering your recommendations by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["max_upsell_amount"]}," improves conversion by avoiding recommendations that will be blocked."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["How do we track which items were upsold?"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Compare the original ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["order_lines"]}," with the final ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["order_lines"]}," from the confirmation push. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["feedback_url"]}," on upsell lines for item-level add signals."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"api-reference","__idx":24},"children":["API reference"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/contents/api/checkout"},"children":["Checkout API"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/contents/api/checkout-callback"},"children":["Merchant Callbacks API"]}]}]}]},"headings":[{"value":"Upsell on Confirmation Page","id":"upsell-on-confirmation-page","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Enabling upsell","id":"enabling-upsell","depth":2},{"value":"Enable per order","id":"enable-per-order","depth":3},{"value":"Enable for all sessions (global)","id":"enable-for-all-sessions-global","depth":3},{"value":"Choosing a recommendation engine","id":"choosing-a-recommendation-engine","depth":2},{"value":"Kustom AI engine (recommended)","id":"kustom-ai-engine-recommended","depth":3},{"value":"Your own endpoint","id":"your-own-endpoint","depth":3},{"value":"Upsell callback","id":"upsell-callback","depth":2},{"value":"Request — upsell_request","id":"request--upsell_request","depth":3},{"value":"Response — upsell_service_response","id":"response--upsell_service_response","depth":3},{"value":"Upsell line fields — upsell_line","id":"upsell-line-fields--upsell_line","depth":3},{"value":"Understanding the quantity field","id":"understanding-the-quantity-field","depth":4},{"value":"Example response","id":"example-response","depth":3},{"value":"Upsell validation callback (optional)","id":"upsell-validation-callback-optional","depth":2},{"value":"Integration methods","id":"integration-methods","depth":2},{"value":"Method 1 — Create on redirect","id":"method-1--create-on-redirect","depth":3},{"value":"Method 2 — Create on push (recommended)","id":"method-2--create-on-push-recommended","depth":3},{"value":"Determining which flow applies","id":"determining-which-flow-applies","depth":3},{"value":"Payment method support","id":"payment-method-support","depth":2},{"value":"Upsell timeout","id":"upsell-timeout","depth":2},{"value":"Shipping and upsell","id":"shipping-and-upsell","depth":2},{"value":"Tracking upsold items","id":"tracking-upsold-items","depth":2},{"value":"FAQ","id":"faq","depth":2},{"value":"API reference","id":"api-reference","depth":2}],"frontmatter":{"seo":{"title":"Upsell on Confirmation Page"}},"lastModified":"2026-05-22T06:37:35.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/contents/checkout/use-cases/upsell","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}