Newsletter
Dari kotak langganan di situs Anda menjadi pelanggan terkonfirmasi, lengkap dengan bukti persetujuan.
Baca 2 menitDiperbarui Nov 11, 2026
Mati secara bawaan
Modul newsletter mati untuk setiap brand. Admin menyalakannya di Settings, Modules, dan hanya setelah integrasi Cloudflare Turnstile atau hCaptcha tersimpan dan uji kuncinya lulus.
Cara kerja
Server situs Anda mengirim satu kolom, contact, ke ATLAS. Email mendapat email konfirmasi dan baru menjadi pelanggan setelah orangnya mengeklik tautan (double opt in). Nomor WhatsApp disimpan bersama persetujuannya dan belum dikirimi apa pun. Setiap email membawa tautan berhenti berlangganan sekali klik, dan berhenti berlaku saat itu juga.
Panggil endpoint dari server Anda dengan read token brand, jangan dari browser, dan kirim alamat serta user agent pengunjung di X-Atlas-Client-Ip dan X-Atlas-Client-User-Agent.
Persiapan
- Simpan integrasi Turnstile (atau hCaptcha) dengan site key dan secret key.
- Simpan pengaturan brand
newsletterdengan minimal satu teks persetujuan:{"consent_texts": {"footer-2026-11": {"text": {"id": "...", "en": "..."}, "policy_url": "https://..."}}}. Kunci opsional:tags(kunci tag yang boleh dikirim situs),channels(email,whatsapp),confirmed_urldanunsubscribed_url(halaman https setelah konfirmasi dan berhenti berlangganan). - Nyalakan modul:
PUT /v1/manage/modules/newsletterdengan{"enabled": true}. Tanpa captcha yang berfungsi jawabannya 422captcha_not_readybeserta alasannya.
Ambil tantangan dan pengaturan captcha
/v1/public/newsletter/challengeMenjawab tantangan Shield (token, min_seconds, expires_in, pow) dan pengaturan widget captcha di captcha: provider, site_key, action (selalu newsletter_subscribe), mode, theme, size, appearance. Selesaikan proof of work (angka yang SHA-256 bersama salt sama dengan challenge) lalu tampilkan widget dengan site key dan action itu. Server situs juga bisa membaca data.newsletter.captcha dari GET /v1/public/shield saat mulai.
Berlangganan
/v1/public/newsletter/subscribe{"contact": "0812 3456 7890", "locale": "id", "source": "footer",
"tags": ["promo"], "consent_version": "footer-2026-11",
"challenge": "<token>", "solution": 4711, "captcha_token": "<token turnstile>", "website": ""}| Kolom | Aturan |
|---|---|
contact | Wajib. Email, atau nomor telepon (0812..., +62812..., 62812..., 812...); nomor Indonesia harus nomor seluler |
source | Wajib: footer, checkout, account, form atau popup |
consent_version | Wajib: versi dari pengaturan newsletter |
locale | Opsional, bahasa brand |
tags | Opsional, maksimal 10; kunci yang tidak dikenal dibuang |
challenge, solution | Wajib: token tantangan dan jawaban proof of work |
captcha_token | Wajib: token Turnstile (atau hCaptcha) |
website | Honeypot, biarkan kosong |
| Status | Isi |
|---|---|
| 202 | {"data": {"channel": "email", "next": "confirm_email"}} atau {"data": {"channel": "whatsapp", "next": "none"}}. Sama untuk alamat baru, yang sudah dikenal, dan yang diblokir |
| 422 | {"message", "code", "errors"}: contact_invalid, channel_unavailable, consent_version_unknown, challenge_required, challenge_invalid, challenge_expired, challenge_failed, challenge_used, too_fast, captcha_required, captcha_failed |
| 503 | {"message", "code": "captcha_unavailable"} dengan Retry-After: 60: penyedia captcha tidak bisa menjawab atau menolak kuncinya. temporarily_unavailable dengan Retry-After: 60: server belum disiapkan untuk newsletter. Dalam kedua kasus tidak ada yang disimpan dan tidak ada email terkirim |
| 429 | {"message", "code": "too_many_attempts"} dengan Retry-After |
| 403 | preview_token_refused untuk preview token, atau situs yang ditangguhkan |
| 404 | Modul mati atau situs tidak dikenal |
Setelah setiap jawaban, ambil tantangan baru dan reset widget captcha: keduanya hanya bisa dipakai sekali.
Tautan konfirmasi dan berhenti berlangganan
Email konfirmasi menautkan ke /v1/newsletter/confirm/{token} (berlaku 72 jam) dan setiap email membawa header List-Unsubscribe dan List-Unsubscribe-Post yang menunjuk ke /v1/newsletter/unsubscribe/{token}. Membuka tautan menampilkan halaman dengan satu tombol dan tidak mengubah apa pun; tombolnya (POST) yang mengonfirmasi atau menghentikan langganan. Aplikasi email memakai POST sekali klik langsung. Dengan Accept: application/json jawabannya {"data": {"status": "subscribed"}} atau {"data": {"status": "unsubscribed"}}; tautan yang tidak dikenal atau kedaluwarsa menjawab 404 link_expired.
Kelola pelanggan
Di bawah /v1/manage/newsletter: GET subscribers (filter status, source, channel, search alamat persis), GET subscribers/{id}, GET summary. Semua anggota bisa membacanya; editor melihat alamat tersamar, publisher dan admin melihat alamat lengkap. Admin bisa POST subscribers/{id}/suppress dan DELETE subscribers/{id} (hapus sekarang). Data yang berhenti berlangganan dihapus setelah 7 hari, pendaftaran yang tidak dikonfirmasi setelah 14 hari (nomor WhatsApp setelah 30 hari), dan hash alamat tetap di daftar blokir.
Apakah halaman ini membantu?