> ## Documentation Index
> Fetch the complete documentation index at: https://developers.redo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# checkoutExperienceUpsellPageSet

> Attach, swap or remove a checkout experience's upsell page. Its page wins over the post-purchase flow, and over any A/B test in it, for orders placed through that experience. Changing a live experience needs `confirmLiveChange`, or fails with CHECKOUT_EXPERIENCE_LIVE (409). Null if the experience or the page doesn't exist, or belongs to another store. CONVERSION_FEATURE_LOCKED (409) when post-purchase is locked for the store.

**Required scopes:** [`checkout_write`](https://developers.redo.com/docs/api-reference/v3/reference/scopes#scope-checkout_write)

## Arguments

**checkoutExperienceId** `ID!` *required*

The experience.

**confirmLiveChange** `Boolean`

Set after a person agrees to change what shoppers see right now.

**upsellPageId** `ID`

The page to attach; omit or pass null to remove it.

## Returns

**checkoutExperienceUpsellPageSet** `[CheckoutExperience](/docs/api-reference/v3/reference/checkout/checkout-experience)`

A checkout experience: a named group of shipping methods shown together at checkout. It does not decide who sees it — the checkout tree does. An experience can also group checkout widgets, which are not covered here, and a post-purchase upsell page.

**fields**

**active** `Boolean!` *required*

True when this experience is reachable in the team's live checkout tree.

**addLandedCosts** `Boolean`

True when landed costs (duties and import fees) are added to every method's price in this experience. Omitted when the merchant has never configured it.

**autoSelectedShippingMethodIds** `[ID!]`

Shipping methods shown first at checkout, in this order, as IDs from `methods`. The first one available is pre-selected for the shopper; methods not listed follow in their usual order. Omitted when auto-selection is off for this experience.

**createdAt** `[DateTime!](/docs/api-reference/v3/reference/common/date-time)` *required*

Creation timestamp, ISO 8601 UTC.

**fulfillmentDelayDaysOverride** `Int`

Days Redo assumes an order takes to ship when it estimates delivery dates, for every shipping method in this experience. A dynamic method's own `fulfillmentDelayDaysOverride` takes precedence. Omitted when the experience uses the store-level value. A whole number of days, zero or more.

**id** `ID!` *required*

Checkout experience ID.

**methods** `[\[ShippingMethod!\]!](/docs/api-reference/v3/reference/checkout/shipping-method)` *required*

Shipping methods offered by this experience.

**fields**

**addLandedCostsOverride** `Boolean`

True when landed costs (duties and import fees) are added to this method's price, overriding the experience-level setting. Omitted when the method does not override it.

**carrierServices** `[\[ShippingMethodCarrierService!\]](/docs/api-reference/v3/reference/checkout/shipping-method-carrier-service)`

Dynamic methods only. The carrier services this method quotes live rates from. This is the answer to 'which carrier do my checkout rates come from' — the rates are fetched by Redo from these carriers. Empty means no carrier service has been pinned, so the method draws on whatever the account has available.

**fields**

**carrier** `[ShippingCarrier!](/docs/api-reference/v3/reference/checkout/shipping-carrier)` *required*

Carrier this method draws a live rate from.

**enabled** `Boolean`

Whether the merchant has this carrier service turned on. A disabled service is configured but not quoted. Defaults to true, and is omitted only on records predating the flag.

**markup** `[ShippingMethodCarrierServiceMarkup](/docs/api-reference/v3/reference/checkout/shipping-method-carrier-service-markup)`

Markup applied to this carrier service specifically, on top of any method-level markup. Omitted when no per-service markup is set.

**service** `String!` *required*

Carrier-specific service code, e.g. 'fedex\_ground' or 'usps\_priority'. The valid set differs per carrier, so this is not a single closed enum.

**coverageTypes** `[ShippingMethodCoverageTypes](/docs/api-reference/v3/reference/checkout/shipping-method-coverage-types)`

Redo coverage bundled into this shipping method. Omitted when no coverage is bundled.

**fields**

**packageProtection** `Boolean`

True when package protection is included. Omitted when never configured.

**return** `Boolean`

True when return coverage is included. Omitted when never configured.

**description** `String!` *required*

Shopper-facing description shown next to the method at checkout. Like `name`, it may contain customer-name template variables; see `fallbackDescription`.

**excludedCarriers** `[\[ShippingCarrier!\]](/docs/api-reference/v3/reference/checkout/shipping-carrier)`

Dynamic methods only. Carriers never considered for this method. Omitted when no carrier is excluded.

**fallbackDescription** `String`

Shopper-facing description used in place of `description` under the same condition as `fallbackName`: `description` contains customer-name template variables and the shopper's name is not available. Omitted when the merchant has not set one.

**fallbackName** `String`

Shopper-facing name used in place of `name` when `name` contains customer-name template variables and the shopper's name is not available at quote time. Ignored when `name` has no variables. Omitted when the merchant has not set one, in which case an unpersonalized `name` renders with the variables emptied out.

**fulfillmentDelayDaysOverride** `Int`

Dynamic methods only. Days Redo assumes an order takes to ship when it estimates delivery dates for this method, overriding the experience's `fulfillmentDelayDaysOverride`. Omitted when the method uses the experience's value, or the store-level value if the experience sets none. A whole number of days, zero or more.

**id** `ID!` *required*

Shipping method ID.

**markup** `[ShippingMethodMarkup](/docs/api-reference/v3/reference/checkout/shipping-method-markup)`

Dynamic methods only. Markup applied to every live carrier rate on this method, on top of which per-carrier-service markups still apply. Omitted when no method-level markup is set.

**fields**

**amount** `[ShippingMethodMarkupAmount](/docs/api-reference/v3/reference/checkout/shipping-method-markup-amount)`

Flat amount added on top of every carrier rate. Omitted when only a percentage markup is set, or none.

**percentage** `[Decimal](/docs/api-reference/v3/reference/common/decimal)`

Percentage added on top of every carrier rate, as a decimal string (e.g. '10' means +10%). Omitted when only a flat markup is set, or none.

**name** `String!` *required*

Shopper-facing name of the shipping method as it appears at checkout. May contain customer-name template variables — '\{customer\_name}', '\{customer\_name:first}', '\{customer\_name:last}' — which are substituted per shopper. Preserve them when rewriting this field, or personalization is silently dropped; see `fallbackName` for what is shown when the shopper's name is unknown.

**orderTags** `[String!]`

Tags applied to the order when this method is bought. Omitted when the merchant has configured no tags.

**priceBounds** `[ShippingMethodPriceBounds](/docs/api-reference/v3/reference/checkout/shipping-method-price-bounds)`

Dynamic methods only. Hard clamp applied after markup and rounding. Omitted when the price is not clamped.

**fields**

**currency** `String!` *required*

Currency of the bounds.

**maximum** `[Decimal](/docs/api-reference/v3/reference/common/decimal)`

Highest price ever shown, as a decimal string. Omitted when there is no ceiling.

**minimum** `[Decimal](/docs/api-reference/v3/reference/common/decimal)`

Lowest price ever shown, as a decimal string. Omitted when there is no floor.

**priceConstraints** `[ShippingMethodPriceConstraints](/docs/api-reference/v3/reference/checkout/shipping-method-price-constraints)`

Bounds the method's sold price must stay within. Omitted when the merchant has set no price or margin constraints.

**fields**

**absoluteMinimumPrice** `Float`

Floor applied after the relative bound: the effective minimum is the greater of this and the referenced price plus `byAtLeast`. Present only on 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' constraints, and omitted when unset.

**byAtLeast** `[ShippingMethodPriceInequality](/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality)`

How far above the referenced method's price this method must sit. Present only on 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' constraints, and omitted when unset.

**byAtMost** `[ShippingMethodPriceInequality](/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality)`

How far above the referenced method's price this method may sit. Present only on 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' constraints, and omitted when unset.

**currency** `String!` *required*

Currency all bounds are expressed in.

**kind** `[ShippingMethodPriceConstraintKind!](/docs/api-reference/v3/reference/checkout/shipping-method-price-constraint-kind)` *required*

How the bounds are expressed: 'DEFAULT' bounds the price absolutely, 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' bounds it against another shipping method's price.

**marginAtLeast** `[ShippingMethodPriceInequality](/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality)`

Suggested lower margin bound. Omitted when no lower margin bound is set.

**marginAtMost** `[ShippingMethodPriceInequality](/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality)`

Suggested upper margin bound. Omitted when no upper margin bound is set.

**maxPrice** `Float`

Highest price this method may be sold at. Present only on 'DEFAULT' constraints, and omitted when no upper bound is set.

**minPrice** `Float`

Lowest price this method may be sold at. Present only on 'DEFAULT' constraints, and omitted when no lower bound is set.

**relativeToMethodId** `ID`

ID of the shipping method this method's price is bounded against. Matches the `id` of another method in this same response. Present only on 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' constraints.

**priceDisplay** `String!` *required*

Human-readable price: 'FREE', a formatted amount like '\$5.99', 'DYNAMIC' for carrier-calculated rates, 'CUSTOM' for merchant-scripted rates, or '-' when no price is configured. Reflects only the first entry in `rates`, so on a method with several it can read 'FREE' or show the cheapest tier while most carts are charged something else — read `rates` for the full picture.

**rateSelection** `[ShippingMethodRateSelection](/docs/api-reference/v3/reference/checkout/shipping-method-rate-selection)`

Dynamic methods only. Which of the eligible live carrier rates is shown to the shopper. Omitted when the merchant has not chosen a preset.

**rates** `[\[ShippingMethodRate!\]](/docs/api-reference/v3/reference/checkout/shipping-method-rate)`

Fixed methods only. Every configured price, in order. More than one entry means the price varies by cart weight or cart value; a single entry with empty `conditions` is a flat price.

**fields**

**conditions** `[\[ShippingMethodCondition!\]!](/docs/api-reference/v3/reference/checkout/shipping-method-condition)` *required*

Cart weight or cart value conditions this price applies to. Empty when the price applies to every cart.

**currency** `String!` *required*

Currency of `price`.

**enabled** `Boolean`

Whether the merchant has this rate turned on. Defaults to true, and is omitted only on records predating the flag.

**price** `[Decimal!](/docs/api-reference/v3/reference/common/decimal)` *required*

This rate's price as a decimal string, e.g. '5.99'. '0' means free shipping for carts matching `conditions`.

**rounding** `[ShippingMethodRounding](/docs/api-reference/v3/reference/checkout/shipping-method-rounding)`

Dynamic methods only. How the marked-up price is rounded before it is shown. Omitted when prices are shown unrounded.

**serviceCode** `String`

Identifier the storefront platform uses for this shipping option at checkout. Omitted when the merchant has not set one.

**serviceLevel** `[ShippingMethodServiceLevel](/docs/api-reference/v3/reference/checkout/shipping-method-service-level)`

Dynamic methods only. When set, the cheapest carrier service delivering within this service level's window is used. Omitted when the method is not bucketed by service level.

**shippingDiscountRules** `[\[ShippingMethodDiscountRule!\]](/docs/api-reference/v3/reference/checkout/shipping-method-discount-rule)`

Shipping discounts applied to this method, in order. READ ONLY: these are configured by Redo, not by the merchant, and they sync to a live storefront-platform function, so writing them here would put the stored rules and the deployed function out of step. Creating or updating a shipping method carries them over untouched. Omitted when the method has no discount rules.

**fields**

**currency** `String`

Currency the cart bounds and discount amount are expressed in. Omitted when the rule sets neither cart bounds nor a flat discount amount.

**discountAmount** `[Decimal](/docs/api-reference/v3/reference/common/decimal)`

Flat amount taken off the shipping price, as a decimal string. Omitted when the rule discounts by percentage instead.

**discountPercentage** `[Decimal](/docs/api-reference/v3/reference/common/decimal)`

Percentage taken off the shipping price, as a decimal string (e.g. '50' means half off). Omitted when the rule discounts by a flat amount instead.

**maxCartPrice** `Float`

Cart total at or below which the discount applies. Omitted when the rule has no upper bound.

**minCartPrice** `Float`

Cart total at or above which the discount applies. Omitted when the rule has no lower bound.

**type** `[ShippingMethodType!](/docs/api-reference/v3/reference/checkout/shipping-method-type)` *required*

How the price is produced: FIXED is a merchant-set price served by Redo with no carrier involved, DYNAMIC is quoted live from the carriers listed in `carrierServices`, CUSTOM is produced by a merchant-authored script.

**name** `String!` *required*

Merchant-facing name of the checkout experience.

**shippingAiStatus** `[ShippingAiStatus!](/docs/api-reference/v3/reference/checkout/shipping-ai-status)` *required*

Whether Shipping AI is setting this experience's shipping prices for shoppers.

**upsellPage** `[UpsellPage](/docs/api-reference/v3/reference/checkout/upsell-page)`

The post-purchase upsell page attached to this experience, or null. It wins over the post-purchase flow, and over any A/B test in it, for orders placed through this experience.

**fields**

**banner** `[UpsellPageBanner!](/docs/api-reference/v3/reference/checkout/upsell-page-banner)` *required*

Its banner.

**fields**

**show** `Boolean!` *required*

Whether the banner shows.

**supportingText** `String!` *required*

The text under the title.

**supportingTextSize** `[UpsellPageTextSize!](/docs/api-reference/v3/reference/checkout/upsell-page-text-size)` *required*

The supporting text's size.

**title** `String!` *required*

Its title.

**titleSize** `[UpsellPageTextSize!](/docs/api-reference/v3/reference/checkout/upsell-page-text-size)` *required*

The title's size.

**createdAt** `[DateTime!](/docs/api-reference/v3/reference/common/date-time)` *required*

When it was created.

**excludedProductTags** `[String!]!` *required*

Tags that keep a product out of recommendations.

**id** `ID!` *required*

The page's id.

**inUse** `Boolean!` *required*

Whether the live flow or a live checkout experience uses it. Changing a page in use takes `confirmLiveChange`, and it can't be deleted.

**locked** `Boolean!` *required*

Whether post-purchase is locked for the store, which refuses writes.

**name** `String!` *required*

The merchant-facing name.

**products** `[\[UpsellPageProduct!\]!](/docs/api-reference/v3/reference/checkout/upsell-page-product)` *required*

The products it offers, one to four.

**fields**

**allowQuantitySelection** `Boolean!` *required*

Whether the shopper can pick a quantity.

**collectionId** `String`

The numeric Shopify collection id, for COLLECTION.

**customDescription** `String`

A description to show instead of the product's own.

**discountAmount** `String!` *required*

The discount, as a decimal string.

**discountType** `[UpsellPageDiscountType!](/docs/api-reference/v3/reference/checkout/upsell-page-discount-type)` *required*

What `discountAmount` means.

**featuredVariantId** `String`

The variant whose image is featured, for MANUAL.

**productId** `String`

The Shopify product GID, for MANUAL.

**showCompareAtPrice** `Boolean!` *required*

Whether the compare-at price shows.

**showDescription** `Boolean!` *required*

Whether a description shows.

**showIfAlreadyInCart** `Boolean!` *required*

Whether it's offered when already in the order.

**source** `[UpsellPageProductSource!](/docs/api-reference/v3/reference/checkout/upsell-page-product-source)` *required*

How the product is picked.

**variantIds** `[String!]`

The Shopify variant GIDs on offer, for MANUAL.

**timer** `[UpsellPageTimer!](/docs/api-reference/v3/reference/checkout/upsell-page-timer)` *required*

Its countdown timer.

**fields**

**minutes** `Int!` *required*

How long it counts down, in minutes.

**show** `Boolean!` *required*

Whether the timer shows.

**status** `[UpsellPageTimerStatus!](/docs/api-reference/v3/reference/checkout/upsell-page-timer-status)` *required*

Its banner style.

**supportingText** `String!` *required*

The text beside the countdown.

**supportingTextSize** `[UpsellPageTextSize!](/docs/api-reference/v3/reference/checkout/upsell-page-text-size)` *required*

The supporting text's size.

**textColor** `[UpsellPageTimerColor!](/docs/api-reference/v3/reference/checkout/upsell-page-timer-color)` *required*

The countdown's color.

**textSize** `[UpsellPageTextSize!](/docs/api-reference/v3/reference/checkout/upsell-page-text-size)` *required*

The countdown's size.

**updatedAt** `[DateTime!](/docs/api-reference/v3/reference/common/date-time)` *required*

When it last changed.

## Example

```graphql theme={null}
mutation {
  checkoutExperienceUpsellPageSet(checkoutExperienceId: "...", confirmLiveChange: true, upsellPageId: "...") {
    active
    addLandedCosts
    autoSelectedShippingMethodIds
    createdAt
    fulfillmentDelayDaysOverride
    id
    name
    shippingAiStatus
    # ...
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.