Personalized checkout and custom promotions with Shopify Scripts
Hi guys, I have a shopify script that I need to modify slightly. This script was built by someone else, with a lot more experience in Ruby and Shopify scripting. Also, he worked on this many years ago and I can't really contact him anymore. I tried modifying it myself, but I couldn't figure it out.
What our script does right now, it is a golden ticket script. When someone types in a special discount code, they will get the item for 100% free. If there are multiple items, it will just choose the cheapest and make that one free. If they only have one item in their cart, it will make that item free and they could checkout with no payment information.
I will paste the scrip below (I'm going to remove all the real golden codes of course).
The modification that I want to make, I want to add a maximum dollar amount that can be discounted. It will be $150. So if they try to order a $500 product, instead of it discounting the entire $500, it will just take $150 off, and make the product $350.
I can show you guys what I was trying to to do, I was trying to edit the first few lines, the first if else code, but it wasn't working.
Here is our script:
if Input.cart.line_items.size > 0 and Input.cart.discount_code != nil freebie_discount_codes = ["fake234", "fake1234", "fake12345", "fake1233", etc] if freebie_discount_codes.include?(Input.cart.discount_code.code) if Input.cart.line_items.size == 1 && Input.cart.line_items.first.quantity == 1 Input.cart.line_items.select do |line_item| line_item.change_line_price(Money.new(cents: 1), message: @discount_message) end else freebie_product_price = Money.zero freebie_product_id = 0 Input.cart.line_items.select do |line_item| if freebie_product_price == Money.zero freebie_product_price = line_item.variant.price freebie_product_id = line_item.variant.id end if line_item.variant.price < freebie_product_price freebie_product_id = line_item.variant.id freebie_product_price = line_item.variant.price end end PRODUCT_DISCOUNTS_BY_DISCOUNT_CODE = [ { discount_code_match_type: :exact, discount_codes: freebie_discount_codes, product_selector_match_type: :include, # product_selector_type: :all, # product_selectors: 'nil', #[freebie_product_id], product_selector_type: :variant_id, product_selectors: [freebie_product_id], discount_type: :dollar, discount_amount: freebie_product_price, discount_message: 'GOLDEN TICKET' } ] # ================================ Script Code (do not edit) ================================ # ================================================================ # DiscountCodeSelector # # Finds whether the supplied discount code matches any of the # entered codes. # ================================================================ class DiscountCodeSelector def initialize(match_type, discount_codes) @comparator = match_type == :exact ? '==' : 'include?' @discount_codes = discount_codes.map { |discount_code| discount_code.upcase.strip } end def match?(discount_code) !@discount_codes.empty? { |code| discount_code.code.upcase.send(@comparator, code) } end end # ================================================================ # ProductSelector # # Finds matching products by the entered criteria. # ================================================================ class ProductSelector def initialize(match_type, selector_type, selectors) @match_type = match_type @comparator = match_type == :include ? 'any?' : 'none?' @selector_type = selector_type @selectors = selectors end def match?(line_item) if self.respond_to?(@selector_type) self.send(@selector_type, line_item) else raise RuntimeError.new('Invalid product selector type') end end def tag(line_item) product_tags = line_item.variant.product.tags.map { |tag| tag.downcase.strip } @selectors = @selectors.map { |selector| selector.downcase.strip } (@selectors & product_tags).send(@comparator) end def type(line_item) @selectors = @selectors.map { |selector| selector.downcase.strip } (@match_type == :include) == @selectors.include?(line_item.variant.product.product_type.downcase.strip) end def vendor(line_item) @selectors = @selectors.map { |selector| selector.downcase.strip } (@match_type == :include) == @selectors.include?(line_item.variant.product.vendor.downcase.strip) end def product_id(line_item) (@match_type == :include) == @selectors.include?(line_item.variant.product.id) end def variant_id(line_item) @selectors.include?(line_item.variant.id) end def all(line_item) true end end # ================================================================ # DiscountApplicator # # Applies the entered discount to the supplied line item. # ================================================================ class DiscountApplicator def initialize(discount_type, discount_amount, discount_message) @discount_type = discount_type @discount_message = discount_message @discount_amount = if discount_type == :percent 1 - (discount_amount * 0.01) else discount_amount end end def apply(line_item) new_line_price = if @discount_type == :percent line_item.line_price * @discount_amount else [line_item.line_price - @discount_amount, Money.zero].max end line_item.change_line_price(new_line_price, message: @discount_message) end end # ================================================================ # ProductDiscountByCodeCampaign # # If any "matching" discount codes are used, any "matching" product # will be discounted by the entered amount. # ================================================================ class ProductDiscountByCodeCampaign def initialize(campaigns) @campaigns = campaigns end def run(cart) return if cart.discount_code.nil? @campaigns.each do |campaign| discount_code_selector = DiscountCodeSelector.new( campaign[:discount_code_match_type], campaign[:discount_codes] ) next unless discount_code_selector.match?(cart.discount_code) product_selector = ProductSelector.new( campaign[:product_selector_match_type], campaign[:product_selector_type], campaign[:product_selectors], ) discount_applicator = DiscountApplicator.new( campaign[:discount_type], campaign[:discount_amount], campaign[:discount_message] ) cart.line_items.each do |line_item| next unless product_selector.match?(line_item) discount_applicator.apply(line_item) end end end end CAMPAIGNS = [ ProductDiscountByCodeCampaign.new(PRODUCT_DISCOUNTS_BY_DISCOUNT_CODE), ] CAMPAIGNS.each do |campaign| campaign.run(Input.cart) end end end end Output.cart = Input.cart
How the script works, is it sets the price of the item to 1 cent.
Then those special coupon code, they are just a code on Shopify side that removes one cent. Thus making it free.
Thanks so much for all the help anyone can provide.
Make sure adding a limit like that ALL customer messaging reflects this to avoid seeming like a bait&switch.
Your trying to use price as a condition, see the example scripts searching for: .price
Example:
if line_item.variant.price <= avg_price
current_price += line_item.line_price
else
in https://help.shopify.com/en/manual/checkout-settings/script-editor/examples/line-item-scripts
or https://github.com/Shopify/shopify-scripts
or https://github.com/discolabs/scripts-examples
Notice how some are structured to qualify eligible items in your script that's basically the ProductSelector class.
class DiscountApplicator is probably where you could put some initial conditional logic to minimize how much a product can be discounted by; possibly a ciel() aka a cieling don't know offhand if that's exposed in the scripts ruby.
@natantantan wrote:How the script works, is it sets the price of the item to 1 cent.
Then those special coupon code, they are just a code on Shopify side that removes one cent. Thus making it free.
Cute.
If you need it worked on for you then contact me , info in sig. Please provide context: store url, theme name, post url and detail.
Contact paull.newton+shopifyforum@gmail.com for the solutions you need
Save time & money ,Ask Questions The Smart Way
Problem Solved? ✔Accept and Like solutions to help future merchants
Answers powered by coffee Thank Paul with a ☕ Coffee for more answers or donate to eff.org
Hey Community! As we jump into 2025, we want to give a big shout-out to all of you wh...
By JasonH Jan 7, 2025Hey Community! As the holiday season unfolds, we want to extend heartfelt thanks to a...
By JasonH Dec 6, 2024Dropshipping, a high-growth, $226 billion-dollar industry, remains a highly dynamic bus...
By JasonH Nov 27, 2024