> ## 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.

# CheckoutExperience

> 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 and a post-purchase upsell page; neither is covered here.

**Required scopes:** [`checkout_read`](/docs/api-reference/v3/reference/scopes#scope-checkout_read), [`checkout_write`](/docs/api-reference/v3/reference/scopes#scope-checkout_write)

<ResponseField name="active" type="Boolean!" required>
  True when this experience is reachable in the team's live checkout tree.
</ResponseField>

<ResponseField name="addLandedCosts" type="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.
</ResponseField>

<ResponseField name="autoSelectedShippingMethodIds" type="[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.
</ResponseField>

<ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
  Creation timestamp, ISO 8601 UTC.
</ResponseField>

<ResponseField name="fulfillmentDelayDaysOverride" type="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.
</ResponseField>

<ResponseField name="id" type="ID!" required>
  Checkout experience ID.
</ResponseField>

<ResponseField name="methods" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method">[ShippingMethod!]!</a>} required>
  Shipping methods offered by this experience.

  <Expandable title="fields" lazyRender>
    <ResponseField name="addLandedCostsOverride" type="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.
    </ResponseField>

    <ResponseField name="carrierServices" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-carrier-service">[ShippingMethodCarrierService!]</a>}>
      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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="carrier" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-carrier">ShippingCarrier!</a>} required>
          Carrier this method draws a live rate from.
        </ResponseField>

        <ResponseField name="enabled" type="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.
        </ResponseField>

        <ResponseField name="markup" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-carrier-service-markup">ShippingMethodCarrierServiceMarkup</a>}>
          Markup applied to this carrier service specifically, on top of any method-level markup. Omitted when no per-service markup is set.
        </ResponseField>

        <ResponseField name="service" type="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.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="coverageTypes" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-coverage-types">ShippingMethodCoverageTypes</a>}>
      Redo coverage bundled into this shipping method. Omitted when no coverage is bundled.

      <Expandable title="fields" lazyRender>
        <ResponseField name="packageProtection" type="Boolean">
          True when package protection is included. Omitted when never configured.
        </ResponseField>

        <ResponseField name="return" type="Boolean">
          True when return coverage is included. Omitted when never configured.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="description" type="String!" required>
      Shopper-facing description shown next to the method at checkout. Like `name`, it may contain customer-name template variables; see `fallbackDescription`.
    </ResponseField>

    <ResponseField name="excludedCarriers" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-carrier">[ShippingCarrier!]</a>}>
      Dynamic methods only. Carriers never considered for this method. Omitted when no carrier is excluded.
    </ResponseField>

    <ResponseField name="fallbackDescription" type="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.
    </ResponseField>

    <ResponseField name="fallbackName" type="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.
    </ResponseField>

    <ResponseField name="fulfillmentDelayDaysOverride" type="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.
    </ResponseField>

    <ResponseField name="id" type="ID!" required>
      Shipping method ID.
    </ResponseField>

    <ResponseField name="markup" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-markup">ShippingMethodMarkup</a>}>
      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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="amount" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-markup-amount">ShippingMethodMarkupAmount</a>}>
          Flat amount added on top of every carrier rate. Omitted when only a percentage markup is set, or none.
        </ResponseField>

        <ResponseField name="percentage" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal</a>}>
          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.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="name" type="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.
    </ResponseField>

    <ResponseField name="orderTags" type="[String!]">
      Tags applied to the order when this method is bought. Omitted when the merchant has configured no tags.
    </ResponseField>

    <ResponseField name="priceBounds" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-bounds">ShippingMethodPriceBounds</a>}>
      Dynamic methods only. Hard clamp applied after markup and rounding. Omitted when the price is not clamped.

      <Expandable title="fields" lazyRender>
        <ResponseField name="currency" type="String!" required>
          Currency of the bounds.
        </ResponseField>

        <ResponseField name="maximum" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal</a>}>
          Highest price ever shown, as a decimal string. Omitted when there is no ceiling.
        </ResponseField>

        <ResponseField name="minimum" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal</a>}>
          Lowest price ever shown, as a decimal string. Omitted when there is no floor.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="priceConstraints" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-constraints">ShippingMethodPriceConstraints</a>}>
      Bounds the method's sold price must stay within. Omitted when the merchant has set no price or margin constraints.

      <Expandable title="fields" lazyRender>
        <ResponseField name="absoluteMinimumPrice" type="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.
        </ResponseField>

        <ResponseField name="byAtLeast" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality">ShippingMethodPriceInequality</a>}>
          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.
        </ResponseField>

        <ResponseField name="byAtMost" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality">ShippingMethodPriceInequality</a>}>
          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.
        </ResponseField>

        <ResponseField name="currency" type="String!" required>
          Currency all bounds are expressed in.
        </ResponseField>

        <ResponseField name="kind" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-constraint-kind">ShippingMethodPriceConstraintKind!</a>} required>
          How the bounds are expressed: 'DEFAULT' bounds the price absolutely, 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' bounds it against another shipping method's price.
        </ResponseField>

        <ResponseField name="marginAtLeast" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality">ShippingMethodPriceInequality</a>}>
          Suggested lower margin bound. Omitted when no lower margin bound is set.
        </ResponseField>

        <ResponseField name="marginAtMost" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality">ShippingMethodPriceInequality</a>}>
          Suggested upper margin bound. Omitted when no upper margin bound is set.
        </ResponseField>

        <ResponseField name="maxPrice" type="Float">
          Highest price this method may be sold at. Present only on 'DEFAULT' constraints, and omitted when no upper bound is set.
        </ResponseField>

        <ResponseField name="minPrice" type="Float">
          Lowest price this method may be sold at. Present only on 'DEFAULT' constraints, and omitted when no lower bound is set.
        </ResponseField>

        <ResponseField name="relativeToMethodId" type="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.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="priceDisplay" type="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.
    </ResponseField>

    <ResponseField name="rateSelection" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-rate-selection">ShippingMethodRateSelection</a>}>
      Dynamic methods only. Which of the eligible live carrier rates is shown to the shopper. Omitted when the merchant has not chosen a preset.
    </ResponseField>

    <ResponseField name="rates" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-rate">[ShippingMethodRate!]</a>}>
      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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="conditions" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-condition">[ShippingMethodCondition!]!</a>} required>
          Cart weight or cart value conditions this price applies to. Empty when the price applies to every cart.
        </ResponseField>

        <ResponseField name="currency" type="String!" required>
          Currency of `price`.
        </ResponseField>

        <ResponseField name="enabled" type="Boolean">
          Whether the merchant has this rate turned on. Defaults to true, and is omitted only on records predating the flag.
        </ResponseField>

        <ResponseField name="price" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal!</a>} required>
          This rate's price as a decimal string, e.g. '5.99'. '0' means free shipping for carts matching `conditions`.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="rounding" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-rounding">ShippingMethodRounding</a>}>
      Dynamic methods only. How the marked-up price is rounded before it is shown. Omitted when prices are shown unrounded.
    </ResponseField>

    <ResponseField name="serviceCode" type="String">
      Identifier the storefront platform uses for this shipping option at checkout. Omitted when the merchant has not set one.
    </ResponseField>

    <ResponseField name="serviceLevel" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-service-level">ShippingMethodServiceLevel</a>}>
      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.
    </ResponseField>

    <ResponseField name="shippingDiscountRules" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-discount-rule">[ShippingMethodDiscountRule!]</a>}>
      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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="currency" type="String">
          Currency the cart bounds and discount amount are expressed in. Omitted when the rule sets neither cart bounds nor a flat discount amount.
        </ResponseField>

        <ResponseField name="discountAmount" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal</a>}>
          Flat amount taken off the shipping price, as a decimal string. Omitted when the rule discounts by percentage instead.
        </ResponseField>

        <ResponseField name="discountPercentage" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal</a>}>
          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.
        </ResponseField>

        <ResponseField name="maxCartPrice" type="Float">
          Cart total at or below which the discount applies. Omitted when the rule has no upper bound.
        </ResponseField>

        <ResponseField name="minCartPrice" type="Float">
          Cart total at or above which the discount applies. Omitted when the rule has no lower bound.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="type" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-type">ShippingMethodType!</a>} 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.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="name" type="String!" required>
  Merchant-facing name of the checkout experience.
</ResponseField>


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