SenderTR Dokümantasyon

Aramanızla eşleşen başlık bulunamadı.

SenderTR Dokümantasyon

Türkiye'nin inbox-odaklı, KVKK uyumlu e-posta pazarlama platformu. Bu rehber, panelin her özelliğini ve REST API entegrasyonunu adım adım, eksiksiz anlatır — aradığınız her sorunun yanıtı burada.

Yeni misiniz? Hızlı Başlangıç ile 7 adımda ilk kampanyanızı gönderin. Geliştiriciyseniz doğrudan API Genel Bakış bölümüne geçebilirsiniz.

Bu dokümantasyonda neler var?

Temel kavramlar

KavramAçıklama
KrediGönderilen her e-posta 1 kredi düşer. Krediler süresizdir (aylık abonelik yoktur). Kayıtta 1.000 kredi hediye.
KampanyaBir listeye/segmente tek seferlik toplu gönderim. Sender Contract onayından geçer.
OtomasyonTetikleyiciye bağlı, sürekli çalışan otomatik e-posta akışı (hoşgeldin, doğum günü vb.).
ListeKişilerin sabit (statik) grubu.
SegmentKurallara göre dinamik kişi grubu (her çalıştığında yeniden hesaplanır).
TransactionalSipariş onayı, şifre sıfırlama gibi işlemsel e-postalar (API/SMTP ile).
Gönderim DomainiAdınıza e-posta gönderdiğimiz, SPF/DKIM/DMARC ile doğrulanmış alan adı.
SuppressionBir daha gönderim yapılmayacak adreslerin kalıcı kara listesi.

Platform adresleri

AdresNe için
app.sendertr.comPanel (giriş, kampanya, raporlar)
api.sendertr.com/v1REST API temel adresi
smtp.sendertr.com:587SMTP relay (STARTTLS)
docs.sendertr.comBu dokümantasyon
Arama: Sol üstteki arama kutusuna yazarak (ör. "DKIM", "webhook imza", "kota uyarısı") ilgili bölümü anında bulabilirsiniz.

Hızlı Başlangıç

Hesap açmaktan ilk kampanyanızın gelen kutusuna düşmesine kadar 7 adımlık eksiksiz başlangıç rehberi. Her adımı tamamladığınızda bir sonrakine geçin; sıralamayı atlamamanız teslim edilebilirliğinizi doğrudan etkiler.

Onboarding — 7 adım

  1. Hesabınızı oluşturun ve doğrulayın. app.sendertr.com/register üzerinden kaydolun. Kayıt sırasında KVKK aydınlatma metni onayı zorunludur. Ardından e-posta adresinize gönderilen doğrulama linki veya 6 haneli kod ile hesabınızı doğrulayın. Doğrulanmamış hesaplar kampanya gönderemez; giriş yaparken doğrulama maili otomatik (5 dk'da bir) yeniden gönderilir.
  2. Şirket bilgilerinizi tamamlayın. Ayarlar → Şirket Bilgileri'nden firma tipinizi seçin (tacir veya esnaf). 6563 Sayılı Kanun gereği tacirler için MERSİS numarası + ticaret unvanı, esnaflar için T.C. Kimlik No + ad soyad zorunludur. Ayrıca en az bir iletişim kanalı (e-posta veya telefon) girilmelidir. Bu bilgiler kampanya footer'ına otomatik eklenir; eksikse kampanya oluşturma ekranında amber renkli bir uyarı görürsünüz.
  3. Gönderim domaininizi ekleyip doğrulayın. Ayarlar → Domainler → "Domain Ekle". Sistem size SPF, DKIM (2048-bit) ve DMARC kayıtlarını üretir. Bu üç TXT kaydını alan adınızın DNS panelinde oluşturun, sonra "Doğrula"ya basın. Domain sağlık skoru 70+ olduğunda yeşile döner.
  4. Kredinizi kontrol edin. Gönderilen her e-posta 1 kredi düşer. Bakiyeniz alıcı sayısından azsa kampanya otomatik olarak paused (duraklatılmış) duruma geçer. Krediler → Paket Satın Al menüsünden PayTR ile kredi ekleyebilirsiniz.
  5. Kişilerinizi yükleyin. Kişiler → İçe Aktar ile CSV/Excel dosyanızı yükleyin (e-posta kolonu eşlemesi zorunlu) veya tek tek ekleyin. İçe aktarma sırasında otomatik e-posta doğrulaması (MX + SMTP + disposable/rol tespiti) çalışır.
  6. Şablonunuzu hazırlayın. Şablonlar → Yeni Şablon ile sürükle-bırak editörde (EmailBuilder.js) tasarımınızı yapın veya HTML modunda kendi kodunuzu kullanın. {{first_name}} gibi merge tag'lerle kişiselleştirin.
  7. Kampanyanızı oluşturup onaya gönderin. Kampanyalar → Yeni Kampanya: gönderici, alıcı, konu, içerik ve zamanlamayı belirleyin. "Onaya Gönder" dediğinizde Sender Contract ön kontrolü (preflight) çalışır; tüm zorunlu maddeler geçerse kampanya gönderim akışına girer.
İpucu: İlk gönderiminizden önce kampanya formundaki DNS Kontrol ve Spam Skor Kontrol butonlarını mutlaka kullanın. DNS sağlık skoru yeşil (80+) ve spam skoru yüksek (80+) olduğunda gelen kutusuna ulaşma oranınız belirgin şekilde artar.
Sık karşılaşılan ilk gönderim engelleri: domain doğrulanmamış (sağlık skoru düşük), kredi bakiyesi alıcı sayısından az, şirket yasal bilgileri eksik (MERSİS/T.C. Kimlik), içerikte abonelikten çıkma linki yok. Bu maddeleri önceden tamamlarsanız onay anında sorun yaşamazsınız.

İlk gönderimde nelere dikkat edin?

KontrolNeden önemliNerede
SPF/DKIM/DMARC geçerliKimlik doğrulaması olmayan e-posta spam'e düşerAyarlar → Domainler / kampanyada "DNS Kontrol"
Liste hijyeniBounce > %5 veya şikayet > %0,3 itibarınızı düşürürKişiler → Liste Temizleme
Spam skoruRiskli içerik gelen kutusu yerleşimini düşürürKampanya → "Spam Skor Kontrol"
Yasal footer6563 s. Kanun zorunluluğuAyarlar → Şirket Bilgileri

Kampanyalar

Bir liste veya segmente tek seferlik toplu e-posta gönderimi. Her kampanya, gönderim öncesi otomatik bir kalite ve uyum denetiminden (Sender Contract) geçer. Bu bölümde formun her alanını, durum makinesini, AI yardımcılarını, preflight kontrollerini, spam analizini ve dinamik içerik bloklarını ayrıntısıyla bulacaksınız.

Adım adım kampanya oluşturma

Kampanya formu 6 mantıksal bölümden oluşur. Aşağıda her alanın ne işe yaradığı ve hangi kuralların geçerli olduğu açıklanmıştır.

Bölüm 1 — Gönderici Bilgileri

AlanZorunluAçıklama & Kurallar
Kampanya AdıEvetYalnızca sizin gördüğünüz dahili isim (alıcılar görmez). Maks. 255 karakter. Ör: "Şubat Bülteni".
Gönderim DomainiEvetE-postanın hangi doğrulanmış alan adından gideceği. Açılır listede domainler sağlık skoruna göre sıralı görünür. Doğrulanmamış domainler de listede görünür ancak yanlarında uyarı taşır. Yanındaki DNS Kontrol butonu canlı SPF/DKIM/DMARC sağlık kontrolü yapar.
From E-postaEvetYalnızca yerel kısmı (ör. bilgi) yazmanız yeterlidir; @alanadi.com seçili domainden otomatik eklenir. Tam adres yazarsanız (bilgi@alanadi.com) olduğu gibi kullanılır.
Gönderen AdıEvetAlıcının gelen kutusunda gördüğü isim. Yalnızca harf, rakam, boşluk, nokta, tire ve alt çizgi kabul edilir (regex:/^[\p{L}\p{N}\s.\-_]+$/u). Maks. 100 karakter.
Reply-ToHayırYanıtların gideceği adres. Yalnızca seçili gönderim domaini ile aynı uzantıda olabilir; farklı domain girerseniz "Reply-To adresi yalnızca @domain uzantısıyla kullanılabilir" hatası alırsınız. Bu hem frontend hem backend'de doğrulanır.

Bölüm 2 — Alıcılar

  • Liste: Önceden oluşturulmuş statik kişi grubu. Seçtiğinizde segment seçimi temizlenir. Alıcı sayısı listenin member_count değerinden gelir.
  • Segment: Kurallara göre dinamik kişi grubu (alternatif). Seçtiğinizde liste seçimi temizlenir. Tahmini sayı segmentin estimated_count değeridir.
  • Mesaj Türü: marketing (Pazarlama) veya transactional (İşlemsel). Bu seçim suppression kurallarını belirler — aşağıdaki tabloya bakın.
Mesaj türü neden önemli? Pazarlama kampanyalarında abonelikten çıkmış (unsubscribe) kişiler dahil tüm suppression nedenleri bloke edilir. İşlemsel mesajlarda ise yalnızca hard_bounce, complaint ve manual nedenleri bloke edilir; abonelikten çıkış serbesttir (çünkü işlemsel mailler izinden bağımsızdır).

Bölüm 3 — Konu

  • Konu Satırı: Zorunlu, maks. 255 karakter. Yanındaki AI Öner butonu yapay zeka ile alternatif konu satırları üretir (aşağıda detay).
  • Ön İzleme Metni (preview text): Opsiyonel. Gelen kutusunda konu satırının yanında/altında görünen kısa açıklama. Karakter sayacı 0/255 olarak gösterilir. Teknik olarak kampanyanın settings.preview_text alanında saklanır.

Bölüm 4 — İçerik

  • Şablon Seçin: Daha önce oluşturduğunuz bir şablonu kampanyaya bağlar. "Yeni şablon oluştur" linki yeni sekmede açılır, böylece doldurduğunuz kampanya formu kaybolmaz.
  • AI ile İçerik Oluştur: Bir brief ve ton (profesyonel/rahat/samimi/acil) girerek e-posta gövdesi ürettirebilirsiniz.
Otomatik tracking: Gönderim sırasında açılma takip pikseli, tıklama takibi için link dönüştürme ve (şablonda yoksa) abonelikten çıkış linki otomatik eklenir. Bunları manuel eklemeniz gerekmez.

Bölüm 5 — Zamanlama

"Onay sonrası hemen gönder" veya "İleri tarih" seçeneği. Akıllı Gönderim Zamanı (STO) ve "En İyi Zaman" AI önerisi de bu bölümdedir — detaylar Gönderim & Zamanlama bölümünde.

Bölüm 6 — Dinamik İçerik Blokları

Aynı kampanyada farklı segmentlere farklı içerik göstermenizi sağlar (aşağıda ayrı başlık).

Kaydetme ve gönderim

Formun altında üç eylem vardır:

  • Spam Skor Kontrol: Gönderim yapmadan içeriğinizin spam riskini analiz eder (konu zorunlu).
  • Taslak Olarak Kaydet: Kampanyayı draft durumunda kaydeder, istediğiniz zaman düzenlersiniz.
  • Onaya Gönder: Sender Contract preflight kontrolü çalışır; geçerse kampanya submitted durumuna geçer.

Durum makinesi (state machine)

Kampanya yaşam döngüsü katı bir durum makinesiyle yönetilir. Geçersiz geçiş denenirse sistem hata fırlatır.

DurumEtiketİzin verilen sonraki durumlar
draftTaslaksubmitted, cancelled
submittedGönderildi (onay bekliyor)under_review, approved, rejected
under_reviewİnceleniyorapproved, rejected
approvedOnaylandıscheduled, queued
rejectedReddedildidraft (düzeltip yeniden gönderme)
scheduledZamanlandıqueued, cancelled
queuedKuyruktasending, cancelled
sendingGönderiliyorpaused, stopped, completed
pausedDuraklatıldısending, stopped
stoppedDurduruldu— (son durum)
completedTamamlandı— (son durum)
cancelledİptal Edildi— (son durum)
Düzenleme kuralı: Yalnızca draft ve rejected durumundaki kampanyalar düzenlenebilir. Yalnızca draft kampanyalar silinebilir. Reddedilen bir kampanyayı düzeltip yeniden onaya gönderebilirsiniz.

AI konu satırı önerisi

Konu alanının yanındaki AI Öner butonu, kampanya adı ve ön izleme metnini bağlam olarak kullanır. Arka planda OpenAI gpt-4o-mini modeline "e-posta pazarlama uzmanı" rolüyle istek gider ve Türkçe, dikkat çekici 5 alternatif konu satırı üretilir (temperature 0.8). Açılan listeden bir öneriye tıklayarak konu alanını doldurursunuz.

Yapılandırma gereği: AI özellikleri yalnızca platformda OPENAI_API_KEY tanımlıysa çalışır. Tanımlı değilse "AI servisi yapılandırılmamış" mesajı döner; kampanya yine de manuel oluşturulabilir.

Sender Contract — gönderim öncesi preflight kontrolü

"Onaya Gönder" dediğinizde SenderContractService bir dizi otomatik kontrol çalıştırır. Sonuçlar üç seviyede döner: pass (geçti), warning (uyarı, gönderimi engellemez) ve fail (başarısız, gönderimi engeller). Tek bir "fail" bile varsa kampanya onaya gönderilemez.

#KontrolGeçme koşuluBaşarısızlık seviyesi
1SPF hizalama (spf_alignment)Domain SPF durumu = passfail
2DKIM hizalama (dkim_alignment)Domain DKIM durumu = passfail
3DMARC politikası (dmarc_policy)Domain DMARC durumu = passfail
4Geçerli From adresi (from_valid)From e-postası geçerli formatfail
5Konu mevcut (subject_present)Konu satırı boş değilfail
6İçerik mevcut (content_present)HTML içerik boş değilfail
7Abonelikten çıkış linki (unsubscribe_link)İçerikte {{unsubscribe_url}} veya "unsubscribe" geçiyorwarning
8Alıcı mevcut (recipients_exist)Toplam alıcı sayısı > 0fail
9Domain sağlığı (domain_health)Skor ≥ 70 pass; 40–69 warning; < 40 failfail / warning
10Canlı DNS sağlığı (dns_health)Kritik hata yok ve skor ≥ 80 pass; 50–79 warning; < 50 failfail / warning

Toplam 10 kontrol çalışır. Her kontrolün sonucu sender_contract_checks tablosuna kaydedilir. Bir kampanya başarısız maddeler içeriyorsa, hangi maddelerin geçemediği hata mesajında listelenir.

Spam skoru analizi

SpamScoreService içeriğinizi 100 puandan başlatıp her riskli bulgu için puan düşer (sonuç en az 0'da tutulur). Yüksek puan = iyi. Konu, HTML içerik, From adresi, Reply-To ve düz metin alternatifi analiz edilir. Aşağıda kontrol edilen tüm maddeler ve maksimum ceza puanları yer alır:

KontrolMaks. cezaAçıklama
Konuda spam kelime−20"ücretsiz", "kazan", "free", "buy now" vb. (kelime başına −5)
İçerikte spam kelime−152'den fazlasında ceza (kelime başına −3)
Konuda BÜYÜK HARF oranı−10Harflerin %50'den fazlası büyükse
Aşırı noktalama (!!! ???)−10Ardışık ünlem/soru işareti
Konu uzunluğu−10İdeal 40–60 karakter; çok kısa −10, çok uzun −5
Görsel/metin oranı−10Çok görsel, az metin
Link sayısı−1015+ link −10, 10+ link −5
Abonelikten çıkma linki−10Yoksa ceza (yasal zorunluluk)
Ücretsiz sağlayıcı From−10gmail/yahoo/hotmail vb. ile gönderim
HTML boyutu−10100 KB+ −10 (Gmail kırpar), 50 KB+ −5
Gizli metin−20display:none, visibility:hidden, font-size:0
Konuda ünlem işareti−152'den fazla ünlem
Gönderen domain uyumu−5İçerik linkleri From domaininden farklı
URL kısaltıcı−20bit.ly, tinyurl vb. (her biri −10)
Metin/HTML oranı−15%10 altı −15, %20 altı −5
Yanıltıcı ön ek (RE:/FW:)−15Sahte yanıt/iletme ön eki
Panik/aciliyet dili−10"hesabınız kapatılacak" vb. phishing kalıpları
JavaScript içerik−20<script> etiketi (mailde çalışmaz, ciddi ceza)
Form elementi−10<form> güvenlik riski
Fiziksel adres bilgisi−5Yoksa ceza (CAN-SPAM/KVKK)
Konuda emoji−103'ten fazla emoji
Gövdede büyük harf oranı−8%50+ −8, %35+ −5, %20+ −2
URL yoğunluğu−10Kelime başına çok link
Sadece görsel maili−12Görsel var, metin < 30 karakter
Reply-To uyumu−8Reply-To ve From farklı domainlerde
Çoklu parça (text alternatif)−5Sadece HTML, düz metin alternatifi yok

Her kontrol için panelde mesaj ve (başarısızsa) bir öneri görüntülenir. Skor renk kodludur: 80+ yeşil, 60–79 amber, < 60 kırmızı.

Dinamik içerik blokları

Aynı kampanyada farklı segmentlere farklı içerik göstermenizi sağlar. Her blok bir blok adı, bir koşul türü (varsayılan / segmente göre) ve HTML içerik taşır.

  1. "Dinamik Blok Ekle" ile yeni blok oluşturun ve bir ad verin (ör. hero, promo, footer).
  2. Koşul türünü seçin: Varsayılan (herkese) veya Segmente göre (yalnızca seçili segmente).
  3. Bloğun HTML içeriğini girin.
  4. Şablonunuza yer tutucuyu ekleyin. Blok adı girildiğinde panel size kopyalanabilir bir etiket gösterir, ör: {{block:hero}}.
Güvenlik & saklama: Bloklar kaydedilirken segment yalnızca kendi hesabınıza aitse kabul edilir. Bloklar dynamic_content_blocks tablosunda priority sırasıyla saklanır ve düzenlemede sil-yeniden oluştur mantığıyla güncellenir.

Açmayanlara tekrar gönderim (Resend to non-openers)

Tamamlanmış (veya gönderimi süren) bir kampanyada e-postayı açmamış kişilere yeni bir kampanya oluşturabilirsiniz.

  1. Kampanya detayında "Açmayanlara Tekrar Gönder" eylemini seçin.
  2. Sistem teslim edilmiş ancak açılmamış (delivered + opened_at boş) alıcıları bulur.
  3. [Tekrar] Kampanya Adı şeklinde, yalnızca bu kişileri hedefleyen yeni bir taslak kampanya oluşturulur.
  4. Genellikle konu satırını değiştirip onaya gönderirsiniz.

Kampanya kopyalama ve audit

  • Kopyala: Mevcut bir kampanyanın ayarlarını "(Kopya)" adıyla yeni bir taslağa aktarır (durum/zamanlama/sayaçlar sıfırlanır).
  • Gönderim Karar Logu (Audit): /campaigns/{id}/audit — her alıcı için verilen gönderim kararını ve sebebini gösterir (gönderildi, suppression, vb.). CSV olarak dışa aktarılabilir. 6563 s. Kanun kapsamında ispatlanabilir iz sağlar.

Sık karşılaşılan sorunlar

SorunSebepÇözüm
"Sender Contract kontrolünden geçemeyen maddeler var"SPF/DKIM/DMARC pass değil, içerik/konu boş veya alıcı yokHata mesajındaki maddeleri düzeltin; domaini doğrulayın
Kampanya paused olduKredi bakiyesi alıcı sayısından azKrediler → Paket Satın Al ile bakiye ekleyin
Domain seçilemiyor / uyarılıDomain doğrulanmamış (düşük sağlık skoru)Ayarlar → Domainler'den DNS kayıtlarını doğrulayın
Reply-To kabul edilmiyorReply-To, gönderim domaininden farklı uzantıdaReply-To'yu @gönderimdomaini uzantısıyla girin
Kampanya suspend tenant'ta durduHesap (tenant) aktif değilHesap durumunu destek ile netleştirin
Yasal footer uyarısı (amber banner)MERSİS/T.C. Kimlik veya iletişim bilgisi eksikAyarlar → Şirket Bilgileri'ni tamamlayın

Şablonlar

Tekrar kullanılabilir e-posta tasarımları. Kod bilmeden sürükle-bırak editörle (EmailBuilder.js) profesyonel maillere ulaşır, dilerseniz HTML çıktısını inceler ve şablonu kampanyalarınıza bağlarsınız.

Şablon oluşturma

  1. Şablonlar → Yeni Şablon ile editörü açın.
  2. Üstteki araç çubuğundan şablon adı (zorunlu) ve isteğe bağlı bir klasör girin. Klasörler şablonları gruplamak için kullanılır.
  3. Görsel editörde blokları (metin, görsel, buton, ayraç vb.) tuvale sürükleyin.
  4. İçeriği merge tag'lerle kişiselleştirin (aşağıda).
  5. Kaydet'e basın. Editör tasarımı hem yapısal JSON (design_json) hem render edilmiş HTML (html_content) olarak saklar.
Otomatik kayıt: Mevcut bir şablonu düzenlerken editör her 60 saniyede bir tasarımınızı arka planda otomatik kaydeder. Bağlantı koparsa son otomatik kayıttan devam edebilirsiniz.

EmailBuilder.js sürükle-bırak editörü

Editör, panelin içine güvenli bir iframe olarak gömülen, self-hosted (kendi sunucumuzda barındırılan) bir React mini-uygulamasıdır (/email-editor/). Vue paneli ile editör arasında postMessage ile haberleşilir ve her mesaj window.location.origin ile doğrulanır (güvenlik). Editör yüklendiğinde "Editör yükleniyor..." göstergesi kaybolur ve tasarıma başlayabilirsiniz.

Görsel ve HTML modu

ModNe yapar
GörselSürükle-bırak tasarım arayüzü. Asıl çalışma alanı burasıdır.
HTMLTasarımın ürettiği HTML çıktısını salt okunur gösterir. Çıktıyı inceleyip kopyalayabilirsiniz; bu modda doğrudan düzenleme yapılmaz.

Merge tag'ler (kişiselleştirme)

Araç çubuğundaki Değişken menüsünden bir etiketi seçtiğinizde panoya kopyalanır; editördeki metin bloğuna yapıştırırsınız. Gönderim sırasında her etiket ilgili kişinin verisiyle değiştirilir.

EtiketKarşılığı
{{first_name}}Kişinin adı
{{last_name}}Kişinin soyadı
{{email}}E-posta adresi
{{city}}Şehir
{{company_name}}Şirket adı
{{unsubscribe_url}}Abonelikten çıkış bağlantısı
{{block:ad}}Dinamik içerik bloğu yer tutucusu (kampanyada tanımlanır)
Abonelikten çıkış: Şablonunuzda {{unsubscribe_url}} kullanmanız önerilir. Eklemeyi unutursanız bile sistem gönderim sırasında abonelikten çıkış linkini ve yasal footer'ı otomatik ekler.

Görsel kütüphanesi

  1. Araç çubuğunda Görsel butonuna basın.
  2. "Görsel Yükle" ile dosya seçin (maks. 5 MB; jpg/png/gif/webp/svg). Görseller tenant izolasyonlu CDN'de saklanır.
  3. Yüklediğiniz görsele tıklayınca URL'si panoya kopyalanır; editördeki Image bloğunun URL alanına yapıştırın.

Şablonu kampanyaya bağlama

Kampanya oluşturma formunda Bölüm 4 — İçerik → Şablon Seçin menüsünden şablonunuzu seçin. Aynı bölümdeki "yeni şablon oluştur" linki yeni sekmede açılır; böylece kampanya formunuz kaybolmadan şablon hazırlayıp geri dönebilirsiniz.

A/B Testi

İki farklı konu satırını gerçek alıcılar üzerinde test edin; sistem istatistiksel olarak kazanan varyantı belirleyip kalan alıcılara otomatik göndersin.

Ne test edilir?

SenderTR A/B testi konu satırını test eder. Varyant A, kampanyada girdiğiniz ana konu satırıdır; Varyant B ise alternatif konu satırıdır. Diğer tüm alanlar (gönderici, içerik, alıcı) aynı kalır — böylece performans farkı net biçimde konu satırına bağlanır.

Kurulum

  1. Kampanya formunda A/B Testi bölümündeki anahtarı açın.
  2. Varyant B — Konu Satırı alanına alternatif konuyu girin (zorunlu). Varyant A salt okunur olarak ana konu satırını gösterir.
  3. Test Yüzdesi kaydırıcısıyla test grubunun büyüklüğünü seçin (%10–%50, varsayılan %20). Bu yüzdenin yarısı A, yarısı B alır.
  4. Kazanan Kriteri seçin: Açılma Oranı (open_rate) veya Tıklama Oranı (click_rate).
Nasıl işler: Alıcıların seçtiğiniz yüzdesine (yarısı A, yarısı B konusuyla) test e-postası gönderilir. Bir süre sonra kazanan kriterine göre üstün varyant belirlenir ve kalan alıcılara kazanan varyant otomatik olarak gönderilir.

Kazanan nasıl belirlenir?

ABTestService her iki varyantın seçtiğiniz kritere göre skorunu hesaplar (açılma veya tıklama oranı) ve yüksek olanı kazanan ilan eder. Eşitlikte Varyant A öncelik kazanır. Kazanan kampanya, henüz mail almamış kalan alıcılar için kuyruğa alınır.

İstatistiksel anlamlılık (z-test)

Detaylı A/B raporunda iki oran arasındaki fark, iki oranlı z-testi ile değerlendirilir. Sistem bir güven düzeyi (confidence) yüzdesi üretir ve bu değer %95'e ulaşırsa sonucu "istatistiksel olarak anlamlı" (significant: true) işaretler.

Yaklaşık z → güven düzeyi dönüşümü:

z değeri~Güven düzeyi
1.28%90
1.645%95 (anlamlılık eşiği)
1.96%97,5
2.33%99
2.58%99,5
≥ 3.3%99,9

Detaylı rapor her varyant için şu metrikleri içerir: gönderilen, teslim edilen, açılma, tıklama, bounce sayıları ile açılma/tıklama/bounce oranları.

Önemli: Güven düzeyi düşükse (örneğin test grubu küçük veya farklar küçükse) sonuç "anlamlı değil" olarak işaretlenir. Bu durumda kazananı temkinli değerlendirin; tek seferlik küçük bir fark her zaman gerçek bir üstünlük anlamına gelmez.

Düzenleme davranışı

  • A/B testini açıp düzenlerseniz, mevcut Varyant B güncellenir; yoksa yeni oluşturulur.
  • A/B testini kapatırsanız, henüz gönderilmemiş (taslak) Varyant B silinir ve kampanya tekli gönderime döner.

Gönderim & Zamanlama

Kampanyanızı onay sonrası hemen, ileri bir tarihte veya her kişiye en uygun saatte (STO) gönderebilirsiniz. Bu bölüm üç gönderim modunu ve yapay zeka destekli saat önerisini açıklar.

Gönderim modları

ModAçıklama
Onay sonrası hemen gönderKampanya onaylandığı anda gönderim kuyruğuna alınır. Form gönderiminde scheduled_at boş bırakılır.
İleri tarih (zamanlanmış)Bir tarih-saat seçersiniz. Değer gelecekte olmalıdır (after:now doğrulaması). Saat dilimi: Europe/Istanbul.
Akıllı Gönderim Zamanı (STO)Her kişiye, geçmiş davranışına göre en uygun saatte gönderim yapılır (aşağıda).

Send Time Optimization (STO) — Akıllı Gönderim Zamanı

Zamanlama bölümündeki Akıllı Gönderim Zamanı (STO) kutusunu işaretlerseniz, sistem her alıcıya kişiye özel en iyi saatte göndermeye çalışır. Bu tercih kampanyanın settings.use_sto alanında saklanır.

STO en iyi saati nasıl bulur?

SendTimeOptimizationService her kişi için şu hesaplamayı yapar:

  1. Son 90 günlük açılmaları toplar. Kişinin geçmiş e-posta açılma kayıtları (opened_at) incelenir.
  2. Saat dilimine çevirir. UTC değerleri Türkiye saatine (+03:00) dönüştürülür, ardından saat bazında gruplanır.
  3. En çok açılan saati seçer. Kişinin en yüksek açılma sayısına sahip saati contacts.best_send_hour alanına yazılır.
  4. Veri yoksa atlar. Hiç açılma kaydı olmayan kişiler için değer boş bırakılır ve genel kampanya saati kullanılır.
Güncelleme sıklığı: best_send_hour değerleri her hafta Pazar günü (etkileşim hesabının ardından) otomatik olarak yeniden hesaplanır. Yani STO, alıcılarınız davrandıkça giderek isabetlenir.

"En İyi Zaman" AI önerisi

Zamanlama bölümündeki En İyi Zaman butonu, hesabınızın genel açılma davranışına bakarak en iyi gönderim saatlerini önerir (kişi bazlı STO'dan farklı olarak, tüm hesap için toplu öneri).

  • Son 90 günlük açılmalar saat bazında gruplanır ve en çok açılma alan ilk 3 saat önerilir (açılma sayısıyla birlikte).
  • Hiç açılma verisi yoksa genel öneri olarak 10:00, 14:00 ve 20:00 sunulur ("Genel öneri" notuyla).
  • Bir saate tıklayınca kampanya, bugünün tarihiyle o saate zamanlanır ve mod otomatik "İleri tarih"e geçer.

Hangisini seçmeliyim?

DurumÖnerilen
Zaman duyarlı duyuru (ör. flaş indirim başlangıcı)Hemen gönder
Belirli bir kampanya tarihi/etkinlik saatiİleri tarih + (gerekiyorsa) En İyi Zaman önerisi
Açılma oranını maksimize etmekSTO (Akıllı Gönderim Zamanı)
Yeni hesap / az açılma verisiİleri tarih + genel öneri saatleri (10/14/20)
İpucu: STO ile A/B testini birlikte kullanmak güçlüdür: önce kazanan konu satırını belirleyip, ardından kalan alıcılara herkesin en aktif olduğu saatte göndererek hem ilgi hem zamanlamayı optimize edersiniz.

Kişiler (Contacts)

Kişi, gönderim yaptığınız her bir e-posta adresinin platformdaki kaydıdır. Tek tek ekleyebilir, dosyadan içe aktarabilir, listelere bağlayabilir ve her birinin etkileşim geçmişini zaman çizelgesiyle takip edebilirsiniz. Kişiler tenant bazında izoledir — başka bir hesabın kişilerine erişilemez.

Kişi Alanları

Bir kişide tutulan alanlar ve doğrulama kuralları aşağıdadır. Yalnızca e-posta zorunludur; diğer tüm alanlar isteğe bağlıdır.

AlanKolonKural / SınırAçıklama
E-postaemailZorunlu, geçerli e-posta, max 255Tenant içinde benzersizdir (tenant_id + email unique). Aynı e-posta tekrar eklenirse mevcut kayıt güncellenir.
Adfirst_nameİsteğe bağlı, max 100Kişiselleştirme değişkenlerinde kullanılır.
Soyadlast_nameİsteğe bağlı, max 100
Telefonphoneİsteğe bağlı, max 20
Şehircityİsteğe bağlı, max 100
Özel Alanlarcustom_fieldsİsteğe bağlı, JSONAnahtar-değer şeklinde dilediğiniz ek veriyi saklar (ör. plan, dogum_tarihi).
Liste Üyeliklerilist_ids[]İsteğe bağlı diziYalnızca kendi tenant'ınıza ait listelere bağlanabilir (cross-tenant koruması vardır).
DurumstatusenumAşağıdaki "Kişi Durumu" tablosuna bakın.
KaynaksourceotomatikManuel ekleme, import, whitelist, form vb.
Etkileşim Puanıengagement_score0–100Otomatik hesaplanır (aşağıya bakın).
Doğrulama Durumuverification_statusenumDoğrulama bölümüne bakın (pending/valid/invalid/risky/disposable/role/unknown).
Doğrulama Skoruverification_score0–100Son doğrulamanın güven puanı.
Son Açılmalast_open_attarihSegmentleme ve liste temizlemede kullanılır.
Son Tıklamalast_click_attarih

Tek Tek Kişi Ekleme

  1. Kişiler → Yeni Kişi sayfasını açın.
  2. E-posta adresini girin (zorunlu). İsterseniz ad, soyad, telefon ve şehir ekleyin.
  3. İsterseniz özel alanlar tanımlayın (anahtar/değer).
  4. Kişiyi bir veya birden fazla listeye bağlayın (yalnızca kendi listeleriniz görünür).
  5. Kaydet'e basın. E-posta daha önce kayıtlıysa yeni kayıt oluşturulmaz; mevcut kişinin bilgileri güncellenir ve "Bu e-posta zaten kayıtlıydı, bilgiler güncellendi." mesajı görünür.
Tekilleştirme (upsert): Kişi ekleme updateOrCreate ile çalışır. Aynı e-posta tenant içinde yalnızca bir kez bulunabilir; tekrar girişler çakışma yaratmaz, mevcut kaydı günceller.
Suppression denetimi: Engellenmiş (suppression listesindeki) bir e-posta tekrar eklenir veya bir listeye dahil edilirse, sistem bunu denetim kaydına (readded_after_suppression) işler. Bu, yasak listedeki bir kişinin yeniden eklenme girişimini kanıtlanabilir biçimde tutmak içindir. Ekleme engellenmez ama gönderim aşamasında suppression kuralları uygulanır.

Kişi Durumu (status)

Her kişinin gönderilebilirliğini belirleyen bir durumu vardır:

DurumAnlamıGönderim
activeGeçerli, gönderime açık kişi.Evet
unsubscribedAbonelikten çıkmış.Pazarlamada hayır (suppression).
bouncedGeri dönen (kalıcı hata) adres.Hayır
complainedSpam şikâyetinde bulunmuş.Hayır
suppressedListe temizleme / geçersiz doğrulama ile pasifleştirilmiş.Hayır
İpucu: Kişiler ekranında durum ve doğrulama durumuna göre filtreleyebilir, arama yapabilirsiniz. Üst kısımdaki sayaçlar toplam, aktif, abonelikten çıkan ve bounce eden kişi sayısını gösterir.

Etkileşim Puanı (0–100)

Her aktif kişi için son 90 günlük davranışa göre otomatik bir etkileşim puanı hesaplanır. Hesaplama engagement:calculate komutu ile periyodik olarak çalışır ve contact_engagement tablosuna yazılır.

Ham puan şu formülle hesaplanır, ardından 0–100 aralığına sıkıştırılır:

rawScore = (açılma_90g × 3) + (tıklama_90g × 5)
         - (bounce × 10) - (şikayet × 20)

score = max(0, min(100, rawScore))
SinyalEtkiAçıklama
Açılma (90 gün)+3 / açılmaPozitif etkileşim
Tıklama (90 gün)+5 / tıklamaEn güçlü pozitif sinyal
Bounce (hard/soft)−10 / bounceTeslim sorunu
Şikâyet (complaint)−20 / şikâyetEn ağır negatif sinyal

Ayrıca her kişi için son açılma/tıklama tarihleri, alınan kampanya sayısı ve 90 günlük toplam açılma/tıklama değerleri saklanır. Bu veriler segmentleme ve liste temizlemede kullanılır.

Kişi Zaman Çizelgesi (Customer Journey Timeline)

Bir kişinin detay sayfasında, o kişiyle ilgili tüm olaylar tek bir dikey zaman çizelgesinde, en yeniden eskiye doğru sıralanır. Kaynaklar:

  • Eklenme: Kişinin sisteme giriş tarihi ve kaynağı (Manuel, import vb.).
  • Doğrulama: verified_at + sonucu (geçerli, geçersiz, riskli, tek kullanımlık, spam tuzağı, catch-all, rol) ve skoru.
  • Mesaj olayları (son 100): gönderildi, teslim edildi, açıldı, link tıklandı, hard/soft bounce, spam şikâyeti — her biri ilgili kampanya adıyla.
  • Denetim (audit) olayları: eklendi, listeye eklendi, suppression eklendi, abonelikten çıkış, suppression sonrası yeniden ekleme, yönetici ile engel kaldırma.
  • Suppression kaydı: Engelleme varsa oluşma anı ve sebebi.
Neden önemli? Zaman çizelgesi, bir kişiyle olan tüm geçmişi (KVKK/6563 uyumu için ispatlanabilir iz dâhil) tek ekranda gösterir. Destek ve uyum sorularını kişi bazında yanıtlamayı kolaylaştırır.

Kişileri Silme ve Dışa Aktarma

  • Tekli/Toplu silme: Bir veya birden fazla kişiyi silebilirsiniz. Toplu silme yalnızca kendi tenant'ınızın kişilerini hedefler.
  • CSV dışa aktarma: Tüm kişileri (e-posta, ad, soyad, telefon, şehir, durum, kaynak, kayıt tarihi) kisiler.csv olarak indirebilirsiniz.
Önemli: Bir kişiyi silmek, onu suppression (abonelikten çıkanlar) listesinden çıkarmaz. Silinen bir e-posta tekrar eklense bile suppression koruması devam eder. Bu, abonelikten çıkmış birine yanlışlıkla tekrar mail gitmesini önler.

Listeler (Lists)

Liste, kişileri gruplamanın en temel yoludur. Bir kişi aynı anda birden fazla listede olabilir. Kampanyalar listelere veya segmentlere gönderilir. Listeler ayrıca temizleme, Tacir istisnası ve zorunlu liste (whitelist) gibi gelişmiş özellikleri destekler.

Liste Oluşturma

  1. Listeler → Yeni Liste'yi açın.
  2. Liste adını girin. Ad yalnızca harf, rakam, boşluk ve - _ . , ( ) içerebilir; % & / ^ gibi özel karakterler kullanılamaz.
  3. İsterseniz bir açıklama ekleyin (max 1000 karakter).
  4. Gerekiyorsa Tacir Listesi kutusunu işaretleyin (aşağıya bakın).
  5. Kaydet'e basın.

Listeye Kişi Ekleme

Listeye iki şekilde kişi eklersiniz:

  • Mevcut kişilerden ekleme: Liste detayında arama yaparak (en fazla 80 sonuç gösterilir) listede olmayan aktif kişileri seçip ekleyebilirsiniz. Tek seferde en fazla 500 kişi eklenebilir. Sadece kendi tenant'ınızın aktif kişileri eklenir; zaten listede olanlar tekrar eklenmez.
  • İçe aktararak (import): CSV/Excel dosyasını yüklerken hedef liste seçilebilir veya yeni liste oluşturulabilir (Import bölümüne bakın).
Denetim kaydı: Listeye her kişi ekleme list_added olarak audit log'a yazılır. Eklenen kişi suppression listesindeyse ayrıca readded_after_suppression kaydı oluşturulur (yasak listeye yeniden ekleme girişimi izlenir).

Liste Temizleme

Liste temizleme, gönderim itibarınızı korumak için sorunlu kişileri tespit edip baskılar (suppress) — yani durumlarını suppressed yapar. Temizleme ekranı her kategori için adet, yüzde ve örnek e-postalar gösterir. Yüzdeler, tenant'ın toplam aktif kişi sayısına göre hesaplanır.

KategoriTespit Ölçütü
Hard bounceSuppression tablosunda hard_bounce sebebiyle kayıtlı e-postalar.
Şikâyet (complaint)Suppression'da complaint sebebiyle kayıtlı.
Abonelikten çıkanlarSuppression'da unsubscribe sebebiyle kayıtlı.
Geçersiz (invalid)verification_status = invalid olan kişiler.
Tek kullanımlık (disposable)verification_status = disposable.
Spam tuzağı (spam_trap)verification_status = spam_trap.
Etkileşimsiz 90 günEn az 90 gündür sistemde olup (yeni eklenenler hariç) son 90 günde hiç açılma/tıklama yapmamış.
Etkileşimsiz 180 günAynı mantık, 180 gün eşiği.
Yeni kişiler "etkileşimsiz" sayılmaz: Etkileşimsizlik kriteri, kişinin en az ilgili gün sayısı kadar sistemde olmasını (created_at eski) şart koşar. Bu sayede daha kampanya almamış yeni kişiler yanlışlıkla baskılanmaz.

Her kategoriyi tek tek temizleyebilir veya "Tümünü Temizle" ile tüm kategorileri tek seferde baskılayabilirsiniz. Temizleme, ilgili kişilerin durumunu suppressed yapar (kişi silinmez).

Tacir Listesi (Tacir İstisnası)

Bir listeyi "Tacir Listesi" olarak işaretlemek, 6563 sayılı Kanun'un tacir/esnaf istisnası kapsamında kurumsal rol adreslerine ayrıca ticari elektronik ileti onayı aranmadan gönderim yapılabilmesini sağlar. Bir adresin tacir sayılması için iki koşul birden gerekir:

  1. Local part kurumsal rol adı olmalı: @ öncesi, bilinen ~70 Türkçe/İngilizce kurumsal rol prefiksinden biri olmalı (ör. bilgi, info, satis, sales, muhasebe, billing, ik, hr, destek, support, kvkk, legal …). Nokta/alt çizgi normalize edilir (halkla.iliskilerhalklailiskiler).
  2. Domain kurumsal olmalı: Domain, ücretsiz/kişisel bir servis olmamalı. Gmail, Hotmail, Outlook, Yahoo, iCloud, Yandex, Mail.ru, GMX, ProtonMail gibi ~40 ücretsiz sağlayıcı tacir istisnasından yararlanamaz.
isTacirAddress(email) = isRoleAddress(localPart) AND isCorporateDomain(domain)

// Örnek:
info@firma.com.tr   → TACİR (rol + kurumsal domain)
satis@sirket.com    → TACİR
info@gmail.com       → tacir DEĞİL (ücretsiz domain)
ahmet@firma.com.tr   → tacir DEĞİL (rol adresi değil)
Önemli kurallar:
  • Tacir listesinde olsa bile tacir olmayan adresler gönderimde atlanır.
  • Tacir istisnası ayrıca onay aranmamasını sağlar, ama suppression'ı geçmez. Abonelikten çıkmış (unsubscribe) bir tacir adresi yine bloke edilir — suppression kontrolü her zaman önce gelir.

Zorunlu Liste / Whitelist

Zorunlu liste, suppression muafiyeti tanır: buradaki kişiler abonelikten çıkmış, şikâyet etmiş veya baskılanmış olsalar bile gönderim alır. Yalnızca sistem/transactional nitelikli zorunlu bildirimler için kullanılmalıdır (ör. fatura, güvenlik uyarısı, sözleşme bildirimi).

  1. Zorunlu Liste sayfasını açın.
  2. Eklemek istediğiniz e-posta adresini ve isteğe bağlı bir gerekçe girin.
  3. Kişi tenant'ınızda yoksa otomatik oluşturulur (kaynak: whitelist). Ekle'ye basın.
  4. Gerektiğinde kişiyi zorunlu listeden çıkarabilirsiniz.
Dikkatli kullanın: Whitelist, kullanıcının abonelikten çıkma hakkını teknik olarak devre dışı bırakır. Yalnızca alıcının almak zorunda olduğu yasal/işlemsel bildirimler için kullanın; pazarlama içeriği için kullanmayın.

Segmentler (Segments)

Segment, kişilerinizi kurallara göre dinamik biçimde filtreleyen kayıtlı bir sorgudur. Listeden farkı: liste sabit bir üye kümesidir, segment ise her çalıştığında kuralları yeniden değerlendirir. Böylece "son 30 günde tıklayan ve etkileşim puanı 50+ olan kişiler" gibi gruplar otomatik güncel kalır.

Dinamik vs Statik

Liste (statik)Segment (dinamik)
ÜyelikElle eklenen sabit kişilerKurala uyan kişiler, her seferinde yeniden hesaplanır
Güncel kalmaManuelOtomatik (kurallar değişmeden kişi durumu değişince üyelik de değişir)
KullanımGenel gruplama, import hedefiDavranış/özellik bazlı hedefleme
Yalnızca aktif kişiler: Segment gönderiminde yalnızca status = active kişiler değerlendirilir; gruplar (OR) ve grup içi koşullar (AND) mantığıyla birleştirilir. Büyük gönderimlerde sorgu materyalize edilmeden parça parça (chunk) işlenir, böylece milyonlarca alıcıda bile bellek güvenli kalır.

Segment Alanları

Güvenlik için segment kuralları yalnızca izin verilen (allow-list) alanlar üzerinde çalışır. İzin dışı bir alan sessizce yok sayılır. Kullanılabilir tüm alanlar:

AlanTürGrupAçıklama
emailmetinKişi BilgileriE-posta adresi
first_namemetinKişi BilgileriAd
last_namemetinKişi BilgileriSoyad
phonemetinKişi BilgileriTelefon
citymetinKişi BilgileriŞehir
countrymetinKişi BilgileriÜlke
company_namemetinKişi BilgileriŞirket adı
statusseçimKişi Bilgileriactive / unsubscribed / bounced / complained / suppressed
sourcemetinKişi BilgileriKaynak (import, whitelist…)
opt_in_statusseçimOnaypending / confirmed / single (double opt-in)
verification_statusseçimDoğrulamavalid / invalid / risky / disposable / role / unknown / pending
engagement_scoresayıEtkileşim0–100 etkileşim puanı
last_open_attarihEtkileşimSon açılma tarihi
last_click_attarihEtkileşimSon tıklama tarihi
best_send_hoursayıEtkileşimOptimum gönderim saati (STO)
created_attarihTarihKayıt tarihi
updated_attarihTarihSon güncelleme

Operatörler

OperatörAnlamıÖrnek
equalsEşittircity = "İstanbul"
not_equalsEşit değildirstatus ≠ "suppressed"
containsİçeriremail içerir "@firma.com"
not_containsİçermezemail içermez "test"
starts_withİle başlarfirst_name başlar "A"
ends_withİle biteremail biter ".tr"
greater_thanBüyüktürengagement_score > 50
less_thanKüçüktürengagement_score < 20
is_emptyBoşphone boş
is_not_emptyDolucity dolu
in_last_daysSon N gün içindelast_click_at son 30 gün
not_in_last_daysSon N günden öncelast_open_at son 90 günden eski

Örnek Segment Kuralları

Örnek 1 — Sıcak (engaged) kişiler: Etkileşim puanı 50+ ve son 30 günde tıklamış.

Grup 1 (AND):
  engagement_score  greater_than     50
  last_click_at     in_last_days     30

Örnek 2 — İstanbul VEYA Ankara'daki geçerli adresler: Gruplar OR, grup içi AND.

Grup 1 (AND):  city = "İstanbul"   AND  verification_status = "valid"
   VEYA
Grup 2 (AND):  city = "Ankara"     AND  verification_status = "valid"

Örnek 3 — Yeniden etkileşim (re-engagement) hedefi: 90 günden uzun süredir açmamış kurumsal kişiler.

Grup 1 (AND):
  last_open_at  not_in_last_days  90
  email         ends_with         ".com.tr"

Segment Oluşturma ve Önizleme

  1. Segmentler → Yeni Segment'i açın ve bir ad verin.
  2. Kural grupları ekleyin: her grupta bir veya birden çok koşul (AND), gruplar arasında OR.
  3. Önizleme ile kaç kişinin eşleştiğini ve toplam içindeki yüzdesini anlık görün.
  4. Kaydet'e basın. Tahmini kişi sayısı (estimated_count) segmentle birlikte saklanır.
İpucu: Aynı segment hem kampanya alıcı çözümünde hem de otomasyon koşullarında kullanılır. Kural mantığı tek bir motorda (SegmentMatcher) tutulur, bu yüzden önizlemede gördüğünüz sayı gönderimde de geçerlidir.

İçe Aktarma (CSV / Excel Import)

Büyük kişi listelerini dosyadan yükleyebilirsiniz. İşlem dört adımdan oluşur: dosyayı yükle → kolonları eşle → liste seç → arka planda işle. Büyük dosyalar timeout olmadan kuyrukta işlenir ve tamamlanınca size bildirim gönderilir.

Desteklenen Formatlar

FormatUzantıNotlar
CSV.csvAyraç otomatik tespit edilir: ; , Tab |. UTF-8 BOM desteklenir.
Metin.txtCSV gibi işlenir (ayraç otomatik).
Excel.xlsx, .xlsİlk satır başlık, sonraki satırlar veri. Aktif sayfa okunur.
JSON.jsonNesne dizisi: [{"email":"...","ad":"..."}, ...]
Boyut sınırı: Yüklenen dosya en fazla 50 MB olabilir. Daha büyük listeleri parçalara bölerek yükleyin.

Adım Adım İçe Aktarma

  1. Dosyayı yükleyin. Sistem dosyayı analiz eder; başlıkları, ilk 5 satırın önizlemesini, tespit edilen ayraç bilgisini ve otomatik kolon eşlemesini döndürür.
  2. Kolonları eşleyin. Sistem başlıkları otomatik tanır (büyük/küçük harf, Türkçe karakter ve nokta/tire farkları normalize edilir). email, e-posta, mail → e-posta; ad, isim, name → ad; soyad, surname → soyad; telefon, tel, gsm → telefon; sehir, il → şehir. Eşlemeyi elle düzeltebilirsiniz. En az bir kolon e-postaya eşlenmelidir.
  3. Hedef liste seçin. Mevcut bir listeyi seçin veya yeni liste adı girerek oluşturun. Liste seçmeden de import yapılabilir.
  4. İşlemi başlatın. Import arka plan kuyruğuna alınır. Sayfada "Import başlatıldı… tamamlandığında bildirim alacaksınız." mesajı görünür.
  5. Bildirim alın. İş bitince uygulama içi bildirim gelir: kaç kişi eklendi, kaç kişi güncellendi, kaç satır geçersizdi (ve double opt-in açıksa kaç onay e-postası gönderildi).

Arka Plan İşleme Mantığı

İçe aktarma ProcessContactImportJob kuyruğunda, 500'erlik chunk'lar hâlinde ve veritabanı transaction'ı içinde toplu (bulk) upsert ile işlenir:

  • Her satır kolon eşlemesine göre alanlara dönüştürülür; e-postası boş veya geçersiz satırlar "geçersiz" sayılıp atlanır.
  • Aynı chunk içinde tekrar eden e-postada son kayıt geçerli olur.
  • E-posta tenant içinde benzersizdir; var olan kişi güncellenir (duplicate), yoksa oluşturulur (imported). Kaynak import olarak işaretlenir.
  • Liste seçildiyse tüm kişiler listeye çift kayıt olmadan eklenir; liste üye sayısı güncellenir.
  • İşlem bitince yüklenen dosya sunucudan silinir.
Tek deneme: Import idempotent olmadığı için job tek kez denenir (kısmi tekrar import önlenir). Hata olursa yarım kalan dosya temizlenir ve sistem yöneticisine uyarı düşer.

Double Opt-in (Çift Onay)

Tenant ayarlarında double opt-in açıksa, import sırasında yalnızca o import'ta yeni oluşturulan ve opt_in_status = single olan kişilere onay e-postası gönderilir. Bu, mevcut kişilere gereksiz onay maili gitmesini önler. Onay e-postası gönderilemezse hata loglanır ama import durmaz.

Hata Durumları

DurumDavranış
E-posta kolonu eşlenmemişImport başlatılmaz: "E-posta sütunu eşlenmeden içe aktarma yapılamaz." hatası.
Geçersiz dosya yoluYalnızca kendi tenant dizininizdeki dosya işlenebilir; aksi halde "Geçersiz dosya yolu." hatası.
Geçersiz/boş e-posta satırıSatır atlanır, "geçersiz" sayacına eklenir.
Bozuk/okunamayan ExcelDosya parse edilemezse boş kabul edilir, hata loglanır.
Desteklenmeyen formatYükleme doğrulamada reddedilir (yalnızca csv, txt, xlsx, xls, json).

E-posta Doğrulama (Verification)

Doğrulama, bir e-posta adresinin gerçekten teslim edilebilir olup olmadığını gönderim yapmadan denetler. Hatalı, tek kullanımlık veya tuzak adresleri ayıklayarak bounce oranınızı düşürür ve itibarınızı korur. Tüm işlem yerel yapılır — dış API'ye veri gönderilmez (KVKK uyumlu).

Doğrulama Aşamaları

Her adres sırayla şu kontrollerden geçer:

  1. Sözdizimi (RFC 5321/5322): Uzunluk, @ sayısı, local part (max 64) ve domain (max 253) kuralları, ardışık/baştaki/sondaki nokta, geçersiz karakter, en az iki harfli TLD denetimi. Türkçe karakter veya boşluk içeren domain reddedilir.
  2. Spam tuzağı tespiti: spamtrap, honeypot, blackhole gibi local part'lar; 10+ ardışık rakam; 20+ karakterlik rastgele hex desenler tuzak sayılır.
  3. Tek kullanımlık (disposable): Adres, 57.000+ domainlik disposable listesinde mi diye bakılır (ör. mailinator, yopmail, 10minutemail). Liste önbelleğe alınır.
  4. Rol adresi: info, admin, support, noreply, sales gibi kişisel olmayan kurumsal adresler işaretlenir.
  5. MX kontrolü: Domain'in MX kaydı dig ile, sistem resolver önbelleği atlanarak otoriter NS üzerinden sorgulanır (bulunamazsa 8.8.8.8 fallback). MX yoksa adres invalid'tir.
  6. SMTP el sıkışması: MX sunucusuna bağlanılır (port 25 → 587 → 465 sırasıyla denenir; 587'de STARTTLS), EHLO → MAIL FROM → RCPT TO akışı yürütülür. 250 → kabul; 550/5.1.1 → geçersiz; 4xx → geçici ret (greylisting olabilir, "riskli").
  7. Catch-all tespiti: İki farklı rastgele adres denenir. İkisi de kabul edilirse, sunucunun gerçek catch-all mı yoksa arka planda filtreleyen bir gateway mi olduğu dinamik sinyallerle (MX farklı kurumda mı, yanıtlar aynı mı, generik mi, gateway adı var mı) puanlanır. Yüksek gateway ihtimali → unknown; aksi halde gerçek catch_all.
Büyük sağlayıcılar (Gmail, Yahoo, Outlook, iCloud, Yandex …): Bu sunucular anti-harvesting amacıyla her RCPT'yi "250 OK" ile kabul eder, dolayısıyla SMTP doğrulaması güvenilmezdir. Bu adresler için SMTP atlanır ve çok sinyalli analiz yapılır: local part kalitesi (uzunluk, ad.soyad deseni, şüpheli kelime, rastgele hex, tamamen rakam) + sizin sisteminizdeki geçmiş (önceki bounce/şikâyet → negatif; açılma/teslim → pozitif) + rol adresi kontrolü. Sonuç skora göre valid (60–85), risky (30–59) veya invalid olur.

Sonuç Kategorileri

SonuçAnlamıÖneri
validMX var, SMTP kabul etti (catch-all değil) veya büyük sağlayıcıda makul görünüyor.Gönder.
invalidSözdizimi hatalı, MX yok ya da sunucu "kullanıcı yok" dedi. Teslim edilemez.Listeden çıkar/baskıla.
riskyRol adresi, şüpheli desen, bounce geçmişi veya geçici ret (greylisting).Dikkatli gönder; izle.
disposableTek kullanımlık / geçici e-posta servisi.Gönderme; baskıla.
catch_allDomain tüm adresleri kabul ediyor; bireysel adres doğrulanamıyor.Düşük güven; temkinli ol.
spam_trapSpam tuzağı / honeypot şüphesi.Kesinlikle gönderme.
roleKişisel olmayan kurumsal adres (info@, support@…).Genelde riskli sayılır.
unknownSunucuya ulaşılamadı veya sonuç netleşmedi (büyük sağlayıcı/gateway).Manuel değerlendir.

Her sonuçla birlikte 0–100 güven skoru ve ek bayraklar döner: mx_found, smtp_check, is_disposable, is_role_based, is_catch_all, is_spam_trap ve açıklayıcı bir SMTP mesajı.

Tek Adres Doğrulama

  1. Doğrulama sayfasını açın; mevcut kredi bakiyeniz ve birim maliyet görünür.
  2. Adresi girip Doğrula'ya basın.
  3. Sonuç (kategori + skor + sinyaller) anında gösterilir ve kaydedilir.

Toplu Doğrulama

  1. Kişiler ekranında seçili kişileri ya da tüm kişileri doğrulamayı seçin.
  2. Sistem maliyeti önceden hesaplar (kişi sayısı, gerekli kredi, mevcut bakiye, karşılanabilir mi).
  3. Onaylayınca kredi atomik olarak düşülür, bir doğrulama seansı (session) oluşturulur ve arka planda işlenir.
  4. İlerlemeyi canlı izleyebilir, biten seansların özetini ve adres bazlı sonuçlarını görebilirsiniz.
Hızlı temizlik: "Geçersizleri temizle" aksiyonu invalid, disposable ve spam_trap doğrulama durumundaki kişileri tek tıkla suppressed yapar.

Kredi Maliyeti

İşlemMaliyet
Tek adres doğrulamaVarsayılan 1 kredi (admin ayarlanabilir).
Toplu doğrulamatavan(adres_sayısı / mail_başına_kredi). Varsayılan 5 mail = 1 kredi.

Maliyet, sonuç olumlu ya da olumsuz olsun, yapılan iş sayısına göre hesaplanır. Yetersiz kredi varsa işlem başlamaz; gerekli ve mevcut kredi miktarı bildirilir. Her doğrulama bir kredi hareketi (email_verification) olarak loglanır.

API ile Doğrulama

Doğrulama, REST API üzerinden de yapılabilir ve panelle birebir aynı motoru kullanır (aynı disposable listesi, catch-all analizi, spam-trap ve sözdizimi tespiti). Tek adres ve en fazla 100 adreslik toplu uçlar mevcuttur; sonuçlar yine tenant'a kaydedilir.

KVKK / Veri yerelliği: Doğrulama tamamen kendi altyapımızda çalışır. Dış bir doğrulama servisine adres gönderilmez; MX/SMTP sorguları doğrudan hedef sunuculara yapılır.

Suppression (Kalıcı Engelleme)

Suppression listesi, hiçbir koşulda (gönderim tipine göre istisnalar dışında) e-posta gönderilmemesi gereken adreslerin kalıcı kara listesidir. Bir adres suppression'a girdiğinde, kişi silinip yeniden eklense bile koruma devam eder. Bu, abonelikten çıkmış veya şikâyet etmiş birine yanlışlıkla tekrar gönderim yapılmasını engeller.

Suppression Nedenleri

NedenAçıklama
hard_bounceKalıcı teslim hatası (adres yok, domain geçersiz vb.).
complaintAlıcı spam şikâyetinde bulundu (FBL).
manualElle eklenen engel.
unsubscribeAlıcı abonelikten çıktı (one-click unsubscribe / tercih merkezi).

Gönderim Tipine Göre Davranış

Suppression'ın etkisi, gönderimin tipine göre değişir. hard_bounce, complaint ve manual her zaman bloke ederken, unsubscribe yalnızca pazarlamada bloke eder:

NedenPazarlamaTransactionalOtomasyon
hard_bounceBlokeBlokeBloke
complaintBlokeBlokeBloke
manualBlokeBlokeBloke
unsubscribeBlokeSerbestSerbest
Neden unsubscribe transactional'da serbest? Abonelikten çıkmak pazarlama iletilerini reddetmektir; ancak fatura, şifre sıfırlama, sipariş bildirimi gibi işlemsel (transactional) iletiler yasal/işlevsel zorunluluktur. Bu yüzden transactional ve otomasyon gönderiminde yalnızca hard_bounce + complaint + manual bloke edilir, unsubscribe serbest bırakılır.
Tacir istisnası suppression'ı geçmez: Tacir listesindeki bir adres ayrıca onay aranmamasından yararlanabilir, fakat suppression kontrolü daha önce çalıştığı için abonelikten çıkmış bir tacir adresi yine de bloke edilir.

Abonelikten Çıkanlar Listesi (Salt Okunur)

Abonelikten çıkanlar (unsubscribe nedenli suppression kayıtları) ayrı bir ekranda listelenir. Bu liste tasarım gereği salt okunurdur: arama ve sayfalama yapabilirsiniz ama kişiyi buradan elle çıkaramazsınız.

  • Tenant, kişiyi sistemden silebilir ama onu abonelikten çıkanlar korumasından çıkaramaz.
  • Bu koruma kasıtlıdır: bir kullanıcı abonelikten çıktıktan sonra elle yeniden listeye eklenerek tekrar pazarlama maili almaya zorlanamaz.
Yeniden izin almak: Abonelikten çıkmış bir kişiye tekrar pazarlama maili gönderebilmenin tek meşru yolu, kişinin kendi isteğiyle yeniden abone olmasıdır (örn. web sitenizdeki kayıt formu üzerinden double opt-in ile). Bu durumda yeni bir açık onay kaydı oluşur.

Kalıcılık Garantisi

Suppression kaydı kişiden bağımsız olarak e-posta bazında tutulur. Bu nedenle:

  • Kişi silinse bile suppression kalır.
  • Aynı e-posta yeni bir kişi olarak tekrar eklenirse, gönderim aşamasında suppression yeniden uygulanır.
  • Suppression varken yeniden ekleme/listeye dahil etme girişimi readded_after_suppression olarak denetim kaydına yazılır (uyum/ispat için).

Otomasyonlar

Otomasyonlar; bir olay (tetikleyici) gerçekleştiğinde kişileri otomatik bir e-posta akışına dahil eden, kampanyalardan farklı olarak tek seferlik değil sürekli çalışan akışlardır. Hoşgeldin serileri, doğum günü kutlamaları, satın alma sonrası takip ve yeniden etkileşim gibi senaryoları kurun; sistem geri kalanı sizin için yapsın.

Kampanya ile farkı: Kampanya belirli bir an için listeye/segmente tek gönderimdir. Otomasyon ise tetikleyici her gerçekleştiğinde ilgili kişi için ayrı ayrı tekrar tekrar çalışır — bir kez kurarsınız, aylarca işler.

Otomasyon nasıl çalışır?

Her otomasyon üç parçadan oluşur:

  1. Tetikleyici (trigger). Akışı başlatan olay: kişi eklendi, etiketlendi, form gönderdi, belirli bir tarih geldi vb.
  2. Adımlar (steps). Sırayla işleyen kutular: e-posta gönder, bekle (gecikme), koşul kontrol et (dallanma), aksiyon yürüt (etiket/liste/alan değişikliği).
  3. Kayıt (enrollment). Tetikleyici eşleşen her kişi için bir kayıt açılır; kişi adım adım akışta ilerletilir, akış bitince kayıt completed olur.

Akış motoru her dakika çalışan bir cron tarafından işletilir: zamanı gelen (next_action_at <= now) aktif kayıtlar toplu olarak ilerletilir. Tek bir döngüde en fazla 500 kayıt işlenir, böylece yoğun trafikte sistem dengede kalır.

Adım adım otomasyon oluşturma

  1. Otomasyonlar → Yeni Otomasyon. Otomasyon adı (zorunlu) ve isteğe bağlı açıklama girin.
  2. Tetikleyici türü seçin. Seçtiğiniz türe göre ek alanlar açılır (liste, etiket, tarih alanı + ofset gibi).
  3. Gönderici bilgilerini belirleyin. Gönderim domainini seçin (DNS sağlık skoru 0'dan büyük olmalı), gönderici adı ve e-postanın yerel kısmını yazın. @ içermeyen bir değer girerseniz seçili domain otomatik eklenir (örn. bilgi + sirket.combilgi@sirket.com).
  4. Otomasyon oluşturulur ve draft (taslak) durumunda açılır. Ardından detay (Show) ekranında adımları eklersiniz.
  5. Adımları ekleyin. En az bir adım gereklidir (genellikle ilk adım bir e-posta).
  6. Etkinleştirin. Otomasyon aktif olunca tetikleyici eşleşen kişiler otomatik kaydedilmeye başlar.
Etkinleştirme ön koşulları: Bir otomasyon aktif edilebilmek için en az bir adıma ve eksiksiz gönderici bilgisine (hem gönderim domaini hem gönderici e-postası) sahip olmalıdır. Eksikse sistem etkinleştirmeyi reddeder ve uyarı gösterir.

Hazır şablondan başlamak (en hızlı yol)

Sıfırdan kurmak yerine, oluşturma ekranındaki şablon galerisinden bir akış seçebilirsiniz. Seçtiğinizde sistem o şablonu kopyalayarak tüm adımlarıyla birlikte yeni bir draft otomasyon üretir; sonra metinleri ve süreleri kendinize göre düzenlersiniz.

İpucu: Şablondan üretilen adımların konu satırları örnek metinlerdir. Yayına almadan önce her e-posta adımının içeriğini ve gönderici bilgilerini gözden geçirin.

Tetikleyiciler

Tetikleyici, akışın hangi olayla başlayacağını belirler. Tüm giriş noktaları (form, içe aktarma, etiketleme, tarih cron'u, e-ticaret entegrasyonu) merkezi bir tetikleyici servisine bağlıdır; bu servis o tenant'ın aktif ve türü eşleşen otomasyonlarını bulup kişiyi kaydeder.

TetikleyiciKod değeriNe zaman tetiklenir?
Kişi Eklendicontact_addedYeni bir kişi oluşturulduğunda (form, içe aktarma, manuel). Belirli bir listeye kısıtlanabilir.
Kişi Etiketlendicontact_taggedKişiye belirli bir etiket eklendiğinde. Config'deki tag ile birebir eşleşmelidir.
Form Gönderildiform_submittedBir kayıt formu doldurulduğunda. Belirli bir form_id ile kısıtlanabilir.
Tarih Alanıdate_fieldKişinin bir tarih alanı (ör. birthday) bugünün ay-günü ile eşleştiğinde. Günlük cron ile işlenir. Ofset gün ile öncesinde/sonrasında tetiklenebilir.
ManuelmanualOtomatik tetiklenmez; kişiyi siz elle akışa eklersiniz (yeniden etkileşim, etkinlik daveti gibi kontrollü senaryolar).
Sipariş Tamamlandıorder_completedE-ticaret entegrasyonunda bir sipariş tamamlandığında (satın alma sonrası akışlar).
Sepet Terk Edildicart_abandonedSepete ürün eklenip alışveriş tamamlanmadığında (geri kazanım akışları).
Yeni Müştericustomer_createdE-ticaret tarafında yeni bir müşteri kaydı oluştuğunda.
Tetikleyici kısıtları (config): Bir tetikleyiciye liste/form/etiket kısıtı eklerseniz yalnızca eşleşen olaylar akışı başlatır. Kısıt boş bırakılırsa o boyutta tümü kabul edilir (örn. liste seçmezseniz "tüm listelere eklenenler").

Tarih alanı tetikleyicisi nasıl çalışır?

Günlük cron, ilgili tarih alanının ay-gün kısmını bugünle karşılaştırır (yıl önemsizdir; doğum günü gibi yıllık olaylar için idealdir). offset_days ile tetiklemeyi öne çekebilirsiniz: örneğin offset = 3 ile "3 gün sonraki olayları bugünden" yakalayıp önceden hatırlatma gönderebilirsiniz. Aynı kişi aynı yıl içinde tekrar kaydedilmez, böylece çift kutlama önlenir.

Adım türleri

Adımlar position sırasına göre işler. Her adımın türüne göre davranışı:

AdımKodGöreviYapılandırma
E-postaemailKişiye e-posta gönderim işine alır (kuyruğa eklenir), sonra hemen sonraki adıma geçer.Konu, şablon/içerik
GecikmedelayAkışı belirtilen süre bekletir; süre dolunca bir sonraki adım planlanır.Miktar + birim: minutes / hours / days
KoşulconditionBir kuralı değerlendirir; sonuca göre evet ya da hayır dalına yönlendirir (dallanma).Koşul türü + (segment/etiket/alan)
AksiyonactionKişi üzerinde bir işlem yapar (e-posta göndermez), sonra sonraki adıma geçer.Aksiyon türü + parametre

Koşul (condition) türleri

Koşul adımı, yes ve no olarak işaretlenmiş alt adımlara (dallara) yönlendirme yapar. Desteklenen koşullar:

  • opened_email — Kişi daha önce herhangi bir e-posta açtı mı?
  • clicked_link — Kişi daha önce bir bağlantıya tıkladı mı?
  • in_segment — Kişi belirtilen segmentin kurallarına uyuyor mu? (Segment yalnızca kişinin kendi tenant'ına ait olabilir; çapraz-tenant erişim engellidir.)
  • has_tag — Kişide belirli bir etiket var mı?
  • field_equals — Kişinin bir alanı belirtilen değere eşit mi?

Sonuç evet ise yes dalı, hayır ise no dalı işlenir. İlgili dal tanımlı değilse akış normal sıradaki adımdan devam eder.

Aksiyon (action) türleri

  • add_to_list — Kişiyi belirtilen listeye ekler.
  • remove_from_list — Kişiyi listeden çıkarır.
  • update_field — Kişinin bir alanını günceller (yalnızca güvenli alanlar: first_name, last_name, phone, city, status).
  • add_tag — Kişiye etiket ekler (mükerrer eklemez).

Örnek: gecikmeli koşullu akış

1) email      → "Hoşgeldiniz" gönder
2) delay      → 5 gün bekle
3) condition  → opened_email?
      ├─ yes → action: add_tag "etkilesim_yuksek"
      └─ no  → email: "Son şans: özel indirim"

Gönderici e-posta mantığı

Gönderici e-postasını her seferinde tam yazmanız gerekmez. Form sadece yerel kısmı ister (ör. bilgi, destek); kaydederken sistem seçili gönderim domainini ekler. Zaten @ içeren bir adres girerseniz olduğu gibi korunur. Bu mantık hem otomasyon oluşturma hem de güncellemede aynı şekilde uygulanır.

Hazır şablonlar (6 adet)

Galeri 6 hazır akış sunar. Her biri belirli bir tetikleyici ve adım dizisiyle gelir:

1. Hoşgeldin Serisi contact_added

Amaç: Yeni abone olan kişiyi karşılamak ve platforma/ürüne ısındırmak.

Akış: Hoşgeldin e-postası → 2 gün bekle → ipuçları e-postası → 3 gün bekle → özel teklif e-postası. (3 e-posta, 2 gecikme.)

2. Doğum Günü Tebrik date_field

Amaç: Kişinin doğum gününde otomatik tebrik + sürpriz teklif göndermek.

Akış: birthday alanı (ofset 0) bugünle eşleşince tek bir tebrik e-postası. Tetikleyici ay-gün eşleşmesiyle çalışır, yıllık dedup uygular.

3. Yeniden Etkileşim manual

Amaç: 90 gündür etkileşim göstermeyen kişileri geri kazanmak.

Akış: "Sizi özledik" e-postası → 5 gün bekle → koşul: e-posta açıldı mı? → evet ise re_engaged etiketi ekle, hayır ise "son şans indirim" e-postası gönder. Manuel tetikleyici olduğu için hedef kişileri siz elle eklersiniz (veya segmentten).

4. Satın Alma Sonrası contact_tagged

Amaç: Sipariş veren müşteriye teşekkür, değerlendirme isteği ve çapraz satış.

Akış: purchased etiketi eklenince teşekkür e-postası → 7 gün bekle → memnuniyet/değerlendirme e-postası → 14 gün bekle → "sizin için seçtiklerimiz" ürün önerisi.

5. Etkinlik Hatırlatma manual

Amaç: Yaklaşan bir etkinlik için kademeli hatırlatma.

Akış: Kayıt onayı e-postası → 1 gün bekle → "yarın görüşmek üzere" → 1 gün bekle → "etkinlik bugün" katılım bilgisi. Etkinliğe kayıtlı kişiler manuel eklenir.

6. Lead Besleme contact_added

Amaç: Yeni bir lead'i 4 haftalık eğitim/bilgilendirme ile satışa hazırlamak.

Akış: Başlangıç rehberi → 7 gün bekle → başarı hikayeleri → 7 gün bekle → koşul: bağlantıya tıkladı mı? → evet ise "ücretsiz demo talebi" e-postası, hayır ise "sık sorulan sorular" e-postası.

Kayıt (enrollment) mantığı ve mükerrer engeli

Bir tetikleyici eşleştiğinde sistem otomatik olarak ilk adımı bularak yeni bir kayıt açar ve kişiyi "şimdi işlenecek" olarak işaretler. Kayıt yaşam döngüsü loglanır (her adım, koşul sonucu ve aksiyon kayıt altına alınır).

Çift akış engeli (deduplication): Aynı kişinin aynı otomasyonda active veya paused bir kaydı varsa, tetikleyici tekrar gerçekleşse bile yeniden kaydedilmez. Bu sayede aynı kişi aynı akışta paralel olarak iki kez ilerlemez. Tarih alanı tetikleyicisinde ek olarak yıllık dedup uygulanır.

Form gönderiminde özel bir durum vardır: form gönderildiğinde önce form_submitted, eğer kişi yeni oluşturulduysa ayrıca contact_added tetikleyicileri tetiklenir — yani tek bir form gönderimi birden fazla uygun otomasyonu çalıştırabilir.

Manuel kayıt (manual enroll)

Manuel tetikleyicili akışlarda (veya istediğiniz herhangi bir aktif akışta) kişileri tek tek elle ekleyebilirsiniz. Otomasyon detay ekranındaki "Kişi Ekle" ile bir kişi seçilir. Sistem şu kontrolleri yapar:

  • Otomasyon active olmalı,
  • En az bir adım bulunmalı,
  • Kişi sizin hesabınıza (tenant) ait olmalı,
  • Kişinin active/paused bir kaydı zaten yoksa eklenir; varsa "bu kişi zaten otomasyona dahil" uyarısı verilir.

Durumlar ve silme kuralı

DurumKodAnlamı
TaslakdraftHenüz aktif değil; düzenlenebilir, adım eklenebilir, silinebilir.
AktifactiveTetikleyiciler çalışıyor, kayıtlar işleniyor. Düzenleme ve silme kapalıdır.
Duraklatılmışpausedİşleme durdu; tekrar düzenlenebilir/silinebilir, yeniden aktif edilebilir.
ArşivarchivedKullanım dışı; silinebilir.
Silme kuralı: Aktif bir otomasyon doğrudan silinemez — "Aktif otomasyon silinemez. Önce duraklatın." uyarısı alırsınız. Silmek için önce duraklatın, sonra silin. Aynı şekilde adım ekleme/düzenleme/silme yalnızca draft veya paused durumlarında mümkündür; aktif akışın yapısı değiştirilemez.

Güvenlik: Hesabı askıya alınmış (suspended) tenant'ların otomasyonları işlenmez; akış motoru yalnızca status=active tenant'ların aktif otomasyonlarını ele alır.

Formlar

Formlar; web sitenize gömebileceğiniz abone kayıt formlarıdır. Ziyaretçiler formu doldurduğunda kişi otomatik oluşturulur, seçtiğiniz listeye eklenir ve (etkinse) onay e-postası süreci başlar — ayrıca ilgili otomasyon tetikleyicileri çalışır.

Form oluşturma

  1. Formlar → Yeni Form. Form adı girin (zorunlu).
  2. Bağlı listeyi seçin. Form üzerinden kaydolan kişiler bu listeye eklenir. (İsteğe bağlıdır; seçilmezse kişi yine oluşturulur ama listeye bağlanmaz.)
  3. Alanları tanımlayın. Her alan için Alan Adı (name), Etiket, Tür ve Zorunlu seçeneklerini belirleyin.
  4. Oluşturun. Kaydedince sistem otomatik olarak gömme (embed) kodunu üretir.
Alan kuralları: En az bir alan zorunludur ve her alanın hem "Alan Adı (name)" hem de "Etiket" değeri dolu olmalıdır. Pratikte en az bir email alanı bulunmalıdır — e-posta olmadan kişi oluşturulamaz. Varsayılan olarak form, zorunlu bir e-posta alanıyla açılır.

Desteklenen alan türleri

TürKodAçıklama
MetintextTek satır serbest metin (ad, şehir vb.)
E-postaemailE-posta doğrulamalı alan (zorunlu olması önerilir)
TelefonphoneTelefon (gömme kodda tel girişi olur, max 20 karakter)
Uzun MetintextareaÇok satırlı metin alanı
SeçimselectAçılır liste seçimi
Standart alan eşleşmesi: email, first_name, last_name ve phone adlı alanlar doğrudan kişinin ana profiline yazılır. Bunların dışındaki alan adları kişinin custom_fields (özel alanlar) bölümüne kaydedilir — segmentasyon ve kişiselleştirmede kullanabilirsiniz.

Gömme (embed) kodu kullanımı

Form kaydedildiğinde, tanımladığınız alanlardan otomatik bir HTML <form> bloğu üretilir. Bu kod, formu SenderTR'nin gönderim adresine (/f/{form_id}) POST eder. Düzenleme ekranında "Embed Kodu" kartından tek tıkla kopyalayıp sitenize yapıştırın.

<form action="https://app.sendertr.com/f/123" method="POST" style="max-width:400px;font-family:sans-serif">
  <div style="margin-bottom:12px">
    <label style="display:block;margin-bottom:4px;font-weight:600">E-posta Adresi</label>
    <input type="email" name="email" required ... />
  </div>
  <button type="submit" ...>Kayıt Ol</button>
</form>

Üretilen kod satır içi (inline) stillerle gelir; dış bağımlılık gerektirmez, doğrudan herhangi bir sayfaya yapıştırılabilir. Alan etiketleri ve adları HTML-escape edilerek güvenli biçimde basılır.

Form gönderiminde ne olur?

  1. Doğrulama. Form alanları tanımınıza göre sunucuda doğrulanır (zorunlu alanlar, e-posta formatı, telefon uzunluğu, metin uzunluğu). E-posta yoksa istek reddedilir.
  2. Kişi oluşturma/güncelleme. E-posta küçük harfe çevrilir; aynı tenant + e-posta için kişi yoksa yeni kayıt açılır (source=form), varsa mevcut kişi kullanılır. Standart alanlar profile, diğerleri custom_fields'a yazılır.
  3. Listeye ekleme. Forma bir liste bağlıysa kişi o listeye eklenir (mükerrer eklemez).
  4. Otomasyon tetikleme. form_submitted tetiklenir; kişi yeni oluşturulduysa ayrıca contact_added tetiklenir.
  5. Double opt-in. Kişi henüz onaylı değilse onay e-postası gönderilir (aşağıya bakın).
  6. Teşekkür sayfası. Ziyaretçiye başarı sayfası gösterilir.

Double Opt-in (çift onay)

İzinli ve KVKK uyumlu liste oluşturmanın en güvenli yolu çift onaydır. Formdan gelen kişi henüz onaylanmamışsa:

  1. Sisteme rastgele güvenli bir onay token'ı üretilir ve kişi opt_in_status = pending olarak işaretlenir.
  2. Kişiye "E-posta Adresinizi Onaylayın" konulu bir onay e-postası gönderilir; içinde /confirm/{token} bağlantısı bulunur.
  3. Kişi bağlantıya tıkladığında opt_in_status = confirmed olur, token silinir ve onay zamanı (opted_in_at) kaydedilir.
Neden önemli? Yalnızca onaylanmış (confirmed veya tek-onay single) kişiler gerçekten "izinli" sayılır. Çift onay; spam şikayetlerini azaltır, gelen kutusu itibarınızı korur ve yasal gönderim iznini kanıtlanabilir kılar.

Spam koruması

Halka açık form gönderim ucu, otomatik bot/spam gönderimlerine karşı IP başına dakikada 10 gönderim ile sınırlandırılmıştır. Eşik aşılırsa istekler geçici olarak reddedilir. Ayrıca tüm alanlar sunucu tarafında tipine göre doğrulanır ve metin uzunlukları sınırlandırılarak kötüye kullanım önlenir.

Landing Page (Açılış Sayfası)

Kampanyalarınız ve formlarınız için barındırılan açılış sayfaları oluşturun. Sayfalar içerik moderasyonundan geçtikten sonra /p/{slug} adresinden herkese açık yayınlanır.

Sayfa oluşturma

  1. Sayfalar → Yeni Sayfa.
  2. Ad girin (panel içi tanımlayıcı isim).
  3. Slug belirleyin. Yayın adresinin son parçasıdır (/p/slug). Yalnızca küçük harf, rakam ve tire (a-z 0-9 -) içerebilir ve sistemde benzersiz olmalıdır.
  4. HTML içeriğini girin (sayfanın gövdesi).
  5. Kaydedin. Sayfa kaydedilirken içerik güvenlik için temizlenir (sanitization) ve doğrudan pending_review (onay bekliyor) durumuna alınır.
Doğrudan yayın yoktur: Tenant bir sayfayı kendi başına yayınlayamaz. Yeni oluşturulan ya da "Onaya Gönder" denilen her sayfa otomatik olarak admin moderasyon kuyruğuna düşer. Yayın yalnızca admin onayıyla gerçekleşir.

Durumlar

DurumKodAnlamı
TaslakdraftHazırlık aşaması (henüz onaya gönderilmemiş).
Onay Bekliyorpending_reviewModerasyon kuyruğunda; admin incelemesini bekliyor. Public erişime kapalı.
YayındapublishedAdmin onayladı; /p/{slug} adresinden herkese açık.
ReddedildirejectedAdmin reddetti; bir red notu ile birlikte. Yayında değil.
ArşivarchivedKullanım dışı.

Moderasyon akışı (detaylı)

  1. Tenant sayfayı oluşturur / onaya gönderir. İçerik sanitize edilir, durum pending_review olur.
  2. Admin paneline düşer. Sayfa, yönetim panelindeki Moderasyon → Landing Page Onayları ekranında listelenir. Onay bekleyen sayfa sayısı menüde uyarı rozeti olarak görünür. Bu ekrana yalnızca super_admin ve moderator rolleri erişebilir.
  3. Admin inceler. İnceleme ekranında sayfanın bilgileri, ham HTML kaynak kodu ve sanitize edilmiş render önizlemesi birlikte görüntülenir — içerikte yasa dışı/aldatıcı unsur olup olmadığı kontrol edilir.
  4. Karar:
    • Onayla → Durum published olur, inceleyen ve inceleme zamanı kaydedilir, varsa eski red notu temizlenir. Sayfa anında /p/{slug}'da yayına girer. (Admin tek tek veya toplu onay ile onaylayabilir.)
    • Reddet → Admin zorunlu bir red notu yazar (tenant bu notu görür). Durum rejected olur. Tenant notu okuyup düzeltir ve tekrar onaya gönderir.

Her onay/red işlemi denetim (activity) loguna yazılır; kim, hangi sayfayı, ne zaman onayladı/reddetti ve red gerekçesi kayıt altına alınır.

Onaylı sayfayı düzenlemek

Yeniden onay kuralı: Yayındaki bir sayfanın HTML içeriğini değiştirirseniz, sayfa otomatik olarak yeniden pending_review'e döner; eski inceleme bilgileri (red notu, inceleyen, inceleme tarihi) sıfırlanır ve onaylanana kadar yayından kalkar. Böylece onaylanmış bir sayfanın altına sonradan denetimsiz içerik konulması engellenir. (Yalnızca ad/slug gibi içerik dışı değişikliklerde yeniden onay tetiklenmez.)

Public erişim — /p/{slug}

Yayın adresi yalnızca published durumundaki sayfaları sunar; başka bir durumdaki (taslak, onay bekleyen, reddedilen) sayfaya bu adresten erişilmek istenirse 404 döner. Her görüntülemede sayfanın ziyaret sayacı artırılır, böylece performansı izleyebilirsiniz.

HTML temizleme (sanitization) — güvenlik

Kaydetme sırasında içerik sunucuda temizlenir. Tehlikeli unsurlar kaldırılır:

  • <script>, <iframe>, <object>, <embed>, <applet> etiketleri tamamen silinir.
  • onclick, onload gibi tüm on* olay işleyici öznitelikleri kaldırılır.
  • href="javascript:..." gibi JavaScript bağlantıları etkisiz hale getirilir (href="#" yapılır).
Neden çift koruma? Önce otomatik sanitization XSS gibi teknik saldırıları engeller; ardından admin moderasyonu, hukuka aykırı veya aldatıcı içeriği (yasa dışı tanıtım, dolandırıcılık vb.) yakalar. SenderTR bir gönderen olarak itibarını ve yasal sorumluluğunu korumak için her açık sayfayı insan denetiminden geçirir.

Domain & DNS Doğrulama

E-postalarınızı kendi alan adınızdan göndermek ve gelen kutusuna ulaşmak için, gönderen domaininizi ekleyip SPF, DKIM ve DMARC DNS kayıtlarını doğrulamanız gerekir. Bu, hem teslim edilebilirlik hem de 6563 sayılı Kanun gereği yasal gönderen kimliği için zorunludur.

Neden zorunlu? Doğrulanmamış (sağlık skoru 0) bir domain kampanya gönderiminde kullanılamaz. Alıcı sunucular (Gmail, Outlook, Yahoo) kimlik doğrulaması olmayan e-postaları reddeder veya spam klasörüne atar.

1. Domain Ekleme

  1. Domainler → Domain Ekle sayfasını açın.
  2. Alan adınızı girin (ör. sirketiniz.com). Sistem girdiğinizi otomatik temizler: https:// ön ekini, sondaki / işaretini ve boşlukları kaldırır, küçük harfe çevirir.
  3. Yalnızca ASCII (Türkçe karaktersiz, punycode olmayan) ve daha önce eklenmemiş benzersiz bir alan adı kabul edilir.
  4. Kaydederken sistem sizin için arka planda 2048-bit RSA DKIM anahtar çifti üretir ve özel anahtarı şifreli olarak saklar. Açık (public) anahtar DNS kaydında kullanılır.
  5. DKIM seçici (selector) otomatik atanır: sendertr + yıl/ay (ör. sendertr202606).

Domain eklendiğinde üç kaydın durumu pending (beklemede), sağlık skoru 0 olarak başlar. Detay sayfasında size eklemeniz gereken tam DNS kayıtları gösterilir.

2. Eklenecek DNS Kayıtları

Domain detay sayfasında üç adet TXT kaydı üretilir. Bunları alan adınızın DNS yönetim panelinde (Cloudflare, GoDaddy, Natro, İsimtescil, alan adı sağlayıcınız vb.) oluşturmanız gerekir.

SPF — Sender Policy Framework

SPF, hangi sunucuların sizin adınıza e-posta göndermeye yetkili olduğunu tanımlar. SenderTR sunucularını yetkilendirmek için domaininizin kök (root) seviyesine eklenir.

AlanDeğer
TipTXT
Host / Adsirketiniz.com (kök domain, bazı panellerde @)
Değerv=spf1 include:sendertr.com ~all
Önemli: Bir domainde yalnızca tek bir SPF kaydı bulunabilir. Halihazırda başka bir SPF kaydınız varsa (ör. Google Workspace), yeni bir kayıt eklemek yerine mevcut kayda include:sendertr.com ifadesini ekleyin: v=spf1 include:_spf.google.com include:sendertr.com ~all
SPF Lookup Limiti (RFC 7208): Bir SPF kaydı toplamda en fazla 10 DNS sorgusu içerebilir (include:, a:, mx, redirect=, exists:, ptr sayılır). Limit aşılırsa PERMERROR oluşur ve SPF tamamen geçersiz olur. Sistem doğrulama sırasında lookup sayısını kontrol eder ve 7'yi aşarsa uyarı, 10'u aşarsa hata verir.

DKIM — DomainKeys Identified Mail

DKIM, gönderilen her e-postaya dijital imza ekler. Alıcı sunucu, DNS'teki açık anahtarınızla imzayı doğrulayarak e-postanın yolda değiştirilmediğini ve gerçekten sizden geldiğini teyit eder. SenderTR 2048-bit RSA anahtar kullanır.

AlanDeğer
TipTXT
Host / Adsendertr202606._domainkey.sirketiniz.com
Değerv=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBA... (uzun açık anahtar)
İpucu: DKIM açık anahtarı çok uzundur ve bazı DNS panelleri 255 karakter sınırı koyar. Çoğu modern panel uzun değeri otomatik böler; siz değeri olduğu gibi (tırnaksız) yapıştırın. Kopyalarken başına/sonuna boşluk veya satır sonu eklenmediğinden emin olun.

DMARC — Domain-based Message Authentication

DMARC, SPF ve DKIM başarısız olduğunda alıcı sunucunun ne yapacağını belirler ve size geri bildirim (rapor) gönderilmesini sağlar. Marka korumasının (spoofing/phishing engelleme) temel taşıdır.

AlanDeğer
TipTXT
Host / Ad_dmarc.sirketiniz.com
Değerv=DMARC1; p=quarantine; rua=mailto:dmarc@sirketiniz.com

Politika (p=) seçenekleri:

PolitikaAnlamıÖneri
p=noneSadece izle/raporla, aksiyon almaİlk hafta için uygun; uzun vadede önerilmez (sistem uyarı verir)
p=quarantineBaşarısız mailleri spam klasörüne yönlendir✓ Önerilen başlangıç politikası
p=rejectBaşarısız mailleri tamamen reddetİtibar oturduktan sonra en güvenli seçenek
BIMI (opsiyonel): DMARC politikanız en az quarantine ise, gelen kutusunda marka logonuzu göstermek için BIMI kaydı ekleyebilirsiniz: default._bimi.sirketiniz.com adresine v=BIMI1; l=https://sirketiniz.com/logo.svg. Logo SVG (Tiny PS profili) ve HTTPS üzerinden erişilebilir olmalıdır.

3. Doğrulama

  1. DNS kayıtlarını sağlayıcınızın panelinde oluşturduktan sonra, SenderTR domain detay sayfasında "Doğrula" butonuna basın.
  2. Sistem her kaydı domaininizin otoriter nameserver'ı üzerinden doğrudan sorgular (ISP/sistem cache'ini atlar). Otoriter NS bulunamazsa Google DNS (8.8.8.8) üzerinden kontrol eder.
  3. SPF, DKIM ve DMARC ayrı ayrı kontrol edilir; her birinin durumu pass veya fail olarak güncellenir.
  4. Sağlık skoru yeniden hesaplanır ve son kontrol zamanı (last_checked_at) kaydedilir.
  5. Skor 100 olduğunda domain "doğrulanmış" (verified_at) olarak işaretlenir ve kampanyalarda kullanılabilir hale gelir.

Sağlık Skoru (health_score) Nasıl Hesaplanır?

Skor 0–100 arasındadır ve üç kaydın ağırlıklı toplamından oluşur:

KayıtGeçerse PuanAçıklama
SPF+30Gönderim yetkisi tanımlı
DKIM+40İmza doğrulaması — en ağırlıklı bileşen
DMARC+30Politika ve raporlama
Toplam100Tam doğrulanmış domain
Skor AralığıNe Anlama Gelir?
100Tüm kayıtlar geçerli → domain gönderime hazır, otomatik "doğrulanmış" işaretlenir
60–99Bir veya iki kayıt eksik → gönderim engellenir, eksik kaydı tamamlayın
30–70Yalnızca bir kayıt geçerli → kimlik doğrulama yetersiz
0Hiçbir kayıt bulunamadı → kayıtları ekleyin ve tekrar doğrulayın
Cloudflare kullanıcıları: Ayarlar > Entegrasyonlar'dan Cloudflare API token'ınızı eklerseniz, domain detay sayfasındaki "DNS Otomatik Kur" butonu ile SPF/DKIM kayıtları doğrudan Cloudflare'e otomatik yazılır — elle kayıt eklemenize gerek kalmaz.

4. DNS Yayılma Süresi

DNS değişiklikleri anında yayılmaz. Kayıtların tüm dünyaya yayılması birkaç dakikadan birkaç saate (nadiren TTL ayarınıza bağlı olarak 24–48 saat) kadar sürebilir. Doğrulama başarısızsa:

  • Bir süre bekleyin (15–30 dakika) ve "Doğrula"yı tekrar deneyin.
  • SenderTR cache kullanmadan otoriter sunucuyu sorguladığı için, sağlayıcınızda kayıt görünür hale geldiği anda doğrulama da başarılı olur.

5. Sık Karşılaşılan Sorunlar

SorunÇözüm
SPF "fail" — kayıt bulunamadıKök domaine (@) v=spf1 include:sendertr.com ~all TXT kaydı ekleyin.
SPF "warning" — SenderTR referansı yokMevcut SPF kaydınıza include:_spf.sendertr.com ekleyin; IP'leri doğrudan yazmak yerine include kullanın (yeni sunucu eklendiğinde otomatik güncellenir).
DKIM "fail"Host adresinin tam olarak SEÇİCİ._domainkey.domain formatında olduğundan emin olun. Açık anahtarda satır sonu/boşluk olmamalı.
DMARC "warning" — p=nonePolitikayı quarantine veya reject olarak güncelleyin; none spam riskini artırır.
Kayıt doğru ama hâlâ "fail"DNS yayılmasını bekleyin. Bazı paneller host alanına otomatik olarak domaini ekler — çift domain (_dmarc.domain.com.domain.com) oluşmadığından emin olun.
MX kaydı uyarısıBounce ve yanıt maillerini alabilmek için domaininizde bir MX kaydı bulunmalıdır (opsiyonel ama önerilir).

Deliverability — Gelen Kutusuna Ulaşmak

Teslim edilebilirlik (deliverability), e-postalarınızın spam klasörüne değil gelen kutusuna ulaşma yeteneğidir. SenderTR'nin temel odağı budur. Teslimat; kimlik doğrulama, gönderici itibarı, liste kalitesi ve içerik kalitesinin bir bileşkesidir.

Teslimat (delivery) ≠ Gelen kutusu yerleşimi (inbox placement). "Teslim edildi" alıcı sunucunun maili kabul ettiği anlamına gelir; ancak spam klasörüne de düşmüş olabilir. Gerçek hedef gelen kutusudur.

IP Warmup (IP Isınması)

Yeni bir gönderim IP'si itibar geçmişine sahip değildir. Sağlayıcılar (Gmail, Outlook) yeni IP'lerden gelen yüksek hacimli gönderime şüpheyle yaklaşır. Bu yüzden gönderim hacmi 30 gün boyunca kademeli olarak artırılır — buna "ısınma" denir.

Aşama (warmup_stage)Anlamı
warmingIsınma sürecinde — günlük limit kademeli artıyor
stableIsınma tamamlandı — tam kapasite gönderim (ör. 50.000/gün)
pausedIsınma duraklatıldı — geçici olarak gönderim dışı

Tipik plan: Gün 1'de 50 e-posta/gün ile başlanır, 30 günde stable seviyeye (50.000/gün) ulaşılır. SenderTR'nin yük dengeleyicisi warmup-aware'dir: günlük limitini doldurmuş sunucuları otomatik dışlar ve stable > warming > paused önceliğiyle sunucu seçer. Bu süreç platform tarafından otomatik yönetilir — tenant olarak ekstra bir işlem yapmanıza gerek yoktur.

IP İtibar Skoru (5 Bileşen)

Her gönderim IP'sinin itibarı 0–100 arası bir skorla ölçülür (yüksek = daha iyi). Skor, beş bileşenin ağırlıklı ortalamasıdır:

BileşenAğırlıkPuanlama
DNSBL Temizliği
Kara liste durumu
%3512 kara listeden kaçında olduğunuza göre: hiçbirinde = 100. Her listeleme skoru orantılı düşürür.
Bounce Oranı
Son 7 gün
%25<%2 → 100 · %2–5 → 70 · %5–10 → 40 · >%10 → 10
Şikayet Oranı
Spam complaint, son 7 gün
%20<%0,1 → 100 · %0,1–0,3 → 60 · >%0,3 → 20
Teslim Oranı
Son 7 gün
%10≥%95 → 100 · %90–95 → 70 · <%90 → 40
IP Yaşı / Warmup%10stable → 100 · warming gün 20+ → 80 · gün 10+ → 60 · gün <10 → 40

Toplam skor bir harf notuna dönüştürülür:

SkorNotDurum
90–100AMükemmel itibar
75–89Bİyi
60–74COrta — dikkat
40–59DZayıf — iyileştirme şart
0–39FKritik — gönderim riskli

Bounce ve Şikayet Eşikleri

Sağlayıcılar belirli eşikleri aşan göndericileri cezalandırır. SenderTR otomatik kötüye kullanım (abuse) tespiti yapar:

MetrikGüvenliKritik EşikSonuç
Bounce oranı< %2> %5İtibar düşer; eşik aşılırsa gönderim kimliği otomatik askıya alınabilir
Şikayet oranı< %0,1> %0,3Gmail/Yahoo gereksinimi; aşılırsa kredential askıya alınır
Hata (fail) oranı< %5> %10Otomatik durdurma tetiklenir
Kalıcı engelleme (suppression): Sert bounce (hard_bounce), şikayet (complaint) veya manuel engelleme alan adresler kalıcı olarak suppression listesine eklenir ve bir daha gönderim yapılmaz. Kişi silinip tekrar eklense bile koruma devam eder.

Gelen Kutusu Yerleşim Tahmini (Inbox Placement)

Kampanya göndermeden önce, SenderTR gelen kutusuna ulaşma olasılığınızı 0–100 arası bir skorla tahmin eder. Beş kontrol değerlendirilir:

KontrolNeye Bakar?
E-posta Kimlik DoğrulamaSPF, DKIM, DMARC sağlık skoru
İçerik KalitesiSpam filtre uyumluluğu (spam skoru analizi)
Gönderici İtibarıHesabınızın bounce ve şikayet oranları
Liste KalitesiDoğrulanmış (valid) kişi oranı
Teknik UyumlulukUnsubscribe linki, geçerli From adresi, konu satırı

Sonuç, başlıca sağlayıcılar için tahmin üretir:

Inbox SkoruTavsiye
≥ 80Gönderime hazır — yüksek ihtimalle gelen kutusu
60–79İyileştirme önerilir — olası inbox / spam riski
< 60Gönderim önerilmez — spam riski yüksek

Teslimatı Artırmak İçin İpuçları

1. Kaliteli liste kullanın. Satın alınmış listeler kullanmayın. Kişileri gönderim öncesi doğrulayın (MX + SMTP kontrolü), etkileşimsiz adresleri temizleyin.
2. Kademeli başlayın. Yeni hesapta birden çok büyük gönderim yapmayın; hacmi zamanla artırın (warmup mantığı tenant gönderiminde de geçerlidir).
3. DNS'i tam doğrulayın. Sağlık skoru 100 olmadan gönderim yapmayın.
4. Etkileşimi izleyin. Açmayan/tıklamayan segmentlere sürekli göndermek yerine yeniden etkileşim kampanyaları kurun; pasif adresleri elemden geçirin.
5. One-Click Unsubscribe (RFC 8058) her kampanyada otomatik eklenir — Gmail/Yahoo zorunluluğudur. Kullanıcıların kolayca çıkabilmesi şikayet oranını düşürür.

Raporlar & Analitik

Gönderim performansınızı kampanya, link, cihaz, coğrafi konum ve zaman bazında detaylı izleyin. Tüm metrikler tek bir merkezi tanım kaynağından (MetricsService) gelir, böylece dashboard, widget ve raporlar her zaman tutarlıdır.

Metrik Tanımları (Tüm Raporlarda Ortak)

Raporları doğru okumak için temel tanımlar:

MetrikTanım
Gönderilen (sent)SMTP'ye verilmiş tüm mesajlar: sent + delivered + bounced_hard + bounced_soft + complained + failed (sadece kuyrukta/atlanan hariç)
Teslim (delivered)Alıcı sunucu tarafından kabul edilmiş mesajlar
BounceGeri dönen: bounced_hard (kalıcı, geçersiz adres) + bounced_soft (geçici, kutu dolu vb.)
Şikayet (complained)Alıcının "spam" olarak işaretlediği mesajlar
Açılma (opens)Takip pikselinin tetiklendiği mesajlar — her mesaj bir kez sayılır (unique)
Tıklama (clicks)İçindeki en az bir linke tıklanmış mesajlar
Abonelik İptaliBu kampanya üzerinden abonelikten çıkanlar

Oranlar şu paydalarla hesaplanır:

OranFormülNot
Teslim oranıdelivered / sentBaşarılı teslim yüzdesi
Açılma oranıopens / deliveredBounce'lar paydaya alınmaz (teslim edilmediler)
Tıklama oranıclicks / deliveredBazı raporlarda clicks / opens (CTOR) gösterilir
Bounce oranıbounced / sentHard + soft toplamı
Şikayet oranıcomplained / delivered%0,3 altında tutulmalı

1. Kampanya Raporu

Raporlar → Kampanyalar. Tamamlanmış ve gönderilmekte olan kampanyaların özet tablosu: kampanya başına gönderilen, açılma %, tıklama %, bounce %, şikayet % ve tarih. Üstte tüm kampanyaların ortalamaları (özet) gösterilir. CSV olarak dışa aktarılabilir.

Kampanya Detay Raporu

Tek bir kampanyaya tıklayınca açılan derin analiz. İçeriği:

  • Dönüşüm hunisi (funnel): Gönderilen → Teslim → Açıldı → Tıklandı → Bounce → Şikayet → Abonelik iptali (sayılar ve oranlar).
  • Saatlik açılma grafiği: Günün 0–23 saatlerine göre açılma dağılımı.
  • Günlük açılma trendi: Son 14 günün açılma eğrisi.
  • Cihaz dağılımı: Masaüstü / mobil / tablet.
  • E-posta istemcisi: Gmail, Outlook, Apple Mail vb. (ilk 10).
  • Ülke dağılımı: Açılma + tıklamaların ülke koduna göre dağılımı (ilk 15).
  • En çok tıklanan linkler: Link bazlı toplam/benzersiz tıklama ve yüzde (ilk 10).
  • Açılma ve tıklama detayları: Adres, IP, ülke, şehir, cihaz, istemci, zaman (ilk 100).
  • Durum dağılımı & SMTP özeti: 250/221 başarı, fail, DSN (delivered/bounced/deferred) sayıları ve örnek mesaj logları.
A/B Testli kampanyalar için detaylı varyant karşılaştırması (istatistiksel anlamlılık / z-test, %95 güven aralığı) ayrıca gösterilir.

2. Link Tıklama Raporu (Heatmap)

Raporlar → Tıklamalar ve kampanya bazında Click Heatmap. Hangi linkin kaç kez tıklandığı, kaç benzersiz kişi tıkladığı ve toplam içindeki yüzdesi (CTR). En çok tıklanan linkler sıralanır — içeriğinizin hangi bölümünün ilgi çektiğini görürsünüz.

KolonAçıklama
URLTıklanan bağlantı
Toplam tıklamaTüm tıklamalar (aynı kişi birden çok tıklayabilir)
Benzersiz tıklamaFarklı kişi sayısı
YüzdeLinkin toplam tıklama içindeki payı

3. Cihaz & E-posta İstemcisi Raporu

Raporlar → Cihazlar. Tıklama/açılma verilerinden User-Agent ayrıştırılarak:

  • Cihaz tipi dağılımı: Masaüstü, mobil, tablet (pasta/çubuk grafik).
  • E-posta istemcisi dağılımı: En çok kullanılan 15 istemci (Gmail, Apple Mail, Outlook vb.).

Bu, içeriğinizi hangi cihaz/istemci için optimize etmeniz gerektiğini gösterir (ör. çoğunluk mobilse mobil uyumlu tasarım önceliklidir).

4. Coğrafi Rapor

Raporlar → Coğrafi. Tıklamaların GeoIP (yerel MaxMind GeoLite2 veritabanı, KVKK uyumlu) ile çözümlenmiş ülke ve şehir dağılımı. Ülke bazında toplam ve benzersiz kişi sayısı, şehir bazında ilk 20 — harita ve tablo olarak.

5. Zaman Analizi (Saatlik / Günlük)

Raporlar → Zaman Analizi. Açılmaların günün saatlerine (0–23) ve haftanın günlerine (Pzt–Paz) göre dağılımı. Bu, kampanyalarınızı en yüksek etkileşim aldığı zaman diliminde göndermenize yardımcı olur.

Send Time Optimization: Bu veriler aynı zamanda kişi bazlı "en iyi gönderim saati" hesabını (best_send_hour) besler; kampanya gönderiminde otomatik kullanılabilir.

6. Teslimat (Deliverability) Raporu

Raporlar → Deliverability. Hesap geneli teslimat sağlığı:

  • Teslim oranı, bounce oranı, şikayet oranı, gelen kutusu oranı.
  • Domain bazında SPF/DKIM/DMARC doğrulama durumu.
  • PDF olarak dışa aktarılabilir.

Şikayet Raporu

Son 30 günün günlük şikayet sayısı ve oranı (binde hassasiyetle), en çok şikayet alan kampanyalar. Şikayet oranınızı %0,3 kritik eşiğinin altında tutmanız için izleme aracıdır.

DMARC Aggregate Raporu

Alıcı sağlayıcılardan gelen DMARC (RUA) raporlarının özeti (son 30 gün):

  • SPF / DKIM geçme oranları ve hizalama (alignment) oranı (en az biri pass).
  • Disposition dağılımı: none / quarantine / reject.
  • Hizalanmayan kaynak IP'ler: Potansiyel spoofing/phishing tespiti için, sizin adınıza yetkisiz gönderim yapan en yüksek hacimli IP'ler listelenir.
Çoklu kiracı izolasyonu: Tüm raporlar yalnızca kendi hesabınızın verisini gösterir; sorgular tenant_id ile filtrelenir. Başka bir hesabın verisine erişim mümkün değildir.

Krediler & Faturalandırma

SenderTR kullandıkça-öde modeliyle çalışır: gönderilen her e-posta 1 kredi düşer ve krediler süresizdir (aylık abonelik zorunluluğu yoktur). Kayıt olunca hesabınıza 1.000 kredi hediye gelir.

Kredi Nedir?

İşlemKredi Maliyeti
Kampanya e-postası (1 alıcı)1 kredi
Transactional / API e-postası1 kredi
Otomasyon e-postası1 kredi
E-posta doğrulama (verification)Plana göre kredi düşebilir
Kampanya öncesi bakiye kontrolü: Bir kampanya gönderilmeden önce bakiyeniz alıcı sayısından azsa kampanya otomatik paused (duraklatılmış) duruma geçer. Gönderim sırasında bakiye sıfırlanırsa gönderim durur. Krediniz tükendiğinde kampanya ve transactional gönderimleri yapılamaz.

Bakiye & Kullanım Görüntüleme

Krediler sayfasında:

  • Güncel bakiye ve toplam satın alınan kredi.
  • İşlem geçmişi: Satın alma, kullanım (charge/debit), iade (refund), transactional/doğrulama kullanımı.
  • Kampanya bazında kullanım: En çok kredi harcayan ilk 10 kampanya.
  • Aylık trend: Son 6 ayın kredi kullanımı.
  • Bu ay kullanılan ve kullanım türü dağılımı (kampanya / transactional / doğrulama).
  • Günlük gönderim trendi (son 30 gün).
  • Günlük ortalama kullanım ve buna dayalı kalan gün tahmini (bakiye / günlük ortalama).
Kalan gün tahmini: Son 30 günün ortalama günlük kullanımına göre bakiyenizin yaklaşık kaç gün yeteceğini gösterir. Örn. günde 500 kredi harcıyorsanız ve 10.000 bakiyeniz varsa ≈ 20 gün.

Paket Satın Alma (PayTR)

Krediler PayTR altyapısıyla güvenli (3D Secure / iframe) şekilde alınır. Adımlar:

  1. Krediler → Paket Satın Al. Aktif paketler listelenir (kredi miktarı, bonus kredi, KDV'li/KDV'siz fiyat, 1.000 e-posta başına birim fiyat).
  2. Bir paket seçip "Satın Al"e basın. (Aynı paket için son 20 dakikada bekleyen bir isteğiniz varsa o yeniden kullanılır.)
  3. PayTR ödeme ekranına yönlendirilirsiniz. Kart bilgilerinizi doğrudan PayTR'ye girersiniz — SenderTR kart verisi saklamaz.
  4. Ödeme tamamlanınca PayTR sunucudan-sunucuya (callback) bildirim gönderir. İmza (HMAC-SHA256) ve tutar doğrulandıktan sonra krediler hesabınıza yüklenir.
  5. Başarı sayfasına dönersiniz. Callback birkaç saniye gecikirse "kredileriniz kısa süre içinde yüklenecek" mesajı görünür ve kısa süre sonra bakiye güncellenir.

Kredi Paketleri

PaketE-postaFiyat (+KDV %20)
Başlangıç10.000₺250
Standart50.000₺1.100
Profesyonel100.000₺1.900
İşletme250.000₺4.250
Kurumsal500.000₺7.500
Enterprise1.000.000+₺12.500 / özel

Bazı paketlerde bonus kredi ve "öne çıkan" rozeti olabilir. Güncel katalog ve fiyatlar satın alma sayfasında gösterilir.

Kota Uyarıları (%80 / %95 / %100)

Kredilerinizin bitmesiyle gönderimlerinizin aniden durmasını önlemek için, kullanım belirli eşiklere ulaştığında otomatik uyarı alırsınız. Uyarılar hem e-posta hem uygulama içi bildirim hem de dashboard banner'ı olarak Owner ve Admin'lere gönderilir.

EşikSeviyeMesaj
%80Uyarı"Kredi kullanımınız %80 seviyesinde" — kesintisiz hizmet için yeni paket düşünün.
%95Kritik"Krediniz tükenmek üzere" — gönderimleriniz durmadan önce paket alın.
%100Tükendi"Krediniz tükendi" — kampanya/transactional gönderimleri yapılamaz.
Tekrarlama önleme: Her eşik bir paket dönemi için yalnızca bir kez tetiklenir. Yeni paket aldığınızda uyarılar sıfırlanır ve yeni bütçeye göre yeniden izlenir. Kullanım yüzdesi (toplam satın alınan − bakiye) / toplam satın alınan ile hesaplanır.

İade Politikası

Kredi iadesi şu durumlarda gerçekleşir:

  • PayTR chargeback / iptal: Ödenmiş bir sipariş için PayTR iptal sinyali gönderirse, ilgili kredi otomatik geri alınır ve sipariş refunded işaretlenir.
  • Manuel iade (destek): Yönetici, belirli bir miktar veya tüm satın almayı iade edebilir.
KuralDavranış
Negatif bakiyeİade bakiyeyi negatife indirmez — mevcut bakiyeden fazlası talep edilirse yalnızca mevcut bakiye kadar düşülür.
İşlem kaydıHer iade için refund tipinde negatif tutarlı bir kredi hareketi oluşturulur (izlenebilirlik).
IdempotentZaten iade edilmiş bir satın alma tekrar iade edilmez.

Ekip & Roller

Hesabınıza ekip üyeleri davet ederek farklı yetki seviyeleriyle birlikte çalışın. Davetler e-posta ile gönderilir ve 7 gün geçerlidir.

Üye Davet Akışı

  1. Ayarlar → Ekip sayfasını açın. Mevcut üyeler ve bekleyen davetler listelenir.
  2. "Üye Davet Et": davet edilecek kişinin e-posta adresini girin ve bir rol seçin (Admin, Marketer, Uploader, Viewer).
  3. Sistem benzersiz bir davet token'ı (64 karakter) üretir ve 7 gün geçerli bir davet bağlantısı oluşturur.
  4. Davet edilen kişiye otomatik bir davet e-postası gider. (E-posta gönderilemese bile davet kaydı durur; bağlantıyı manuel paylaşabilirsiniz.)
  5. Kişi bağlantıya tıklar → davet kabul ekranı açılır. Yeni kullanıcıysa ad ve şifre belirleyerek hesap oluşturur ve otomatik giriş yapar; ekibinize katılır.
Akıllı kontroller:
  • Zaten ekipte olan bir e-posta tekrar davet edilemez.
  • Bekleyen (süresi geçmemiş) bir davet varsa ikinci davet engellenir.
  • Davet edilen e-posta başka bir hesaba bağlıysa kabul edilemez.
  • Süresi dolmuş davetler "expired" olarak görünür; iptal edip yeniden davet edebilirsiniz.

Davet Yönetimi

  • Davet iptali: Bekleyen bir daveti istediğiniz an iptal edebilirsiniz.
  • Üye kaldırma: Bir üyeyi ekipten çıkarabilirsiniz. Owner kaldırılamaz (hesap sahibi korunur).
  • Son giriş: Her üyenin son giriş zamanı listede gösterilir.

Roller ve Yetkiler

SenderTR'de 5 tenant rolü vardır. Her rolün yetki kapsamı:

RolYetki Kapsamı
Owner
(Hesap Sahibi)
Tam yetki. Hesabın sahibidir; faturalandırma, ekip yönetimi, tüm ayarlar dahil her şeye erişir. Kaldırılamaz. Hesap başına genelde bir Owner bulunur (kayıt olan kişi).
AdminFaturalandırma (kredi satın alma) dahil tüm yönetim işlemleri: ekip davet etme, ayarlar, domainler, kampanyalar, raporlar. Owner'a en yakın yetki. (Davet ile atanabilir.)
MarketerKampanya, otomasyon ve içerik (şablon) yönetimi. Pazarlama operasyonunu yürütür; faturalandırma ve ekip yönetimi yetkisi yoktur.
UploaderKişi ve liste yönetimi (içe aktarma, ekleme, düzenleme). Veri girişine odaklıdır; kampanya gönderme yetkisi sınırlıdır.
ViewerSalt görüntüleme. Raporları ve verileri görür ama değişiklik yapamaz, gönderim yapamaz. İzleme/denetim amaçlı idealdir.
En az ayrıcalık ilkesi: Her üyeye yalnızca işini yapması için gereken rolü verin. Örneğin dış ajansa Marketer, muhasebeye Viewer, veri ekibine Uploader rolü uygundur.

Webhook'lar (Panel Üzerinden)

Webhook, e-posta olaylarınızı (teslim, bounce, açılma vb.) kendi sisteminize anlık iletmenin yoludur. Bir olay gerçekleştiğinde SenderTR, belirttiğiniz URL'ye imzalı bir HTTP POST isteği gönderir — böylece CRM, ERP veya kendi uygulamanız gerçek zamanlı güncellenir.

Webhook Ekleme

  1. Ayarlar → Webhook'lar → "Yeni Webhook".
  2. Webhook URL'ini girin (geçerli bir https:// adresi, max 500 karakter). Bildirimler buraya POST edilir.
  3. Dinlemek istediğiniz olayları seçin (en az bir tane zorunlu).
  4. Kaydedin. Sistem size tek seferlik bir secret gösterir — bunu güvenli bir yere kaydedin (aşağıya bakın).
  5. İsterseniz "Test" butonu ile endpoint'inize örnek bir bildirim göndererek entegrasyonu doğrulayın.

Olay (Event) Türleri

EventEtiketNe Zaman Tetiklenir?
deliveredTeslim EdildiE-posta alıcı sunucu tarafından kabul edildiğinde
bouncedBounceE-posta geri döndüğünde (geçersiz adres, kutu dolu vb.)
openedAçıldıAlıcı e-postayı açtığında (takip pikseli)
clickedTıklandıAlıcı içindeki bir linke tıkladığında
unsubscribedAbonelik İptalAlıcı abonelikten çıktığında
complainedŞikayetAlıcı maili "spam" olarak işaretlediğinde

İstek Formatı

Her webhook isteği JSON gövde ile gelir ve aşağıdaki başlıkları taşır:

BaşlıkDeğer
Content-Typeapplication/json
X-Webhook-SignatureHMAC-SHA256 imzası
X-Event-TypeOlay türü (ör. delivered)
X-TimestampISO 8601 zaman damgası
User-AgentSenderTR-Webhook/1.0

Örnek gövde:

{
  "event": "clicked",
  "timestamp": "2026-06-01T17:30:00+03:00",
  "data": {
    "email": "musteri@example.com",
    "campaign_id": 123,
    "url": "https://sirketiniz.com/kampanya"
  }
}

İmza Doğrulama (HMAC-SHA256)

İsteğin gerçekten SenderTR'den geldiğini ve değiştirilmediğini doğrulamak için, gövdenin (raw body) HMAC-SHA256 imzasını secret'ınızla hesaplayıp X-Webhook-Signature başlığıyla karşılaştırın:

# PHP örneği
$payload   = file_get_contents('php://input');
$signature = hash_hmac('sha256', $payload, $secret);

if (hash_equals($signature, $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'])) {
    // Geçerli istek — işle
} else {
    http_response_code(401); // Sahte / değiştirilmiş istek
}
# Node.js örneği
const crypto = require('crypto');
const signature = crypto
  .createHmac('sha256', secret)
  .update(rawBody)
  .digest('hex');

if (signature === req.headers['x-webhook-signature']) {
  // Geçerli
}

Secret Yönetimi

Secret yalnızca bir kez gösterilir! Webhook oluşturduğunuzda veya secret'ı yenilediğinizde, 64 karakterlik secret ekranda tek seferlik görüntülenir. Sayfayı yenilediğinizde tekrar görüntülenemez. Hemen güvenli bir yere (parola yöneticisi, ortam değişkeni) kaydedin.
  • Secret Yenile: Secret'ı kaybettiyseniz veya sızdığından şüpheleniyorsanız "Secret Yenile" ile yeni bir tane üretin. Eski secret anında geçersiz olur — entegrasyonunuzu güncellemeyi unutmayın.

Yeniden Deneme (Retry) ve Otomatik Devre Dışı Bırakma

Endpoint'iniz geçici olarak ulaşılamaz olursa SenderTR teslimatı yeniden dener:

DavranışDetay
Deneme sayısı3 kez (artan beklemeyle: 10 sn → 60 sn → 300 sn)
Başarı kriteriEndpoint'iniz 2xx HTTP durum kodu dönmeli. Diğer kodlar başarısız sayılır.
Hata sayacıHer başarısızlıkta fail_count artar; başarılı teslimde sıfırlanır.
Otomatik devre dışı5 ardışık hatada webhook otomatik pasif hale gelir. Sorunu çözüp tekrar etkinleştirmeniz gerekir.
Zaman aşımıHer istek için 15 saniye. Endpoint'iniz hızlı (ideal < 5 sn) yanıt vermeli.
İpucu: Webhook'u hızlıca 200 OK ile yanıtlayıp ağır işlemleri (DB yazma, üçüncü parti çağrılar) arka plana atın. Yavaş yanıt zaman aşımına ve gereksiz retry'lara yol açar. Panelde her webhook için son tetiklenme zamanı ve hata sayısı görüntülenir.

Ayarlar

Hesabınızı dört kategoride yönetin: Hesap & Şirket, Entegrasyon & API, Güvenlik ve E-posta & Teslimat. Bu bölüm şirket bilgileri (yasal footer), API anahtarları ve güvenlik ayarlarını kapsar.

Şirket Bilgileri (Yasal Footer)

Ayarlar → Şirket Bilgileri. 6563 sayılı Kanun gereği her kampanyaya otomatik eklenen yasal footer için gereken bilgiler buradan girilir. Şirket tipinize göre footer içeriği değişir:

Şirket Tipi (company_type)Footer'da Gösterilen Zorunlu Alanlar
Tacir
(şirket / tüzel kişi)
Şirket adı + MERSİS No + Vergi No (VKN) + vergi dairesi + açık adres + iletişim bilgileri
Esnaf
(şahıs / gerçek kişi)
Ad soyad + T.C. Kimlik No (11 hane) + iletişim bilgileri

Girilebilen alanlar:

Alan Grubuİçerik
KimlikŞirket adı, vergi dairesi, vergi no, MERSİS no, T.C. kimlik no, şirket tipi, sektör
Yetkili kişiAd, telefon, e-posta
MuhasebeAd, telefon, e-posta
Teknik kişiAd, telefon, e-posta
Adresİl, ilçe, mahalle, cadde/sokak, bina no, daire no, posta kodu
Yasal izinlegal_consent_reason — alıcının e-postayı neden aldığını açıklayan metin (footer'daki "neden aldınız?" kutusunda gösterilir)
Eksik bilgi uyarısı: Yasal footer alanları eksikse kampanya oluştururken amber bir uyarı banner'ı görürsünüz. Şirket Bilgileri sayfasında canlı önizleme ve uyumluluk kontrolü ile footer'ın nasıl görüneceğini önceden görebilirsiniz. T.C. kimlik no tam 11 hane olmalıdır.

API Anahtarı Oluşturma

Ayarlar → API / Entegrasyon. REST API ve entegrasyonlar için anahtar üretin.

  1. Anahtara açıklayıcı bir ad verin (ör. "Üretim sunucusu", "CRM entegrasyonu").
  2. İsteğe bağlı olarak izinli IP listesi (allowed IPs) girin — yalnızca IPv4, her satıra bir adres. Belirtilirse anahtar yalnızca bu IP'lerden çalışır (ek güvenlik).
  3. Oluşturun. Anahtar str_ ön ekiyle üretilir (ör. str_xxxxxxxx...).
Anahtar yalnızca oluşturulurken bir kez gösterilir. Veritabanında yalnızca SHA-256 özeti saklanır; SenderTR ham anahtarı saklamaz ve tekrar gösteremez. Hemen güvenli bir yere kaydedin. Listede yalnızca anahtarın ilk 12 karakterlik ön eki (str_xxxxxxxx...) görünür.

Listede her anahtar için: ad, ön ek, oluşturma tarihi, son kullanım zamanı ve izinli IP sayısı gösterilir. Bir anahtarı istediğiniz an silebilirsiniz (anında devre dışı kalır).

Yetki Kapsamları (Scope)

API anahtarları belirli yetkilerle sınırlanabilir: send, verify, contacts:read, contacts:write, lists:read, lists:write, segments:read, campaigns:read, campaigns:write. Yetki dışı bir istek 403 insufficient_scope döner. Rate limit: transactional API 300/dk, genel API 60/dk.

Güvenlik

  • Şifre değiştirme: Hesap Bilgilerim sayfasından mevcut şifrenizi doğrulayarak yeni şifre belirleyin (min. 8 karakter).
  • Giriş geçmişi (Login History): Son 50 girişiniz — IP adresi, kaynak port, tarayıcı (User-Agent) ve zaman bilgisiyle. Başarılı, başarısız ve kayıt (register) girişleri 5651 sayılı Kanun uyumu için 24 ay saklanır. Tanımadığınız bir giriş görürseniz hemen şifrenizi değiştirin.
  • Tema: Açık / koyu (light/dark) tema tercihi.

Entegrasyon & Diğer

AyarAçıklama
Cloudflare API TokenEklerseniz domain DNS kayıtları (SPF/DKIM) Cloudflare'e otomatik kurulabilir. Token panelde maskelenir (••••••••); "Test" ile geçerliliği doğrulanır.
SMTP Kimlik BilgileriTransactional e-postaları SMTP relay üzerinden (smtp.sendertr.com:587, STARTTLS) göndermek için kullanıcı adı/şifre.
DMARC RehberiHer domain için hazır SPF/DKIM/DMARC/BIMI kayıt değerlerinin gösterildiği yardımcı sayfa.

Bildirim Tercihleri

Ayarlar → Bildirimler. Hangi olaylarda e-posta/uygulama içi bildirim alacağınızı seçin:

  • Kampanya tamamlandı, kampanya reddedildi
  • Günlük rapor, haftalık rapor
  • Bounce uyarısı, şikayet uyarısı
  • Düşük kredi uyarısı, yeni ekip üyesi
KVKK md.11 hakları: Hesabınızdaki kişisel verileri dışa aktarabilir (/my-data/export) veya silinme/anonimleştirme talep edebilirsiniz. Tüm veriler Türkiye'deki sunucularda saklanır ve yurt dışına çıkmaz.

API Genel Bakış

SenderTR REST API ile transactional e-posta gönderebilir, e-posta adreslerini doğrulayabilir, e-ticaret olaylarını otomasyonlara aktarabilir ve pazarlama verilerinizi (kişi, liste, segment, kampanya) programatik olarak yönetebilirsiniz.

Temel URL

Tüm endpoint'ler v1 öneki altındadır:

https://api.sendertr.com/v1
Yol biçimi: Bu dokümandaki yollar /send şeklinde kısaltılmıştır; tam URL her zaman https://api.sendertr.com/v1/send olur.

İçerik tipi

İstek ve yanıt gövdeleri her zaman JSON'dır. Gövdeli isteklerde (POST/PUT) aşağıdaki başlığı gönderin:

Content-Type: application/json
Accept: application/json

Accept: application/json başlığı, hata durumunda HTML yerine JSON dönmesini garanti eder (özellikle 419/500 sayfaları için önerilir).

Kimlik doğrulama özeti

Her istek bir API anahtarı ile yetkilendirilir. Anahtarı iki yoldan biriyle gönderebilirsiniz:

Authorization: Bearer YOUR_API_KEY
# veya
X-Api-Key: YOUR_API_KEY

Detaylar ve yetki kapsamları (scope) için Kimlik Doğrulama bölümüne bakın.

Rate limit (hız sınırı)

Limitler dakika başına, anahtar/IP bazında uygulanır. Aşımda 429 Too Many Requests döner.

Limit grubuSınırKapsam (endpoint)
transactional-api300 / dakikaPOST /send
api60 / dakikaDoğrulama, mesaj durumu, e-ticaret webhook ve tüm Marketing CRUD endpoint'leri
login5 / dakikaPanel oturum açma (API değil, referans amaçlı)
İki ayrı limit vardır: Yukarıdaki dakikalık HTTP rate limit'in yanı sıra, her SMTP/API kimliğinin bir günlük gönderim limiti (daily_limit) vardır. Transactional gönderimde günlük limit Redis ile atomik sayılır; aşımda 429 daily_limit_exceeded döner. Bkz. Transactional.

Versiyonlama

API sürümü URL yolundadır: /v1/.... Geriye dönük uyumu bozan değişiklikler yeni bir sürüm öneki (/v2) ile yayınlanır; v1 yaşam döngüsü boyunca desteklenir.

Geriye dönük uyum & yetkiler

Eski anahtarlar: Yetki (abilities) tanımlanmamış (NULL/boş) anahtarlar yalnızca send ve verify işlemleri yapabilir. Marketing CRUD endpoint'lerini kullanmak için anahtara ilgili yetkinin açıkça eklenmesi gerekir.

İzolasyon

Her API anahtarı yalnızca kendi hesabınıza (tenant) ait verilere erişir. Tüm sorgular hesap kimliğiyle açıkça filtrelenir; başka bir hesabın kayıt ID'si istenirse 404 döner (IDOR koruması).

Kimlik Doğrulama

SenderTR API, hesabınıza bağlı bir API anahtarı (SMTP/API credential) ile yetkilendirilir. Anahtar bir SMTP kimliğine ve bir gönderim alan adına (sending domain) bağlıdır.

API anahtarı nasıl alınır?

  1. Panele girin: app.sendertr.com.
  2. Ayarlar → API / Entegrasyon bölümüne gidin.
  3. Yeni bir SMTP/API kimliği oluşturun; bir gönderim alan adı (DNS doğrulanmış) seçin.
  4. Oluşan api_key değerini kopyalayın. Bu değer yalnızca bir kez gösterilir.
  5. İsteğe bağlı: anahtara yetki kapsamları (scope) ve izinli IP listesi atayın.

Anahtarı gönderme

Aşağıdaki iki başlıktan biri kullanılabilir (ikisi de aynı anahtarı taşır):

# Önerilen
Authorization: Bearer skk_live_xxxxxxxxxxxxxxxxxxxxxxxx

# Alternatif
X-Api-Key: skk_live_xxxxxxxxxxxxxxxxxxxxxxxx

Yetki kapsamları (abilities / scope)

Her endpoint belirli bir yetkiye sahip anahtar gerektirir. Anahtarınıza panelden bu yetkileri atarsınız. Tanınan yetkiler:

Yetkiİzin verdiği işlem
sendTransactional e-posta gönderimi (POST /send), mesaj durumu/listeleme
verifyE-posta doğrulama (POST /verify, /verify/bulk)
contacts:readKişileri listele/görüntüle
contacts:writeKişi oluştur/güncelle/sil
lists:readListeleri listele/görüntüle
lists:writeListe oluştur/güncelle/sil
segments:readSegmentleri listele/görüntüle (segment yazma yoktur)
campaigns:readKampanyaları listele/görüntüle
campaigns:writeTaslak kampanya oluştur
*Tüm yetkiler (joker)
Yetki dışı istek: Anahtar gerekli yetkiye sahip değilse 403 insufficient_scope döner ve yanıt required_ability alanında eksik yetkiyi bildirir.

IP kısıtlaması (opsiyonel)

Anahtara izinli IP listesi tanımlarsanız, listede olmayan bir IP'den gelen istek 403 ip_not_allowed döner. Üretim sunucularınızın çıkış IP'lerini eklemeniz önerilir.

Güvenlik — anahtar saklama

  • API anahtarını asla istemci tarafı (tarayıcı/JS, mobil uygulama) koduna gömmeyin. Anahtar yalnızca sunucu tarafında kullanılmalıdır.
  • Anahtarı ortam değişkeninde (.env) veya gizli yönetim servisinde saklayın; sürüm kontrolüne (git) eklemeyin.
  • Sızıntı şüphesinde panelden anahtarı pasifleştirin ve yenisini oluşturun.
  • Mümkünse anahtara yalnızca ihtiyaç duyduğu yetkileri ve izinli IP listesini atayın (en az ayrıcalık ilkesi).

Doğrulama hatası örnekleri

// Anahtar eksik
HTTP/1.1 401 Unauthorized
{ "error": "unauthorized", "message": "API key gerekli. X-Api-Key header veya Bearer token kullanın." }

// Geçersiz/pasif anahtar
HTTP/1.1 401 Unauthorized
{ "error": "invalid_api_key", "message": "Geçersiz veya deaktif API anahtarı." }

// Hesap pasif
HTTP/1.1 403 Forbidden
{ "error": "tenant_inactive", "message": "Hesabınız aktif değil." }

// IP izinli değil
HTTP/1.1 403 Forbidden
{ "error": "ip_not_allowed", "message": "Bu IP adresinden erişim izniniz yok." }

// Yetki yetersiz
HTTP/1.1 403 Forbidden
{ "error": "insufficient_scope", "message": "Bu API anahtarı 'contacts:write' yetkisine sahip değil.", "required_ability": "contacts:write" }

Transactional E-posta Gönderimi

Sipariş onayı, şifre sıfırlama, OTP gibi işlemsel e-postaları tek istekte gönderin. Gönderim asenkron kuyruğa alınır; yanıt anında döner.

POST /send

Tek bir alıcıya transactional e-posta gönderir. Yetki: send. Rate limit: 300/dk.

İstek alanları

AlanTipZorunluAçıklama
tostring (email)EvetAlıcı e-posta adresi.
subjectstringEvetKonu satırı. Maks. 500 karakter.
htmlstringKoşulluHTML gövde. text yoksa zorunlu.
textstringKoşulluDüz metin gövde. html yoksa zorunlu.
from_emailstring (email)HayırGönderen adresi. Boşsa noreply@<gönderim-alanı> kullanılır.
from_namestringHayırGönderen görünen adı. Boşsa hesap adınız kullanılır. Maks. 255.
reply_tostring (email)HayırYanıtla adresi.
headersobjectHayırEk özel başlıklar (anahtar→değer).
tagsarrayHayırRaporlama/filtreleme için etiketler.
metadataobjectHayırSerbest anahtar→değer üst veri (logta saklanır).
HTML veya text: En az birini göndermelisiniz (required_without). İkisini birden göndermeniz multipart (HTML + düz metin) e-posta için önerilir.

cURL örneği

curl -X POST https://api.sendertr.com/v1/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "to": "musteri@example.com",
    "from_email": "siparis@sirketiniz.com",
    "from_name": "Sirketiniz",
    "subject": "Siparisiniz alindi (#10234)",
    "html": "<h1>Tesekkurler!</h1><p>Siparisiniz hazirlaniyor.</p>",
    "text": "Tesekkurler! Siparisiniz hazirlaniyor.",
    "reply_to": "destek@sirketiniz.com",
    "tags": ["order", "confirmation"],
    "metadata": { "order_id": "10234" }
  }'

Başarılı yanıt

E-posta kuyruğa alınır ve 202 Accepted döner:

HTTP/1.1 202 Accepted
{
  "success": true,
  "message_id": "8f3c0c1e-...-9a2b@sirketiniz.com",
  "status": "queued"
}

message_id değerini saklayın; gönderim durumunu sorgulamak için kullanılır.

Hata yanıtları

// Doğrulama hatası (eksik/yanlış alan)
HTTP/1.1 422 Unprocessable Content
{ "message": "...", "errors": { "to": ["The to field is required."] } }

// Günlük gönderim limiti doldu
HTTP/1.1 429 Too Many Requests
{ "error": "daily_limit_exceeded", "message": "Günlük gönderim limitiniz doldu.", "limit": 5000, "used": 5000 }

// Alıcı suppression listesinde
HTTP/1.1 422 Unprocessable Content
{ "error": "recipient_suppressed", "message": "Bu alıcı suppression listesinde (hard_bounce).", "limit": null, "used": null }

// Yetersiz kredi
HTTP/1.1 402 Payment Required
{ "error": "insufficient_credit", "message": "Yetersiz kredi." }

// Hesap/kimlik pasif
HTTP/1.1 403 Forbidden
{ "error": "tenant_inactive", "message": "Hesabınız aktif değil." }

Gönderim ön kontrolleri (validator)

Her /send isteği sırayla şu kontrollerden geçer; ilk başarısızlıkta yukarıdaki ilgili hata döner:

  1. Hesap aktif mi? (tenant_inactive → 403)
  2. API/SMTP kimliği aktif mi? (credential_inactive → 403)
  3. Günlük limit (Redis ile atomik sayım). (daily_limit_exceeded → 429)
  4. Alıcı suppression listesinde mi? (recipient_suppressed → 422)
  5. Kredi bakiyesi yeterli mi? (insufficient_credit → 402)
Suppression davranışı (önemli): Transactional gönderimde yalnızca hard_bounce, complaint ve manual nedenli suppression alıcıyı engeller. Abonelikten çıkma (unsubscribe) transactional e-postayı engellemez — şifre sıfırlama gibi işlemsel mailler her zaman gönderilir. (Marketing kampanyalarında ise tüm nedenler engeller.)

Günlük limit

Her API/SMTP kimliğinin bir daily_limit değeri vardır (panelden görülür). Sayaç her gün 00:00'da (Europe/Istanbul) sıfırlanır. Limit aşımında HTTP 429 ve daily_limit_exceeded hatası döner; yanıt limit ve used alanlarını içerir.

GET /messages/{messageId}

Tek bir transactional mesajın güncel durumunu döndürür. Yetki: send. Rate limit: 60/dk.

cURL

curl https://api.sendertr.com/v1/messages/8f3c0c1e-...-9a2b@sirketiniz.com \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Başarılı yanıt

HTTP/1.1 200 OK
{
  "message_id": "8f3c0c1e-...-9a2b@sirketiniz.com",
  "to": "musteri@example.com",
  "subject": "Siparisiniz alindi (#10234)",
  "status": "delivered",
  "sent_at": "2026-06-01T14:05:12+03:00",
  "opened_at": "2026-06-01T14:09:40+03:00",
  "clicked_at": null,
  "created_at": "2026-06-01T14:05:10+03:00"
}

Olası status değerleri: queued, sending, delivered, bounced, failed, complained. Mesaj bulunamazsa 404 { "error": "not_found" }.

GET /messages

Hesabınızın transactional mesajlarını sayfalı listeler. Yetki: send.

Sorgu parametreleri

ParametreAçıklama
statusDuruma göre filtre (queued, delivered, ...).
fromBaşlangıç tarihi (YYYY-MM-DD), created_at >=.
to_dateBitiş tarihi (YYYY-MM-DD), created_at <=.
per_pageSayfa başına kayıt (varsayılan 25).
curl "https://api.sendertr.com/v1/messages?status=delivered&from=2026-06-01&per_page=50" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Accept: application/json"

Yanıt, Laravel sayfalama yapısında döner (data, current_page, total, last_page, ...).

SMTP alternatifi: API yerine SMTP protokolü tercih ediyorsanız aynı transactional e-postaları SMTP Relay üzerinden gönderebilirsiniz. İki yol da aynı ön kontrollerden (limit, suppression, kredi) geçer.

E-posta Doğrulama API

Adresleri gönderim öncesi doğrulayın: söz dizimi, MX kaydı, SMTP el sıkışması, geçici (disposable) servis, rol adresi, catch-all ve spam-trap tespiti. Tüm kontroller lokal yapılır — dış servise veri gitmez (KVKK uyumlu).

POST /verify

Tek bir adresi doğrular. Yetki: verify. Rate limit: 60/dk.

İstek alanları

AlanTipZorunluAçıklama
emailstring (email)EvetDoğrulanacak e-posta adresi.

cURL

curl -X POST https://api.sendertr.com/v1/verify \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "email": "test@example.com" }'

Başarılı yanıt

HTTP/1.1 200 OK
{
  "email": "test@example.com",
  "result": "valid",
  "score": 95,
  "mx_found": true,
  "smtp_check": true,
  "smtp_message": "250 OK",
  "is_disposable": false,
  "is_role_based": false,
  "is_catch_all": false,
  "is_spam_trap": false
}

Yanıt alanları

AlanTipAçıklama
resultstringSonuç kategorisi (aşağıdaki tablo).
scoreinteger0–100 güven puanı (yüksek = daha güvenli).
mx_foundbooleanAlan adının MX kaydı var mı.
smtp_checkbooleanSMTP el sıkışması başarılı mı.
smtp_messagestringSMTP sunucu yanıtı (tanılama).
is_disposablebooleanTek kullanımlık adres servisi mi.
is_role_basedbooleanRol adresi mi (info@, satis@ ...).
is_catch_allbooleanAlan adı catch-all mı.
is_spam_trapbooleanSpam-trap şüphesi var mı.

result kategorileri

DeğerAnlam
validAdres geçerli ve teslim edilebilir görünüyor.
invalidSöz dizimi hatalı, MX yok veya SMTP reddetti.
riskyBelirsiz/riskli (ör. greylisting, catch-all olasılığı).
disposableTek kullanımlık (geçici) e-posta servisi.
catch_allAlan adı her adresi kabul ediyor; teslim garanti değil.
spam_trapSpam-trap şüphesi — gönderim yapmayın.
unknownSMTP sunucu net yanıt vermedi, belirsiz.

POST /verify/bulk

Birden çok adresi tek istekte doğrular. Yetki: verify. İstek başına en fazla 100 adres.

İstek alanları

AlanTipZorunluAçıklama
emailsarrayEvetE-posta dizisi. Maks. 100 eleman.
emails.*string (email)EvetHer eleman geçerli e-posta olmalı.

cURL

curl -X POST https://api.sendertr.com/v1/verify/bulk \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "emails": ["a@example.com", "b@example.com"] }'

Başarılı yanıt

HTTP/1.1 200 OK
{
  "results": [
    { "email": "a@example.com", "result": "valid",   "score": 92, "mx_found": true,  "smtp_check": true,  "is_disposable": false, "is_role_based": false, "is_catch_all": false, "is_spam_trap": false },
    { "email": "b@example.com", "result": "invalid", "score": 5,  "mx_found": false, "smtp_check": false, "is_disposable": false, "is_role_based": false, "is_catch_all": false, "is_spam_trap": false }
  ]
}
100'den fazla adres gönderilirse 422 doğrulama hatası döner. Daha büyük listeleri 100'erlik parçalara bölerek gönderin.

Kredi maliyeti

Doğrulama sonuçları hesabınıza kaydedilir. Doğrulama API'si transactional gönderim kredisini tüketmez; gönderim kredisi yalnızca e-posta gönderiminde (1 e-posta = 1 kredi) düşer.

Marketing CRUD API

Kişi, liste, segment ve kampanyalarınızı programatik yönetin. Tüm endpoint'ler 60/dk rate limit'e tabidir ve ilgili yetki kapsamını (scope) gerektirir. Her istek yalnızca kendi hesabınızın verisine erişir; başka hesabın ID'si → 404.

Sayfalama ve yanıt zarfı

Listeleme endpoint'leri tutarlı bir zarf döndürür:

{
  "data": [ { ... }, { ... } ],
  "meta": {
    "current_page": 1,
    "per_page": 25,
    "total": 134,
    "last_page": 6,
    "from": 1,
    "to": 25
  }
}

Tekil kayıt endpoint'leri { "data": { ... } } döndürür. per_page parametresi 1–100 aralığında olabilir (varsayılan 25).

Kişiler (Contacts)

GET /contacts

Yetki: contacts:read. Kişileri sayfalı listeler.

Sorgu parametresiTipAçıklama
list_idintegerBelirli bir listedeki kişiler (liste de hesabınıza ait olmalı).
statusstringactive, unsubscribed, bounced, complained, suppressed.
searchstringE-posta, ad veya soyadda arama. Maks. 255.
per_pageinteger1–100, varsayılan 25.
curl "https://api.sendertr.com/v1/contacts?status=active&search=ahmet&per_page=50" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Accept: application/json"
HTTP/1.1 200 OK
{
  "data": [
    {
      "id": 4821,
      "email": "ahmet@example.com",
      "first_name": "Ahmet",
      "last_name": "Yılmaz",
      "phone": "+905xxxxxxxxx",
      "city": "İstanbul",
      "status": "active",
      "source": "api",
      "custom_fields": { "plan": "pro" },
      "engagement_score": 72,
      "verification_status": "valid",
      "opt_in_status": "confirmed",
      "created_at": "2026-05-20T10:11:00+03:00",
      "updated_at": "2026-05-28T08:00:00+03:00"
    }
  ],
  "meta": { "current_page": 1, "per_page": 50, "total": 1, "last_page": 1, "from": 1, "to": 1 }
}

GET /contacts/{id}

Yetki: contacts:read. Tek kişiyi, üye olduğu listelerle birlikte döndürür. Bulunamazsa 404.

HTTP/1.1 200 OK
{ "data": { "id": 4821, "email": "ahmet@example.com", "...": "...", "lists": [ { "id": 12, "name": "Bülten" } ] } }

POST /contacts

Yetki: contacts:write. E-posta bazlı upsert: aynı e-posta varsa günceller, yoksa oluşturur. Yeni oluşturulursa 201, güncellenirse 200 döner.

AlanTipZorunluAçıklama
emailstring (email)EvetKişinin e-postası. Maks. 255.
first_namestringHayırMaks. 100.
last_namestringHayırMaks. 100.
phonestringHayırMaks. 20.
citystringHayırMaks. 100.
custom_fieldsobjectHayırSerbest anahtar→değer alanları.
list_idsarray(int)HayırEklenecek liste ID'leri (hesabınıza ait olmalı; mevcut üyelikler korunur).
curl -X POST https://api.sendertr.com/v1/contacts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "yeni@example.com",
    "first_name": "Yeni",
    "last_name": "Kullanıcı",
    "custom_fields": { "plan": "trial" },
    "list_ids": [12, 15]
  }'
HTTP/1.1 201 Created
{ "data": { "id": 5012, "email": "yeni@example.com", "...": "...", "lists": [ { "id": 12, "name": "Bülten" }, { "id": 15, "name": "Kampanya" } ] } }
Suppression koruması: Daha önce abonelikten çıkmış / suppression listesindeki bir adresi tekrar eklerseniz işlem kaydedilir ancak adres suppression korumasını korur — pazarlama gönderiminde yine engellenir.

PUT /contacts/{id}

Yetki: contacts:write. Var olan kişiyi günceller. Tüm alanlar opsiyoneldir (gönderilen güncellenir).

AlanTipAçıklama
emailstringBenzersiz olmalı (hesap içinde).
first_name / last_name / phone / citystringProfil alanları.
statusstringactive, unsubscribed, bounced, complained, suppressed.
custom_fieldsobjectÖzel alanlar.
list_idsarray(int)Gönderilirse liste üyelikleri tamamen bununla değiştirilir (sync).
curl -X PUT https://api.sendertr.com/v1/contacts/5012 \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{ "city": "Ankara", "list_ids": [12] }'

DEL /contacts/{id}

Yetki: contacts:write. Kişiyi siler (liste bağları çözülür).

HTTP/1.1 200 OK
{ "data": { "deleted": true, "id": 5012 } }

Listeler (Lists)

GET /lists

Yetki: lists:read. Parametreler: search, per_page. Her liste üye sayısı (member_count) ile döner.

HTTP/1.1 200 OK
{ "data": [ { "id": 12, "name": "Bülten", "description": null, "is_tacir_list": false, "member_count": 3120, "created_at": "...", "updated_at": "..." } ], "meta": { "...": "..." } }

GET /lists/{id}

Yetki: lists:read. Tek liste. Bulunamazsa 404.

POST /lists

Yetki: lists:write. Yeni liste oluşturur (201).

AlanTipZorunluAçıklama
namestringEvetListe adı. Maks. 255. %, &, /, ^ gibi özel karakterler kullanılamaz.
descriptionstringHayırAçıklama. Maks. 1000.
is_tacir_listbooleanHayırTacir (kurumsal) listesi mi. Varsayılan false.
curl -X POST https://api.sendertr.com/v1/lists \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{ "name": "Haziran Kampanyası", "description": "Yaz indirimi listesi" }'

PUT /lists/{id}

Yetki: lists:write. name (opsiyonel ama gönderilirse zorunlu+geçerli), description, is_tacir_list güncellenir.

DEL /lists/{id}

Yetki: lists:write. Listeyi siler (kişi bağları çözülür, kişiler silinmez). Yanıt: { "data": { "deleted": true, "id": 12 } }.

Listeye kişi ekleme: Ayrı bir endpoint yoktur. Kişiyi POST /contacts (mevcut üyelikler korunur) veya PUT /contacts/{id} (üyelikleri değiştirir) ile list_ids alanını kullanarak listeye ekleyin/çıkarın.

Segmentler (Segments)

Segmentler salt okunurdur (API ile oluşturulamaz/düzenlenemez).

GET /segments

Yetki: segments:read. Parametreler: search, per_page.

HTTP/1.1 200 OK
{ "data": [ { "id": 7, "name": "Aktif İstanbul", "estimated_count": 940, "created_at": "...", "updated_at": "..." } ], "meta": { "...": "..." } }

GET /segments/{id}

Yetki: segments:read. Tek segment + rules (kural tanımları) döner.

Kampanyalar (Campaigns)

Önemli: API ile yalnızca taslak (draft) kampanya oluşturulur. Onay/gönderim akışı (gönder → incele → onayla → gönder) panel üzerinden yürür; API ile doğrudan gönderim tetiklenmez.

GET /campaigns

Yetki: campaigns:read. Parametreler: status, search, per_page.

HTTP/1.1 200 OK
{
  "data": [
    {
      "id": 88, "name": "Yaz İndirimi", "subject": "%30'a varan indirim",
      "from_email": "kampanya@sirketiniz.com", "from_name": "Sirketiniz",
      "message_type": "marketing", "status": "draft", "status_label": "Taslak",
      "total_recipients": 0, "sent_count": 0,
      "scheduled_at": null, "started_at": null, "completed_at": null,
      "created_at": "...", "updated_at": "..."
    }
  ],
  "meta": { "...": "..." }
}

GET /campaigns/{id}

Yetki: campaigns:read. Tek kampanya + detaylı istatistikler (stats) ve settings döner.

HTTP/1.1 200 OK
{
  "data": {
    "id": 88, "name": "Yaz İndirimi", "status": "completed",
    "stats": {
      "sent": 3120, "delivered": 3080, "opens": 1450, "unique_opens": 1190,
      "clicks": 320, "unique_clicks": 270, "bounces_hard": 12, "bounces_soft": 28,
      "complaints": 1, "unsubscribes": 9
    },
    "settings": { "list_ids": [12], "segment_ids": [] }
  }
}

POST /campaigns

Yetki: campaigns:write. Yeni taslak kampanya oluşturur (201, durum draft).

AlanTipZorunluAçıklama
namestringEvetKampanya adı. Maks. 255.
subjectstringEvetKonu. Maks. 500.
from_emailstring (email)EvetGönderen adresi.
from_namestringEvetGönderen adı.
reply_tostring (email)HayırYanıtla adresi.
html_contentstringHayırHTML içerik.
message_typestringHayırmarketing (varsayılan), transactional, system.
sending_domain_idintegerHayırHesabınıza ait gönderim alan adı ID'si.
list_idsarray(int)HayırHedef liste ID'leri (hesabınıza ait).
segment_idsarray(int)HayırHedef segment ID'leri (hesabınıza ait).
curl -X POST https://api.sendertr.com/v1/campaigns \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "name": "Yaz İndirimi",
    "subject": "%30'\''a varan indirim",
    "from_email": "kampanya@sirketiniz.com",
    "from_name": "Sirketiniz",
    "html_content": "<h1>İndirim başladı</h1>",
    "list_ids": [12]
  }'

Oluşan kampanyayı göndermek için panele girip onaya göndermeniz gerekir.

Webhook'lar

İki yönlü webhook desteği: Giden webhook'larla e-posta olaylarını kendi sisteminize anlık iletiriz; gelen e-ticaret webhook'larıyla mağaza olaylarınızı (sipariş/sepet) otomasyonlara aktarırsınız.

Giden Webhook'lar (SenderTR → sizin sunucunuz)

Panelden Ayarlar → Webhook'lar bölümünde bir endpoint URL'i ve dinlenecek olayları tanımlarsınız. Olay gerçekleştiğinde sunucunuza POST isteği gönderilir.

Event türleri

delivered, bounced, opened, clicked, unsubscribed, complained

Gönderilen başlıklar

BaşlıkAçıklama
Content-Typeapplication/json
X-Webhook-SignatureGövdenin HMAC-SHA256 imzası (hex). Doğrulama için kullanın.
X-Event-TypeOlay türü (ör. delivered).
X-TimestampGönderim zamanı (ISO 8601).
User-AgentSenderTR-Webhook/1.0

Payload yapısı

POST https://sizin-sunucunuz.com/webhooks/sendertr
Content-Type: application/json
X-Webhook-Signature: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
X-Event-Type: opened
X-Timestamp: 2026-06-01T14:09:40+03:00
User-Agent: SenderTR-Webhook/1.0

{
  "event": "opened",
  "timestamp": "2026-06-01T14:09:40+03:00",
  "data": {
    "campaign_id": 88,
    "contact_email": "musteri@example.com",
    "message_id": "8f3c0c1e-...-9a2b",
    "opened_at": "2026-06-01T14:09:40+03:00"
  }
}

Tüm payload'lar aynı üst yapıyı taşır: event, timestamp ve olaya özgü alanları içeren data nesnesi.

İmza doğrulama (HMAC-SHA256)

İmza, ham istek gövdesinin (raw body) webhook secret'ınızla HMAC-SHA256'sıdır. Secret webhook oluştururken bir kez gösterilir.

// PHP
$payload   = file_get_contents('php://input');
$signature = hash_hmac('sha256', $payload, $secret);

if (!hash_equals($signature, $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '')) {
    http_response_code(401);
    exit('Geçersiz imza');
}

$data = json_decode($payload, true);
// $data['event'], $data['data'] ...
// Node.js (Express, express.raw ile)
const crypto = require('crypto');

app.post('/webhooks/sendertr', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = crypto.createHmac('sha256', SECRET).update(req.body).digest('hex');
  const received  = req.get('X-Webhook-Signature') || '';

  if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(received))) {
    return res.status(401).send('Geçersiz imza');
  }

  const payload = JSON.parse(req.body.toString());
  // payload.event, payload.data ...
  res.sendStatus(200);
});
Önemli: İmzayı her zaman ham gövde üzerinden hesaplayın (JSON'u parse edip yeniden serialize etmeyin — boşluk/sıra farkı imzayı bozar). Karşılaştırmada sabit-zamanlı fonksiyon (hash_equals / timingSafeEqual) kullanın.

Yeniden deneme (retry) ve devre dışı bırakma

  • Başarısız teslimatlar 3 kez yeniden denenir; geri çekilme (backoff) aralıkları: 10s, 60s, 300s.
  • Sunucunuz 2xx dışı yanıt verirse veya zaman aşımına uğrarsa (15s) deneme başarısız sayılır.
  • 5 ardışık hatadan sonra webhook otomatik olarak devre dışı bırakılır (panelden tekrar aktifleştirebilirsiniz).
  • Başarılı teslimat hata sayacını sıfırlar.

Hızlı yanıt verin: işlemi asenkron yapıp hemen 200 dönmeniz, zaman aşımı kaynaklı gereksiz retry'ları önler.

Gelen E-ticaret Webhook'ları (mağazanız → SenderTR)

POST /webhooks/ecommerce — Mağaza olaylarınızı SenderTR'ye iletin; eşleşen e-ticaret tetikleyicili otomasyonlara kişi otomatik kaydedilir. Yetki: API anahtarı (auth gerekli). Rate limit: 60/dk.

Üç format desteklenir

1) Generic, 2) WooCommerce (native), 3) Shopify (native). Hangi formatın geldiği gönderilen başlıklarla anlaşılır.

1) Generic format

AlanZorunluAçıklama
eventEvetOlay adı (aşağıdaki tablo).
emailEvetMüşteri e-postası.
first_name / last_nameHayırMüşteri adı.
dataHayırSerbest olay verisi (kişiye last_ecommerce_data olarak işlenir).
curl -X POST https://api.sendertr.com/v1/webhooks/ecommerce \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "event": "order.completed",
    "email": "musteri@example.com",
    "first_name": "Ahmet",
    "data": { "order_id": "10234", "total": 499.90 }
  }'

Desteklenen olaylar ve otomasyon tetikleyici eşlemesi

Gelen eventOtomasyon tetikleyici
order.createdorder_completed
order.completedorder_completed
cart.abandonedcart_abandoned
customer.createdcustomer_created

2) WooCommerce (native)

X-WC-Webhook-Topic başlığı ile gelir; e-posta billing.email alanından okunur. Topic eşlemesi: order.created→sipariş, order.updatedorder.completed, customer.created.

3) Shopify (native)

X-Shopify-Topic başlığı ile gelir; e-posta email veya customer.email alanından okunur. Topic eşlemesi: orders/createorder.created, orders/paid & orders/fulfilledorder.completed, checkouts/createcart.abandoned, customers/createcustomer.created.

Başarılı yanıt

HTTP/1.1 200 OK
{
  "ok": true,
  "contact_id": 5012,
  "event": "order.completed",
  "platform": "generic",
  "enrolled": 1
}

enrolled = bu olayla kişinin kaydedildiği otomasyon sayısı. Eşleşen tetikleyici yoksa kişi yine oluşturulur/güncellenir ama enrolled: 0 döner.

Hata yanıtı

HTTP/1.1 422 Unprocessable Content
{ "error": "invalid_payload", "message": "event + email gerekli (generic) veya desteklenen WooCommerce/Shopify webhook başlığı." }

HTTP/1.1 422 Unprocessable Content
{ "error": "invalid_email" }

SMTP Relay

REST API yerine standart SMTP protokolünü tercih ediyorsanız, transactional e-postalarınızı SenderTR SMTP relay üzerinden gönderebilirsiniz. Mevcut SMTP uyumlu kütüphane/uygulamalarınızla çalışır.

Bağlantı ayarları

AyarDeğer
Sunucu (host)smtp.sendertr.com
Port587 (STARTTLS / TLS)
ŞifrelemeSTARTTLS (TLS zorunlu)
Kimlik doğrulamaSASL (AUTH LOGIN / PLAIN)
Kullanıcı adıSMTP kimliğinizin kullanıcı adı (username) (panelden)
ŞifreSMTP kimliğinizin şifresi (panelden, bir kez gösterilir)
SMTP kullanıcı adı ve şifresini Ayarlar → API / Entegrasyon'dan oluşturduğunuz SMTP kimliğinden alırsınız. Bu kimlik, REST API anahtarıyla aynı hesaba ve gönderim alan adına bağlıdır.

Önemli kurallar

  • TLS zorunludur — şifresiz (plaintext) kimlik doğrulamaya izin verilmez.
  • Gönderim, REST API ile aynı ön kontrollerden geçer: hesap aktif, kimlik aktif, günlük limit, suppression, kredi.
  • Günlük limit (daily_limit) SMTP gönderimlerinde de geçerlidir; aşımda mesaj reddedilir.
  • Suppression davranışı transactional kuralıyla aynıdır: unsubscribe serbest, hard_bounce/complaint/manual engellidir.
  • Gönderen adresi (From) doğrulanmış gönderim alan adınızda olmalıdır.

Kod örnekleri

PHP (PHPMailer)

use PHPMailer\PHPMailer\PHPMailer;

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host       = 'smtp.sendertr.com';
$mail->Port       = 587;
$mail->SMTPAuth   = true;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Username   = 'SMTP_KULLANICI_ADINIZ';
$mail->Password   = 'SMTP_SIFRENIZ';

$mail->setFrom('siparis@sirketiniz.com', 'Sirketiniz');
$mail->addAddress('musteri@example.com');
$mail->addReplyTo('destek@sirketiniz.com');
$mail->Subject = 'Siparişiniz alındı';
$mail->isHTML(true);
$mail->Body    = '<h1>Teşekkürler!</h1>';
$mail->AltBody = 'Teşekkürler!';
$mail->send();

Node.js (Nodemailer)

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
  host: 'smtp.sendertr.com',
  port: 587,
  secure: false,        // 587 + STARTTLS
  requireTLS: true,
  auth: {
    user: 'SMTP_KULLANICI_ADINIZ',
    pass: 'SMTP_SIFRENIZ',
  },
});

await transporter.sendMail({
  from: '"Sirketiniz" <siparis@sirketiniz.com>',
  to: 'musteri@example.com',
  replyTo: 'destek@sirketiniz.com',
  subject: 'Siparişiniz alındı',
  text: 'Teşekkürler!',
  html: '<h1>Teşekkürler!</h1>',
});

Özel başlıklar

İstemcinizin desteklediği standart e-posta başlıklarını (Reply-To, X-* özel başlıklar) ekleyebilirsiniz. Açılma/tıklama izleme ve yasal footer (List-Unsubscribe, RFC 8058) sistem tarafından otomatik eklenir.

API mi, SMTP mi? Yüksek hacim ve ayrıntılı durum sorgulama (message status) için REST API; mevcut SMTP altyapınızı değiştirmeden hızlı entegrasyon için SMTP relay önerilir.

Hatalar & Durum Kodları

SenderTR API standart HTTP durum kodlarını kullanır ve tüm hatalarda makinece okunabilir JSON döndürür.

HTTP durum kodları

KodAnlamNe zaman
200 OKBaşarılıGET/PUT/DELETE başarılı; mevcut kişi upsert (güncelleme).
201 CreatedOluşturulduYeni kişi/liste/kampanya oluşturuldu.
202 AcceptedKuyruğa alındıPOST /send — e-posta kuyruğa alındı.
400 Bad RequestGeçersiz istekTanımsız/genel validator hatası.
401 UnauthorizedKimlik doğrulanamadıAnahtar eksik veya geçersiz/pasif.
402 Payment RequiredÖdeme gerekliYetersiz kredi (insufficient_credit).
403 ForbiddenYetkisizHesap pasif, IP izinli değil veya yetki (scope) yetersiz.
404 Not FoundBulunamadıKayıt yok veya başka hesaba ait (izolasyon).
422 Unprocessable ContentDoğrulama hatasıAlan eksik/yanlış; alıcı suppression listesinde; geçersiz payload.
429 Too Many RequestsÇok fazla istekRate limit veya günlük gönderim limiti aşıldı.
500 Internal Server ErrorSunucu hatasıBeklenmeyen hata. Tekrar deneyin / destek ile iletişime geçin.

Hata yanıt yapısı

İş kuralı hataları (validator) error + message alanları döndürür:

{
  "error": "daily_limit_exceeded",
  "message": "Günlük gönderim limitiniz doldu.",
  "limit": 5000,
  "used": 5000
}

Bilinen error kodları: unauthorized, invalid_api_key, tenant_inactive, credential_inactive, ip_not_allowed, insufficient_scope, daily_limit_exceeded, recipient_suppressed, insufficient_credit, not_found, invalid_payload, invalid_email.

Validation (422) hataları

Alan doğrulama hataları Laravel standardında döner: message ve alan→mesaj listesi içeren errors.

HTTP/1.1 422 Unprocessable Content
{
  "message": "The to field is required. (and 1 more error)",
  "errors": {
    "to": ["The to field is required."],
    "subject": ["The subject field is required."]
  }
}
Accept: application/json başlığını gönderdiğinizden emin olun; aksi halde bazı hatalar (419/500) HTML olarak dönebilir.

Rate limit (429) ve Retry-After

Dakikalık HTTP rate limit aşıldığında 429 ile birlikte Retry-After (saniye) ve limit başlıkları döner:

HTTP/1.1 429 Too Many Requests
Retry-After: 38
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 0

{ "message": "Too Many Attempts." }

Günlük gönderim limiti aşımı ise iş kuralı hatasıdır ve farklı gövde döner (yukarıdaki daily_limit_exceeded). İkisini ayırt etmek için yanıt gövdesindeki error alanına bakın.

Yaygın hatalar ve çözümleri

BelirtiOlası nedenÇözüm
401 unauthorizedBaşlık eksik/yanlışAuthorization: Bearer ... veya X-Api-Key başlığını ekleyin.
401 invalid_api_keyAnahtar yanlış/pasifPanelden anahtarı kontrol edin; pasifse yeniden etkinleştirin/yenisini oluşturun.
403 insufficient_scopeYetki kapsamı eksikYanıttaki required_ability yetkisini anahtara ekleyin.
403 ip_not_allowedIP kısıtlamasıSunucu çıkış IP'nizi anahtarın izinli IP listesine ekleyin.
402 insufficient_creditBakiye bittiKrediler → Paket Satın Al ile bakiye yükleyin.
422 recipient_suppressedAlıcı engelliHard bounce/şikayet/manuel suppression — bu adrese gönderim yapmayın.
422 errors{}Alan hatasıerrors içindeki alanları düzeltin (ör. html veya text'ten biri zorunlu).
429 (HTTP)Dakikalık limitRetry-After kadar bekleyip tekrar deneyin; istek hızını düşürün.
429 daily_limit_exceededGünlük kota dolduErtesi gün (00:00 TR) sıfırlanır; limiti artırmak için destekle görüşün.
404Yanlış ID / başka hesapID'nin doğru ve sizin hesabınıza ait olduğundan emin olun.
Yeniden deneme stratejisi: 429 ve 500 hatalarında üstel geri çekilme (exponential backoff) ile yeniden deneyin. 4xx doğrulama/yetki hatalarında (422/401/403) isteği düzeltmeden tekrar denemeyin.

Sıkça Sorulan Sorular

En sık karşılaşılan sorular ve kısa yanıtları. Detay için ilgili bölüme bağlantı verilmiştir.

Hesap & Faturalandırma

Krediler süreli mi, her ay yeniden mi yükleniyor?

Hayır. SenderTR kullandıkça-öde modeliyle çalışır; krediler süresizdir ve aylık abonelik zorunluluğu yoktur. Bir kez aldığınız kredi bitene kadar geçerlidir. (Krediler)

Kredim biterse ne olur?

Bakiyeniz alıcı sayısından azsa kampanya otomatik paused olur; sıfırlanırsa gönderim durur. Kullanım %80/%95/%100 eşiklerinde önceden uyarılırsınız. (Krediler)

Nasıl kredi satın alırım?

Krediler → Paket Satın Al menüsünden PayTR ile (3D Secure) güvenli ödeme yaparsınız. Kart bilgileriniz SenderTR'de saklanmaz. (Krediler)

Gönderim & Teslimat

E-postalarım neden spam'e düşüyor?

En yaygın nedenler: eksik DNS doğrulaması (SPF/DKIM/DMARC), kötü liste hijyeni (yüksek bounce/şikayet) ve riskli içerik. Domain sağlık skorunuzu 100'e çıkarın, listenizi doğrulayın ve kampanyada "Spam Skor Kontrol" yapın. (Deliverability)

Kampanyam neden gönderilemiyor / onaya gitmiyor?

Sender Contract preflight kontrolünde bir "fail" maddesi vardır (SPF/DKIM/DMARC geçersiz, içerik/konu boş, alıcı yok veya domain sağlığı düşük). Hata mesajındaki maddeleri düzeltin. (Kampanyalar)

Domainimi doğruladım ama hâlâ "fail" görünüyor.

DNS yayılması birkaç dakika–saat sürebilir. 15–30 dk bekleyip tekrar "Doğrula"ya basın. Host adında çift domain (ör. _dmarc.domain.com.domain.com) oluşmadığından emin olun. (Domain & DNS)

En iyi gönderim saati nedir?

Hesabınızın geçmiş açılma verisine göre değişir. "En İyi Zaman" önerisini kullanın veya kişi bazlı optimizasyon için STO'yu açın. Veri yoksa 10:00/14:00/20:00 iyi başlangıçtır. (Gönderim & Zamanlama)

Kişiler & Listeler

Abonelikten çıkan birini tekrar nasıl eklerim?

Suppression koruması kalıcıdır; kişiyi silseniz bile korunur. Tek meşru yol, kişinin kendi isteğiyle (ör. sitenizdeki form üzerinden) yeniden abone olmasıdır. (Suppression)

Hangi dosya formatlarını içe aktarabilirim?

CSV, TXT, Excel (XLSX/XLS) ve JSON. En fazla 50 MB. İçe aktarmada e-posta kolonu eşlemesi zorunludur. (İçe Aktarma)

Liste ile segment arasındaki fark nedir?

Liste sabit (statik) bir kişi grubudur; segment ise kurallara göre her çalıştığında yeniden hesaplanan dinamik bir gruptur. (Segmentler)

Geliştirici / API

API anahtarımı nereden alırım?

Ayarlar → API / Entegrasyon. Anahtar yalnızca bir kez gösterilir; yetki kapsamı (scope) ve izinli IP atayabilirsiniz. (Kimlik Doğrulama)

API mi SMTP mi kullanmalıyım?

Yüksek hacim ve durum sorgulama için REST API; mevcut SMTP altyapınızı değiştirmeden hızlı entegrasyon için SMTP relay önerilir. İkisi de aynı ön kontrollerden geçer. (SMTP Relay)

Webhook imzasını nasıl doğrularım?

Ham istek gövdesinin secret'ınızla HMAC-SHA256'sını hesaplayıp X-Webhook-Signature ile sabit-zamanlı karşılaştırın. PHP/Node örnekleri için: (Webhook'lar (API))

WooCommerce / Shopify mağazamı bağlayabilir miyim?

Evet. Gelen e-ticaret webhook'u ile sipariş/sepet olaylarını otomasyonlara aktarabilirsiniz (native WooCommerce ve Shopify desteği vardır). (Webhook'lar (API))

Gizlilik & Güvenlik

Verilerim güvende mi? Yurt dışına çıkıyor mu?

Tüm sunucular Türkiye'dedir ve %100 KVKK uyumludur. Veriler yurt dışına çıkmaz; e-posta doğrulaması bile dış servise gönderilmeden lokal yapılır. KVKK md.11 kapsamında verilerinizi dışa aktarabilir (/my-data/export) veya silinme talep edebilirsiniz. (Ayarlar)

Ekip üyesi davet edebilir miyim?

Evet, Ayarlar → Ekip'ten rol atayarak (Admin/Marketer/Uploader/Viewer) davet edersiniz. Davet 7 gün geçerlidir. (Ekip & Roller)

Daha fazla yardım

Aradığınızı bulamadıysanız destek@sendertr.com adresinden veya panel içi destek bölümünden bize ulaşın.