How can I apply a custom discount based on line item's value in Shopify?

1 0 0

I am building out a rather complicated discount/proration calculator in my store. For some background knowledge: I have a physical product that customers purchase and with that, they need to purchase a subscription plan. The subscription plan for the first month has some tricky proration. For example, a customer checking out on March 27th would have to pay a prorated amount for the remainder of March (1 -(27/31 = .87096..)) = .12903...) March subscription cost * .12903 + Whole cost of April. So basically 1 month + .13 month for the remainder of March.

I already have all of this functionality worked out. But there's one piece I'm stuck on:

I used this tutorial to create a line item property in my product-form.liquid (on Motion theme). The custom JS code I wrote here just finds the day in the current month and divides it by the total amount of days in the month, For example: if a customer is checking out on March 27th, the code just divides 27 by 31 (days in March). Then I attach that number value to a line item property. This is all working perfectly fine. I have some functionality in my store already that adds 2x the subscription product they purchase to the cart and adds the physical product to the cart as well. 

Heres a simplified example:

<p class="line-item-property__field">
    	<input id="proration" type="hidden" name="properties[_proration]">
          	    var d = new Date();
          	    // Get today's date
          	    var day = d.getDate();
          	    var month = d.getMonth() + 1; // The months are 0-based
          	    var year = d.getFullYear();
              	var daysInMonth = getDaysInMonth(day, year);
              	var prorate = day / daysInMonth;
          	    document.getElementById("proration").value = prorate;

But I now need to use Shopify scripts, to discount one of those subscription items in the cart, based on the percentage calculation I made and attached previously to the "proration" field. 

I have tried a few things to no avail. Hoping someone in here knows what to do!

Replies 2 (2)

Shopify Partner
72 18 33

Hi @superofficial,

Looks like you've done most of the heavy lifting here. Now, we just have to do the following during checkout:

  • look for a line item property "_proration"
  • check that the property has a value greater than 0.00
  • create a variable called "prorated_discount" with that value
  • update the line item's price to be the new discounted amount

Here is the script for that functionality:


cart = Input.cart
cart.line_items.each do |line_item|
  if"_prorated") && (["_prorated"].to_f > 0.00) && (["_prorated"].to_f < 1.00)
    prorated_discount =["_prorated"].to_f
    line_item.change_line_price(line_item.line_price * prorated_discount, message: 'Prorated charge for the rest of this month')
Output.cart = cart



And here it is working in the checkout preview:

Screen Shot 2021-03-28 at 8.18.54 PM.png

NOTE 1: The extra conditional on line 4 (this part - " && (["_prorated"].to_f < 1.00)"), is only really needed if you are adding the "_prorated" property to ALL products. It will probably work without it.

NOTE 2: you will need to save and preview the script from the Script Editor app by clicking "preview on the Online Store". This is because you cannot easily add line item properties in the Script Editor cart preview


Hope that is helpful!


Playwright | Create Shopify Scripts without writing code |
- Was my reply helpful? Please Like and Accept Solution.

Shopify Partner
119 2 16

@playwright-mike I tried to implement similar code to yours and keep getting this error: "Float can't be coerced into Money". Any idea what that's about?