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

> Get a checkout experience with the full configuration of each shipping method: prices and the cart conditions they apply to, carrier services, markups, price constraints, and fulfillment delays. An id from another account, or one that does not exist, is null. An invalid request fails with INVALID_CHECKOUT_REQUEST (400).

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

## Arguments

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

## Returns

<ResponseField name="checkoutExperience" type={<a href="/docs/api-reference/v3/reference/checkout/checkout-experience">CheckoutExperience</a>}>
  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.

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

## Example

```graphql theme={null}
query {
  checkoutExperience(id: "...") {
    active
    addLandedCosts
    autoSelectedShippingMethodIds
    createdAt
    fulfillmentDelayDaysOverride
    id
    name
  }
}
```


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