Recurring subscription orders apply 100% shipping discount regardless of the SubscriptionManualDiscount value

When a subscription contract carries a shipping discount below 100% (a 50% percentage or a fixed amount), the orders created by billing the contract discount shipping by 100%. The contract itself stores the correct value, so the recurring order ignores it.

Setup

  • API version: 2026-07
  • Development store, Shopify Payments in test mode
  • Our app owns the selling plan group (created with sellingPlanGroupCreate, daily billing and delivery), so no third-party subscriptions app touches the contract
  • An automatic app discount (DiscountAutomaticApp, shipping class) with appliesOnSubscription: true
  • The cart contains only the subscription line. Shipping rate: 500 JPY

Steps

  1. Check out the subscription product with the automatic shipping discount applied. The first order is discounted as expected.
  2. Read the contract’s discounts:
subscriptionContract(id: $id) {
  discounts(first: 10) {
    nodes {
      type
      targetType
      recurringCycleLimit
      value {
        ... on SubscriptionDiscountPercentageValue { percentage }
        ... on SubscriptionDiscountFixedAmountValue { amount { amount } appliesOnEachItem }
      }
    }
  }
}
  1. Bill the next cycle with subscriptionBillingCycleCharge (billingCycleSelector: { index: 1 }) and inspect the resulting order’s shippingLines.discountAllocations.

Results

Discount setting Stored on the contract Recurring order shipping discount
50%, recurringCycleLimit 0 SHIPPING_LINE, 50%, limit null ManualDiscountApplication 100% (500 of 500 JPY)
Fixed 100 JPY, recurringCycleLimit 0 SHIPPING_LINE, fixed 100 JPY, limit null ManualDiscountApplication 100% (500 of 500 JPY)
50%, recurringCycleLimit 1 SHIPPING_LINE, 50%, limit 1 none (expected)
100%, recurringCycleLimit 0 SHIPPING_LINE, 100%, limit null ManualDiscountApplication 100% (expected)

Expected: the recurring order discounts shipping by the value stored on the contract (50%, or 100 JPY).

Actual: any shipping discount below 100% is applied as 100% on recurring orders.

We suspect the recurring billing path still assumes that a shipping discount means free shipping, since that was the only shipping discount type before Shipping Discount Functions. But the contract stores the partial value correctly, so the behavior looks inconsistent.

Questions

  1. Is this intended? If so, is it documented anywhere? We couldn’t find it in the subscription discount docs.
  2. If it’s intended, is a free shipping discount the only shipping discount the platform supports on recurring orders?

For now we limit partial shipping discounts to the first order in our app, so merchants don’t give away free shipping unintentionally.

Follow-up: the shipping discount is recorded on the contract even with appliesOnSubscription: false

We ran the same test with a mixed cart (one one-time line and one subscription line). At checkout there are two delivery groups: ONE_TIME_PURCHASE, which holds both lines (the one-time line plus the first subscription shipment), and SUBSCRIPTION, which holds the subscription line.

Discount node Function targets Recorded on the contract Recurring order shipping discount
appliesOnSubscription: true, appliesOnOneTimePurchase: false, 50%, recurringCycleLimit 0 SUBSCRIPTION group options only nothing none
appliesOnSubscription: false, appliesOnOneTimePurchase: true, 50%, recurringCycleLimit 0 ONE_TIME_PURCHASE group options only SHIPPING_LINE 50% ManualDiscountApplication 100% (500 of 500 JPY)

So the contract seems to record whatever shipping discount is applied to the ONE_TIME_PURCHASE delivery group. It ignores the discount on the SUBSCRIPTION group and ignores appliesOnSubscription. As a result:

  • A discount meant for one-time purchases only ends up on the subscription contract, and then applies as 100% on recurring orders.
  • A discount meant for subscriptions only never reaches the contract in a mixed cart.

Is this also intended? If so, what is the supported way to discount only recurring shipments?

Hey @ogasawarakyohei :waving_hand: thanks for reaching out and for sharing the detailed test results.

I did some digging here, and the 100% shipping discount on recurring orders is a documented limitation. The Discount Function docs, under Subscription (Recurring orders), explain that the Function isn’t rerun when recurring orders are created, and shipping discounts applied to the original order default to 100% on recurring orders regardless of the original discount value.

Your mixed-cart follow-up raises a separate question about which discounts are saved to the subscription contract: the one-time-only discount being recorded despite appliesOnSubscription: false, and the subscription-only discount being omitted. That documentation note doesn’t explain these persistence results. I’ll look into whether this behaviour is intended and what’s supported for discounting only recurring shipments.

I’ll follow up here as soon as I have more to share.