Bir e-posta listesi bir gelen kutusuna aittir ve sizden haber almayı kabul eden kişileri tutar. Ziyaretçiler sitenizdeki bir formla katılır, arka uç zaten izni olan kişileri ekler, her değişiklik de dışa aktarabileceğiniz bir izin kaydına yazılır.
Bir listenin onay ve karşılama e-postaları, gelen kutusunun e-posta kanalı üzerinden, o kanalın adresi ve SMTP hesabıyla gider. E-posta kanalı olmayan bir liste için Yuva hiçbir şey göndermez.
1. Gönderen bilgilerini girin
Pazarlama içeren e-posta, kimin gönderdiğini ve ona nasıl ulaşılacağını belirtmelidir. Panelde: Ayarlar → gelen kutusu → Gönderen bilgileri. Yasal unvanı, posta adresini, sicil bilgisini (MERSİS numarası, ticaret sicil ya da vergi numarası) ve bir iletişim bilgisini (e-posta adresi, telefon ya da URL) yazın. Yuva bunları gelen kutusunun liste e-postalarının alt bilgisine koyar.
API ile: sender nesnesiyle PATCH /v1/inboxes/{inboxId}.
2. Liste oluşturun
Panelde: Bültenler, sonra Yeni liste. Gelen kutusunu ve listenin e-postalarını gönderecek e-posta kanalını seçin.
| Ayar (API alanı) | Anlamı |
|---|---|
Ad (name) |
En çok 100 karakter, gelen kutusunda benzersiz. |
Açıklama (description) |
En çok 500 karakter; formlarda ve tercih sayfasında gösterilir. |
Çift onay (double_opt_in) |
Varsayılan açık. Formdan gelen aboneler abone olmadan önce e-postayla onaylar. |
Herkese açık (public) |
Varsayılan açık. Formlarda ve tercih sayfasında sunulur. Özel listeleri yalnızca API ve ekibiniz doldurur. |
Ticari (commercial) |
Varsayılan açık. Pazarlama içeriğini işaretler; izin kayıtlarının dışa aktarımında yer alır. |
Karşılama (welcome) |
Varsayılan açık. Biri abone olunca abonelikten çıkma bağlantılı bir makbuz gönderir. |
Gönderen kanal (channel_id) |
Aynı gelen kutusunda SMTP hesabı olan bir e-posta kanalı. Yoksa formlar hiçbir şey göndermez ve abonelikler pending kalır. |
API ile: inbox_id ve name ile POST /v1/lists.
3. Formu sitenize ekleyin
Form, aynı gelen kutusunun bir sohbet kanalını kullanır: kanalın herkese açık anahtarı ve izinli origin’leri formun nerede görünebileceğini belirler. Panelde listenin sayfasındaki Form sekmesi bu kod parçalarını sizin için doldurur.
<script src="https://support.example.com/yuva-subscribe.js" defer></script>
<yuva-subscribe
channel="yuva_pk_xxxxxxxxxxxxxxxx"
lists="LIST-ID"
privacy-url="https://www.example.com/privacy"
></yuva-subscribe>
lists alanını boş bırakırsanız gelen kutusunun tüm herkese açık listeleri, her biri için bir kutuyla
sunulur. Öğe bir e-posta adresi ister ve işaretlenmemiş bir izin kutusu gösterir. Ziyaretçi kutuyu
işaretlemeden abone olamaz; gördüğü cümle de kanıt olarak saklanır.
Paketleyici kullanan bir projede npm install useyuva çalıştırın ve şunlardan birini kullanın:
| Yığın | Kod |
|---|---|
| Herhangi bir paketleyici | import "useyuva/subscribe", sonra yukarıdaki öğe ve bir server özniteliği. |
| React | import { YuvaSubscribe } from "useyuva/react" ve <YuvaSubscribe channel server lists={["LIST-ID"]} />. |
| Nuxt | nuxt.config içinde modules: ["useyuva/nuxt"] ve yuva: { server, channel }, sonra <YuvaSubscribe :lists="['LIST-ID']" />. |
| shadcn/ui | npx shadcn@latest add https://useyuva.com/r/yuva-subscribe.json, sonra <YuvaSubscribe server channel lists={["LIST-ID"]} />. |
Siteniz bir Content Security Policy gönderiyorsa Yuva sunucunuza script-src ve connect-src içinde
izin verin. Oturum açmış kullanıcılar için öğeye setIdentityToken ile bir kimlik belirteci
verin: e-posta alanı yerine her liste için bir anahtar gösterir ve kullanıcının adresi doğrulanmışsa
hemen abone eder.
4. Aboneler ne görür
- Formu doldururlar. Adres yeni, abone, abonelikten çıkmış ya da bilinmiyor olsun yanıt hep aynıdır; böylece form kimin listenizde olduğunu kimseye söylemez.
- Çift onayda
/s/…bağlantılı bir e-posta alırlar. Sayfayı açmak hiçbir şeyi değiştirmez; onaylayan, sayfadaki düğmedir. Ardından liste karşılama gönderiyorsa karşılama e-postası gelir. - Her liste e-postasında
/m/…bağlantısı vardır; kişi buradan bir listeden ya da her şeyden çıkar veya listeleri seçer. Bu sayfayı açmak da hiçbir şeyi değiştirmez. Tek tıkla abonelikten çıkmayı (RFC 8058) destekleyen posta programları listeyi tek bir istekle çıkarır.
Sayfalar ve e-postalar İngilizce, Türkçe ve Almanca gelir. Abonelikten çıkan kişiye yalnızca kendisi
yeniden abone olabilir: ekibiniz ve anahtarlarınız olamaz. Her şeyden çıkmış, bir e-postayı spam diye
bildirmiş ya da itiraz ettikten sonra silinmiş bir adres reddedilir (409 opted_out). Bekleyen
abonelikler 30 gün sonra, abonelikten çıkanlar üç yıl sonra silinir.
5. Arka uçtan abone ekleyin
Başka bir yerde, örneğin kayıt sırasında, kabul etmiş kişiler için kullanın. Kişinin nasıl kabul ettiğini
siz bildirirsiniz; Yuva bunu kanıt olarak saklar. Anahtarın lists:write kapsamı olmalıdır.
curl -X POST https://support.example.com/v1/lists/LIST-ID/subscriptions \
-H "Authorization: Bearer $YUVA_API_KEY" \
-H "Idempotency-Key: signup-1234" \
-H "Content-Type: application/json" \
-d '{
"email": "ada@example.com",
"name": "Ada",
"consent": {
"confirmed": true,
"obtained_at": "2026-10-01T09:30:00Z",
"text": "Ürün haberlerini e-postayla göndermenizi kabul ediyorum.",
"page_url": "https://www.example.com/signup",
"reference": "order-1234"
}
}'
confirmed: true ile abonelik hemen subscribed olur ve karşılama e-postası gider. confirmed: false
ile pending olur ve kişiye önce bir onay e-postası gider; kabul ettiğinden emin değilseniz bunu
kullanın. 201 yeni bir abonelik, 200 listede zaten olan bir adrestir.
6. İzin kayıtlarını dışa aktarın
Listeyi açın, sonra Dışa aktar’ı seçin ya da GET /v1/lists/{listId}/consent-export çağırın
(format=csv veya json; daha yeni olaylar için since). Her satır bir olaydır: adres, durum, zaman,
kaynak, IP adresi, sayfa ve kişinin gördüğü sözler. GET /v1/contacts/{contactId}/consent bir kişinin
tüm listelerdeki kayıtlarını verir; GDPR m. 15 ya da KVKK m. 11 kapsamındaki erişim talepleri içindir.
=, +, - ya da @ ile başlayan hücrelerin başına işaret konur, böylece e-tablolar bunları formül
olarak çalıştırmaz.
Türkiye: İYS
Yuva İYS’ye bağlanmaz. Listenin izin kayıtlarını dışa aktarın ve İYS’ye kendiniz yükleyin; orada gönderici olarak kaydolmak da size aittir. Bu sayfa hukuki tavsiye değildir.
Sorun giderme
- Formda liste yok: liste özel ya da arşivlenmiş, veya
listskanalın gelen kutusunda herkese açık olmayan bir kimliği gösteriyor. - Form hata gösteriyor: sayfanın origin’i sohbet kanalının izinli origin’lerinden biri değil.
- Onay e-postası gelmedi: listenin gönderen kanalı yok (panel bunu işaretler) ya da adres bugün zaten 3 onay aldı.
409 email_channel_required: kanal, listenin gelen kutusunda SMTP hesabı olan bir e-posta kanalı değil.
Başvuru
<yuva-subscribe> öznitelikleri
| Öznitelik | Anlamı |
|---|---|
channel |
Sohbet kanalının herkese açık anahtarı. Zorunlu. |
server |
Yuva sunucu URL’si. Varsayılan: yuva-subscribe.js’in geldiği yer. |
lists |
Virgülle ayrılmış liste kimlikleri. Boş: tüm herkese açık listeler. |
layout |
stacked (varsayılan) ya da inline. |
name |
off (varsayılan), optional ya da required: ad alanı ekler. |
button-text |
Düğmenin etiketi. |
consent |
Kendi izin cümleniz. Gösterildiği gibi saklanır. |
privacy-url |
Kutunun yanında gösterilen gizlilik bildirimi bağlantısı. |
locale, dir |
en ya da tr; ltr ya da rtl. |
identity-token |
Bir belirteç dizesi; genelde setIdentityToken daha iyidir. |
--yuva-accent, --yuva-on-accent, --yuva-radius, --yuva-font ve
::part(field|button|consent|status) ile biçimlendirin.
Olaylar
| Olay | detail |
|---|---|
yuva-subscribe |
{ lists, confirmation }: sunulan kimlikler ve bir onay e-postası beklenip beklenmediği. |
yuva-subscribe-error |
{ code }. |
React ve shadcn: onSubscribe, onError. Nuxt: @subscribe, @error.
Uç noktalar
| Uç nokta | Kullanım |
|---|---|
GET, POST /v1/lists |
Listeleri sıralar ve oluşturur (archived=true arşivlenenleri sıralar). |
GET, PATCH, DELETE /v1/lists/{listId} |
Listeyi okur, değiştirir, arşivler (archived: true) ya da siler. |
GET /v1/lists/{listId}/growth |
Günlük yeni, onaylanan ve ayrılan sayısı; days=30 ya da 90. |
GET, POST /v1/lists/{listId}/subscriptions |
Aboneleri sıralar (state, q) ve ekler. |
GET, PATCH, DELETE /v1/lists/{listId}/subscriptions/{subscriptionId} |
İzin olaylarıyla okur, abonelikten çıkarır (state: unsubscribed), siler. |
POST /v1/lists/{listId}/subscriptions/{subscriptionId}/confirmation |
Onay e-postasını yeniden gönderir. |
GET /v1/lists/{listId}/consent-export |
Bir listenin izin kayıtları. |
GET /v1/contacts/{contactId}/subscriptions |
Bir kişinin abonelikleri. |
GET /v1/contacts/{contactId}/consent |
Bir kişinin izin kayıtları. |
GET /client/v1/channels/{channel_key}/lists |
Form için herkese açık listeler ve bir form belirteci. |
POST /client/v1/channels/{channel_key}/subscriptions |
Formdan abone olur. |
GET /client/v1/subscriptions, PUT, DELETE /client/v1/subscriptions/{listId} |
Oturum açmış kullanıcının listeleri, abone olma, çıkma. |
İstek ve yanıt biçimlerinin tamamı API sözleşmesinde yer alır. Kendi
formlarınız için useyuva, headless istemcide lists(), subscribe(),
subscriptions(), subscribeList() ve unsubscribeList() sunar.
Kapsamlar ve olaylar
| Ad | Anlamı |
|---|---|
lists:read |
Listeleri, abonelikleri, büyümeyi ve izin dışa aktarımlarını okur. |
lists:write |
Liste oluşturur, değiştirir, siler; abone ekler, abonelikten çıkarır, siler; onayları yeniden gönderir. |
subscription.created |
Webhook olayı: biri herhangi bir durumda abone oldu. |
subscription.updated |
Webhook olayı: durum değişti; eski durum data.previous_state içindedir. |
Bu kapsamlar var olmadan önce oluşturulan anahtarlara verilmez.
Sınırlar
| Sınır | Değer |
|---|---|
| Bir formda sunulan liste | 10 |
| IP adresi başına form isteği | Saatte 10 |
| Kanal başına form isteği | Saatte 600 |
| Adres başına onay e-postası | Günde 3; liste başına 10 dakikada 1 |
| Kanal başına onay e-postası | Günde 1.000 |
| Panelden ya da API’den yeniden gönderilen onay | Abonelik başına günde 3, toplamda 10 |
| Form belirteci | Verildikten 2 saniye ile 2 saat arasında geçerli |