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

# ShippingMethod

> A shipping method offered at checkout and the configuration that prices it.

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

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

      <Expandable title="fields" lazyRender>
        <ResponseField name="amount" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal</a>}>
          Flat amount added on top of the carrier rate, as a decimal string. 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 the 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="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.

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

        <ResponseField name="value" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal!</a>} required>
          Flat markup as a decimal string.
        </ResponseField>
      </Expandable>
    </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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="amount" type="Float">
          Absolute amount of the bound. Omitted when unset.
        </ResponseField>

        <ResponseField name="percentage" type="Float">
          Percentage form of the bound. Omitted when unset.
        </ResponseField>
      </Expandable>
    </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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="amount" type="Float">
          Absolute amount of the bound. Omitted when unset.
        </ResponseField>

        <ResponseField name="percentage" type="Float">
          Percentage form of the bound. Omitted when unset.
        </ResponseField>
      </Expandable>
    </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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="amount" type="Float">
          Absolute amount of the bound. Omitted when unset.
        </ResponseField>

        <ResponseField name="percentage" type="Float">
          Percentage form of the bound. Omitted when unset.
        </ResponseField>
      </Expandable>
    </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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="amount" type="Float">
          Absolute amount of the bound. Omitted when unset.
        </ResponseField>

        <ResponseField name="percentage" type="Float">
          Percentage form of the bound. Omitted when unset.
        </ResponseField>
      </Expandable>
    </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.

      <Expandable title="fields" lazyRender>
        <ResponseField name="currency" type="String">
          Currency the price bounds are expressed in. Present only on cart-value conditions.
        </ResponseField>

        <ResponseField name="maxGrams" type="Float">
          Inclusive upper bound of cart weight in grams. Present only on weight conditions.
        </ResponseField>

        <ResponseField name="maxPrice" type="Float">
          Inclusive upper bound of cart value. Present only on cart-value conditions.
        </ResponseField>

        <ResponseField name="minGrams" type="Float">
          Inclusive lower bound of cart weight in grams. Present only on weight conditions.
        </ResponseField>

        <ResponseField name="minPrice" type="Float">
          Inclusive lower bound of cart value. Present only on cart-value conditions.
        </ResponseField>

        <ResponseField name="type" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-condition-type">ShippingMethodConditionType!</a>} required>
          What this condition is measured against: WEIGHT uses the cart's total weight, PRICE uses the cart's total value.
        </ResponseField>
      </Expandable>
    </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>


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