Kampanyalar
E-posta pazarlama kampanyaları oluşturun, zamanlayın ve gönderin; izleme ve analitik dahil
E-posta pazarlama kampanyaları oluşturun ve yönetin. MailLand, her kampanya için alıcı seçimi, gönderim, teslimat takibi ve etkileşim analitiğini yönetir.
Kampanya Yaşam Döngüsü
Her kampanya belirli bir durum akışından geçer:
| Durum | Değer | Açıklama |
|---|---|---|
Draft | 0 | Başlangıç durumu: düzenlenebilir, henüz gönderilmedi |
Scheduled | 1 | Gelecekteki teslimat için sıraya alındı |
Sending | 2 | Şu anda alıcılara gönderiliyor |
Sent | 3 | Tüm alıcılar işlendi |
Paused | 4 | Gönderim ortasında duraklatıldı |
Cancelled | 5 | Gönderim iptal edildi |
Failed | 6 | Gönderim sırasında sistem hatası |
İzin verilen geçişler:
Draft→Scheduled(zamanla) veyaSending(hemen gönder) veyaCancelled(iptal et)Scheduled→SendingveyaCancelled:Scheduledbir kampanyayı yeniden zamanlama desteklenmezSending→Sent,Paused,CancelledveyaFailedPaused→Sending(devam ettir)SentveyaCancelled→ arşivlendi
Kampanya Türleri
| Tür | Değer | Açıklama |
|---|---|---|
Regular | 0 | Standart tek seferlik kampanya |
Automated | 1 | Otomasyonlar tarafından tetiklenir |
ABTest | 2 | A/B testi kampanyası |
Kişiselleştirme
Kampanya konu satırları ve içeriği, o abonenin kendi kaydından alıcı başına değiştirilen {{variable}} birleştirme etiketlerini destekler.
| Etiket | Değer |
|---|---|
{{firstName}} | Abonenin adı |
{{lastName}} | Abonenin soyadı |
{{fullName}} | Ad ve soyad birleşimi |
{{email}} | Abonenin e-posta adresi |
{{subscriberId}} | Opak abone tanımlayıcısı |
{{custom_<field>}} | Abonedeki herhangi bir özel alan, {{<field>}} olarak da kullanılabilir |
<p>Hi {{firstName}}, here's what's new this month.</p>Değeri olmayan bir etiket tam olarak yazıldığı gibi bırakılır: adı olmayan bir abone için {{firstName}}, boş bir boşluk olmak yerine teslim edilen e-postada {{firstName}} olarak kalır. Her iki durumda da doğru okunan içerik yazın; örneğin Hi there{{firstName}} kötü bir seçimken "Your account" güvenlidir. Her abonenin bu alana sahip olduğundan emin değilseniz yedek bir selamlama kullanın.
Değerler, düştükleri kısma göre kaçışlanır: HTML içeriği HTML olarak kaçışlanır (böylece & veya < içeren bir ad biçimlendirmenizi bozamaz), oysa konu satırı ve düz metin gövdesi asla kaçışlanmaz, Ben & Jerry's tam olarak öyle kalır.
Eski snake_case yazımları ({{first_name}}, {{last_name}}, {{full_name}}, {{subscriber_id}}) takma ad olarak çalışmaya devam eder.
Kampanya Oluşturma
Bir kampanya oluşturmadan veya güncellemeden önce çalışma alanının Business Verified (İşletme Olarak Doğrulanmış) olması gerekir: bu, aşağıdaki fromEmail kontrolünden önce gelen ayrı bir kapıdır. Değilse, istek 400 INVALID_REQUEST ("Marketing campaigns require Business Verified status…") hatasıyla reddedilir.
fromEmail alan adı, oluşturma ve güncelleme sırasında zaten eklenmiş ve tamamen doğrulanmış (SPF + DKIM + DMARC) olmalıdır, aksi takdirde istek reddedilir (400/404). Bu kontrol burada yapılır, gönderim sırasında değil, bkz. Hemen Gönder.
POST https://api.mail.land/v1/marketing/campaigns{
"name": "February Newsletter",
"subject": "What's new in February",
"previewText": "Product updates and tips",
"fromName": "MailLand Team",
"fromEmail": "[email protected]",
"replyTo": "[email protected]",
"htmlContent": "<html>...</html>",
"textContent": "Plain text version...",
"type": 0,
"mailingListId": "ddv6ou6kz4wbto",
"segmentId": "x4xa3ep1zmqq0b"
}| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
name | string | Evet | Kampanya adı |
subject | string | Evet | E-posta konu satırı |
previewText | string | Hayır | Gelen kutusunda gösterilen önizleme metni |
fromName | string | Evet | Gönderenin görünen adı |
fromEmail | string | Evet | Gönderenin e-posta adresi |
replyTo | string | Hayır | Yanıt adresi |
htmlContent | string | Evet | HTML e-posta gövdesi |
textContent | string | Hayır | Düz metin yedeği |
templateId | string | Hayır | Kullanılacak şablon kimliği |
type | int | Hayır | Kampanya türü (varsayılan: 0 Düzenli) |
mailingListId | string | Hayır* | Hedef posta listesi |
segmentId | string | Hayır* | Hedef segment |
* mailingListId veya segmentId sağlayın, templateId ayarlanmadıkça ikisinden biri zorunludur.
curl -X POST https://api.mail.land/v1/marketing/campaigns \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"name": "February Newsletter",
"subject": "What'\''s new in February",
"fromName": "MailLand Team",
"fromEmail": "[email protected]",
"htmlContent": "<html><body><h1>Hello!</h1></body></html>",
"mailingListId": "ddv6ou6kz4wbto"
}'Yanıt
{
"id": "uivozyvucowj9w",
"name": "February Newsletter",
"subject": "What's new in February",
"previewText": "Product updates and tips",
"fromName": "MailLand Team",
"fromEmail": "[email protected]",
"status": "draft",
"statusName": "Draft",
"type": 0,
"typeName": "Regular",
"mailingListId": "ddv6ou6kz4wbto",
"mailingListName": "Main Newsletter",
"segmentId": null,
"segmentName": null,
"createdAt": "2026-02-17T12:00:00Z",
"updatedAt": "2026-02-17T12:00:00Z"
}Kampanyaları Listele
GET https://api.mail.land/v1/marketing/campaigns| Parametre | Tür | Varsayılan | Açıklama |
|---|---|---|---|
cursor | string | - | Önceki sayfanın nextCursor değerinden alınan opak imleç. İlk sayfa için belirtmeyin. |
limit | int | 20 | Sayfa başına öğe (maks. 100) |
search | string | - | Ada göre ara |
status | int | - | CampaignStatus ile filtrele |
type | int | - | CampaignType ile filtrele |
mailingListId | string | - | Posta listesine göre filtrele |
sortBy | string | - | Sıralama alanı |
sortDesc | bool | false | Azalan sıralama |
includeArchived | bool | false | Arşivlenmiş kampanyaları dahil et |
curl "https://api.mail.land/v1/marketing/campaigns?limit=20&status=3" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"items": [
{
"id": "uivozyvucowj9w",
"name": "February Newsletter",
"subject": "What's new in February",
"status": "sent",
"statusName": "Sent",
"type": 0,
"typeName": "Regular",
"mailingListId": "ddv6ou6kz4wbto",
"mailingListName": "Main Newsletter",
"totalRecipients": 5000,
"totalSent": 4980,
"totalDelivered": 4900,
"totalOpened": 1520,
"totalClicked": 195,
"totalBounced": 45,
"totalUnsubscribed": 12,
"sentAt": "2026-02-15T10:00:00Z",
"completedAt": "2026-02-15T10:35:00Z",
"createdAt": "2026-02-14T08:00:00Z"
}
],
"nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
"hasMore": true
}Kampanya Ayrıntılarını Getir
GET https://api.mail.land/v1/marketing/campaigns/{id}HTML içeriği, tüm istatistikler ve hesaplanan etkileşim oranlarını içeren tam CampaignDetailDto nesnesini döndürür:
curl https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"id": "uivozyvucowj9w",
"name": "February Newsletter",
"subject": "What's new in February",
"previewText": "Product updates and tips",
"fromName": "MailLand Team",
"fromEmail": "[email protected]",
"replyTo": "[email protected]",
"status": "sent",
"statusName": "Sent",
"type": 0,
"typeName": "Regular",
"htmlContent": "<html>...</html>",
"textContent": "Plain text...",
"mailingListId": "ddv6ou6kz4wbto",
"mailingListName": "Main Newsletter",
"totalRecipients": 5000,
"totalSent": 4980,
"totalDelivered": 4900,
"totalOpened": 1520,
"totalClicked": 195,
"totalBounced": 45,
"totalUnsubscribed": 12,
"totalComplaints": 2,
"deliveryRate": 98.39,
"openRate": 31.02,
"clickRate": 3.98,
"clickToOpenRate": 12.83,
"bounceRate": 0.9,
"unsubscribeRate": 0.24,
"openTrackingEnabled": true,
"clickTrackingEnabled": true,
"sentAt": "2026-02-15T10:00:00Z",
"completedAt": "2026-02-15T10:35:00Z",
"createdAt": "2026-02-14T08:00:00Z",
"updatedAt": "2026-02-15T10:35:00Z"
}Etkileşim Oranları
| Oran | Formül |
|---|---|
deliveryRate | totalDelivered / totalSent * 100 |
openRate | totalOpened / totalDelivered * 100 |
clickRate | totalClicked / totalDelivered * 100 |
clickToOpenRate | totalClicked / totalOpened * 100 |
bounceRate | totalBounced / totalSent * 100 |
unsubscribeRate | totalUnsubscribed / totalDelivered * 100 |
Oranlar sunucuda ham sayaçlardan hesaplanır (açılmalar ve tıklamalar alıcı başına tekildir). deliveryRate ve bounceRate gönderilenlere, openRate, clickRate ve unsubscribeRate teslim edilenlere göre oranlardır; clickToOpenRate (CTOR) tıklayanların açanlara oranıdır ve clickRateten ayrı bir ölçüttür. Bir oran üst sınırı olmayan bir yüzdedir (clickToOpenRate 100'ü aşabilir) ve kullanılamadığında 0 değil null olur: paydası 0'dır ya da gereken izleme hesapta kapalıdır (openTrackingEnabled / clickTrackingEnabled geçerli ayarı gösterir). Kampanyaları birleştirmek için sayaçları toplayıp bir kez bölün; yüzdelerin ortalamasını almayın. Liste de her kampanya için aynı alanları döndürür.
Kampanya Güncelleme
PUT https://api.mail.land/v1/marketing/campaigns/{id}Yalnızca Draft veya Scheduled durumdaki kampanyalar güncellenebilir. İstek gövdesi, değiştirilemeyen type alanı dışında oluşturma isteğiyle aynıdır.
| Durum | Kod | Açıklama |
|---|---|---|
200 | - | Kampanya güncellendi |
400 | INVALID_REQUEST | Yalnızca taslak kampanyalar düzenlenebilir |
404 | RESOURCE_NOT_FOUND | Kampanya bulunamadı |
curl -X PUT https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"name": "February Newsletter (Updated)",
"subject": "What'\''s new in February - updated",
"fromName": "MailLand Team",
"fromEmail": "[email protected]",
"htmlContent": "<html><body><h1>Updated!</h1></body></html>",
"mailingListId": "ddv6ou6kz4wbto"
}'Kampanya Zamanlama
POST https://api.mail.land/v1/marketing/campaigns/{id}/schedule{
"scheduledAt": "2026-02-20T14:00:00Z"
}scheduledAt zamanı gelecekte olmalıdır. Kampanya durumu Scheduled olarak değişir ve CampaignWorker belirtilen zamanda çalıştırır.
Zamanlama yalnızca Draft durumundan yapılabilir: zaten Scheduled olan bir kampanya bu uç nokta üzerinden yeniden zamanlanamaz.
| Durum | Kod | Açıklama |
|---|---|---|
200 | - | Kampanya zamanlandı |
400 | VALIDATION_FAILED | Zamanlama zamanı gelecekte olmalıdır |
404 | RESOURCE_NOT_FOUND | Kampanya bulunamadı veya zamanlanamıyor |
403 | MARKETING_NOT_YET_ALLOWED | Pazarlama hesap için henüz açık değil (bkz. Hata Kodları); /send de bunu döndürür |
403 | MARKETING_SUSPENDED | Pazarlama platform genelinde kullanılamıyor; /send de bunu döndürür |
422 | CAMPAIGN_LINK_BLOCKED | Kampanyadaki bir bağlantı güvensiz olarak işaretlenmiş bir hedefe gidiyor; /send de bunu döndürür. Hiçbir şey zamanlanmaz veya gönderilmez |
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/schedule \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "scheduledAt": "2026-02-20T14:00:00Z" }'Hemen Gönder
POST https://api.mail.land/v1/marketing/campaigns/{id}/sendKampanyayı hemen gönderir. Kampanya durumu Sending olarak değişir ve CampaignWorker alıcıları işlemeye başlar.
/send'in kendisi alan adı doğrulamasını kontrol etmez: bu kontrol oluşturma/güncelleme sırasında yapılır (bkz. Kampanya Oluşturma). Hedef liste/segmentte kampanyayı almaya uygun kimse yoksa (örneğin herkes bastırılmış veya abonelikten çıkmışsa), /send 422 CAMPAIGN_NO_ELIGIBLE_RECIPIENTS döner.
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/send \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Duraklatma ve Devam Ettirme
Gönderilmekte olan bir kampanyayı duraklatın:
POST https://api.mail.land/v1/marketing/campaigns/{id}/pausecurl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/pause \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Duraklatılmış bir kampanyayı devam ettirin:
POST https://api.mail.land/v1/marketing/campaigns/{id}/resumecurl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/resume \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Duraklatma, CampaignWorker'ın kalan alıcıları işlemesini durdurur. Önceden gönderilen e-postalar etkilenmez. Devam ettirme kaldığı yerden sürdürür.
Kampanya İptal Etme
POST https://api.mail.land/v1/marketing/campaigns/{id}/cancelDraft, Scheduled veya Sending durumundaki bir kampanyayı iptal eder. Önceden gönderilen e-postalar geri alınmaz.
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/cancel \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Kampanya Kopyalama
POST https://api.mail.land/v1/marketing/campaigns/{id}/duplicate?name=Copy%20of%20NewsletterOrijinalden tüm ayarlar kopyalanarak yeni bir Draft kampanyası oluşturur. name sorgu parametresi isteğe bağlıdır.
curl -X POST "https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/duplicate?name=Copy%20of%20Newsletter" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Arşivleme ve Arşivden Çıkarma
Sent veya Cancelled kampanyayı arşivleyin:
POST https://api.mail.land/v1/marketing/campaigns/{id}/archivecurl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/archive \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Arşivlenmiş kampanyayı arşivden çıkarın:
POST https://api.mail.land/v1/marketing/campaigns/{id}/unarchivecurl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/unarchive \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Arşivlenmiş kampanyalar, includeArchived=true iletilmedikçe varsayılan liste görünümünden gizlenir.
Kampanya Alıcıları
Bir kampanya için teslimat durumuyla birlikte sayfalandırılmış alıcıları alın:
GET https://api.mail.land/v1/marketing/campaigns/{id}/recipients| Parametre | Tür | Varsayılan | Açıklama |
|---|---|---|---|
cursor | string | - | Önceki sayfanın nextCursor değerinden alınan opak imleç. İlk sayfa için belirtmeyin. |
limit | int | 20 | Sayfa başına öğe (maks. 100) |
status | string | - | Alıcı durumuna göre filtrele |
search | string | - | E-postaya göre ara |
curl "https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/recipients?limit=20" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"items": [
{
"email": "[email protected]",
"status": "Opened",
"sentAt": "2026-02-15T10:00:30Z",
"deliveredAt": "2026-02-15T10:00:32Z",
"openedAt": "2026-02-15T11:15:00Z",
"clickedAt": "2026-02-15T11:16:30Z",
"bouncedAt": null,
"complainedAt": null,
"unsubscribedAt": null,
"openCount": 2,
"clickCount": 1,
"bounceReason": null
}
],
"nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
"hasMore": true
}Alıcı Durumları
| Durum | Değer | Açıklama |
|---|---|---|
Pending | 0 | Sırada, henüz gönderilmedi |
Sent | 1 | MTA tarafından kabul edildi |
Delivered | 2 | Alıcıya teslim edildi |
Opened | 3 | Alıcı açtı |
Clicked | 4 | Alıcı bir bağlantıya tıkladı |
Bounced | 5 | Sert geri dönüş |
Unsubscribed | 6 | Alıcı aboneliği iptal etti |
Complained | 7 | Spam şikayeti |
Failed | 8 | Teslimat başarısız |
openedAt/openCount ve clickedAt/clickCount, MailLand'in bugün filtrelemediği makine etkinliğini, Apple Mail Privacy Protection ön yüklemesi ve güvenlik bağlantı tarayıcılarını, içerir. Açma/tıklamadan türetilen oranları kesin bir insan etkileşimi rakamı değil, bir üst sınır olarak değerlendirin.
Kampanya Silme
DELETE https://api.mail.land/v1/marketing/campaigns/{id}Bir kampanyayı ve alıcı verilerini kalıcı olarak siler. Yalnızca Draft veya Scheduled durumundaki kampanyalar silinebilir; başka bir durumu silmeye çalışmak 404 döner: bunun yerine gönderilmiş bir kampanyayı arşivleyin.
curl -X DELETE https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Hata Yanıtları
| Durum | Kod | Açıklama |
|---|---|---|
400 | VALIDATION_FAILED | Zorunlu alanlar eksik |
400 | INVALID_REQUEST | Yalnızca taslak kampanyalar düzenlenebilir |
403 | FORBIDDEN | Yetersiz izinler |
404 | RESOURCE_NOT_FOUND | Kampanya bulunamadı |
Sonraki Adımlar
- Aboneler: abone kişilerini yönetin
- Listeler: aboneleri posta listelerinde düzenleyin
- Segmentler: kampanyaları dinamik segmentlerle hedefleyin
- Otomasyonlar: tetikleyici tabanlı e-posta dizileri kurun