MailLandDocs
Pazarlama

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:

DurumDeğerAçıklama
Draft0Başlangıç durumu: düzenlenebilir, henüz gönderilmedi
Scheduled1Gelecekteki teslimat için sıraya alındı
Sending2Şu anda alıcılara gönderiliyor
Sent3Tüm alıcılar işlendi
Paused4Gönderim ortasında duraklatıldı
Cancelled5Gönderim iptal edildi
Failed6Gönderim sırasında sistem hatası

İzin verilen geçişler:

  • Draft → Scheduled (zamanla) veya Sending (hemen gönder) veya Cancelled (iptal et)
  • Scheduled → Sending veya Cancelled: Scheduled bir kampanyayı yeniden zamanlama desteklenmez
  • Sending → Sent, Paused, Cancelled veya Failed
  • Paused → Sending (devam ettir)
  • Sent veya Cancelled → arşivlendi

Kampanya Türleri

TürDeğerAçıklama
Regular0Standart tek seferlik kampanya
Automated1Otomasyonlar tarafından tetiklenir
ABTest2A/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.

EtiketDeğ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
Kişiselleştirilmiş kampanya içeriği
<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
Create campaign request
{
  "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"
}
AlanTürZorunluAçıklama
namestringEvetKampanya adı
subjectstringEvetE-posta konu satırı
previewTextstringHayırGelen kutusunda gösterilen önizleme metni
fromNamestringEvetGönderenin görünen adı
fromEmailstringEvetGönderenin e-posta adresi
replyTostringHayırYanıt adresi
htmlContentstringEvetHTML e-posta gövdesi
textContentstringHayırDüz metin yedeği
templateIdstringHayırKullanılacak şablon kimliği
typeintHayırKampanya türü (varsayılan: 0 Düzenli)
mailingListIdstringHayır*Hedef posta listesi
segmentIdstringHayır*Hedef segment

* mailingListId veya segmentId sağlayın, templateId ayarlanmadıkça ikisinden biri zorunludur.

Create a campaign
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

Campaign response
{
  "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
ParametreTürVarsayılanAçıklama
cursorstring-Önceki sayfanın nextCursor değerinden alınan opak imleç. İlk sayfa için belirtmeyin.
limitint20Sayfa başına öğe (maks. 100)
searchstring-Ada göre ara
statusint-CampaignStatus ile filtrele
typeint-CampaignType ile filtrele
mailingListIdstring-Posta listesine göre filtrele
sortBystring-Sıralama alanı
sortDescboolfalseAzalan sıralama
includeArchivedboolfalseArşivlenmiş kampanyaları dahil et
List campaigns
curl "https://api.mail.land/v1/marketing/campaigns?limit=20&status=3" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Campaign list response
{
  "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:

Get campaign details
curl https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Campaign detail response
{
  "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ı

OranFormül
deliveryRatetotalDelivered / totalSent * 100
openRatetotalOpened / totalDelivered * 100
clickRatetotalClicked / totalDelivered * 100
clickToOpenRatetotalClicked / totalOpened * 100
bounceRatetotalBounced / totalSent * 100
unsubscribeRatetotalUnsubscribed / 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.

DurumKodAçıklama
200-Kampanya güncellendi
400INVALID_REQUESTYalnızca taslak kampanyalar düzenlenebilir
404RESOURCE_NOT_FOUNDKampanya bulunamadı
Update a campaign
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
Schedule request
{
  "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.

DurumKodAçıklama
200-Kampanya zamanlandı
400VALIDATION_FAILEDZamanlama zamanı gelecekte olmalıdır
404RESOURCE_NOT_FOUNDKampanya bulunamadı veya zamanlanamıyor
403MARKETING_NOT_YET_ALLOWEDPazarlama hesap için henüz açık değil (bkz. Hata Kodları); /send de bunu döndürür
403MARKETING_SUSPENDEDPazarlama platform genelinde kullanılamıyor; /send de bunu döndürür
422CAMPAIGN_LINK_BLOCKEDKampanyadaki 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
Schedule a campaign
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}/send

Kampanyayı 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.

Send a campaign immediately
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}/pause
Pause a campaign
curl -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}/resume
Resume a campaign
curl -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}/cancel

Draft, Scheduled veya Sending durumundaki bir kampanyayı iptal eder. Önceden gönderilen e-postalar geri alınmaz.

Cancel a campaign
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%20Newsletter

Orijinalden tüm ayarlar kopyalanarak yeni bir Draft kampanyası oluşturur. name sorgu parametresi isteğe bağlıdır.

Duplicate a campaign
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}/archive
Archive a campaign
curl -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}/unarchive
Unarchive a campaign
curl -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
ParametreTürVarsayılanAçıklama
cursorstring-Önceki sayfanın nextCursor değerinden alınan opak imleç. İlk sayfa için belirtmeyin.
limitint20Sayfa başına öğe (maks. 100)
statusstring-Alıcı durumuna göre filtrele
searchstring-E-postaya göre ara
Get campaign recipients
curl "https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/recipients?limit=20" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Campaign recipients response
{
  "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ı

DurumDeğerAçıklama
Pending0Sırada, henüz gönderilmedi
Sent1MTA tarafından kabul edildi
Delivered2Alıcıya teslim edildi
Opened3Alıcı açtı
Clicked4Alıcı bir bağlantıya tıkladı
Bounced5Sert geri dönüş
Unsubscribed6Alıcı aboneliği iptal etti
Complained7Spam şikayeti
Failed8Teslimat 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.

Delete a campaign
curl -X DELETE https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Hata Yanıtları

DurumKodAçıklama
400VALIDATION_FAILEDZorunlu alanlar eksik
400INVALID_REQUESTYalnızca taslak kampanyalar düzenlenebilir
403FORBIDDENYetersiz izinler
404RESOURCE_NOT_FOUNDKampanya 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

Bu sayfada