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

# createShippingMethod

> Add a shipping method to a checkout experience. - A FIXED method is a price you set, served by Redo with no carrier involved. It needs `rates`. - A DYNAMIC method quotes live carrier rates through Redo. It needs `carrierServices` or a `serviceLevel`, and every carrier must be one the store has an account or setting for. Script-priced (CUSTOM) methods cannot be created through the API. Shipping discount rules are configured by Redo and cannot be set here. 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_write`](/docs/api-reference/v3/reference/scopes#scope-checkout_write)

## Arguments

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

<ResponseField name="input" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-input">ShippingMethodInput!</a>} required>
  The shipping method to add.

  <Expandable title="fields" lazyRender>
    <ResponseField name="addLandedCostsOverride" type="Boolean">
      Add landed costs (duties and import fees) to this method's price, overriding the experience-level setting.
    </ResponseField>

    <ResponseField name="carrierServices" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-carrier-service-input">[ShippingMethodCarrierServiceInput!]</a>}>
      Dynamic methods only. The carrier services to quote live rates from. Required unless `serviceLevel` is set.

      <Expandable title="fields" lazyRender>
        <ResponseField name="carrier" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-carrier">ShippingCarrier!</a>} required>
          Carrier to quote live rates from. Values are display-cased, e.g. 'FedEx', 'UPS', 'USPS'.
        </ResponseField>

        <ResponseField name="enabled" type="Boolean">
          Whether this carrier service is quoted. Defaults to true.
        </ResponseField>

        <ResponseField name="markup" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-carrier-service-markup-input">ShippingMethodCarrierServiceMarkupInput</a>}>
          Markup applied to this carrier service specifically.
        </ResponseField>

        <ResponseField name="service" type="String!" required>
          Carrier-specific service code, e.g. 'FEDEX\_GROUND' for FedEx or 'Ground' for UPS. The valid set differs per carrier; read an existing dynamic method with checkoutExperience(id:) to see the codes this store already uses.
        </ResponseField>
      </Expandable>
    </ResponseField>

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

      <Expandable title="fields" lazyRender>
        <ResponseField name="packageProtection" type="Boolean">
          Include package protection with this method.
        </ResponseField>

        <ResponseField name="return" type="Boolean">
          Include return coverage with this method.
        </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.
    </ResponseField>

    <ResponseField name="excludedCarriers" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-carrier">[ShippingCarrier!]</a>}>
      Dynamic methods only. Carriers excluded from this method's candidate set.
    </ResponseField>

    <ResponseField name="fallbackDescription" type="String">
      Shopper-facing description used in place of `description` under the same condition as `fallbackName`.
    </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.
    </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`. Omit it to use the experience's value. A whole number of days, zero or more.
    </ResponseField>

    <ResponseField name="markup" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-markup-input">ShippingMethodMarkupInput</a>}>
      Dynamic methods only. Markup applied to every live carrier rate on this method.

      <Expandable title="fields" lazyRender>
        <ResponseField name="amount" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal</a>}>
          Flat markup as a decimal string.
        </ResponseField>

        <ResponseField name="currency" type="String">
          Currency of the flat markup. Required when `amount` is set.
        </ResponseField>

        <ResponseField name="percentage" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal</a>}>
          Percentage markup as a decimal string, e.g. '10' for +10%.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="name" type="String!" required>
      Shopper-facing name of the shipping method as it appears at checkout, e.g. 'Standard'. May contain customer-name template variables — '\{customer\_name}', '\{customer\_name:first}', '\{customer\_name:last}' — which are substituted per shopper. Send them back verbatim when you are not deliberately changing them, or you will silently strip the merchant's personalization.
    </ResponseField>

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

    <ResponseField name="priceBounds" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-bounds-input">ShippingMethodPriceBoundsInput</a>}>
      Dynamic methods only. Hard clamp applied after markup and rounding.

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

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

    <ResponseField name="priceConstraints" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-constraints-input">ShippingMethodPriceConstraintsInput</a>}>
      Bounds the final price this method may be sold at, after every other pricing rule has run. Omit to leave the method's existing constraint untouched; send one to replace it outright. There is no way to clear a constraint through this API.

      <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`. 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' constraints only.
        </ResponseField>

        <ResponseField name="byAtLeast" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality-input">ShippingMethodPriceInequalityInput</a>}>
          How far above the referenced method's price this method must sit. 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' constraints only.
        </ResponseField>

        <ResponseField name="byAtMost" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality-input">ShippingMethodPriceInequalityInput</a>}>
          How far above the referenced method's price this method may sit. 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' constraints only.
        </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-input">ShippingMethodPriceInequalityInput</a>}>
          Suggested lower margin bound. Omit when there is none.
        </ResponseField>

        <ResponseField name="marginAtMost" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-price-inequality-input">ShippingMethodPriceInequalityInput</a>}>
          Suggested upper margin bound. Omit when there is none.
        </ResponseField>

        <ResponseField name="maxPrice" type="Float">
          Highest price this method may be sold at. 'DEFAULT' constraints only.
        </ResponseField>

        <ResponseField name="minPrice" type="Float">
          Lowest price this method may be sold at. 'DEFAULT' constraints only.
        </ResponseField>

        <ResponseField name="relativeToMethodId" type="ID">
          ID of the shipping method this method's price is bounded against, from the same checkout experience. Required for, and only valid on, 'RELATIVE\_TO\_OTHER\_RATE\_TABLE' constraints.
        </ResponseField>
      </Expandable>
    </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 rates to show the shopper. Values are CHEAPEST, FASTEST, and CUSTOM.
    </ResponseField>

    <ResponseField name="rates" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-rate-input">[ShippingMethodRateInput!]</a>}>
      Fixed methods only, and required for them. One entry per price. A single entry with no `conditions` is a flat price; multiple entries express weight or cart-value ranges and free-shipping thresholds.

      <Expandable title="fields" lazyRender>
        <ResponseField name="conditions" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-condition-input">[ShippingMethodConditionInput!]</a>}>
          Cart weight or cart value ranges this rate applies to. Omit or pass an empty array for a flat price that applies to every cart.
        </ResponseField>

        <ResponseField name="currency" type="String!" required>
          ISO currency code for `price`, e.g. 'USD'.
        </ResponseField>

        <ResponseField name="enabled" type="Boolean">
          Whether this rate is active. Defaults to true.
        </ResponseField>

        <ResponseField name="price" type={<a href="/docs/api-reference/v3/reference/common/decimal">Decimal!</a>} required>
          Price for this rate as a decimal string, e.g. '5.99'. Use '0' for free shipping.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="rounding" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-rounding">ShippingMethodRounding</a>}>
      Dynamic methods only. How to round the marked-up price before showing it.
    </ResponseField>

    <ResponseField name="serviceCode" type="String">
      Identifier the storefront platform uses for this shipping option at checkout.
    </ResponseField>

    <ResponseField name="serviceLevel" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method-service-level">ShippingMethodServiceLevel</a>}>
      Dynamic methods only. Quote the cheapest carrier service delivering within this service level's window instead of pinning carrier services.
    </ResponseField>

    <ResponseField name="type" type={<a href="/docs/api-reference/v3/reference/checkout/writable-shipping-method-type">WritableShippingMethodType!</a>} required>
      How the price is produced. FIXED is a merchant-set price served by Redo with no carrier involved and requires `rates`. DYNAMIC quotes live carrier rates through Redo and requires either `carrierServices` or `serviceLevel`. Custom (script-priced) methods cannot be created or edited here.
    </ResponseField>
  </Expandable>
</ResponseField>

## Returns

<ResponseField name="createShippingMethod" type={<a href="/docs/api-reference/v3/reference/checkout/shipping-method">ShippingMethod</a>}>
  A shipping method offered at checkout and the configuration that prices it.

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

          <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>
  </Expandable>
</ResponseField>

## Example

```graphql theme={null}
mutation {
  createShippingMethod(checkoutExperienceId: "...", input: { ... }) {
    addLandedCostsOverride
    description
    excludedCarriers
    fallbackDescription
    fallbackName
    fulfillmentDelayDaysOverride
    id
    name
    # ...
  }
}
```


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