Pular para o conteúdo
Exemplos de Scripts

Migrating a script that limited how many units were discounted

The cap is not the trap. The trap is a single sort line: with it the CHEAPEST units are discounted, without it the FIRST ones are, and both files are dense with the same split call that also makes them look like a BOGO.

Reconstruído
O que o Script fazia

It discounted only the first few matching units and left the rest at full price.

Os lojistas escreveram isso de 3 formas diferentes, e nem todas significam a mesma coisa. Cada variação está abaixo com o próprio carrinho e os próprios números.

Teste na sua própria loja

Cole no Resgate de Scripts e veja o que ele reconstrói

  1. Copie o Ruby no botão ao lado de qualquer Script desta página.
  2. No admin da Shopify, abra o Stackable, depois Ferramentas e depois Resgate de Scripts.
  3. Cole lá, leia o que a ferramenta diz que vai criar e compare com as configurações desta página.

O Resgate de Scripts está no plano Pro. Nada é publicado até você informar quanto o Script antigo descontava e os dois valores baterem no centavo.

Quantity limit first n discounted (D5)

Reconstruído

Par perigoso D5. Este arquivo e o parceiro dele são quase idênticos e se comportam de formas diferentes, então leia os dois antes de decidir qual é o seu.

O Ruby original

# GENERATED BY THE SHOPIFY SCRIPT CREATOR APP

class ConditionalDiscount < Campaign
  def initialize(condition, customer_qualifier, cart_qualifier, line_item_selector, discount, max_discounts)
    super(condition, customer_qualifier, cart_qualifier, line_item_selector)
    @discount = discount
    @items_to_discount = max_discounts == 0 ? nil : max_discounts
  end

  def run(cart)
    return unless qualifies?(cart)
    applicable_items = cart.line_items.select { |item| @line_item_selector.nil? || @line_item_selector.match?(item) }
    applicable_items.each do |item|
      break if @items_to_discount == 0
      if !@items_to_discount.nil? && (item.quantity > @items_to_discount)
        new_item = item.split({ take: @items_to_discount })
        @discount.apply(new_item)
        position = cart.line_items.find_index(item)
        cart.line_items.insert(position + 1, new_item)
        @items_to_discount = 0
      else
        @discount.apply(item)
        @items_to_discount -= item.quantity unless @items_to_discount.nil?
      end
    end
  end
end

CAMPAIGNS = [
  ConditionalDiscount.new(
    :all, nil, nil,
    ProductTypeSelector.new(:does, ["Sale"]),
    PercentageDiscount.new(30, "30% off first 2"),
    2
  ),
].freeze

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

Output.cart = Input.cart
No que ele vira

Reconhecido como Discount on the first few units e reconstruído como uma oferta do tipo bxgy. Estas são as chaves de configuração reais com as quais a oferta é salva, então você pode conferir a sua própria reconstrução campo a campo.

Cada configuração, detalhada
ConfiguraçãoValorChave de configuração
Offer typebxgytype
Countingper_variantcounting
Recurrenceoncerecurrence
Tier 1min qty 1 -> free itemtiers[0]
Buy quantity1bxgy.buyQty
Get quantity2bxgy.getQty
Get selectionsame_itembxgy.getSelection
Reward on the get units30% offbxgy.getDiscountPct
Free units are additionalfalsebxgy.freeUnitsAreAdditional
Target scopeproduct_typestarget.scope
Target includesSaletarget.includeIds
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Você vai precisar confirmar
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Você será avisado
  • The unit limit counts per matching group, not per cart line, so a cart with two separate lines can reach the limit twice.
O carrinho que comprova

Montado na nossa loja de demonstração pública, Meridian Goods, para que cada preço aqui possa ser reproduzido em vez de aceito por confiança. O desconto abaixo é o que o mesmo motor que roda no checkout calcula para este carrinho exato.

  • No Meridian Goods product carries the type Sale. Set it on Aria Wireless Earbuds in Shopify before you build the cart, and on nothing else.
O carrinho que aciona esta oferta, e quanto ela custa
ItemQtdPreço unit.
Aria Wireless Earbuds1$79.00
Subtotal$79.00
Desconto-$23.70
Total$55.30

Sem login, ou logado como cliente sem tags.

O número com o qual a ferramenta compara você

Antes de publicar, a ferramenta pergunta o que o seu Script antigo fazia com um carrinho que você já tem. Defina como 1 de Aria Wireless Earbuds a $79.00 e a resposta fica fixa.

O desconto é $23.70. O total que o cliente pagou é $55.30.

A comparação é exata, até a menor unidade da sua moeda. Um centavo de diferença e a publicação continua bloqueada, que é justamente o objetivo desta etapa.

O carrinho que não pode produzir nada
  • swap the cart for a single Braided USB-C Cable
O carrinho que não pode acionar esta oferta
ItemQtdPreço unit.
Braided USB-C Cable1$14.00
Subtotal$14.00
Total$14.00

Sem login, ou logado como cliente sem tags.

Quantity limit cheapest n (D5)

Reconstruído

Par perigoso D5. Este arquivo e o parceiro dele são quase idênticos e se comportam de formas diferentes, então leia os dois antes de decidir qual é o seu.

O Ruby original

# GENERATED BY THE SHOPIFY SCRIPT CREATOR APP

class ConditionalDiscount < Campaign
  def initialize(condition, customer_qualifier, cart_qualifier, line_item_selector, discount, max_discounts)
    super(condition, customer_qualifier, cart_qualifier, line_item_selector)
    @discount = discount
    @items_to_discount = max_discounts == 0 ? nil : max_discounts
  end

  def run(cart)
    return unless qualifies?(cart)
    applicable_items = cart.line_items.select { |item| @line_item_selector.nil? || @line_item_selector.match?(item) }
    applicable_items = applicable_items.sort_by { |item| item.variant.price }
    applicable_items.each do |item|
      break if @items_to_discount == 0
      if !@items_to_discount.nil? && (item.quantity > @items_to_discount)
        new_item = item.split({ take: @items_to_discount })
        @discount.apply(new_item)
        position = cart.line_items.find_index(item)
        cart.line_items.insert(position + 1, new_item)
        @items_to_discount = 0
      else
        @discount.apply(item)
        @items_to_discount -= item.quantity unless @items_to_discount.nil?
      end
    end
  end
end

CAMPAIGNS = [
  ConditionalDiscount.new(
    :all, nil, nil,
    ProductTypeSelector.new(:does, ["Sale"]),
    PercentageDiscount.new(30, "30% off your 2 cheapest"),
    2
  ),
].freeze

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

Output.cart = Input.cart
No que ele vira

Reconhecido como Discount on the first few units e reconstruído como uma oferta do tipo bxgy. Estas são as chaves de configuração reais com as quais a oferta é salva, então você pode conferir a sua própria reconstrução campo a campo.

Cada configuração, detalhada
ConfiguraçãoValorChave de configuração
Offer typebxgytype
Countingper_groupcounting
Recurrenceoncerecurrence
Tier 1min qty 1 -> free itemtiers[0]
Buy quantity1bxgy.buyQty
Get quantity2bxgy.getQty
Get selectioncheapest_eligiblebxgy.getSelection
Reward on the get units30% offbxgy.getDiscountPct
Free units are additionalfalsebxgy.freeUnitsAreAdditional
Target scopeproduct_typestarget.scope
Target includesSaletarget.includeIds
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Você vai precisar confirmar
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Você será avisado
  • The unit limit counts per matching group, not per cart line, so a cart with two separate lines can reach the limit twice.
O carrinho que comprova

Montado na nossa loja de demonstração pública, Meridian Goods, para que cada preço aqui possa ser reproduzido em vez de aceito por confiança. O desconto abaixo é o que o mesmo motor que roda no checkout calcula para este carrinho exato.

  • No Meridian Goods product carries the type Sale. Set it on Aria Wireless Earbuds and Impact Phone Case in Shopify before you build the cart, and on nothing else.
O carrinho que aciona esta oferta, e quanto ela custa
ItemQtdPreço unit.
Impact Phone Case1$24.00
Aria Wireless Earbuds1$79.00
Subtotal$103.00
Desconto-$30.90
Total$72.10

Sem login, ou logado como cliente sem tags.

O número com o qual a ferramenta compara você

Antes de publicar, a ferramenta pergunta o que o seu Script antigo fazia com um carrinho que você já tem. Defina como 1 de Impact Phone Case a $24.00 e a resposta fica fixa.

O desconto é $7.20. O total que o cliente pagou é $16.80.

A comparação é exata, até a menor unidade da sua moeda. Um centavo de diferença e a publicação continua bloqueada, que é justamente o objetivo desta etapa.

O carrinho que não pode produzir nada
  • swap the cart for a single Braided USB-C Cable
O carrinho que não pode acionar esta oferta
ItemQtdPreço unit.
Braided USB-C Cable1$14.00
Subtotal$14.00
Total$14.00

Sem login, ou logado como cliente sem tags.

Quantity limit first n discounted (D6)

Reconstruído

Par perigoso D6. Este arquivo e o parceiro dele são quase idênticos e se comportam de formas diferentes, então leia os dois antes de decidir qual é o seu.

O Ruby original

DISCOUNT_PERCENTAGE = 30
MAX_UNITS = 2

num_to_discount = MAX_UNITS

Input.cart.line_items.each_with_index do |line_item, position|
  break if num_to_discount <= 0
  next unless line_item.variant.product.tags.include?("limited")

  if line_item.quantity > num_to_discount
    split_line_item = line_item.split(take: num_to_discount)
    Input.cart.line_items.insert(position + 1, split_line_item)
    line_item = split_line_item
  end

  line_item.change_line_price(
    line_item.line_price * (1.0 - (DISCOUNT_PERCENTAGE / 100.0)),
    message: "30% off your first 2"
  )
  num_to_discount -= line_item.quantity
end

Output.cart = Input.cart
No que ele vira

Reconhecido como Discount on the first few units e reconstruído como uma oferta do tipo bxgy. Estas são as chaves de configuração reais com as quais a oferta é salva, então você pode conferir a sua própria reconstrução campo a campo.

Cada configuração, detalhada
ConfiguraçãoValorChave de configuração
Offer typebxgytype
Countingper_variantcounting
Recurrenceoncerecurrence
Tier 1min qty 1 -> free itemtiers[0]
Buy quantity1bxgy.buyQty
Get quantity2bxgy.getQty
Get selectionsame_itembxgy.getSelection
Reward on the get units30% offbxgy.getDiscountPct
Free units are additionalfalsebxgy.freeUnitsAreAdditional
Target scopetagstarget.scope
Target includeslimitedtarget.includeIds
MethodautomaticdiscountMethod
Allocationstandardstacking.allocation
Combines with other discountsnostacking
Você vai precisar confirmar
  • Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Você será avisado
  • The unit limit counts per matching group, not per cart line, so a cart with two separate lines can reach the limit twice.
O carrinho que comprova

Montado na nossa loja de demonstração pública, Meridian Goods, para que cada preço aqui possa ser reproduzido em vez de aceito por confiança. O desconto abaixo é o que o mesmo motor que roda no checkout calcula para este carrinho exato.

  • No Meridian Goods product carries the tag limited. Set it on Aria Wireless Earbuds in Shopify before you build the cart, and on nothing else.
O carrinho que aciona esta oferta, e quanto ela custa
ItemQtdPreço unit.
Aria Wireless Earbuds1$79.00
Subtotal$79.00
Desconto-$23.70
Total$55.30

Sem login, ou logado como cliente sem tags.

O número com o qual a ferramenta compara você

Antes de publicar, a ferramenta pergunta o que o seu Script antigo fazia com um carrinho que você já tem. Defina como 1 de Aria Wireless Earbuds a $79.00 e a resposta fica fixa.

O desconto é $23.70. O total que o cliente pagou é $55.30.

A comparação é exata, até a menor unidade da sua moeda. Um centavo de diferença e a publicação continua bloqueada, que é justamente o objetivo desta etapa.

O carrinho que não pode produzir nada
  • swap the cart for a single Braided USB-C Cable
O carrinho que não pode acionar esta oferta
ItemQtdPreço unit.
Braided USB-C Cable1$14.00
Subtotal$14.00
Total$14.00

Sem login, ou logado como cliente sem tags.

Dois arquivos que parecem iguais

Cada dupla abaixo é a mesma forma de Script escrita de dois jeitos. Elas mudam em uma ou duas linhas e fazem coisas diferentes, então leia as duas antes de decidir qual é a sua.

Dupla perigosa D5

Quantity limit first n discounted (D5)

Reconstruído

Reconstruído como oferta bxgy.

Desconto no carrinho dele: $23.70

Linhas que mudam
    PercentageDiscount.new(30, "30% off first 2"),
Ler Limit the discounted units

Quantity limit cheapest n (D5)

Reconstruído

Reconstruído como oferta bxgy.

Desconto no carrinho dele: $30.90

Linhas que mudam
    applicable_items = applicable_items.sort_by { |item| item.variant.price }
    PercentageDiscount.new(30, "30% off your 2 cheapest"),
Ler Limit the discounted units

Dupla perigosa D6

Quantity limit first n discounted (D6)

Reconstruído

Reconstruído como oferta bxgy.

Desconto no carrinho dele: $23.70

Linhas que mudam
DISCOUNT_PERCENTAGE = 30
MAX_UNITS = 2
num_to_discount = MAX_UNITS
Input.cart.line_items.each_with_index do |line_item, position|
  break if num_to_discount <= 0
  next unless line_item.variant.product.tags.include?("limited")

E mais 9 linhas diferentes, na página dela.

Ler Limit the discounted units

Quantity limit purchase cap (D6)

Outra API da Shopify

Não reconstruído. This needs a different kind of Shopify app

Linhas que mudam
# GENERATED BY THE SHOPIFY SCRIPT CREATOR APP
class QuantityLimit < Campaign
  def initialize(condition, customer_qualifier, cart_qualifier, line_item_selector, limit_by, limit)
    super(condition, customer_qualifier, cart_qualifier, line_item_selector)
    @limit_by = limit_by
    @limit = limit

E mais 26 linhas diferentes, na página dela.

Ler Purchase quantity limit

Perguntas frequentes

Will Stackable rebuild this script?
Yes. Every spelling on this page is rebuilt today as a bxgy offer, and the cart above is the one that proves it.
What cart proves it works?
1 x Aria Wireless Earbuds at $79.00. The engine takes $23.70 off, and checkout charges $55.30.
What will I have to check before publishing?
Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect. The unit limit counts per matching group, not per cart line, so a cart with two separate lines can reach the limit twice.

Formatos de Script relacionados

Purchase quantity limit

A cap on how many units a shopper could buy, enforced by trimming the cart.

Buy one get one free

A set of paid units earns an extra unit at no charge.

Buy X get Y, inclusive

The same buy-and-get offer, counted so the reward sits inside each set rather than beside it.

Cole o seu Script e veja a reconstrução

A reconstrução é comparada com o valor que o seu Script antigo cobrava antes de você poder publicá-la.

Usamos cookies essenciais para operar este site e, apenas com sua permissão, cookies de análise para entender o tráfego. Leia nossa Política de Cookies.