Free Gift At Sign Up

Shopify Plus only

This is an advanced guide.

Only one line item script can be active at a time. If you already have a line item script running and you want to run this script in tandem, this will not work. You'll need to customize the scripts to work together.

Editable Values

  • MESSAGE - {string} A message that will be displayed on the free gift line item in the cart and checkout.

Script

# Editable Values
MESSAGE = 'FREE GIFT FOR SIGNING UP!'

########
# DO NOT EDIT PAST THIS POINT
########

class InveterateFreeGiftWithSignup
  def initialize()
    @message = MESSAGE
  end

  def run(cart)
    @cart = cart
    start
  end

  private

  def start
    @customer = @cart.customer
    @line_items = @cart.line_items

    return unless valid_cart?

    discount_gift
  end

  def valid_cart?
    valid = false

    @line_items.each do |line_item|
      if line_item.variant.product.tags.include? 'inveterate-product'
        valid = true
        break
      end
    end

    return valid
  end

  def discount_gift
    @line_items.each do |line_item|
      # Skip if membership product
      next if line_item.variant.product.tags.include? 'inveterate-product'
      # Skip if product is not the free gift
      next unless line_item.variant.product.tags.include? 'inveterate-signup-gift'

      # Check quantity to create new line item if quantity is greater than 1
      new_line_item = nil
      if line_item.quantity > 1
        new_line_item = line_item.split(take: 1)
        @cart.line_items << new_line_item
      else
        new_line_item = line_item
      end

      puts new_line_item.quantity
      # Apply 100% discount
      new_line_item.change_line_price(
        Money.zero,
        message: @message
      )

      # Once discount has been applied once, break out so it doesn't get applied to another product
      break
    end
  end
end

CAMPAIGNS = [
  InveterateFreeGiftWithSignup.new()
]

CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart)
end

Output.cart = Input.cart

Last updated

Was this helpful?