İçindekiler
Promosyonlar
Bir kampanya koşullardan ve faydalardan oluşur. Yayına almadan önce gerçek bir müşterinin gerçek sepetinde çalıştırılabilir; yayına alındıktan sonra da her siparişte hangi kampanyanın neden çalıştığı ve hangisinin neden çalışmadığı kayda geçer.
Bir kampanyanın parçaları #
Kampanya bir mekanik taşır: koşullar listesi, faydalar listesi ve tekrar ayarları. Buna kod, ad, öncelik, çakışma davranışı, tarih penceresi, isteğe bağlı bütçe tavanı ve hedef kitle eklenir.
Koşullar #
| Koşul | Parametreleri |
|---|---|
| Ürün miktarı | Kapsam (tüm ürünler, ürünler, markalar, kategoriler) ve taban birimde en az miktar. İsteğe bağlı bir görünen ad taşır — “10 koli Efsane Kola” gibi. |
| Sepet tutarı | En az tutar; isteğe bağlı kapsam. Kapsam boşsa sipariş toplamına bakılır. |
| Farklı ürün sayısı | Kapsam ve en az kaç farklı ürün bulunması gerektiği. |
| Müşteri kanalı | Kampanyanın geçerli olduğu kanallar listesi. |
| İlk sipariş | Parametresiz. Müşterinin ilk siparişinde çalışır. |
Faydalar #
| Fayda | Parametreleri |
|---|---|
| Yüzde indirim | Kapsam, yüzde, isteğe bağlı üst sınır tutarı. |
| Tutar indirimi | Kapsam ve tutar. Tutar her uygulama başına düşülür. |
| Bedava ürün | Ürün, birim (varsayılan ADET) ve miktar. |
| Kademeli indirim | Kapsam ve kademeler. Her kademe bir en az miktar ve bir yüzde taşır; ulaşılan en yüksek kademe uygulanır. |
| Fatura indirimi | Yüzde ve isteğe bağlı üst sınır. Satır bazında değil, sipariş bazında. |
| Puan | Para birimi başına puan; isteğe bağlı kapsam. |
Kapsam dört şeyin birleşimidir: hepsi, belirli ürünler, markalar, kategoriler. Boş bir kapsam hiçbir şeyle eşleşmez — taslak için güvenli varsayılan budur, çünkü boş kapsamın “her şey” sayılması, yarım bırakılmış bir taslağın bütün kataloğa indirim yazması demektir.
Koşullar taban birimde sayılır. “10 koli” eşiği, on iki adetlik bir koli için 120 adet demektir; temsilcinin hangi birimde girdiği sonucu değiştirmez.
Hedef kitle #
Hiç atama yoksa kampanya herkese açıktır. Atama varsa müşteri, segment, kanal, rut ya da organizasyon birimi üzerinden hedeflenir ve en az birinin tutması gerekir.
Sıra, tekrar ve çakışma #
Kampanyalar önce önceliğe göre (büyükten küçüğe), sonra koda göre sıralanır ve bu sırayla değerlendirilir. Her biri için önce kapılar kontrol edilir; geçemeyen bir kampanya atlanma sebebiyle birlikte cevaba yazılır — çünkü “neden bu indirim çıkmadı” sorusu, “neden çıktı” kadar sık sorulur.
| Atlanma sebebi | Anlamı |
|---|---|
| Yayında değil | Kampanya aktif değil ya da tarih penceresinin dışında. |
| Hedef kitle dışı | Bu müşteri kampanyanın kitlesinde değil. |
| Bütçe tükendi | Bütçe tavanı tamamen harcanmış. |
| Koşullar sağlanmadı | Sepet koşulu karşılamıyor. Kıl payı kaçırılmışsa uyarı da üretilir. |
| Tekil promosyon engelledi | Daha yüksek öncelikli, siparişe özel (tekil) bir kampanya zaten uygulandı. |
| Fayda oluşmadı | Koşullar tuttu ama bu sepette fayda sıfır çıktı. |
Çakışma davranışı üç değerden biridir:
- Yığılabilir. Hiçbir şeyi kilitlemez; sonraki kampanyalar aynı satırları görmeye devam eder.
- Satırlara özel. Dokunduğu satırları kilitler. Sonraki kampanyalar yalnızca kilitlenmemiş satırları görür.
- Siparişe özel. Sıradaki bütün kampanyalar “tekil promosyon engelledi” ile atlanır. Kendinden önce uygulanmış olanları geri almaz — bu yüzden önceliğin ne olduğu burada gerçekten önemlidir.
Bir kampanyanın verdiği bedava ürün satırını başka bir kampanya indiremez: bedava satırlar her turda hesaba katılmayan satırlar arasındadır.
Tekrar sayısı, koşulların izin verdiği en küçük katsayıdır. “10 koli al 1 bedava” kuralında 25 koli üç kez tekrar eder. Mekanik tekrarsız işaretlenmişse ya da bir üst sınır konmuşsa orada kesilir.
Bütçe: reddetmez, kırpar #
Bir kampanyaya bütçe tavanı konabilir. Hesaplanan fayda kalan bütçeyi aşıyorsa kampanya reddedilmez; fayda kalan bütçeye oranlanarak kırpılır ve açıklamaya bunun yapıldığını söyleyen bir satır eklenir. Harcanan tutar sipariş oluşturulduğunda işlenir, faturada değil.
İndirimler kazanan satırlara net tutarlarıyla orantılı dağıtılır ve artan kuruş son satıra yazılır — böylece dağıtım ne bir kuruş kaybeder ne de uydurur.
Kıl payı kaçan fırsatlar #
Her teklif, sepetin az kalsın hak edeceği kampanyaları da bildirir. Uyarı tam eksiği taşır ve temsilci daha tezgâhın başındayken görür.
| Koşul | Uyarı neyi söyler |
|---|---|
| Ürün miktarı | Kaç taban birim eksik olduğu, kampanyanın kendi görünen adıyla birlikte: “10 koli Efsane Kola”. |
| Sepet tutarı | Kaç lira daha harcanması gerektiği. |
| Farklı ürün sayısı | Kaç farklı ürün daha eklenmesi gerektiği. |
Kanal ve ilk sipariş koşulları uyarı üretmez: temsilcinin tezgâhta yapabileceği bir şey yoktur. Bir kampanya için yalnızca ilk karşılanmayan koşul bildirilir, ve yalnızca kampanya bunun dışında yayında, hedefte ve bütçesi duruyorken.
Kademeli indirimin kendi, daha yumuşak bir uyarısı vardır: hiçbir kademeye ulaşılmadığında bir sonraki kademeye ne kadar kaldığı açıklama satırı olarak döner.
Yaşam döngüsü #
- 1
Taslak
Kural yazılır ve kaydedilir. Kaydetme anında doğrulanır; hiçbir sepette çalışmaz. - 2
Simüle et
Taslak, gerçek bir müşterinin gerçek sepetinde çalıştırılır. Kaydedilmemiş bir taslak da simüle edilebilir — kural oluşturucudan doğrudan. - 3
Yayına al
Durum aktif olur. Başlangıç zamanı boşsa o an atanır. Yayına alma ayrıca bir doğrulama yapmaz; doğrulama kaydetme anında yapılmıştır. - 4
Duraklat, düzelt, tekrar yayına al
Yayındaki bir kampanya düzenlenemez. Bir dakika arayla verilen iki sipariş farklı indirim alır ve aradaki farkı açıklayacak hiçbir kayıt olmaz: iz tek bir kampanyayı adlandırır, iki farklı kural gösterir. Düzenlemek için önce duraklatılır. Duraklatmak bütçeyi, uygulamaları ve atamaları değiştirmez.
Simülatör #
POST /promotions/simulate bir müşteri, bir sepet ve bir kampanya (kayıtlı ya da taslak) alır. Kayıtlı kampanya, saklanan satıra hiç dokunmadan yayındaymış gibi kopyalanır: durumu aktif sayılır, gelecekteki başlangıcı geriye çekilir, geçmiş bitişi kaldırılır. Böylece duraklatılmış ve taslak kampanyalar da denenebilir.
Varsayılan olarak yayındaki kampanyalar da hesaba katılır — yeni kuralın mevcutlarla nasıl yığıldığını görmenin tek yolu budur. Cevap şunları döner:
- Sepetin brüt tutarı, toplam indirim, indirim sonrası net ve indirim oranı.
- Uygulanan kampanyalar: tekrar sayısı, fayda değeri ve her birinin açıklama satırları.
- Atlananlar, sebepleriyle.
- Kıl payı kaçanlar, eksikleriyle.
- Bedava ürünler.
- Satır bazında brüt, indirim, net ve etkin birim fiyat — indirim dağıtıldıktan sonra satırın gerçekte kaça geldiği.
Simülasyon gerçek fiyat motorundan geçer; fiyatı olmayan bir ürün simülasyonda da hata verir. Bu bir kusur değil, amacın kendisi: simülatörün yalan söylemediğini bilmenin yolu, satışın kullandığı yolun aynısını kullanmasıdır.
POST /promotions/simulate
{
"customerId": "<müşteri>",
"includeActivePromotions": true,
"draft": {
"name": "Ağustos KOLİ kampanyası",
"code": "AGU-KOLI",
"stacking": "stackable",
"mechanic": {
"conditions": [
{ "type": "product_quantity", "minBaseQuantity": 120,
"displayHint": "10 koli Efsane Kola",
"scope": { "productIds": ["<ürün>"] } }
],
"benefits": [
{ "type": "free_goods", "productId": "<ürün>", "unit": "KOLI", "quantity": 1 }
],
"repeatable": true
}
},
"lines": [ { "productId": "<ürün>", "unit": "KOLI", "quantity": 25 } ]
}Kaydetme anında reddedilenler #
Fiyat listelerinde olduğu gibi, temiz kaydedilip hiçbir şey yapmayan kural reddedilir: faydası olmayan bir kampanya (sepeti nitelendirir ve hiçbir şey vermez), %140 indirim, sıfır adetlik koşul (boş sepet dâhil her sepet karşılar), boş kapsam, kanalı olmayan bir kanal koşulu, kademesiz kademeli indirim, sıfır ya da negatif bütçe tavanı, başlangıcından önce biten pencere ve mükerrer kod.
Kayda geçen #
Bir kampanya bir siparişe uygulandığında ayrı bir kayıt satırı yazılır: hangi kampanya, kaç tekrar, ne kadar fayda, hangi müşteri ve hangi sipariş. Açıklama hem kod-ve-değer hem de o an gösterilen metin olarak saklanır. Aylar sonraki bir itiraz bu satır üzerinden çözülür.