Combine free shipping with product or order discounts

Is it possible to offer free shipping only when a product discount or order discount created in the application is applied?
I would like to add a free shipping option to my product discounts and order discounts.

I tried this problem by rewriting shopify.extension.toml as follows but it did not solve the problem.

api_version = "2024-07"

  [[extensions.targeting]]
  target = "purchase.shipping-discount.run"
  input_query = "src/run-shipping.graphql"
  export = "run-shipping"

  [[extensions.targeting]]
  target = "purchase.product-discount.run"
  input_query = "src/run.graphql"
  export = "run"

Message log:
Error while updating drafts: Targeting multiple Function APIs is not supported.

You can currently only have one target for discount functions. Your use case is not technically feasible with functions. One alternative is to automatically add a manual shipping code at checkout with an extension (our application Stackable now does this!).

2 Likes

I found an article I would like to read on this issue and share it here.

Why You Can’t Use a Single Code for Both Product and Shipping Discounts in Shopify

Thanks for sharing my article; however, it is now outdated. Now that Shopify has released a new Discount Functions API, which allows multiple discount classes on the same Function instance, it should be possible to combine product/shipping discounts into the same code.

Best,
Tobe

1 Like

@tobebuilds I just encountered an issue with the new Discount Function API. It was working fine last week, but today when I tried to create a new one, it returned a product-discount instead.

When I checked the functions, I noticed that it only includes PRODUCT classes. I believe this issue started last Saturday or Sunday, because everything was still working correctly on Friday’s morning.

Could you please check this issue?

  • Image 1 shows how it looked last 10AM Friday
  • Image 2 shows the current situation

Thanks!

Hello Pemond,

I do not work for Shopify. Therefore, I can’t look into this for you.

Hopefully you find the answer you are looking for!

Oh, Thank for let me know.
Hope you have a good day.

Does someone knows some example of a multiple discount classes on the same function?

I want to apply free shipping discounts only when discounts are applied to products or orders. Is this possible?

I think the same logic needs to be implemented in cart_delivery_options_discounts_generate_run and cart_lines_discounts_generate_run.

@Hirano :
This will give you an approach idea :

How Shopify Discount Functions Work

Shopify’s Discount Function API processes discounts in a specific order during cart evaluation:

  1. Cart Lines Discounts (cart_lines_discounts_generate_run): This function applies discounts to individual cart lines (products) or the order subtotal. It outputs discount operations that Shopify applies to the cart.
  2. Delivery Discounts (cart_delivery_options_discounts_generate_run): This function applies discounts to shipping options. It runs after cart line discounts are calculated and can access the cart’s state, including any applied discounts via the discountAllocations field.

The input to cart_delivery_options_discounts_generate_run includes the cart’s current state, which reflects discounts applied by cart_lines_discounts_generate_run. Specifically, the discountAllocations field in the cart or cart lines will contain details about discounts applied to products or the order subtotal.

using this you can decide on providing free shipping

using before query for cart_delivery_options_discounts_generate_run will provide data

query RunInput {
  cart {
    lines {
      id
      discountAllocations {
        discountedAmount {
          amount
        }
      }
    }
    cost {
      subtotalAmount {
        amount
      }
      discountAllocations {
        discountedAmount {
          amount
        }
      }
    }
    deliveryGroups {
      id
      deliveryOptions {
        handle
        cost {
          amount
        }
      }
    }
  }
}

@Ankit_Shrivastava

Thank you for your advise.
But the documentation does not mention a discountAllocations field.
https://shopify.dev/docs/api/functions/latest/discount#Input

Am I missing something?