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) withappliesOnSubscription: true - The cart contains only the subscription line. Shipping rate: 500 JPY
Steps
- Check out the subscription product with the automatic shipping discount applied. The first order is discounted as expected.
- Read the contract’s discounts:
subscriptionContract(id: $id) {
discounts(first: 10) {
nodes {
type
targetType
recurringCycleLimit
value {
... on SubscriptionDiscountPercentageValue { percentage }
... on SubscriptionDiscountFixedAmountValue { amount { amount } appliesOnEachItem }
}
}
}
}
- Bill the next cycle with
subscriptionBillingCycleCharge(billingCycleSelector: { index: 1 }) and inspect the resulting order’sshippingLines.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
- Is this intended? If so, is it documented anywhere? We couldn’t find it in the subscription discount docs.
- 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.