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.
Bu dokümantasyonda neler var?
Hızlı Başlangıç
Hesap açmaktan ilk gönderime 7 adım
Kampanyalar
Oluşturma, onay, A/B test, spam skoru, STO
Kişiler & Segmentler
Listeler, segment kuralları, etkileşim puanı
Otomasyonlar
Tetikleyiciler, adımlar, hazır şablonlar
Deliverability
SPF/DKIM/DMARC, IP itibarı, warmup
REST API
Transactional, doğrulama, CRUD, webhook, SMTP
Temel kavramlar
| Kavram | Açıklama |
|---|---|
| Kredi | Gönderilen her e-posta 1 kredi düşer. Krediler süresizdir (aylık abonelik yoktur). Kayıtta 1.000 kredi hediye. |
| Kampanya | Bir listeye/segmente tek seferlik toplu gönderim. Sender Contract onayından geçer. |
| Otomasyon | Tetikleyiciye bağlı, sürekli çalışan otomatik e-posta akışı (hoşgeldin, doğum günü vb.). |
| Liste | Kişilerin sabit (statik) grubu. |
| Segment | Kurallara göre dinamik kişi grubu (her çalıştığında yeniden hesaplanır). |
| Transactional | Sipariş onayı, şifre sıfırlama gibi işlemsel e-postalar (API/SMTP ile). |
| Gönderim Domaini | Adınıza e-posta gönderdiğimiz, SPF/DKIM/DMARC ile doğrulanmış alan adı. |
| Suppression | Bir daha gönderim yapılmayacak adreslerin kalıcı kara listesi. |
Platform adresleri
| Adres | Ne için |
|---|---|
app.sendertr.com | Panel (giriş, kampanya, raporlar) |
api.sendertr.com/v1 | REST API temel adresi |
smtp.sendertr.com:587 | SMTP relay (STARTTLS) |
docs.sendertr.com | Bu dokümantasyon |
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
- 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.
- Şirket bilgilerinizi tamamlayın. Ayarlar → Şirket Bilgileri'nden firma tipinizi seçin (
tacirveyaesnaf). 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. - Gönderim domaininizi ekleyip doğrulayın. Ayarlar → Domainler → "Domain Ekle". Sistem size
SPF,DKIM(2048-bit) veDMARCkayı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. - 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. - 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.
- Ş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. - 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.
İlk gönderimde nelere dikkat edin?
| Kontrol | Neden önemli | Nerede |
|---|---|---|
| SPF/DKIM/DMARC geçerli | Kimlik doğrulaması olmayan e-posta spam'e düşer | Ayarlar → Domainler / kampanyada "DNS Kontrol" |
| Liste hijyeni | Bounce > %5 veya şikayet > %0,3 itibarınızı düşürür | Kişiler → Liste Temizleme |
| Spam skoru | Riskli içerik gelen kutusu yerleşimini düşürür | Kampanya → "Spam Skor Kontrol" |
| Yasal footer | 6563 s. Kanun zorunluluğu | Ayarlar → Ş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
| Alan | Zorunlu | Açıklama & Kurallar |
|---|---|---|
| Kampanya Adı | Evet | Yalnızca sizin gördüğünüz dahili isim (alıcılar görmez). Maks. 255 karakter. Ör: "Şubat Bülteni". |
| Gönderim Domaini | Evet | E-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-posta | Evet | Yalnı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ı | Evet | Alı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-To | Hayır | Yanı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_countdeğerinden gelir. - Segment: Kurallara göre dinamik kişi grubu (alternatif). Seçtiğinizde liste seçimi temizlenir. Tahmini sayı segmentin
estimated_countdeğeridir. - Mesaj Türü:
marketing(Pazarlama) veyatransactional(İşlemsel). Bu seçim suppression kurallarını belirler — aşağıdaki tabloya bakın.
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_textalanı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.
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ı
draftdurumunda kaydeder, istediğiniz zaman düzenlersiniz. - Onaya Gönder: Sender Contract preflight kontrolü çalışır; geçerse kampanya
submitteddurumuna 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.
| Durum | Etiket | İzin verilen sonraki durumlar |
|---|---|---|
draft | Taslak | submitted, cancelled |
submitted | Gönderildi (onay bekliyor) | under_review, approved, rejected |
under_review | İnceleniyor | approved, rejected |
approved | Onaylandı | scheduled, queued |
rejected | Reddedildi | draft (düzeltip yeniden gönderme) |
scheduled | Zamanlandı | queued, cancelled |
queued | Kuyrukta | sending, cancelled |
sending | Gönderiliyor | paused, stopped, completed |
paused | Duraklatıldı | sending, stopped |
stopped | Durduruldu | — (son durum) |
completed | Tamamlandı | — (son durum) |
cancelled | İptal Edildi | — (son durum) |
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.
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.
| # | Kontrol | Geçme koşulu | Başarısızlık seviyesi |
|---|---|---|---|
| 1 | SPF hizalama (spf_alignment) | Domain SPF durumu = pass | fail |
| 2 | DKIM hizalama (dkim_alignment) | Domain DKIM durumu = pass | fail |
| 3 | DMARC politikası (dmarc_policy) | Domain DMARC durumu = pass | fail |
| 4 | Geçerli From adresi (from_valid) | From e-postası geçerli format | fail |
| 5 | Konu mevcut (subject_present) | Konu satırı boş değil | fail |
| 6 | İçerik mevcut (content_present) | HTML içerik boş değil | fail |
| 7 | Abonelikten çıkış linki (unsubscribe_link) | İçerikte {{unsubscribe_url}} veya "unsubscribe" geçiyor | warning |
| 8 | Alıcı mevcut (recipients_exist) | Toplam alıcı sayısı > 0 | fail |
| 9 | Domain sağlığı (domain_health) | Skor ≥ 70 pass; 40–69 warning; < 40 fail | fail / warning |
| 10 | Canlı DNS sağlığı (dns_health) | Kritik hata yok ve skor ≥ 80 pass; 50–79 warning; < 50 fail | fail / 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:
| Kontrol | Maks. ceza | Açıklama |
|---|---|---|
| Konuda spam kelime | −20 | "ücretsiz", "kazan", "free", "buy now" vb. (kelime başına −5) |
| İçerikte spam kelime | −15 | 2'den fazlasında ceza (kelime başına −3) |
| Konuda BÜYÜK HARF oranı | −10 | Harflerin %50'den fazlası büyükse |
| Aşırı noktalama (!!! ???) | −10 | Ardışı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ı | −10 | 15+ link −10, 10+ link −5 |
| Abonelikten çıkma linki | −10 | Yoksa ceza (yasal zorunluluk) |
| Ücretsiz sağlayıcı From | −10 | gmail/yahoo/hotmail vb. ile gönderim |
| HTML boyutu | −10 | 100 KB+ −10 (Gmail kırpar), 50 KB+ −5 |
| Gizli metin | −20 | display:none, visibility:hidden, font-size:0 |
| Konuda ünlem işareti | −15 | 2'den fazla ünlem |
| Gönderen domain uyumu | −5 | İçerik linkleri From domaininden farklı |
| URL kısaltıcı | −20 | bit.ly, tinyurl vb. (her biri −10) |
| Metin/HTML oranı | −15 | %10 altı −15, %20 altı −5 |
| Yanıltıcı ön ek (RE:/FW:) | −15 | Sahte 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 | −5 | Yoksa ceza (CAN-SPAM/KVKK) |
| Konuda emoji | −10 | 3'ten fazla emoji |
| Gövdede büyük harf oranı | −8 | %50+ −8, %35+ −5, %20+ −2 |
| URL yoğunluğu | −10 | Kelime başına çok link |
| Sadece görsel maili | −12 | Görsel var, metin < 30 karakter |
| Reply-To uyumu | −8 | Reply-To ve From farklı domainlerde |
| Çoklu parça (text alternatif) | −5 | Sadece 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.
- "Dinamik Blok Ekle" ile yeni blok oluşturun ve bir ad verin (ör.
hero,promo,footer). - Koşul türünü seçin: Varsayılan (herkese) veya Segmente göre (yalnızca seçili segmente).
- Bloğun HTML içeriğini girin.
- Şablonunuza yer tutucuyu ekleyin. Blok adı girildiğinde panel size kopyalanabilir bir etiket gösterir, ör:
{{block:hero}}.
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.
- Kampanya detayında "Açmayanlara Tekrar Gönder" eylemini seçin.
- Sistem teslim edilmiş ancak açılmamış (
delivered+opened_atboş) alıcıları bulur. [Tekrar] Kampanya Adışeklinde, yalnızca bu kişileri hedefleyen yeni bir taslak kampanya oluşturulur.- 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
| Sorun | Sebep | Çözüm |
|---|---|---|
| "Sender Contract kontrolünden geçemeyen maddeler var" | SPF/DKIM/DMARC pass değil, içerik/konu boş veya alıcı yok | Hata mesajındaki maddeleri düzeltin; domaini doğrulayın |
Kampanya paused oldu | Kredi bakiyesi alıcı sayısından az | Krediler → 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 edilmiyor | Reply-To, gönderim domaininden farklı uzantıda | Reply-To'yu @gönderimdomaini uzantısıyla girin |
| Kampanya suspend tenant'ta durdu | Hesap (tenant) aktif değil | Hesap durumunu destek ile netleştirin |
| Yasal footer uyarısı (amber banner) | MERSİS/T.C. Kimlik veya iletişim bilgisi eksik | Ayarlar → Ş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
- Şablonlar → Yeni Şablon ile editörü açın.
- Ü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.
- Görsel editörde blokları (metin, görsel, buton, ayraç vb.) tuvale sürükleyin.
- İçeriği merge tag'lerle kişiselleştirin (aşağıda).
- Kaydet'e basın. Editör tasarımı hem yapısal JSON (
design_json) hem render edilmiş HTML (html_content) olarak saklar.
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
| Mod | Ne yapar |
|---|---|
| Görsel | Sürükle-bırak tasarım arayüzü. Asıl çalışma alanı burasıdır. |
| HTML | Tasarı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.
| Etiket | Karşı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) |
{{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
- Araç çubuğunda Görsel butonuna basın.
- "Görsel Yükle" ile dosya seçin (maks. 5 MB; jpg/png/gif/webp/svg). Görseller tenant izolasyonlu CDN'de saklanır.
- 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
- Kampanya formunda A/B Testi bölümündeki anahtarı açın.
- Varyant B — Konu Satırı alanına alternatif konuyu girin (zorunlu). Varyant A salt okunur olarak ana konu satırını gösterir.
- 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.
- Kazanan Kriteri seçin: Açılma Oranı (
open_rate) veya Tıklama Oranı (click_rate).
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ı.
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ı
| Mod | Açıklama |
|---|---|
| Onay sonrası hemen gönder | Kampanya 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:
- Son 90 günlük açılmaları toplar. Kişinin geçmiş e-posta açılma kayıtları (
opened_at) incelenir. - Saat dilimine çevirir. UTC değerleri Türkiye saatine (
+03:00) dönüştürülür, ardından saat bazında gruplanır. - En çok açılan saati seçer. Kişinin en yüksek açılma sayısına sahip saati
contacts.best_send_houralanına yazılır. - 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.
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 etmek | STO (Akıllı Gönderim Zamanı) |
| Yeni hesap / az açılma verisi | İleri tarih + genel öneri saatleri (10/14/20) |
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.
| Alan | Kolon | Kural / Sınır | Açıklama |
|---|---|---|---|
| E-posta | email | Zorunlu, geçerli e-posta, max 255 | Tenant içinde benzersizdir (tenant_id + email unique). Aynı e-posta tekrar eklenirse mevcut kayıt güncellenir. |
| Ad | first_name | İsteğe bağlı, max 100 | Kişiselleştirme değişkenlerinde kullanılır. |
| Soyad | last_name | İsteğe bağlı, max 100 | |
| Telefon | phone | İsteğe bağlı, max 20 | |
| Şehir | city | İsteğe bağlı, max 100 | |
| Özel Alanlar | custom_fields | İsteğe bağlı, JSON | Anahtar-değer şeklinde dilediğiniz ek veriyi saklar (ör. plan, dogum_tarihi). |
| Liste Üyelikleri | list_ids[] | İsteğe bağlı dizi | Yalnızca kendi tenant'ınıza ait listelere bağlanabilir (cross-tenant koruması vardır). |
| Durum | status | enum | Aşağıdaki "Kişi Durumu" tablosuna bakın. |
| Kaynak | source | otomatik | Manuel ekleme, import, whitelist, form vb. |
| Etkileşim Puanı | engagement_score | 0–100 | Otomatik hesaplanır (aşağıya bakın). |
| Doğrulama Durumu | verification_status | enum | Doğrulama bölümüne bakın (pending/valid/invalid/risky/disposable/role/unknown). |
| Doğrulama Skoru | verification_score | 0–100 | Son doğrulamanın güven puanı. |
| Son Açılma | last_open_at | tarih | Segmentleme ve liste temizlemede kullanılır. |
| Son Tıklama | last_click_at | tarih |
Tek Tek Kişi Ekleme
- Kişiler → Yeni Kişi sayfasını açın.
- E-posta adresini girin (zorunlu). İsterseniz ad, soyad, telefon ve şehir ekleyin.
- İsterseniz özel alanlar tanımlayın (anahtar/değer).
- Kişiyi bir veya birden fazla listeye bağlayın (yalnızca kendi listeleriniz görünür).
- 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.
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.
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:
| Durum | Anlamı | Gönderim |
|---|---|---|
active | Geçerli, gönderime açık kişi. | Evet |
unsubscribed | Abonelikten çıkmış. | Pazarlamada hayır (suppression). |
bounced | Geri dönen (kalıcı hata) adres. | Hayır |
complained | Spam şikâyetinde bulunmuş. | Hayır |
suppressed | Liste temizleme / geçersiz doğrulama ile pasifleştirilmiş. | Hayır |
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))
| Sinyal | Etki | Açıklama |
|---|---|---|
| Açılma (90 gün) | +3 / açılma | Pozitif etkileşim |
| Tıklama (90 gün) | +5 / tıklama | En güçlü pozitif sinyal |
| Bounce (hard/soft) | −10 / bounce | Teslim sorunu |
| Şikâyet (complaint) | −20 / şikâyet | En 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.
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.csvolarak indirebilirsiniz.
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
- Listeler → Yeni Liste'yi açın.
- Liste adını girin. Ad yalnızca harf, rakam, boşluk ve
- _ . , ( )içerebilir;% & / ^gibi özel karakterler kullanılamaz. - İsterseniz bir açıklama ekleyin (max 1000 karakter).
- Gerekiyorsa Tacir Listesi kutusunu işaretleyin (aşağıya bakın).
- 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).
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.
| Kategori | Tespit Ölçütü |
|---|---|
| Hard bounce | Suppression tablosunda hard_bounce sebebiyle kayıtlı e-postalar. |
| Şikâyet (complaint) | Suppression'da complaint sebebiyle kayıtlı. |
| Abonelikten çıkanlar | Suppression'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ün | En az 90 gündür sistemde olup (yeni eklenenler hariç) son 90 günde hiç açılma/tıklama yapmamış. |
| Etkileşimsiz 180 gün | Aynı mantık, 180 gün eşiği. |
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:
- 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.iliskiler→halklailiskiler). - 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)
- 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).
- Zorunlu Liste sayfasını açın.
- Eklemek istediğiniz e-posta adresini ve isteğe bağlı bir gerekçe girin.
- Kişi tenant'ınızda yoksa otomatik oluşturulur (kaynak:
whitelist). Ekle'ye basın. - Gerektiğinde kişiyi zorunlu listeden çıkarabilirsiniz.
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) | |
|---|---|---|
| Üyelik | Elle eklenen sabit kişiler | Kurala uyan kişiler, her seferinde yeniden hesaplanır |
| Güncel kalma | Manuel | Otomatik (kurallar değişmeden kişi durumu değişince üyelik de değişir) |
| Kullanım | Genel gruplama, import hedefi | Davranış/özellik bazlı hedefleme |
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:
| Alan | Tür | Grup | Açıklama |
|---|---|---|---|
email | metin | Kişi Bilgileri | E-posta adresi |
first_name | metin | Kişi Bilgileri | Ad |
last_name | metin | Kişi Bilgileri | Soyad |
phone | metin | Kişi Bilgileri | Telefon |
city | metin | Kişi Bilgileri | Şehir |
country | metin | Kişi Bilgileri | Ülke |
company_name | metin | Kişi Bilgileri | Şirket adı |
status | seçim | Kişi Bilgileri | active / unsubscribed / bounced / complained / suppressed |
source | metin | Kişi Bilgileri | Kaynak (import, whitelist…) |
opt_in_status | seçim | Onay | pending / confirmed / single (double opt-in) |
verification_status | seçim | Doğrulama | valid / invalid / risky / disposable / role / unknown / pending |
engagement_score | sayı | Etkileşim | 0–100 etkileşim puanı |
last_open_at | tarih | Etkileşim | Son açılma tarihi |
last_click_at | tarih | Etkileşim | Son tıklama tarihi |
best_send_hour | sayı | Etkileşim | Optimum gönderim saati (STO) |
created_at | tarih | Tarih | Kayıt tarihi |
updated_at | tarih | Tarih | Son güncelleme |
Operatörler
| Operatör | Anlamı | Örnek |
|---|---|---|
equals | Eşittir | city = "İstanbul" |
not_equals | Eşit değildir | status ≠ "suppressed" |
contains | İçerir | email içerir "@firma.com" |
not_contains | İçermez | email içermez "test" |
starts_with | İle başlar | first_name başlar "A" |
ends_with | İle biter | email biter ".tr" |
greater_than | Büyüktür | engagement_score > 50 |
less_than | Küçüktür | engagement_score < 20 |
is_empty | Boş | phone boş |
is_not_empty | Dolu | city dolu |
in_last_days | Son N gün içinde | last_click_at son 30 gün |
not_in_last_days | Son N günden önce | last_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
- Segmentler → Yeni Segment'i açın ve bir ad verin.
- Kural grupları ekleyin: her grupta bir veya birden çok koşul (AND), gruplar arasında OR.
- Önizleme ile kaç kişinin eşleştiğini ve toplam içindeki yüzdesini anlık görün.
- Kaydet'e basın. Tahmini kişi sayısı (
estimated_count) segmentle birlikte saklanır.
İç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
| Format | Uzantı | Notlar |
|---|---|---|
| CSV | .csv | Ayraç otomatik tespit edilir: ; , Tab |. UTF-8 BOM desteklenir. |
| Metin | .txt | CSV gibi işlenir (ayraç otomatik). |
| Excel | .xlsx, .xls | İlk satır başlık, sonraki satırlar veri. Aktif sayfa okunur. |
| JSON | .json | Nesne dizisi: [{"email":"...","ad":"..."}, ...] |
Adım Adım İçe Aktarma
- 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.
- 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. - Hedef liste seçin. Mevcut bir listeyi seçin veya yeni liste adı girerek oluşturun. Liste seçmeden de import yapılabilir.
- İş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.
- 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
importolarak 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.
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ı
| Durum | Davranış |
|---|---|
| E-posta kolonu eşlenmemiş | Import başlatılmaz: "E-posta sütunu eşlenmeden içe aktarma yapılamaz." hatası. |
| Geçersiz dosya yolu | Yalnı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 Excel | Dosya parse edilemezse boş kabul edilir, hata loglanır. |
| Desteklenmeyen format | Yü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:
- 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. - Spam tuzağı tespiti:
spamtrap,honeypot,blackholegibi local part'lar; 10+ ardışık rakam; 20+ karakterlik rastgele hex desenler tuzak sayılır. - 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.
- Rol adresi:
info,admin,support,noreply,salesgibi kişisel olmayan kurumsal adresler işaretlenir. - MX kontrolü: Domain'in MX kaydı
digile, sistem resolver önbelleği atlanarak otoriter NS üzerinden sorgulanır (bulunamazsa 8.8.8.8 fallback). MX yoksa adresinvalid'tir. - 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 TOakışı yürütülür.250→ kabul;550/5.1.1→ geçersiz;4xx→ geçici ret (greylisting olabilir, "riskli"). - 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çekcatch_all.
Sonuç Kategorileri
| Sonuç | Anlamı | Öneri |
|---|---|---|
valid | MX var, SMTP kabul etti (catch-all değil) veya büyük sağlayıcıda makul görünüyor. | Gönder. |
invalid | Sözdizimi hatalı, MX yok ya da sunucu "kullanıcı yok" dedi. Teslim edilemez. | Listeden çıkar/baskıla. |
risky | Rol adresi, şüpheli desen, bounce geçmişi veya geçici ret (greylisting). | Dikkatli gönder; izle. |
disposable | Tek kullanımlık / geçici e-posta servisi. | Gönderme; baskıla. |
catch_all | Domain tüm adresleri kabul ediyor; bireysel adres doğrulanamıyor. | Düşük güven; temkinli ol. |
spam_trap | Spam tuzağı / honeypot şüphesi. | Kesinlikle gönderme. |
role | Kişisel olmayan kurumsal adres (info@, support@…). | Genelde riskli sayılır. |
unknown | Sunucuya 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
- Doğrulama sayfasını açın; mevcut kredi bakiyeniz ve birim maliyet görünür.
- Adresi girip Doğrula'ya basın.
- Sonuç (kategori + skor + sinyaller) anında gösterilir ve kaydedilir.
Toplu Doğrulama
- Kişiler ekranında seçili kişileri ya da tüm kişileri doğrulamayı seçin.
- Sistem maliyeti önceden hesaplar (kişi sayısı, gerekli kredi, mevcut bakiye, karşılanabilir mi).
- Onaylayınca kredi atomik olarak düşülür, bir doğrulama seansı (session) oluşturulur ve arka planda işlenir.
- İlerlemeyi canlı izleyebilir, biten seansların özetini ve adres bazlı sonuçlarını görebilirsiniz.
invalid, disposable ve spam_trap doğrulama durumundaki kişileri tek tıkla suppressed yapar.
Kredi Maliyeti
| İşlem | Maliyet |
|---|---|
| Tek adres doğrulama | Varsayılan 1 kredi (admin ayarlanabilir). |
| Toplu doğrulama | tavan(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.
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
| Neden | Açıklama |
|---|---|
hard_bounce | Kalıcı teslim hatası (adres yok, domain geçersiz vb.). |
complaint | Alıcı spam şikâyetinde bulundu (FBL). |
manual | Elle eklenen engel. |
unsubscribe | Alı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:
| Neden | Pazarlama | Transactional | Otomasyon |
|---|---|---|---|
hard_bounce | Bloke | Bloke | Bloke |
complaint | Bloke | Bloke | Bloke |
manual | Bloke | Bloke | Bloke |
unsubscribe | Bloke | Serbest | Serbest |
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.
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_suppressionolarak 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.
Otomasyon nasıl çalışır?
Her otomasyon üç parçadan oluşur:
- Tetikleyici (trigger). Akışı başlatan olay: kişi eklendi, etiketlendi, form gönderdi, belirli bir tarih geldi vb.
- 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).
- 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
completedolur.
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
- Otomasyonlar → Yeni Otomasyon. Otomasyon adı (zorunlu) ve isteğe bağlı açıklama girin.
- Tetikleyici türü seçin. Seçtiğiniz türe göre ek alanlar açılır (liste, etiket, tarih alanı + ofset gibi).
- 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.com→bilgi@sirket.com). - Otomasyon oluşturulur ve
draft(taslak) durumunda açılır. Ardından detay (Show) ekranında adımları eklersiniz. - Adımları ekleyin. En az bir adım gereklidir (genellikle ilk adım bir e-posta).
- Etkinleştirin. Otomasyon aktif olunca tetikleyici eşleşen kişiler otomatik kaydedilmeye başlar.
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.
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.
| Tetikleyici | Kod değeri | Ne zaman tetiklenir? |
|---|---|---|
| Kişi Eklendi | contact_added | Yeni bir kişi oluşturulduğunda (form, içe aktarma, manuel). Belirli bir listeye kısıtlanabilir. |
| Kişi Etiketlendi | contact_tagged | Kişiye belirli bir etiket eklendiğinde. Config'deki tag ile birebir eşleşmelidir. |
| Form Gönderildi | form_submitted | Bir kayıt formu doldurulduğunda. Belirli bir form_id ile kısıtlanabilir. |
| Tarih Alanı | date_field | Kiş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. |
| Manuel | manual | Otomatik tetiklenmez; kişiyi siz elle akışa eklersiniz (yeniden etkileşim, etkinlik daveti gibi kontrollü senaryolar). |
| Sipariş Tamamlandı | order_completed | E-ticaret entegrasyonunda bir sipariş tamamlandığında (satın alma sonrası akışlar). |
| Sepet Terk Edildi | cart_abandoned | Sepete ürün eklenip alışveriş tamamlanmadığında (geri kazanım akışları). |
| Yeni Müşteri | customer_created | E-ticaret tarafında yeni bir müşteri kaydı oluştuğunda. |
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ım | Kod | Görevi | Yapılandırma |
|---|---|---|---|
| E-posta | email | Kişiye e-posta gönderim işine alır (kuyruğa eklenir), sonra hemen sonraki adıma geçer. | Konu, şablon/içerik |
| Gecikme | delay | Akışı belirtilen süre bekletir; süre dolunca bir sonraki adım planlanır. | Miktar + birim: minutes / hours / days |
| Koşul | condition | Bir kuralı değerlendirir; sonuca göre evet ya da hayır dalına yönlendirir (dallanma). | Koşul türü + (segment/etiket/alan) |
| Aksiyon | action | Kiş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).
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
activeolmalı, - En az bir adım bulunmalı,
- Kişi sizin hesabınıza (tenant) ait olmalı,
- Kişinin
active/pausedbir kaydı zaten yoksa eklenir; varsa "bu kişi zaten otomasyona dahil" uyarısı verilir.
Durumlar ve silme kuralı
| Durum | Kod | Anlamı |
|---|---|---|
| Taslak | draft | Henüz aktif değil; düzenlenebilir, adım eklenebilir, silinebilir. |
| Aktif | active | Tetikleyiciler ç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şiv | archived | Kullanım dışı; silinebilir. |
draft veya paused durumlarında mümkündür; aktif akışın yapısı değiştirilemez.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
- Formlar → Yeni Form. Form adı girin (zorunlu).
- 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.)
- Alanları tanımlayın. Her alan için Alan Adı (name), Etiket, Tür ve Zorunlu seçeneklerini belirleyin.
- Oluşturun. Kaydedince sistem otomatik olarak gömme (embed) kodunu üretir.
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ür | Kod | Açıklama |
|---|---|---|
| Metin | text | Tek satır serbest metin (ad, şehir vb.) |
| E-posta | email | E-posta doğrulamalı alan (zorunlu olması önerilir) |
| Telefon | phone | Telefon (gömme kodda tel girişi olur, max 20 karakter) |
| Uzun Metin | textarea | Çok satırlı metin alanı |
| Seçim | select | Açılır liste seçimi |
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?
- 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.
- 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ğerlericustom_fields'a yazılır. - Listeye ekleme. Forma bir liste bağlıysa kişi o listeye eklenir (mükerrer eklemez).
- Otomasyon tetikleme.
form_submittedtetiklenir; kişi yeni oluşturulduysa ayrıcacontact_addedtetiklenir. - Double opt-in. Kişi henüz onaylı değilse onay e-postası gönderilir (aşağıya bakın).
- 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:
- Sisteme rastgele güvenli bir onay token'ı üretilir ve kişi
opt_in_status = pendingolarak işaretlenir. - Kişiye "E-posta Adresinizi Onaylayın" konulu bir onay e-postası gönderilir; içinde
/confirm/{token}bağlantısı bulunur. - Kişi bağlantıya tıkladığında
opt_in_status = confirmedolur, token silinir ve onay zamanı (opted_in_at) kaydedilir.
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
- Sayfalar → Yeni Sayfa.
- Ad girin (panel içi tanımlayıcı isim).
- 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. - HTML içeriğini girin (sayfanın gövdesi).
- Kaydedin. Sayfa kaydedilirken içerik güvenlik için temizlenir (sanitization) ve doğrudan
pending_review(onay bekliyor) durumuna alınır.
Durumlar
| Durum | Kod | Anlamı |
|---|---|---|
| Taslak | draft | Hazırlık aşaması (henüz onaya gönderilmemiş). |
| Onay Bekliyor | pending_review | Moderasyon kuyruğunda; admin incelemesini bekliyor. Public erişime kapalı. |
| Yayında | published | Admin onayladı; /p/{slug} adresinden herkese açık. |
| Reddedildi | rejected | Admin reddetti; bir red notu ile birlikte. Yayında değil. |
| Arşiv | archived | Kullanım dışı. |
Moderasyon akışı (detaylı)
- Tenant sayfayı oluşturur / onaya gönderir. İçerik sanitize edilir, durum
pending_reviewolur. - 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_adminvemoderatorrolleri erişebilir. - 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.
- Karar:
- Onayla → Durum
publishedolur, 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
rejectedolur. Tenant notu okuyup düzeltir ve tekrar onaya gönderir.
- Onayla → Durum
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
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,onloadgibi tümon*olay işleyici öznitelikleri kaldırılır.href="javascript:..."gibi JavaScript bağlantıları etkisiz hale getirilir (href="#"yapılır).
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.
1. Domain Ekleme
- Domainler → Domain Ekle sayfasını açın.
- 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. - Yalnızca ASCII (Türkçe karaktersiz, punycode olmayan) ve daha önce eklenmemiş benzersiz bir alan adı kabul edilir.
- 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.
- 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.
| Alan | Değer |
|---|---|
| Tip | TXT |
| Host / Ad | sirketiniz.com (kök domain, bazı panellerde @) |
| Değer | v=spf1 include:sendertr.com ~all |
include:sendertr.com ifadesini ekleyin: v=spf1 include:_spf.google.com include:sendertr.com ~allinclude:, 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.
| Alan | Değer |
|---|---|
| Tip | TXT |
| Host / Ad | sendertr202606._domainkey.sirketiniz.com |
| Değer | v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBA... (uzun açık anahtar) |
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.
| Alan | Değer |
|---|---|
| Tip | TXT |
| Host / Ad | _dmarc.sirketiniz.com |
| Değer | v=DMARC1; p=quarantine; rua=mailto:dmarc@sirketiniz.com |
Politika (p=) seçenekleri:
| Politika | Anlamı | Öneri |
|---|---|---|
p=none | Sadece izle/raporla, aksiyon alma | İlk hafta için uygun; uzun vadede önerilmez (sistem uyarı verir) |
p=quarantine | Başarısız mailleri spam klasörüne yönlendir | ✓ Önerilen başlangıç politikası |
p=reject | Başarısız mailleri tamamen reddet | İtibar oturduktan sonra en güvenli seçenek |
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
- DNS kayıtlarını sağlayıcınızın panelinde oluşturduktan sonra, SenderTR domain detay sayfasında "Doğrula" butonuna basın.
- 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.
- SPF, DKIM ve DMARC ayrı ayrı kontrol edilir; her birinin durumu
passveyafailolarak güncellenir. - Sağlık skoru yeniden hesaplanır ve son kontrol zamanı (
last_checked_at) kaydedilir. - 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ıt | Geçerse Puan | Açıklama |
|---|---|---|
| SPF | +30 | Gönderim yetkisi tanımlı |
| DKIM | +40 | İmza doğrulaması — en ağırlıklı bileşen |
| DMARC | +30 | Politika ve raporlama |
| Toplam | 100 | Tam doğrulanmış domain |
| Skor Aralığı | Ne Anlama Gelir? |
|---|---|
| 100 | Tüm kayıtlar geçerli → domain gönderime hazır, otomatik "doğrulanmış" işaretlenir |
| 60–99 | Bir veya iki kayıt eksik → gönderim engellenir, eksik kaydı tamamlayın |
| 30–70 | Yalnızca bir kayıt geçerli → kimlik doğrulama yetersiz |
| 0 | Hiçbir kayıt bulunamadı → kayıtları ekleyin ve tekrar doğrulayın |
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ı yok | Mevcut 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=none | Politikayı 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.
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ı |
|---|---|
warming | Isınma sürecinde — günlük limit kademeli artıyor |
stable | Isınma tamamlandı — tam kapasite gönderim (ör. 50.000/gün) |
paused | Isı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şen | Ağırlık | Puanlama |
|---|---|---|
| DNSBL Temizliği Kara liste durumu | %35 | 12 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 | %10 | stable → 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:
| Skor | Not | Durum |
|---|---|---|
| 90–100 | A | Mükemmel itibar |
| 75–89 | B | İyi |
| 60–74 | C | Orta — dikkat |
| 40–59 | D | Zayıf — iyileştirme şart |
| 0–39 | F | Kritik — 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:
| Metrik | Güvenli | Kritik Eşik | Sonuç |
|---|---|---|---|
| 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,3 | Gmail/Yahoo gereksinimi; aşılırsa kredential askıya alınır |
| Hata (fail) oranı | < %5 | > %10 | Otomatik durdurma tetiklenir |
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:
| Kontrol | Neye Bakar? |
|---|---|
| E-posta Kimlik Doğrulama | SPF, DKIM, DMARC sağlık skoru |
| İçerik Kalitesi | Spam filtre uyumluluğu (spam skoru analizi) |
| Gönderici İtibarı | Hesabınızın bounce ve şikayet oranları |
| Liste Kalitesi | Doğrulanmış (valid) kişi oranı |
| Teknik Uyumluluk | Unsubscribe linki, geçerli From adresi, konu satırı |
Sonuç, başlıca sağlayıcılar için tahmin üretir:
| Inbox Skoru | Tavsiye |
|---|---|
| ≥ 80 | Gönderime hazır — yüksek ihtimalle gelen kutusu |
| 60–79 | İyileştirme önerilir — olası inbox / spam riski |
| < 60 | Gönderim önerilmez — spam riski yüksek |
Teslimatı Artırmak İçin İpuçları
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:
| Metrik | Tanı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 |
| Bounce | Geri 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 İptali | Bu kampanya üzerinden abonelikten çıkanlar |
Oranlar şu paydalarla hesaplanır:
| Oran | Formül | Not |
|---|---|---|
| Teslim oranı | delivered / sent | Başarılı teslim yüzdesi |
| Açılma oranı | opens / delivered | Bounce'lar paydaya alınmaz (teslim edilmediler) |
| Tıklama oranı | clicks / delivered | Bazı raporlarda clicks / opens (CTOR) gösterilir |
| Bounce oranı | bounced / sent | Hard + 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ı.
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.
| Kolon | Açıklama |
|---|---|
| URL | Tıklanan bağlantı |
| Toplam tıklama | Tüm tıklamalar (aynı kişi birden çok tıklayabilir) |
| Benzersiz tıklama | Farklı kişi sayısı |
| Yüzde | Linkin 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.
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.
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?
| İşlem | Kredi 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 |
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).
Paket Satın Alma (PayTR)
Krediler PayTR altyapısıyla güvenli (3D Secure / iframe) şekilde alınır. Adımlar:
- 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).
- 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.)
- PayTR ödeme ekranına yönlendirilirsiniz. Kart bilgilerinizi doğrudan PayTR'ye girersiniz — SenderTR kart verisi saklamaz.
- Ö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.
- 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
| Paket | E-posta | Fiyat (+KDV %20) |
|---|---|---|
| Başlangıç | 10.000 | ₺250 |
| Standart | 50.000 | ₺1.100 |
| Profesyonel | 100.000 | ₺1.900 |
| İşletme | 250.000 | ₺4.250 |
| Kurumsal | 500.000 | ₺7.500 |
| Enterprise | 1.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şik | Seviye | Mesaj |
|---|---|---|
| %80 | Uyarı | "Kredi kullanımınız %80 seviyesinde" — kesintisiz hizmet için yeni paket düşünün. |
| %95 | Kritik | "Krediniz tükenmek üzere" — gönderimleriniz durmadan önce paket alın. |
| %100 | Tükendi | "Krediniz tükendi" — kampanya/transactional gönderimleri yapılamaz. |
(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ş
refundedişaretlenir. - Manuel iade (destek): Yönetici, belirli bir miktar veya tüm satın almayı iade edebilir.
| Kural | Davranış |
|---|---|
| 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). |
| Idempotent | Zaten 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ışı
- Ayarlar → Ekip sayfasını açın. Mevcut üyeler ve bekleyen davetler listelenir.
- "Üye Davet Et": davet edilecek kişinin e-posta adresini girin ve bir rol seçin (Admin, Marketer, Uploader, Viewer).
- Sistem benzersiz bir davet token'ı (64 karakter) üretir ve 7 gün geçerli bir davet bağlantısı oluşturur.
- Davet edilen kişiye otomatik bir davet e-postası gider. (E-posta gönderilemese bile davet kaydı durur; bağlantıyı manuel paylaşabilirsiniz.)
- 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.
- 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ı:
| Rol | Yetki 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). |
| Admin | Faturalandı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.) |
| Marketer | Kampanya, otomasyon ve içerik (şablon) yönetimi. Pazarlama operasyonunu yürütür; faturalandırma ve ekip yönetimi yetkisi yoktur. |
| Uploader | Kiş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. |
| Viewer | Salt görüntüleme. Raporları ve verileri görür ama değişiklik yapamaz, gönderim yapamaz. İzleme/denetim amaçlı idealdir. |
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
- Ayarlar → Webhook'lar → "Yeni Webhook".
- Webhook URL'ini girin (geçerli bir
https://adresi, max 500 karakter). Bildirimler buraya POST edilir. - Dinlemek istediğiniz olayları seçin (en az bir tane zorunlu).
- Kaydedin. Sistem size tek seferlik bir secret gösterir — bunu güvenli bir yere kaydedin (aşağıya bakın).
- İsterseniz "Test" butonu ile endpoint'inize örnek bir bildirim göndererek entegrasyonu doğrulayın.
Olay (Event) Türleri
| Event | Etiket | Ne Zaman Tetiklenir? |
|---|---|---|
delivered | Teslim Edildi | E-posta alıcı sunucu tarafından kabul edildiğinde |
bounced | Bounce | E-posta geri döndüğünde (geçersiz adres, kutu dolu vb.) |
opened | Açıldı | Alıcı e-postayı açtığında (takip pikseli) |
clicked | Tıklandı | Alıcı içindeki bir linke tıkladığında |
unsubscribed | Abonelik İptal | Alıcı abonelikten çıktığında |
complained | Şikayet | Alı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ık | Değer |
|---|---|
Content-Type | application/json |
X-Webhook-Signature | HMAC-SHA256 imzası |
X-Event-Type | Olay türü (ör. delivered) |
X-Timestamp | ISO 8601 zaman damgası |
User-Agent | SenderTR-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 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ı kriteri | Endpoint'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. |
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şi | Ad, telefon, e-posta |
| Muhasebe | Ad, telefon, e-posta |
| Teknik kişi | Ad, telefon, e-posta |
| Adres | İl, ilçe, mahalle, cadde/sokak, bina no, daire no, posta kodu |
| Yasal izin | legal_consent_reason — alıcının e-postayı neden aldığını açıklayan metin (footer'daki "neden aldınız?" kutusunda gösterilir) |
API Anahtarı Oluşturma
Ayarlar → API / Entegrasyon. REST API ve entegrasyonlar için anahtar üretin.
- Anahtara açıklayıcı bir ad verin (ör. "Üretim sunucusu", "CRM entegrasyonu").
- İ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).
- Oluşturun. Anahtar
str_ön ekiyle üretilir (ör.str_xxxxxxxx...).
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
| Ayar | Açıklama |
|---|---|
| Cloudflare API Token | Eklerseniz domain DNS kayıtları (SPF/DKIM) Cloudflare'e otomatik kurulabilir. Token panelde maskelenir (••••••••); "Test" ile geçerliliği doğrulanır. |
| SMTP Kimlik Bilgileri | Transactional e-postaları SMTP relay üzerinden (smtp.sendertr.com:587, STARTTLS) göndermek için kullanıcı adı/şifre. |
| DMARC Rehberi | Her 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
/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
/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 grubu | Sınır | Kapsam (endpoint) |
|---|---|---|
transactional-api | 300 / dakika | POST /send |
api | 60 / dakika | Doğrulama, mesaj durumu, e-ticaret webhook ve tüm Marketing CRUD endpoint'leri |
login | 5 / dakika | Panel oturum açma (API değil, referans amaçlı) |
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
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?
- Panele girin: app.sendertr.com.
- Ayarlar → API / Entegrasyon bölümüne gidin.
- Yeni bir SMTP/API kimliği oluşturun; bir gönderim alan adı (DNS doğrulanmış) seçin.
- Oluşan
api_keydeğerini kopyalayın. Bu değer yalnızca bir kez gösterilir. - İ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 |
|---|---|
send | Transactional e-posta gönderimi (POST /send), mesaj durumu/listeleme |
verify | E-posta doğrulama (POST /verify, /verify/bulk) |
contacts:read | Kişileri listele/görüntüle |
contacts:write | Kişi oluştur/güncelle/sil |
lists:read | Listeleri listele/görüntüle |
lists:write | Liste oluştur/güncelle/sil |
segments:read | Segmentleri listele/görüntüle (segment yazma yoktur) |
campaigns:read | Kampanyaları listele/görüntüle |
campaigns:write | Taslak kampanya oluştur |
* | Tüm yetkiler (joker) |
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ı
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
to | string (email) | Evet | Alıcı e-posta adresi. |
subject | string | Evet | Konu satırı. Maks. 500 karakter. |
html | string | Koşullu | HTML gövde. text yoksa zorunlu. |
text | string | Koşullu | Düz metin gövde. html yoksa zorunlu. |
from_email | string (email) | Hayır | Gönderen adresi. Boşsa noreply@<gönderim-alanı> kullanılır. |
from_name | string | Hayır | Gönderen görünen adı. Boşsa hesap adınız kullanılır. Maks. 255. |
reply_to | string (email) | Hayır | Yanıtla adresi. |
headers | object | Hayır | Ek özel başlıklar (anahtar→değer). |
tags | array | Hayır | Raporlama/filtreleme için etiketler. |
metadata | object | Hayır | Serbest anahtar→değer üst veri (logta saklanır). |
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:
- Hesap aktif mi? (
tenant_inactive→ 403) - API/SMTP kimliği aktif mi? (
credential_inactive→ 403) - Günlük limit (Redis ile atomik sayım). (
daily_limit_exceeded→ 429) - Alıcı suppression listesinde mi? (
recipient_suppressed→ 422) - Kredi bakiyesi yeterli mi? (
insufficient_credit→ 402)
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
| Parametre | Açıklama |
|---|---|
status | Duruma göre filtre (queued, delivered, ...). |
from | Başlangıç tarihi (YYYY-MM-DD), created_at >=. |
to_date | Bitiş tarihi (YYYY-MM-DD), created_at <=. |
per_page | Sayfa 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, ...).
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ı
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
email | string (email) | Evet | Doğ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ı
| Alan | Tip | Açıklama |
|---|---|---|
result | string | Sonuç kategorisi (aşağıdaki tablo). |
score | integer | 0–100 güven puanı (yüksek = daha güvenli). |
mx_found | boolean | Alan adının MX kaydı var mı. |
smtp_check | boolean | SMTP el sıkışması başarılı mı. |
smtp_message | string | SMTP sunucu yanıtı (tanılama). |
is_disposable | boolean | Tek kullanımlık adres servisi mi. |
is_role_based | boolean | Rol adresi mi (info@, satis@ ...). |
is_catch_all | boolean | Alan adı catch-all mı. |
is_spam_trap | boolean | Spam-trap şüphesi var mı. |
result kategorileri
| Değer | Anlam |
|---|---|
valid | Adres geçerli ve teslim edilebilir görünüyor. |
invalid | Söz dizimi hatalı, MX yok veya SMTP reddetti. |
risky | Belirsiz/riskli (ör. greylisting, catch-all olasılığı). |
disposable | Tek kullanımlık (geçici) e-posta servisi. |
catch_all | Alan adı her adresi kabul ediyor; teslim garanti değil. |
spam_trap | Spam-trap şüphesi — gönderim yapmayın. |
unknown | SMTP 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ı
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
emails | array | Evet | E-posta dizisi. Maks. 100 eleman. |
emails.* | string (email) | Evet | Her 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 }
]
}
422 doğrulama hatası döner. Daha büyük listeleri 100'erlik parçalara bölerek gönderin.Kredi maliyeti
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 parametresi | Tip | Açıklama |
|---|---|---|
list_id | integer | Belirli bir listedeki kişiler (liste de hesabınıza ait olmalı). |
status | string | active, unsubscribed, bounced, complained, suppressed. |
search | string | E-posta, ad veya soyadda arama. Maks. 255. |
per_page | integer | 1–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.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
email | string (email) | Evet | Kişinin e-postası. Maks. 255. |
first_name | string | Hayır | Maks. 100. |
last_name | string | Hayır | Maks. 100. |
phone | string | Hayır | Maks. 20. |
city | string | Hayır | Maks. 100. |
custom_fields | object | Hayır | Serbest anahtar→değer alanları. |
list_ids | array(int) | Hayır | Eklenecek 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" } ] } }
PUT /contacts/{id}
Yetki: contacts:write. Var olan kişiyi günceller. Tüm alanlar opsiyoneldir (gönderilen güncellenir).
| Alan | Tip | Açıklama |
|---|---|---|
email | string | Benzersiz olmalı (hesap içinde). |
first_name / last_name / phone / city | string | Profil alanları. |
status | string | active, unsubscribed, bounced, complained, suppressed. |
custom_fields | object | Özel alanlar. |
list_ids | array(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).
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
name | string | Evet | Liste adı. Maks. 255. %, &, /, ^ gibi özel karakterler kullanılamaz. |
description | string | Hayır | Açıklama. Maks. 1000. |
is_tacir_list | boolean | Hayır | Tacir (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 } }.
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)
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).
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
name | string | Evet | Kampanya adı. Maks. 255. |
subject | string | Evet | Konu. Maks. 500. |
from_email | string (email) | Evet | Gönderen adresi. |
from_name | string | Evet | Gönderen adı. |
reply_to | string (email) | Hayır | Yanıtla adresi. |
html_content | string | Hayır | HTML içerik. |
message_type | string | Hayır | marketing (varsayılan), transactional, system. |
sending_domain_id | integer | Hayır | Hesabınıza ait gönderim alan adı ID'si. |
list_ids | array(int) | Hayır | Hedef liste ID'leri (hesabınıza ait). |
segment_ids | array(int) | Hayır | Hedef 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ık | Açıklama |
|---|---|
Content-Type | application/json |
X-Webhook-Signature | Gövdenin HMAC-SHA256 imzası (hex). Doğrulama için kullanın. |
X-Event-Type | Olay türü (ör. delivered). |
X-Timestamp | Gönderim zamanı (ISO 8601). |
User-Agent | SenderTR-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);
});
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
2xxdışı 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
| Alan | Zorunlu | Açıklama |
|---|---|---|
event | Evet | Olay adı (aşağıdaki tablo). |
email | Evet | Müşteri e-postası. |
first_name / last_name | Hayır | Müşteri adı. |
data | Hayır | Serbest 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 event | Otomasyon tetikleyici |
|---|---|
order.created | order_completed |
order.completed | order_completed |
cart.abandoned | cart_abandoned |
customer.created | customer_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.updated→order.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/create→order.created, orders/paid & orders/fulfilled→order.completed, checkouts/create→cart.abandoned, customers/create→customer.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ı
| Ayar | Değer |
|---|---|
| Sunucu (host) | smtp.sendertr.com |
| Port | 587 (STARTTLS / TLS) |
| Şifreleme | STARTTLS (TLS zorunlu) |
| Kimlik doğrulama | SASL (AUTH LOGIN / PLAIN) |
| Kullanıcı adı | SMTP kimliğinizin kullanıcı adı (username) (panelden) |
| Şifre | SMTP kimliğinizin şifresi (panelden, bir kez gösterilir) |
Ö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:
unsubscribeserbest,hard_bounce/complaint/manualengellidir. - 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.
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ı
| Kod | Anlam | Ne zaman |
|---|---|---|
200 OK | Başarılı | GET/PUT/DELETE başarılı; mevcut kişi upsert (güncelleme). |
201 Created | Oluşturuldu | Yeni kişi/liste/kampanya oluşturuldu. |
202 Accepted | Kuyruğa alındı | POST /send — e-posta kuyruğa alındı. |
400 Bad Request | Geçersiz istek | Tanımsız/genel validator hatası. |
401 Unauthorized | Kimlik doğrulanamadı | Anahtar eksik veya geçersiz/pasif. |
402 Payment Required | Ödeme gerekli | Yetersiz kredi (insufficient_credit). |
403 Forbidden | Yetkisiz | Hesap pasif, IP izinli değil veya yetki (scope) yetersiz. |
404 Not Found | Bulunamadı | Kayıt yok veya başka hesaba ait (izolasyon). |
422 Unprocessable Content | Doğrulama hatası | Alan eksik/yanlış; alıcı suppression listesinde; geçersiz payload. |
429 Too Many Requests | Çok fazla istek | Rate limit veya günlük gönderim limiti aşıldı. |
500 Internal Server Error | Sunucu 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
| Belirti | Olası neden | Çözüm |
|---|---|---|
401 unauthorized | Başlık eksik/yanlış | Authorization: Bearer ... veya X-Api-Key başlığını ekleyin. |
401 invalid_api_key | Anahtar yanlış/pasif | Panelden anahtarı kontrol edin; pasifse yeniden etkinleştirin/yenisini oluşturun. |
403 insufficient_scope | Yetki kapsamı eksik | Yanıttaki required_ability yetkisini anahtara ekleyin. |
403 ip_not_allowed | IP kısıtlaması | Sunucu çıkış IP'nizi anahtarın izinli IP listesine ekleyin. |
402 insufficient_credit | Bakiye bitti | Krediler → Paket Satın Al ile bakiye yükleyin. |
422 recipient_suppressed | Alıcı engelli | Hard 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 limit | Retry-After kadar bekleyip tekrar deneyin; istek hızını düşürün. |
429 daily_limit_exceeded | Günlük kota doldu | Ertesi gün (00:00 TR) sıfırlanır; limiti artırmak için destekle görüşün. |
404 | Yanlış ID / başka hesap | ID'nin doğru ve sizin hesabınıza ait olduğundan emin olun. |
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.