Kupon mantığı hataları ödeme toplamlarını bozabilir. Çift indirim, hariç tutma ve negatif toplamları önleyecek yığın kuralları, öncelikler ve test edilebilir desenleri öğrenin.

Promosyonlar basit görünür, ta ki gerçek bir ödeme akışına koyana kadar. Sepet sürekli değişir, ancak indirim kuralları genellikle tek seferlik kontroller olarak yazılır. Bu fark, kupon mantığı tuzaklarının çoğunun ortaya çıktığı yerdir.
Zor olan taraf şu: tek bir yeni kural her yere etki edebilir. "İndirimli ürünlerde geçerli değil" şeklinde bir "%10 indirim" eklerseniz, "indirimli"nin ne anlama geldiğini, ne zaman kontrol edildiğini ve %10'un hangi tutara uygulanacağını kararlaştırmanız gerekir. Başka bir promosyon aynı ürünlere dokunuyorsa, uygulama sırası önem kazanır ve sıra fiyatı değiştirir.
Birçok ekip ayrıca matematiği iş kurallarıyla karıştırır. "İndirimi ara toplamla sınırla" gibi hızlı bir düzeltme üç yere kopyalanır ve yakında toplam farklı yerlerde (sepet sayfası, ödeme, fatura, e-posta) farklı sonuçlar verir.
Riskli anlar, sisteminizin fiyatları yeniden hesapladığı anlardır:
Küçük bir örnek: bir müşteri bir paket ekler, sonra "100$ üzeri 20$ indirim" kodu uygular, sonra bir ürün çıkarır. Kodunuz eski ara toplamı "hatırlamaya" devam ederse, 85$'lık sepete 20$ indirim verebilir ya da bir ürün satırını negatif gösterebilir.
Bu yazının sonunda en sık görülen promosyon hatalarını önleyebiliyor olmalısınız: çift indirim, ekranlar arasında uyuşmayan toplamlar, negatif tutarlar, hariç tutulmuş ürünlere uygulanan indirimler ve müşterinin aslında ödediğiyle eşleşmeyen iadeler.
Çoğu kupon mantığı tuzağı bir eksik cümleyle başlar: hangi indirimlerin birlikte uygulanmasına izin veriliyor ve hangi sırayla. Yığın kurallarını açık bir dille açıklayamıyorsanız, sepetiniz sonunda şaşırtıcı bir şey yapacaktır.
Birleştirmeyi basit evet/hayır ifadeleriyle tanımlayın. Örneğin: "Sipariş başına bir manuel kupon. Kuponun engellediği belirtilmedikçe otomatik promosyonlar yine de uygulanabilir." Bu tek satır, çift indirimlemeye yol açan rastgele kombinasyonları önler.
Erken aşamada ürün düzeyindeki indirimleri sipariş düzeyindeki indirimlerden ayırın. Ürün düzeyindeki kurallar belirli ürünlerin fiyatını değiştirir (ör. ayakkabılarda %20). Sipariş düzeyindeki kurallar toplamı değiştirir (ör. sepette 10$ indirim). Bunları yapısız karıştırmak, ürün sayfası, sepet ve ödeme arasında toplamların sürüklenmesine yol açar.
"En iyi fırsat"ın ne anlama geldiğine kod yazmadan önce karar verin. Birçok ekip "azami tasarruf" seçer, ancak bu fiyat tabanlarını bozabilir. Ayrıca "maliyetin altına asla indirmeyin" veya "kargoyu negatif yapmayın" gibi kurallara ihtiyaç duyabilirsiniz. Motorun tahmin yürütmemesi için tek bir açık kazanan kural seçin.
Basit bir öncelik sırası çakışmaları öngörülebilir kılar:
Örnek: Sepette tüm ürünlerde %10 otomatik promosyon ve 100$ üzeri 15$ indirim kuponu varsa, önceliğiniz otomatik promosyonlar ise şu soruya net cevap verirsiniz: 100$ eşiği indirim öncesi ara toplam mı yoksa indirimli ara toplam mı kullanılarak kontrol edilir? Yazın ve her yerde tutarlı olun.
Bu tercihleri yazılı hale getirdiğinizde, kupon yığılma kurallarınız gizli davranışlar değil test edilebilir kurallar olur. Bu, kupon mantığı tuzaklarından kaçınmanın en hızlı yoludur.
Çoğu kupon mantığı tuzağı, indirimlerin ödeme kodunun çeşitli yerlerine saçılmış if-else kontrolleri olarak yaşadığı zaman başlar. Daha güvenli bir yaklaşım, her promosyonu açık bir tip, kapsam ve limitlerle verisel olarak ele almaktır. Böylece sepet matematiğiniz küçük ve öngörülebilir bir değerlendirici olur.
Önce indirim tipine isim verin, pazarlama ifadesine değil. Çoğu promosyon birkaç biçime uyar: yüzde indirim, sabit tutar indirimi, ücretsiz ürün (veya X al Y bedava) ve ücretsiz kargo. Bir promosyonu bu türlerden biriyle ifade edebildiğinizde, test edilmesi zor özel durumlardan kaçınırsınız.
Sonra kapsamı açık hale getirin. Aynı yüzde indirimi hedeflediği şeye göre çok farklı davranır. Uygulandığı yerin tüm sipariş mi, bir kategori mi, bir ürün mü, tek bir satır mı yoksa kargo mu olduğunu tanımlayın. Kapsam net değilse yanlış ara toplamı indirgersiniz veya iki kez indirim uygularsınız.
Kısıtlamaları kod yorumları olarak değil alanlar (fields) olarak yakalayın. Yaygın olanlar asgari harcama, sadece ilk sipariş için geçerli olma ve tarih aralığıdır. Ayrıca indirimli fiyatlarla nasıl davranması gerektiğini de kaydedin: üst üste binebilir, liste fiyatına uygulanır ya da indirimli ürünleri dışlar.
Kompakt bir kural şeması şunları içerebilir:
Son olarak, motorun her zaman uyması gereken fiyat tabanları ekleyin: toplamlar asla sıfırın altına düşemez ve iş gereksinimi varsa ürünler asla maliyetin altına (veya tanımlı bir minimum fiyatın altına) inemez. Bunu önden kurarsanız, negatif toplamları ve garip "müşteriye ödeme yapıyoruz" uç durumlarını önlersiniz.
Eğer bir indirim motoru prototipini Koder.ai içinde yapıyorsanız, bu alanları planlama modunda görünür tutun ki değerlendirme ekleyici promosyonlar eklendikçe basit ve test edilebilir kalsın.
Çoğu kupon mantığı tuzağı, uygunluk kontrolleri ile matematiğin karıştığı yerde başlar. Daha güvenli bir desen iki aşamalıdır: önce hangi promosyonların uygulanabileceğine karar verin, sonra tutarları hesaplayın. Bu ayrım kuralları okunabilir kılar ve kötü durumları (örn. negatif toplamlar) önlemeyi kolaylaştırır.
Her zaman aynı sırayı kullanın, promosyonlar UI veya API'den farklı bir sırada gelse bile. Determinizm önemlidir çünkü "neden bu sepet değişti?" sorusunu yanıtlanabilir hale getirir.
İyi çalışan basit bir akış:
Promoları uyguladığınızda sadece tek bir "indirim toplamı" saklamayın. Satır bazında ve sipariş düzeyinde bir döküm tutun ki toplamları mutabık hale getirebilesiniz ve açıklayabilesiniz.
En azından şunları kaydedin:
Örnek: Sepette iki ürün var, biri zaten indirimde. 1. aşama kodu yalnızca tam fiyatlı ürün için uygun olarak işaretler. 2. aşama o satıra %10 uygular, indirimdeki satırı olduğu gibi bırakır ve sonra satır dökümünden sipariş toplamını yeniden hesaplar; böylece yanlışlıkla çift indirim uygulanmaz.
Çoğu kupon mantığı tuzağı, hariç tutmaların "eğer kod X ise Y'yi atla" gibi özel durum dallanmalarının içine gizlendiği zaman başlar. Bu bir promosyon için işe yarar, sonra bir sonraki promosyon geldiğinde bozulur.
Daha güvenli desen: tek bir değerlendirme akışını koruyun ve hariç tutmaları promosyon kombinasyonunu hesaplamadan önce reddedebilen bir dizi kontrol olarak tutun. Böylece indirimler asla yarım uygulanmaz.
Davranışları kodlamak yerine her promosyona küçük, açık bir "uyumluluk profili" verin. Örneğin: promosyon türü (kupon vs otomatik indirim), kapsam (ürünler, kargo, sipariş) ve kombinasyon kuralları.
Hem şunu destekleyin:
Anahtar nokta: motorunuz her promosyon için aynı soruları sorsun, sonra kümenin geçerli olup olmadığına karar versin.
Otomatik satışlar genellikle önce uygulanır, sonra bir kupon girilir ve otomatik satış sessizce üzerine yazılır. Önceden ne olacağını belirleyin:
Her promosyon için bir tercih seçin ve bunu ayrı bir kontrol olarak kodlayın, alternatif bir hesaplama yolu olarak değil.
Sürprizleri önlemenin pratik yolu simetriyi doğrulamaktır. Eğer "WELCOME10, FREESHIP ile birleştirilemez" düşünülüyorsa, bunu iki yönlü engelleyecek şekilde kodlayın. Eğer iki yönlü değilse, bunun kasıtlı ve veride görünür olduğundan emin olun.
Örnek: Site genelinde %15 otomatik satış varken müşteri %20 kupon girerse ve kupon sadece tam fiyatlı ürünler içinse, kontroller kupon için satışlı ürünleri hesaplamadan önce hariç tutmalıdır; indirim uygulayıp sonra sayıları düzeltmeye çalışmamak gerekir.
Eğer indirim kurallarınızı Koder.ai gibi bir platformda oluşturuyorsanız, bu kontrolleri ayrı, test edilebilir bir katman olarak tutun ki kuralları değiştirmek için matematiği yeniden yazmanız gerekmesin.
Çoğu kupon anlaşmazlığı başlık indirimiyle ilgili değildir. Aynı sepetin iki hafif farklı yolla hesaplandığı ve müşterinin bir sayı gördüğü, ödeme ekranında başka bir sayı olduğu durumlarda çıkar.
İşlem sırasını kilitleyerek başlayın. Ürün düzeyi indirimlerin sipariş düzeyi indirimlerden önce mi sonra mı olduğunu ve kargonun nereye girdiğini belgeleyin. Yaygın bir kural: önce ürün indirimleri, sonra kalan ara toplam üzerinden sipariş indirimi, son olarak kargo indirimleri. Ne seçerseniz seçin, toplam gösterdiğiniz her yerde aynı sıralamayı kullanın.
Vergi bir sonraki tuzaktır. Fiyatlar vergi dahil ise, indirim vergi payını da küçültür. Fiyatlar vergi hariçse, vergi indirim sonrası hesaplanır. Akışın farklı bölümlerinde bu modelleri karıştırmak klasik hatalardan biridir çünkü iki doğru hesaplama bile farklı vergi tabanları varsayıyorsa uyuşmayabilir.
Yuvarlama küçük görünür ama büyük destek biletleri yaratır. Her satır için (indirim sonrası her SKU) mi yoksa yalnızca sipariş düzeyinde mi yuvarlanacağına karar verin ve para birimi hassasiyetine bağlı kalın. Yüzde kuponlarda, satır yuvarlaması çok sayıda düşük fiyatlı ürünle sipariş yuvarlamasından birkaç kuruş sapma yaratabilir.
Aşağıdaki uç durumları açıkça ele alın:
Somut örnek: %10 sipariş kuponu ve 50$ üzeri ücretsiz kargo. Eğer kupon eşiği kontrolünden önce uygulanıyorsa, indirimli ara toplam 50$'ın altına düşebilir ve kargo artık ücretsiz olmaz. Bir yorum seçin, kural olarak kodlayın ve sepet, ödeme ve iade işlemlerinde tutarlı hale getirin.
Çoğu kupon mantığı tuzağı sepetin birden fazla yol üzerinden değerlendirilmesiyle ortaya çıkar. Bir promosyon bir yerde satır düzeyinde uygulanırken başka bir yerde sipariş düzeyinde tekrar uygulanabilir ve her ikisi de izole halde "doğru" görünebilir.
En sık görülen hatalar ve arkasındaki nedenler:
Somut örnek: Sepette iki ürün var, biri uygun diğeri hariç tutulmuş. Motor yüzde promosyon için uygun ara toplamı doğru hesaplasa da daha sonra sabit indirimi tüm sipariş toplamından düşerse, hariç tutulmuş ürün etkilenmiş olur.
En güvenli desen, her promosyonu açık bir "uygun tutar"a karşı hesaplamak ve sınırlı bir düzeltme döndürmektir (asla sıfırın altına düşmeyen), ayrıca hangi satırları etkilediğine dair açık bir iz. Eğer indirim motorunuzu Koder.ai gibi bir araçla üretirseniz, çıktının izi düz veri olarak olsun ki testler hangi satırların uygun olduğunu ve hangi ara toplamın kullanıldığını netçe iddia edebilsin.
Çoğu kupon mantığı tuzağı testlerin sadece nihai toplamı kontrol etmesinden kaynaklanır. İyi bir test takımı hem uygunluğu kontrol eder (bu promosyon uygulanmalı mı?) hem de matematiği (ne kadar indirim yapmalı?), ve okunabilir bir döküm sağlar ki zaman içinde karşılaştırılabilsin.
Önce tek bir kuralı izole eden birim testleriyle başlayın. Girdiyi küçük tutun, sonra gerçek sepet senaryolarına genişletin.
Kapsama sahip olduktan sonra birkaç "her zaman doğru" kontrol ekleyin. Bunlar elle yazmadığınız garip durumları yakalar.
2 üründen oluşan bir sepet hayal edin: 40$ gömlek (uygun) ve 30$ hediye kartı (hariç). Kargo 7$. Bir promosyon "giyim %20 indirim, maksimum 15$", ikinci promosyon ise "50$ üzeri siparişlere 10$" ve yüzde promosyonlarla birleştirilemez.
Senaryo testiniz hangi promosyonun (öncelik) kazandığını, hediye kartının dışlandığını ve tam tahsisi doğrulamalı: 40$'ın %20'si 8$ eder, kargo değişmez, nihai toplam doğru olmalı. Bu dökümü altın görüntü olarak saklayın ki sonraki düzenlemeler hangi promosyonun uygulandığını veya hariç tutmanın değişmeye başladığını sessizce değiştirmesin.
Yeni bir promosyonu yayına almadan önce, müşterilerin anında fark edeceği hataları yakalayan kısa bir kontrolden geçirin: garip toplamlar, kafa karıştırıcı mesajlar ve tutarsız iadeler. Bu kontroller aynı zamanda en yaygın kupon mantığı tuzaklarını yakalar çünkü kurallarınızın her sepette aynı davranmasını zorunlu kılar.
Bu kontrolleri küçük bir "bilinen zorlu" sepet setine karşı çalıştırın (tek ürün, çok ürün, karışık vergi oranları, kargo ve yüksek miktarlı bir satır). Sepetleri kaydedin ki fiyat kodunu her değiştirdiğinizde tekrar çalıştırabilesiniz.
Eğer indirim kurallarınızı Koder.ai gibi bir üreticide oluşturuyorsanız, bu durumları kural tanımlarıyla birlikte otomatik testler olarak ekleyin. Amaç basit: gelecekteki herhangi bir promosyon değişikliği, müşteri sepetinde değil testlerde hızlıca başarısız olsun.
Aşağıda çoğu kupon mantığı tuzağını ortaya çıkaran ama karmaşık olmayan küçük bir sepet var.
Bu kuralları varsayın (bunları sisteminizde tam olarak böyle yazın):
Sepet:
| Line | Price | Notes |
|---|---|---|
| Item A | $60 | full-price, eligible |
| Item B | $40 | full-price, eligible |
| Item C | $30 | sale item, excluded |
| Shipping | $8 | fee |
Promolar:
Kupon asgari harcama kontrolü: indirim öncesi uygun ürün toplamı 60$ + 40$ = 100$, bu yüzden kupon uygulanabilir.
Promo 1 uygulansın (%10 eligible ürünlerde): 100$ x %10 = 10$ indirim. Uygun ara toplam 90$ olur.
Promo 2 uygulansın (15$): üst sınır 90$ olduğundan tam 15$ uygulanır. Yeni uygun ara toplam 75$ olur.
Toplamlar:
Şimdi bir şeyi değiştirin: müşteri Item B'yi (40$) çıkarıyor. Uygun ürün toplamı 60$ olur, dolayısıyla 15$ kupon asgari harcama kontrolünü geçemez. Sadece %10 otomatik promo kalır: Item A 54$ olur, ürünler 54$ + 30$ = 84$, ve nihai toplam 99.36$ olur. Bu, uygunluk ve işlem sırasının açık olmadığı durumlarda sepetleri bozabilen "küçük düzenleme" tipik örneğidir.
Kupon mantığı tuzaklarından kaçınmanın en hızlı yolu, promoları "ödeme içinde biraz matematik" gibi değil ürün kuralları gibi ele almaktır. Yayına almadan önce herkesin okuyup üzerinde anlaşabileceği kısa bir spesifikasyon yazın.
Dört şeyi sade dille dahil edin:
Yayın sonrası, toplamları hata kayıtlarını izlediğiniz gibi izleyin. Bir indirim hatası genellikle geçerli bir sipariş gibi görünür ta ki finans görüp fark edene kadar.
Aşağıdakileri tetikleyecek bir izleme kurun: neredeyse sıfır total, negatif toplamlar, toplamdan büyük indirimler veya "%100 indirimli" sepetlerde ani artışlar. Uyarıları ödeme hatalarının gittiği aynı yere yönlendirin ve bir promosyonu güvenle devre dışı bırakma için kısa bir çalışma planı tutun.
Regresyon olmadan yeni promolar eklemek için tekrarlanabilir bir iş akışı kullanın: önce spesifikasyonu güncelleyin, kuralı verisel olarak kodlayın (dallanmış kod değil), birkaç "normal" sepet için test ekleyin artı bir-iki zorlu uç durum, sonra tam indirim test süitini çalıştırıp merge edin.
Daha hızlı uygulamak ve yinelemeler yapmak isterseniz, Koder.ai içinde planlama modunda promosyon motoru akışlarını prototipleyebilir, sonra test görüntüleri ve geri alma ile kural değişikliklerini kaydederek hızlıca deneyebilirsiniz. Bu, kural değişikliklerini denerken bilinen iyi bir sürümü kaybetmemenize yardımcı olur.