Migrating a BOGO that ran across the whole cart
How most agency-written BOGOs worked: pool every eligible unit, sort it, then peel off the discounted ones. Sort ascending and the cheapest units are free. Sort descending and they are not. The class names differ by one word.
GenopbyggetIt pooled every eligible unit in the cart, sorted them by price, and discounted a share of them.
Handlende har skrevet det her på 2 forskellige måder, og de betyder ikke alle det samme. Hver variant står nedenfor med sin egen kurv og sine egne tal.
Indsæt det i Scripts-redning, og se hvad der bliver bygget
- Kopiér Ruby-koden med knappen ved siden af ethvert Script på siden.
- Åbn Stackable i Shopify-administrationen, derefter Værktøjer og så Scripts-redning.
- Indsæt det der, læs hvad værktøjet siger, det vil bygge, og hold det op mod indstillingerne på denne side.
Scripts-redning hører til Pro-abonnementet. Intet bliver udgivet, før du oplyser, hvad dit gamle Script gav i rabat, og de to beløb stemmer helt ned på øret.
Bogo cross line interleaved (D17)
GenopbyggetFarligt par D17. Denne fil og dens makker ser næsten ens ud og opfører sig forskelligt, så læs dem begge, før du afgør, hvilken du har.
class InterleavedPartitioner
def initialize(paid_item_count, discounted_item_count)
@paid_item_count = paid_item_count
@discounted_item_count = discounted_item_count
end
def partition(cart, applicable_line_items)
sorted_items = applicable_line_items.sort_by { |line_item| line_item.variant.price }.reverse
discounted_items = []
paid_items_seen = 0
discounted_items_seen = 0
sorted_items.each do |line_item|
line_item.quantity.times do
if paid_items_seen < @paid_item_count
paid_items_seen += 1
else
discounted_items_seen += 1
discounted_items.push(line_item.split(take: 1))
if discounted_items_seen == @discounted_item_count
paid_items_seen = 0
discounted_items_seen = 0
end
end
end
end
discounted_items
end
end
CAMPAIGNS = [
BogoCampaign.new(
ProductTagSelector.new("bogo"),
PercentageDiscount.new(100, "Buy 2 get 1 free"),
InterleavedPartitioner.new(2, 1)
),
]
CAMPAIGNS.each do |campaign|
campaign.run(Input.cart)
end
Output.cart = Input.cartGenkendt som Buy X, get Y og genopbygget som et tilbud af typen bxgy. Det her er de rigtige konfigurationsnøgler, som tilbuddet gemmes med, så du kan tjekke din egen genopbygning felt for felt.
| Indstilling | Værdi | Konfigurationsnøgle |
|---|---|---|
| Offer type | bxgy | type |
| Counting | per_group | counting |
| Recurrence | repeat | recurrence |
| Tier 1 | min qty 2 -> free item | tiers[0] |
| Buy quantity | 2 | bxgy.buyQty |
| Get quantity | 1 | bxgy.getQty |
| Get selection | same_item | bxgy.getSelection |
| Reward on the get units | 100% off | bxgy.getDiscountPct |
| Free units are additional | true | bxgy.freeUnitsAreAdditional |
| Target scope | tags | target.scope |
| Target includes | bogo | target.includeIds |
| Method | automatic | discountMethod |
| Allocation | standard | stacking.allocation |
| Combines with other discounts | no | stacking |
- Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
- Your Script used Shopify's own item ordering to choose what to discount. We use the campaign's allocation order, which can pick a different item in a mixed cart.
Bygget i vores offentlige demobutik, Meridian Goods, så hver pris her kan efterregnes i stedet for at blive taget på tro. Rabatten nedenfor er det, som den samme motor, der kører i kassen, beregner for præcis denne kurv.
- No Meridian Goods product carries the tag bogo. Set it on Aria Wireless Earbuds in Shopify before you build the cart, and on nothing else.
| Vare | Antal | Stykpris |
|---|---|---|
| Aria Wireless Earbuds | 3 | $79.00 |
| Subtotal | $237.00 | |
| Rabat | -$79.00 | |
| Total | $158.00 | |
Logget ud, eller logget ind som kunde uden tags.
Inden du udgiver, spørger værktøjet, hvad dit gamle Script gjorde ved en kurv, du allerede har. Sæt den til 3 af Aria Wireless Earbuds à $79.00, så ligger svaret fast.
Rabatten er $79.00. Det beløb, kunden betalte, er $158.00.
Sammenligningen er præcis, helt ned til den mindste enhed i din valuta. En øre ved siden af, og udgivelsen forbliver spærret, hvilket er hele pointen med trinnet.
- drop to 1 of the same product, under what the rule needs
| Vare | Antal | Stykpris |
|---|---|---|
| Aria Wireless Earbuds | 1 | $79.00 |
| Subtotal | $79.00 | |
| Total | $79.00 | |
Logget ud, eller logget ind som kunde uden tags.
Bogo cross line low to high (D17)
GenopbyggetFarligt par D17. Denne fil og dens makker ser næsten ens ud og opfører sig forskelligt, så læs dem begge, før du afgør, hvilken du har.
class LowToHighPartitioner
def initialize(paid_item_count, discounted_item_count)
@paid_item_count = paid_item_count
@discounted_item_count = discounted_item_count
end
def partition(cart, applicable_line_items)
sorted_items = applicable_line_items.sort_by { |line_item| line_item.variant.price }
total_applicable_items = sorted_items.map(&:quantity).reduce(0, :+)
discounted_items_to_find = (total_applicable_items / (@paid_item_count + @discounted_item_count)) * @discounted_item_count
discounted_items = []
sorted_items.each do |line_item|
break if discounted_items_to_find <= 0
take = [line_item.quantity, discounted_items_to_find].min
discounted_items.push(line_item.split(take: take))
discounted_items_to_find -= take
end
discounted_items
end
end
CAMPAIGNS = [
BogoCampaign.new(
ProductTagSelector.new("bogo"),
PercentageDiscount.new(100, "Buy 2 get 1 free"),
LowToHighPartitioner.new(2, 1)
),
]
CAMPAIGNS.each do |campaign|
campaign.run(Input.cart)
end
Output.cart = Input.cartGenkendt som Buy X, get Y og genopbygget som et tilbud af typen bxgy. Det her er de rigtige konfigurationsnøgler, som tilbuddet gemmes med, så du kan tjekke din egen genopbygning felt for felt.
| Indstilling | Værdi | Konfigurationsnøgle |
|---|---|---|
| Offer type | bxgy | type |
| Counting | per_group | counting |
| Recurrence | repeat | recurrence |
| Tier 1 | min qty 2 -> free item | tiers[0] |
| Buy quantity | 2 | bxgy.buyQty |
| Get quantity | 1 | bxgy.getQty |
| Get selection | cheapest_eligible | bxgy.getSelection |
| Reward on the get units | 100% off | bxgy.getDiscountPct |
| Free units are additional | true | bxgy.freeUnitsAreAdditional |
| Target scope | tags | target.scope |
| Target includes | bogo | target.includeIds |
| Method | automatic | discountMethod |
| Allocation | standard | stacking.allocation |
| Combines with other discounts | no | stacking |
- Your Script limited this to a tag, vendor, or product type. We carried that filter over, so confirm it selects the products you expect.
Bygget i vores offentlige demobutik, Meridian Goods, så hver pris her kan efterregnes i stedet for at blive taget på tro. Rabatten nedenfor er det, som den samme motor, der kører i kassen, beregner for præcis denne kurv.
- No Meridian Goods product carries the tag bogo. Set it on Aria Wireless Earbuds and Impact Phone Case in Shopify before you build the cart, and on nothing else.
| Vare | Antal | Stykpris |
|---|---|---|
| Impact Phone Case | 2 | $24.00 |
| Aria Wireless Earbuds | 1 | $79.00 |
| Subtotal | $127.00 | |
| Rabat | -$24.00 | |
| Total | $103.00 | |
Logget ud, eller logget ind som kunde uden tags.
Inden du udgiver, spørger værktøjet, hvad dit gamle Script gjorde ved en kurv, du allerede har. Sæt den til 3 af Impact Phone Case à $24.00, så ligger svaret fast.
Rabatten er $24.00. Det beløb, kunden betalte, er $48.00.
Sammenligningen er præcis, helt ned til den mindste enhed i din valuta. En øre ved siden af, og udgivelsen forbliver spærret, hvilket er hele pointen med trinnet.
- drop to 1 of the same product, under what the rule needs
| Vare | Antal | Stykpris |
|---|---|---|
| Impact Phone Case | 1 | $24.00 |
| Subtotal | $24.00 | |
| Total | $24.00 | |
Logget ud, eller logget ind som kunde uden tags.
To filer, der ligner hinanden
Hvert par herunder er den samme Script-form skrevet på to måder. De adskiller sig på en eller to linjer og gør noget forskelligt, så læs dem begge, før du afgør, hvilken du har.
Farligt par D17
Bogo cross line interleaved (D17)
GenopbyggetBygges om til et bxgy-tilbud.
Rabat i dens egen kurv: $79.00
class InterleavedPartitioner
sorted_items = applicable_line_items.sort_by { |line_item| line_item.variant.price }.reverse
paid_items_seen = 0
discounted_items_seen = 0
line_item.quantity.times do
if paid_items_seen < @paid_item_countOg 11 flere forskellige linjer, på dens egen side.
Bogo cross line low to high (D17)
GenopbyggetBygges om til et bxgy-tilbud.
Rabat i dens egen kurv: $24.00
class LowToHighPartitioner
sorted_items = applicable_line_items.sort_by { |line_item| line_item.variant.price }
total_applicable_items = sorted_items.map(&:quantity).reduce(0, :+)
discounted_items_to_find = (total_applicable_items / (@paid_item_count + @discounted_item_count)) * @discounted_item_count
break if discounted_items_to_find <= 0
take = [line_item.quantity, discounted_items_to_find].minOg 3 flere forskellige linjer, på dens egen side.
Ofte stillede spørgsmål
- 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?
- 3 x Aria Wireless Earbuds at $79.00. The engine takes $79.00 off, and checkout charges $158.00.
- 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. Your Script used Shopify's own item ordering to choose what to discount. We use the campaign's allocation order, which can pick a different item in a mixed cart.
Beslægtede Script-typer
A set of paid units earns an extra unit at no charge.
The same buy-and-get offer, counted so the reward sits inside each set rather than beside it.
The discount applied to the first few units only, with the rest at full price.
Indsæt dit Script og se det blive genopbygget
Genopbygningen holdes op mod det beløb, dit gamle Script opkrævede, før du kan udgive den.