Kampanya kurmak kolaydır. Kampanyayı durdurmak zordur. Çoğu e-pin satıcısı panele bir başlangıç ve bir bitiş tarihi girdiğinde işin tamamlandığını sanır: saat gelir, indirim kalkar, hayat devam eder. Sahada olan şey ise bambaşkadır. Bitiş saati geçer ama ana sayfadaki şerit hâlâ «Son 3 gün» yazar, kategori listesinde üstü çizili fiyat durur, sepete daha önce eklenmiş üründe eski tutar hesaplanır ve gece 02.40'ta biri o linki bulup kuruş kârla yüzlerce kod çeker.
Çoğu kişi bunun bir dikkatsizlik olduğunu düşünür; aslında bir mimari meselesidir. Bir dijital ürün satış scriptinde kampanya bitişi tek bir yerde değil, en az beş ayrı yerde aynı saniyede gerçekleşmek zorundadır: fiyat hesaplayıcıda, listeleme sorgusunda, önbellekte, sepet/sipariş doğrulamasında ve pazarlama yüzeylerinde. Bu beşinden biri gecikirse kampanya «bitmiş» görünür ama fiilen açık kalır. Aşağıda, kendi e-pin satış yazılımında bu zinciri nasıl kuracağını tek tek açıyorum.
Kampanya Neden «Bitmez»? Sorun Takvimde Değil, Karar Katmanında
Kampanyayı bir tarih alanı olarak düşündüğün sürece bu sorun tekrar eder. Çünkü tarih pasif bir veridir; onu okuyup karar üreten yer ise fiyat motorudur. Eğer ürün kartı fiyatı A dosyasından, sepet fiyatı B dosyasından, ödeme özeti C dosyasından hesaplıyorsa üç ayrı doğruluk tanımın var demektir. Doğru kurulum tersidir: tüm yüzeyler tek bir fiyat çözücüye sorar, o çözücü kampanyanın geçerliliğini her istekte yeniden değerlendirir.
Bu yaklaşımın güzelliği şudur: kampanyayı kapatmak için hiçbir şey yapmana gerek kalmaz. Bitiş anı geldiğinde çözücü zaten «bu kural artık geçerli değil» der ve indirim kendiliğinden buharlaşır. Sana kalan iş sadece vitrini temizlemektir. Çoğu epin yazılım kurgusunda ise tam tersi olur: kampanya açılırken fiyatlar ürün tablosuna yazılır, bitişte de geri yazılması beklenir. Bir yazma işlemi yarım kalırsa indirim kalıcı hale gelir ve kimse fark etmez.
Otomatik Kapanış Üç Ayrı Kapıdır: Fiyat, Stok ve Görünürlük
Kapanışı tek bir anahtar sanmak en yaygın hatadır. Gerçekte üç bağımsız kapı vardır. Fiyat kapısı, indirimli tutarın artık uygulanmamasını sağlar. Stok kapısı, kampanyaya ayırdığın kontenjanın (örneğin 500 adet) tükenmesi durumunda tarih gelmeden kapanmayı sağlar. Görünürlük kapısı, banner, sayacı, kategori etiketi ve e-posta şablonlarındaki kampanya anlatısını kaldırır.
Bu üçünü ayırmak zorundasın, çünkü her biri farklı hızda çalışır. Fiyat kapısı milisaniye hassasiyetinde olmalı. Stok kapısı, eşzamanlı siparişlerde kilitleme gerektirir; aksi halde 500 adetlik kontenjandan 517 adet satarsın. Görünürlük kapısı ise önbelleğe takılır, dolayısıyla kapanışta önbellek anahtarlarının hedefli temizlenmesi gerekir. Sadece fiyatı kapatıp vitrini açık bırakmak en kötü senaryodur: müşteri indirim görüp sepette tam fiyat bulur, güven kaybedip çıkar.
Saat Dilimi ve Sunucu Zamanı: Kampanyaları Öldüren Sessiz Hata
«Kampanya 23:59'da bitiyor» cümlesi tek başına anlamsızdır. Hangi saate göre? Paylaşımlı barındırmada sunucu saati sıklıkla UTC'dir; yönetici panelinde girdiğin saat yerel kabul edilir; veritabanı bir başka dilimde damga atar. Sonuç: kampanya sen uyurken üç saat fazla açık kalır. Bu, hiçbir hata kaydına düşmeyen, sadece kâr marjında görünen bir sızıntıdır.
Doğru yaklaşım tek türlüdür: tüm zaman damgalarını UTC olarak sakla, kullanıcıya gösterirken yerel dilime çevir ve panelde kampanya kaydederken hangi dilime göre girildiğini açıkça yaz. Ayrıca bitiş saatini 23:59 yerine 00:00'a hizalamak, gece yarısı belirsizliğini ortadan kaldırır. Küçük bir detay gibi görünür; yüzlerce siparişte fark eden şey tam olarak budur.
| Kapanış modeli | Nasıl çalışır | Gecikme riski | Ne zaman tercih edilir |
|---|---|---|---|
| Fiyat yazma (destructive) | Kampanya açılırken ürün fiyatı değiştirilir, bitişte geri yazılır | Yüksek — yarım kalan işlem kalıcı indirim bırakır | Tek seferlik, çok küçük katalog |
| Kural tabanlı çözücü | Fiyat her istekte kurala göre hesaplanır | Yok denecek kadar az | Standart öneri — tüm katalog boyutları |
| Zamanlanmış görev (cron) | Belirli aralıkla bitmiş kampanyalar taranıp pasife alınır | Aralık kadar (5-15 dk) | Vitrin temizliği ve önbellek tazeleme |
| Olay tabanlı tetik | Kontenjan dolduğunda anında kapanır | Yok | Sınırlı stoklu kod kampanyaları |
| Karma (çözücü + cron + olay) | Karar anlık, temizlik periyodik, kontenjan olaysal | Pratikte sıfır | Ciddi hacimli her operasyon |
Cron mu, İstek Anında Değerlendirme mi? Cevap: İkisi de
Bu ikisi rakip değil, tamamlayıcıdır. İstek anında değerlendirme doğruluğu garanti eder: kimse bitmiş bir kampanyadan yararlanamaz, çünkü fiyat o anda hesaplanır. Zamanlanmış görev ise temizliği garanti eder: bitmiş kampanyaları pasife alır, ana sayfa bloklarını yeniler, önbelleği hedefli boşaltır, biten kampanyanın raporunu kapatır.
Zamanlanmış görevi kurarken iki şeye dikkat et. Birincisi, görevin yeniden çalıştırılabilir olması: aynı kampanyayı iki kez kapatmak hiçbir yan etki üretmemeli. İkincisi, çalıştığına dair kanıt bırakması. Sessiz çalışan bir görev, çalışmadığında da sessizdir. Her turda «şu kadar kampanya tarandı, şu kadarı kapatıldı» satırı yaz; böylece ölen bir görevi haftalar sonra değil aynı gün fark edersin.
Kampanya bitişi hatalarında zarar kalemlerinin dağılımı
- Geç kapanan indirimden kâr kaybı 40%
- Vitrin-sepet fiyat uyuşmazlığı & terk 30%
- Kontenjan aşımı ve stok düzeltmesi 20%
- Destek ve iade yükü 10%
Kapanış Sonrası Ne Olacak? Boşluk Bırakmayan Devir Planı
Kampanya bittiğinde ana sayfanda bir delik oluşur. Bu delik hem görsel hem psikolojiktir: dün «fırsat» olan yerde bugün boşluk vardır ve dönüşüm oranı düşer. Profesyonel operasyonlar bu yüzden kampanyayı kapatmaz, devreder. Biten kampanyanın yerine otomatik olarak bir sonraki teklif, «en çok satanlar» bloğu ya da sürekli geçerli bir avantaj (örneğin toplu alım kademesi) girer.
Bunu e-pin satış scripti tarafında kurmak için kampanyalara öncelik sırası ver ve «varsayılan vitrin» tanımla. Aktif kampanya yoksa varsayılan devreye girsin. Böylece unuttuğun bir hafta bile vitrinini boş bırakmaz. Ayrıca biten kampanyanın linkine gelen ziyaretçiyi 404'e düşürmek yerine ilgili kategoriye ya da güncel teklife yönlendir; hem arama motoru hem müşteri tarafında kazançlı çıkarsın.
Sepet, kullanıcının tarayıcısında saatlerce açık kalabilir. Ödeme başlatılırken fiyatı yeniden hesapla ve sepetteki tutarla uyuşmazsa kullanıcıya nazik bir uyarı göster. Bu tek kontrol, kampanya sonrası sömürünün büyük bölümünü kapatır.
Denetim İzi: «O İndirimi Açık Kim Bıraktı?» Sorusunun Cevabı
Tek kişilik bir operasyondaysan bu bölümü atlamak isteyebilirsin; atlama. Kampanya kayıtlarına kim ne zaman hangi alanı değiştirdi bilgisini yazmak, sorunu çözmenin değil tekrarını önlemenin yoludur. Bir bitiş tarihi elle uzatıldığında, bir kontenjan yükseltildiğinde, bir kampanya yeniden aktifleştirildiğinde bunun izi kalmalı.
Buna bir de ön izleme ekle: kampanya kaydedilmeden önce «şu ürünlerde şu fiyatlar oluşacak, en düşük marj yüzde şu» özeti göster. Marj eşiğinin altına düşen bir kalem varsa kaydı engelle. Bu tek doğrulama, yüzde 20 yerine yanlışlıkla yüzde 200 indirim girilen o klasik kazayı tarihe gömüyor. İyi bir dijital ürün satış yazılımının işi sana özgürlük vermek değil, pahalı hataları imkânsız kılmaktır.
| Kontrol | Nasıl test edilir | Beklenen sonuç | Durum |
|---|---|---|---|
| Bitiş saatinden 1 dk sonra fiyat | Sunucu saatini ileri alıp ürün kartı + sepet + ödeme özeti karşılaştır | Üç yüzeyde de liste fiyatı | Zorunlu |
| Eski sepetle ödeme | Kampanya bitmeden sepete ekle, bittikten sonra ödemeye geç | Fiyat güncellenir, kullanıcı bilgilendirilir | Zorunlu |
| Kontenjan sınırı | Kalan 2 adette eşzamanlı 5 sipariş dene | En fazla 2 sipariş geçer | Zorunlu |
| Vitrin temizliği | Bitişten 5 dk sonra ana sayfa & kategori tara | Banner, sayacı, etiket kalkmış | Yüksek |
| Önbellek tazeleme | Önbellekli sayfayı çerezsiz tarayıcıda aç | Güncel fiyat görünür | Yüksek |
| Zamanlanmış görev sağlığı | Son çalışma damgasını kontrol et | Son 15 dk içinde çalışmış | Yüksek |
| Devir planı | Tüm kampanyaları pasife al | Varsayılan vitrin devreye girer | Orta |
| Marj eşiği | Panelde açıkta zarar yazacak indirim gir | Kayıt engellenir | Orta |
Kampanyalarını kendi kendine kapanan bir sisteme devret
Pinova, kural tabanlı fiyat çözücüsü, kontenjan kilitleri ve zamanlanmış vitrin temizliğiyle kampanya bitişini senin hatırlamana bırakmaz. Özellik listesini ve lisans seçeneklerini incele.
Kampanya bitişi için cron kurmak zorunlu mu?
Doğruluk için zorunlu değil — fiyat her istekte kurala göre hesaplandığında bitmiş kampanya zaten uygulanmaz. Ama vitrin temizliği, önbellek tazeleme ve rapor kapanışı için zamanlanmış bir görev şiddetle önerilir.
Kontenjan dolarsa kampanya tarihinden önce kapanmalı mı?
Evet. Sınırlı kodlu kampanyalarda kontenjan birincil sınırdır. Eşzamanlı siparişlerde aşım yaşamamak için stok düşümü sipariş kaydıyla aynı işlemde ve kilitli yapılmalıdır.
Sepetteki eski indirimli fiyatı müşteriye vermek daha mı iyi?
Kısa vadede jest gibi görünür, uzun vadede istismara açık kapı bırakır. Doğrusu ödeme anında yeniden hesaplamak ve fark oluştuysa şeffaf bir uyarı göstermektir. İstersen dar bir tolerans süresi tanımlayabilirsin.
Saat dilimi karmaşasını en hızlı nasıl çözerim?
Tüm damgaları UTC sakla, arayyüzde yerel dilime çevir, panelde hangi dilime göre giriş yapıldığını yaz ve bitiş saatlerini gece yarısına hizala. Bu dört adım vakalarin neredeyse tamamını kapatır.
Kampanya yönetimi, disiplinden çok mimari ister: doğru kurulmuş bir sistemde kapanışı hatırlamak zorunda kalmazsın, çünkü sistem zaten hatırlar. Bu zincirin gerçekten nasıl çalıştığını kendi elinle görmek istersen canlı demo üzerinden bir kampanya kur, bitiş saatini beş dakika sonrasına al ve fiyatın üç yüzeyde birden nasıl düzeldiğini izle — anlatılan her şeyi tek oturumda test edebilirsin.

