Panduan Teknis Resmi Arsitektur PHP 8.2+ Zero-Build Dioptimalkan untuk Shared Hosting

Dokumentasi & Ensiklopedia Sistem

Panduan teknis komprehensif, direktori elemen UI, dan manual optimasi shared-hosting untuk MarbleSend.

Filter:
Inti

Arsitektur Sistem & Fondasi Hosting

Filosofi: Mandiri (self-hosted), single-tenant, zero-build, ramah shared hosting

MarbleSend dibangun dari nol untuk mengatasi masalah klasik perangkat lunak email marketing: ketergantungan pada VPS dedicated mahal, server Redis, pipeline build node, atau orkestrasi Docker yang rumit. MarbleSend berjalan pada shared hosting standar (cPanel, Hostinger, DirectAdmin, Plesk, LiteSpeed) menggunakan PHP 8.2+ murni tanpa kompilasi server.

100% Prepared PDO

Bebas SQL Injection

Setiap kueri database menggunakan prepared statements ketat tanpa beban ORM.

AES-256-GCM

Enkripsi Saat Diam

Kredensial SMTP, kunci API AI, dan secret webhook dienkripsi via Crypto.php.

Antrean Atomik

Tanpa Pengiriman Ganda

Worker mengklaim batch antrean secara atomik lewat pembaruan status MySQL dengan penanganan batas waktu ketat.

UI Zero-Build

Deployment Instan

Tailwind CSS terkompilasi & Alpine.js tervendor. Unggah file zip, jalankan installer, selesai.

0.1 Filosofi Zero-Build Hosting & Runtime

Mayoritas aplikasi web modern membutuhkan build pipeline Node.js, daemon server Redis, orkestrasi Docker, atau akses root VPS. MarbleSend menolak kompleksitas ini. Dirancang khusus untuk shared hosting ramah kantong (cPanel, Hostinger, Plesk, LiteSpeed), aplikasi ini berjalan di atas PHP 8.2+ murni tanpa proses kompilasi di server.

Zero Server Compilation

Tidak memerlukan npm, Webpack, Vite, maupun Composer di server produksi. Tailwind CSS telah dikompilasi menjadi aset statis, Alpine.js di-vendor secara lokal, dan PHPMailer 6.9.x disertakan langsung di vendor-lite.

Jejak Memori Ringan

Penggunaan memori puncak tetap di bawah 32MB bahkan saat memproses batch email queue. Berjalan lancar dalam batas ketat alokasi memori shared hosting (alokasi php.ini 64MB-128MB).

Bebas Fungsi Terlarang

Secara ketat menghindari fungsi berbahaya yang biasa dimatikan penyedia shared hosting (exec, shell_exec, system, passthru, eval, proc_close). Seluruh operasi eksternal menggunakan cURL native dengan timeout.

0.2 Perimeter Keamanan & Isolasi Direktori

MarbleSend menerapkan struktur direktori dua tingkat yang memisahkan aset web publik dari kode aplikasi sensitif dan storage, menutup risiko directory traversal dan eksposur file.

Document Root Terisolasi (public/)

Hanya direktori public/ yang terbuka ke web server. Arahkan DocumentRoot domain atau subdomain Anda ke /public. Sekalipun fitur directory listing aktif di Apache/Nginx, file sumber utama tidak dapat diakses.

Inti Aplikasi Terlindungi (app/)

Controller, service, library, view, dan konfigurasi berada di luar document root dalam app/. Kredensial database di app/config/config.php dan kunci enkripsi tidak dapat dijangkau via request HTTP langsung.

Storage & Migrasi Aman

Direktori storage/ (tempat log worker) dan migrations/ (berisi file schema SQL mentah) berada sepenuhnya di luar public/, mencegah unduhan tidak sah atas log sistem atau struktur database.

0.3 Database Zero-ORM & Prepared Statement PDO

Object-Relational Mapper (ORM) seperti Eloquent atau Doctrine menimbulkan beban memori masif, lapisan hidrasi rumit, dan pola kueri N+1 tak terduga. MarbleSend menggunakan PDO PHP native secara langsung dengan 100% prepared statement.

IMMUNITY

100% Prepared Statements

Setiap kueri database mengikat parameter secara eksplisit (PDO::PARAM_STR, PDO::PARAM_INT). Struktur kueri SQL dan data pengguna tidak pernah digabung mentah, memberikan kekebalan matematis terhadap serangan SQL Injection.

PERFORMANCE

Kueri Performa Tinggi Terprediksi

Eksekusi SQL langsung mengeliminasi overhead hidrasi objek ORM, mempercepat operasi daftar dan pembaruan batch queue hingga 5x lebih cepat dengan konsumsi CPU minimal di shared database.

IDEMPOTENCY

Migrasi Skema Idempoten

Versi database dilacak melalui file SQL bernomor (0001_initial.sql hingga 0019_add_feedback_attachment.sql) yang dieksekusi oleh runner idempoten berpelindung IF NOT EXISTS dan tercatat pada cm_migrations.

SINGLE-TENANT

Isolasi Data Single-Tenant

Dirancang sebagai software standalone single-tenant tanpa kolom tenant_id. Indeks tetap padat, pemindaian sekuensial dihindari, dan risiko kebocoran data antar-penyewa adalah nol mutlak.

0.4 Enkripsi At-Rest & Standar Kriptografi

Rahasia sensitif tidak pernah disimpan dalam bentuk plain-text. MarbleSend mengenkripsi kredensial menggunakan kriptografi simetris terotentikasi standar industri melalui App\Lib\Crypto.

AES-256-GCM

Enkripsi AES-256-GCM

Menggunakan Advanced Encryption Standard dalam Galois/Counter Mode (AES-256-GCM), memberikan kerahasiaan sekaligus verifikasi integritas kriptografis untuk mendeteksi segala manipulasi data.

RANDOM_BYTES()

IV Acak Unik 96-bit

Setiap nilai terenkripsi menghasilkan Initialization Vector (IV) acak 12-byte (96-bit) aman via random_bytes(), memastikan teks asli yang identik menghasilkan ciphertext yang sama sekali berbeda.

SECRETS CATALOG

Katalog Rahasia Terenkripsi

Melindungi kata sandi relay SMTP, API key AI BYOK (OpenAI, Claude, Gemini, DeepSeek, Kimi, OpenRouter), secret signing webhook, serta Purchase Code Envato secara otomatis.

MASTER KEY ISOLATION

Isolasi Kunci Utama (Master Key)

ENCRYPTION_KEY 32-byte dibuat saat instalasi dan disimpan eksklusif di app/config/config.php (chmod 0600). Database tidak pernah memuat kunci enkripsi tersebut.

0.5 Dual-Worker Engine & Keamanan Konkurensi

MarbleSend mendelegasikan seluruh tugas terjadwal dan intensif waktu ke background worker terpadu, menjaga dashboard admin tetap responsif dan kencang setiap saat.

UNIFIED RUNNER

Single Master Background Runner

worker.php mengoordinasikan pengiriman batch queue, eksekusi jadwal rutin, polling RSS feed, pemicuan sekuens autoresponder, dan pengiriman ulang campaign belum terbuka.

CLI & WEB-CRON

Fleksibilitas CLI Cron & Web-Cron

Dijalankan via crontab sistem native (* * * * * php /path/to/worker.php) atau via ping HTTP eksternal aman ke /cron.php?key=YOUR_KEY. Kedua jalur mengeksekusi logika service yang identik.

ATOMIC CLAIM

Atomic Queue Claiming (Bebas Duplikasi)

Instance worker mengklaim batch queue dengan pembaruan status SQL atomik (UPDATE cm_email_queue SET status = 'processing' WHERE status = 'pending' LIMIT N). Pengiriman ganda mustahil terjadi.

HEARTBEAT RECOVERY

Heartbeat & Pemulihan Pekerjaan Macet

Mencatat detak jantung eksekusi di cm_settings. Jika proses worker terputus di tengah jalan (misal timeout hosting), eksekusi worker berikutnya otomatis mendeteksi dan memulihkan item antrean yang macet.

0.6 Kebutuhan Server & Matriks Kompatibilitas Hosting

MarbleSend terverifikasi kompatibel dengan semua lingkungan shared hosting standar, panel kontrol, dan konfigurasi server yang memenuhi standar dasar PHP 8.2+.

Komponen Kebutuhan Minimum Direkomendasikan Catatan Operasional
PHP Runtime PHP 8.2.0+ PHP 8.2 atau 8.3 strict_types=1 dideklarasikan di seluruh file aplikasi.
Database Engine MySQL 8.0+ / MariaDB 10.6+ MariaDB 10.11+ atau MySQL 8.0+ Engine InnoDB wajib. Charset UTF8MB4 full Unicode.
Ekstensi Wajib pdo_mysql, openssl, mbstring, json, curl, simplexml, sodium Semua ekstensi standar inti aktif Tersedia bawaan di 99% shared hosting. Opsional: intl untuk format lokal.
Web Server Apache, Nginx, LiteSpeed, Caddy Apache + mod_rewrite atau LiteSpeed File .htaccess siap pakai tersedia di root dan public/.
Alokasi Memori 32MB memory_limit 64MB - 128MB Queue diproses dalam batch konservatif untuk mencegah kehabisan memori.
Penjadwal Cron CLI crontab ATAU ping HTTP Web-Cron CLI cron setiap 1 menit Endpoint fallback Web-Cron (/cron.php?key=...) untuk host tanpa akses CLI.

Panel Kontrol Hosting Teruji

Telah diuji dan terverifikasi penuh di cPanel, Hostinger hPanel, Plesk, DirectAdmin, CyberPanel, AApanel, CloudPanel, serta instalasi Ubuntu/Debian LAMP/LEMP standar.

Modul 01

Ringkasan Dashboard (/dashboard)

Pusat kendali agregat untuk kesehatan audiens, KPI pengiriman, detak jantung worker, dan otomatisasi jadwal.

Anatomi Komponen Dashboard & Inspektur Dukungan

Arahkan kursor atau klik elemen mana pun di bawah untuk detail backend
Kartu KPI 1

Total Terkirim

Agregasi log & Penghitung bulanan
Kartu KPI 2

Dibuka / Open Rate

Piksel pelacak 1x1 & Catatan Apple MPP
Kartu KPI 3

Diklik / CTR

Injektor redirect klik
KPI 04

Audiens Berhenti Langganan

Tingkat berhenti langganan & kepatuhan RFC
Kartu Operasi 4

Detak Jantung Worker

Status cron & Interval 1 menit
Visualizer

Grafik Pertumbuhan Volume

Skala 7h, 30h, 90h, YTD
Feed Aktivitas

Tabel Siaran Terbaru

Siklus status & jejak audit
Banner Keamanan

Kesehatan Deliverabilitas

Kesiapan profil SMTP

Dampak Database:

Tips Tim Dukungan:

1.1 Kartu KPI Performa Email

Elemen Kalkulasi & Sumber Data Arti Visual Alasan Pencegahan Tiket Dukungan
Kartu Total Terkirim COUNT(cm_email_logs) + SUM(cm_campaigns.sent_count) Menampilkan total seumur hidup email broadcast dan jadwal yang terkirim. Subteks mencantumkan volume terkirim bulan ini. Mencegah kebingungan saat log lawas dibersihkan; penghitung historis campaign memastikan total seumur hidup tidak menyusut.
Total Dibuka / Open Rate COUNT(DISTINCT contact_id WHERE opened_at IS NOT NULL) / Total Sent * 100 Mengukur interaksi via piksel pelacak transparan 1x1 yang disematkan di footer email HTML. Catatan Apple MPP: iOS Mail Privacy Protection memuat gambar lebih awal via proxy Apple, yang dapat menaikkan open rate semu. CTR adalah indikator riil.
Total Diklik / CTR COUNT(DISTINCT contact_id WHERE clicked_at IS NOT NULL) / Total Sent * 100 Mengukur klik tautan unik penerima. Ditulis ulang melalui /track/click.php. Tautan berhenti langganan dan tautan konfirmasi dikecualikan dari CTR campaign demi akurasi statistik.
Kartu Berhenti Langganan COUNT(status = 'unsubscribed') / Total Contacts * 100 Persentase penerima yang memilih berhenti berlangganan via mekanisme satu klik wajib. Ambang batas sehat adalah < 0.5%. Angka > 1% menandakan audiens jenuh, daftar kontak beli, atau relevansi pesan rendah.

Total Terkirim & Throughput Bulanan

Melacak total email seumur hidup yang berhasil dikirim melalui siaran, jadwal berulang, RSS feed, dan autoresponder. Teks sub menampilkan volume yang dikirim pada bulan kalender berjalan. Karena MarbleSend mengagregasi penghitung Campaign historis bersama log pengiriman email aktif, metrik seumur hidup tetap permanen dan akurat meskipun baris log lama dibersihkan demi pemeliharaan database.

Buka Unik & Dinamika Apple MPP

Dicatat melalui piksel pelacak transparan 1x1 yang disuntikkan ke footer HTML email. Buka dilacak secara unik per kontak per Campaign (pencatatan waktu sentuhan pertama). Catatan deliverabilitas krusial: Apple Mail Privacy Protection (MPP) mem-cache gambar melalui server proxy, yang dapat meningkatkan angka buka semu. Meskipun Open Rate tetap menjadi indikator tren keterlibatan yang bernilai, Click-Through Rate (CTR) merupakan bukti niat konversi pelanggan yang sesungguhnya.

Klik Unik & Mesin URL Rewrite

Setiap hyperlink standar di badan email ditulis ulang untuk melewati /track/click.php, mencatat contact ID, campaign ID, URL tujuan, dan timestamp sebelum mengarahkan pelanggan. Demi melindungi privasi pelanggan dan kepatuhan hukum, link berhenti berlangganan (/unsubscribe.php) dan link konfirmasi langganan (/confirm.php) secara ketat dikecualikan dari pengalihan pelacakan.

Kontak Berhenti Langganan & Perlindungan Domain

Mengukur pelanggan yang berhenti berlangganan menggunakan link berhenti langganan di badan email atau header satu-klik List-Unsubscribe RFC 8058. Daftar kontak yang sehat mempertahankan tingkat berhenti langganan di bawah 0,5%. Ketika angka melebihi 1,0%, MarbleSend memperingatkan operator untuk meninjau kualitas daftar dan frekuensi pengiriman agar penyedia kotak surat (Gmail, Yahoo, Outlook) tidak menurunkan reputasi domain.

1.2 Operasi & Detak Jantung Kesehatan Worker

MarbleSend mengandalkan satu eksekutor latar belakang: worker.php. Dashboard memeriksa cm_settings['worker_last_run'] untuk memverifikasi cron aktif setiap 60 detik.

Kondisi Aktif (Cron Sehat)

Saat worker.php berjalan dalam 3 menit terakhir, lencana menampilkan Aktif. Antrean diproses real-time, jadwal terkirim tepat waktu, dan autoresponder berjalan lancar.

Kondisi Tidak Aktif (Cron Terhenti)

Jika tidak ada detak jantung > 3 menit, lencana berubah merah. Klik kartu untuk langsung membuka Settings → Sistem beserta perintah CLI crontab dan URL web-cron fallback.

Kontak Aktif vs Total Audiens

Menampilkan kontak berstatus aktif berbanding total basis pelanggan. MarbleSend menerapkan mesin state 4-tahap yang ketat: active, pending (menunggu konfirmasi double opt-in), unsubscribed, dan suppressed (bounce/keluhan). Worker Campaign keluar secara ketat memfilter WHERE status = 'active', memastikan email yang belum dikonfirmasi atau ditekan tidak akan pernah dikirim.

Volume Campaign Bulanan & Seumur Hidup

Meringkas siaran yang dikirim pada bulan kalender aktif bersama dengan total Campaign seumur hidup. Memberikan visibilitas langsung terhadap ritme pemasaran email bulanan dan output operasional.

Resolusi Jadwal Mendatang Berikutnya

Mengueri jadwal berulang yang aktif (diurutkan berdasarkan next_run_at ASC LIMIT 1) dan menampilkan newsletter berikutnya yang antre beserta hitung mundurnya. Semua waktu eksekusi dihitung secara ketat oleh SchedulerService::computeNextRun() dengan kesadaran zona waktu penuh dan disimpan dalam UTC, mengeliminasi penyimpangan daylight saving time (DST).

Heartbeat Worker & Cron Shared Hosting

Heartbeat sistem memverifikasi apakah worker.php telah dieksekusi dalam 180 detik terakhir. Di lingkungan shared hosting (cPanel, Hostinger), konfigurasikan crontab untuk menjalankan * * * * * php /path/to/worker.php >/dev/null 2>&1. Jika cron CLI tidak tersedia, MarbleSend menyediakan endpoint fallback Web-Cron yang aman (/cron.php?key=YOUR_KEY) yang kompatibel dengan pinger eksternal gratis seperti cron-job.org.

1.3 Visualisasi Pertumbuhan Campaign

Grafik pertumbuhan menampilkan distribusi volume kirim pada empat rentang waktu: 7 Hari, 30 Hari, 90 Hari, dan Tahun Berjalan (YTD). Setiap batang memperlihatkan jumlah terkirim dan terbuka saat disorot.

Rentang Waktu Dapat Dipilih (7h, 30h, 90h, YTD)

Memungkinkan peralihan instan antara ritme mingguan jangka pendek (7 Hari), siklus bulanan (30 Hari), kinerja kuartalan (90 Hari), dan volume pengiriman tahunan (Year-to-Date).

Flex Bar Ringan Zero-Dependency

Dirender menggunakan tinggi flexbox CSS murni yang dihitung relatif terhadap volume pengiriman puncak. Menghilangkan library grafik JavaScript yang berat, memuat secara instan di perangkat seluler dan hosting berspesifikasi rendah.

Telemetri Tooltip Metrik Ganda

Mengarahkan kursor ke bar mana pun akan menampilkan interval waktu yang tepat, total pesan yang dikirim, dan volume buka unik, memungkinkan perbandingan keterlibatan yang cepat dari waktu ke waktu.

Feed Aktivitas Pengiriman Langsung & Heartbeat

Feed kolom kanan menampilkan pengiriman Campaign terkini secara real-time, dilengkapi lencana status beranimasi (Completed, Sending berdenyut, Failed, Draft), rasio pengiriman, dan kartu status heartbeat sistem yang persisten.

Selesai

status = 'completed'

Mengirim

status = 'sending'

Gagal

status = 'failed'

Draf

status = 'draft'

Tabel Riwayat Campaign & Audit Pengiriman

Tabel audit bawah mencantumkan eksekusi siaran terkini dengan metadata lengkap: nama Campaign, status siklus hidup, penanda asal (manual, jadwal berulang, RSS feed, atau kirim ulang belum dibuka), rasio pengiriman penerima, dan tingkat buka terverifikasi.

Nama Campaign & Asal

Menampilkan subjek campaign, tanggal pembuatan, dan tag asal (manual, recurring, rss, atau resend_unopened).

Penerima & Rasio Pengiriman

Jumlah pesan terkirim vs gagal, disertai persentase open rate dan click rate langsung.

Tautan Laporan Analitik

Pintasan langsung ke Laporan Campaign untuk log aktivitas per penerima dan modal Kirim Ulang ke Belum Buka.

1.5 Banner Peringatan Pemeriksaan Deliverability

Bila domain pengirim Anda belum memverifikasi record SPF, DKIM, atau DMARC, MarbleSend menampilkan banner peringatan tepat di atas metrik KPI. Mengklik Verifikasi DNS Domain membuka wizard diagnostik 4-langkah di /settings?tab=deliverability guna menjaga reputasi pengiriman Anda.

Verifikasi Profil SMTP Aktif

Menampilkan jumlah profil relay SMTP aktif yang dikonfigurasi di Settings. MarbleSend mendukung rotasi multi-SMTP, memungkinkan distribusi beban round-robin di beberapa relay.

Peringatan Relay Tidak Ditemukan & Penjaga Preflight

Jika tidak ada profil SMTP aktif yang ditemukan, banner akan menampilkan peringatan merah mencolok sebelum Campaign dapat diluncurkan, mencegah kegagalan antrean fatal.

1.6 Pintasan Tindakan Cepat & Automasi Alur Kerja

Pemicu tindakan langsung yang menghubungkan dashboard ringkasan dengan alur kerja berkecepatan tinggi: jadwal newsletter otomatis berulang, jalur ringkasan RSS-ke-email, akuisisi daftar kontak, verifikasi double opt-in, dan perlindungan supresi.

Automasi Alur (Berulang & RSS)

Menjalankan pengiriman email otomatis pada jadwal cron tetap atau setiap kali RSS feed WordPress/Ghost/Substack yang terhubung menerbitkan konten baru, sepenuhnya tanpa intervensi manual.

Manajemen Audiens & Kontak

Memungkinkan impor kontak cepat via CSV, pengelompokan list tersegmentasi, penegakan kepatuhan double opt-in, dan supresi otomatis untuk alamat yang bounce atau berhenti berlangganan.

Modul 02

Pengelola Campaign & Laporan (/campaigns)

Penyusun broadcast berkecepatan tinggi, pemilih target berbasis tag, engine uji preflight otomatis, dan laporan pengiriman mendalam.

Interactive Campaigns UI Inspector

Klik komponen mana saja untuk melihat dampak skema dan tips operasional
PROGRESS

Monitor Pengiriman Live

Statistik & event real-time
AUDIENCE

Pemilih Penerima

Filter tag & pilih semua
COMPOSER

Editor Tiga Tampilan

Kode, split & pratinjau
SAFETY

Engine Pemeriksaan Preflight

Inspeksi otomatis 6 titik
TESTING

Diagnostik Uji Kirim

Sampel live tanpa antrean
ATTRIBUTION

Penulis Ulang UTM & Link

Parameter UTM & pelacakan 302
PORTFOLIO

Riwayat Siaran

Filter status & asal
ANALYTICS

Laporan Detail Pasca-Kirim

CTR, MPP & auto-resend

Dampak Database:

Tips Tim Dukungan:

2.1 Banner Pemantau Campaign Langsung

Saat broadcast sedang dikirim, banner pemantau muncul di bagian atas /campaigns. Banner ini melakukan polling ke /api/campaigns/:id/progress setiap 1,5 detik tanpa memuat ulang halaman.

Summer Launch Newsletter

Mengirim

74% selesai

7,420 / 10,000 email

Dalam Antrean

2,528

Sedang Dikirim

40

Berhasil

7,420

Gagal

12

Aktivitas Terbaru Status real-time
ana.wijaya@example.com Delivered
budi.santoso@example.org Delivered
chen.li@example.net 550 5.1.1 User unknown
dewi.lestari@example.com Delivered
eko.prasetyo@example.org Sedang Dikirim
Lihat Laporan Lengkap

Engine Polling 1,5 Detik

Melakukan query ke /api/campaigns/:id/progress secara asinkron tiap 1,5 detik, menampilkan throughput live tanpa reload halaman browser.

Aliran Event Pengiriman Terbaru

Pencatat event live yang menyiarkan 5 perubahan status penerima terakhir dengan konfirmasi pengiriman real-time dan diagnostik error SMTP.

TELEMETRY NOTE

Jika worker.php tertunda atau cron nonaktif, badge peringatan akan muncul dengan instruksi perbaikan satu klik.

2.2 Pemilih Penerima & Filter Tag (Kolom Kiri)

Kolom kiri memungkinkan penargetan audiens secara presisi. Admin dapat memfilter berdasarkan tag kontak, mencari sebagian email/nama, dan memilih kontak satuan atau klik Pilih Semua yang Cocok.

Garansi Filter State Machine:

Apapun pilihan atau pencarian Anda, engine kueri selalu memberlakukan status = 'active'. Kontak unsubscribed, pending, atau suppressed otomatis disaring keluar dari antrean.

Interseksi Multi-Tag

Pilih segmen pelanggan spesifik berdasarkan tag. Pemilih penerima menghitung jumlah irisan kontak secara dinamis dan real-time.

Pencarian Live Ter-debounce (300ms)

Pencarian instan yang memfilter kontak berdasarkan nama atau email dengan debounce 300ms untuk mencegah lonjakan beban database pada daftar besar.

Kontrol Pemilihan Utama

Pilih kontak individual atau gunakan tombol Pilih Semua untuk menargetkan seluruh kontak yang cocok dengan filter aktif dalam satu klik.

Grup

Kontak diatur dalam grup (satu kontak bisa di beberapa grup; setiap kontak minimal di satu grup, default General). Di Select Recipients pilih “Per grup” untuk mengirim ke setiap kontak aktif di grup terpilih — seluruh grup, bukan hanya halaman yang sedang dilihat — atau “Pilih manual” untuk memilih kontak satu per satu (bisa difilter satu grup).

Grup juga bisa dipilih sebagai audiens jadwal, pemicu aturan autoresponder, tujuan halaman signup, dan untuk mempersempit kirim ulang ke yang belum membuka. Menghapus grup tidak pernah menghapus kontaknya; aturan autoresponder yang bergantung padanya dinonaktifkan.

2.3 Penyusun Campaign & Mode Split Editor

Mode Split

Penyuntingan kode di sebelah kiri bersamaan dengan pratinjau responsif iframe langsung di sebelah kanan.

Mode Kode Saja

Editor kode HTML layar penuh yang fokus dengan nomor baris dan tab bantuan syntax.

Mode Pratinjau Langsung

Rendering terisolasi dengan tombol beralih viewport perangkat: Desktop (100%), Tablet (600px), dan Ponsel (375px).

Variabel Placeholder & Engine Substitusi

Personalisasikan email secara dinamis menggunakan tag {{name}}, {{email}}, {{unsubscribe_link}}, {{offer_url}}, dan {{track_pixel}}.

Viewport Responsif Sandbox

Uji tampilan responsif seluler (375px), tablet (600px), dan desktop (100%) di dalam sandbox iframe terisolasi sebelum meluncurkan.

2.4 Pemeriksaan Keamanan Preflight Otomatis 6-Titik

Untuk mencegah kesalahan fatal (misal mengirim email dengan placeholder rusak, tanpa tautan berhenti langganan, atau memicu filter spam), MarbleSend mewajibkan cek preflight sebelum meluncurkan broadcast.

Pemeriksaan Keamanan Tingkat Bahaya Aturan & Deteksi Konsekuensi Jika Gagal
1. Tautan Berhenti Langganan KRITIKAL Memeriksa keberadaan token {{unsubscribe_link}}. Pengiriman DIBLOKIR. Wajib berdasarkan regulasi CAN-SPAM, GDPR, serta Persyaratan Pengirim Google & Yahoo 2024.
2. Validitas Placeholder KRITIKAL Mendeteksi tag placeholder tak dikenal (contoh typo seperti {{first_nam}}). Pengiriman diblokir sampai tag yang keliru diperbaiki atau dihapus.
3. Audiens Penerima KRITIKAL Memvalidasi bahwa > 0 penerima aktif terpilih. Tidak dapat mengirim broadcast ke audiens kosong.
4. Konektivitas SMTP KRITIKAL Memverifikasi host dan kredensial profil SMTP yang dipilih. Mencegah antrean macet akibat kredensial relay yang salah.
5. Kata Pemicu Spam PERINGATAN Memindai subjek dan konten dari kata pemicu spam ("100% gratis", "klaim sekarang", "waktu terbatas"). Banner peringatan ditampilkan; admin dapat meninjau dan tetap melanjutkan.
6. Panjang Baris Subjek INFO Merekomendasikan 30–60 karakter demi keterbacaan optimal di layar ponsel. Pemberitahuan informatif untuk mendorong open rate lebih tinggi.

Gerbang Verifikasi Preflight

Mengevaluasi 6 aturan keamanan otomatis sebelum memasukkan ke antrean. Kegagalan pemeriksaan KRITIS akan menonaktifkan tombol kirim.

2.5 Diagnostik Kirim Tes & Modal Konfirmasi

Sebelum mengantrekan ribuan email, tombol Kirim Email Tes langsung mengirimkan satu pesan uji coba ke kotak masuk admin atau QA tanpa menyentuh daftar kontak database. Semua tag placeholder ({{first_name}}, {{email}}, {{unsubscribe_link}}) diisi dengan nilai pratinjau simulasi agar Anda dapat meninjau tampilan email di Gmail, Apple Mail, dan Outlook.

Interpolasi Tag Uji Mock

Mengisi variabel pelanggan dengan nilai pratinjau realistis (misal: Jane Doe, tautan unsubscribe demo) untuk verifikasi visual otentik.

Modal Verifikasi Pra-Peluncuran

Konfirmasi modal dua langkah yang menampilkan jumlah penerima, profil pengirim terpilih, dan tag UTM aktif sebelum antrean dibuat.

2.6 Penyisipan Pelacakan Parameter UTM Otomatis

Semua tag tautan keluar (<a href="...">) diproses lewat App\Services\TrackingInjector. Parameter UTM (utm_source, utm_medium, utm_campaign, utm_content) disisipkan otomatis sebelum URL dibungkus pelacak klik. Tautan mailto, tel, dan tautan unsubscribe dipertahankan utuh.

PIPELINE 01

Langkah 1: Injeksi Query UTM

Menambahkan parameter utm_source, utm_medium, utm_campaign, dan utm_content ke setiap hyperlink tanpa mengubah parameter yang sudah ada.

PIPELINE 02

Langkah 2: Penyisipan Piksel Pelacak

Menyisipkan gambar GIF transparan 1x1 tepat sebelum tag penutup </body> untuk merekam event pembukaan saat email dibuka di mail client.

PIPELINE 03

Langkah 3: Engine Penulisan Ulang Klik 302

Menulis ulang URL keluar ke /track/click.php?h=... untuk pengalihan instan berlatensi milidetik dengan pencatatan log telemetri klik first-touch.

Pengecualian Kepatuhan Ketat

Tautan berhenti berlangganan, protokol mailto/tel, dan URL konfirmasi double opt-in secara ketat dikecualikan dari injeksi UTM dan pembungkusan klik.

2.7 Riwayat & Portofolio Campaign (/campaigns/history)

Portofolio riwayat lengkap menyediakan filter multi-atribut berdasarkan asal (manual, recurring, rss, resend_unopened), status (completed, sending, failed, draft), dan rentang tanggal. Admin dapat memilih banyak campaign untuk mengunduh log pengiriman CSV gabungan.

Saluran Pelacakan Asal

Mengkategorikan siaran berdasarkan sumber: Composer manual, Jadwal berulang, Pemicu blog RSS, atau Klon kirim ulang ke non-pembuka.

Penyaringan Multi-Status & Ekspor CSV

Filter arsip berdasarkan status selesai, mengirim, gagal, dan draft. Unduh log pengiriman detail dengan sekali klik.

Duplikasi Siaran Satu Klik

Klon siaran historis apa pun kembali ke composer dengan tata letak HTML lengkap, baris subject, dan profil pengirim tetap terjaga.

2.8 Laporan Analitik & Fitur "Kirim Ulang ke Belum Buka"

Opsional: pilih grup agar kirim ulang hanya ke yang belum membuka dan tergabung di grup itu. Kirim ulang tidak pernah melampaui penerima campaign asli.

Pada /campaigns/:id/report, MarbleSend menyajikan laporan pasca-pengiriman yang komprehensif:

KPI METRICS

4 Metrik Kinerja Bento

Melacak volume Terkirim (100%), Kegagalan pengiriman, Pembukaan unik dengan rasio buka, dan Klik unik dengan CTR.

TEMPORAL CLUSTERS

Kurva Keterlibatan Per Jam

Menampilkan kluster pembukaan per jam selama 72 jam pertama untuk menemukan jendela waktu pengiriman optimal bagi pelanggan.

ENGAGEMENT RECOVERY

Kirim Ulang Bertarget ke Non-Pembuka

Mengklon Campaign untuk menargetkan pelanggan dengan opened_at IS NULL, memungkinkan pengujian subject baru untuk memulihkan 15–25% pembukaan tambahan tanpa mengirim ulang ke pembaca aktif.

Modul 03

Pusat Kontak & Alat Pertumbuhan (/contacts)

Manajemen siklus hidup pelanggan, impor CSV, kepatuhan GDPR, halaman pendaftaran kustom, dan autoresponder.

UI Inspector Interaktif Kontak

Klik komponen mana pun untuk memeriksa dampak skema dan tips operasional
LIFECYCLE

State Machine 4-Status

active/pending/unsub/supp
PENYARINGAN

Engine Pencarian & Filter

Tag, status & debounce
TELEMETRI

Drawer Audit & Izin

IP, timestamp & bounce
INGESTION

Importer CSV RFC 4180

50rb baris & proteksi dedup
CORONG

Halaman Pendaftaran Mandiri

Double opt-in & funnels
OTOMASI

Autoresponder Tag

Aturan drip berbasis event
MANAJEMEN

Hub Manajemen Massal

Segmentasi lintas halaman
KEPATUHAN

Privasi GDPR & Penghapusan

Ekspor JSON & hapus permanen

Dampak Database:

Tips Tim Dukungan:

3.1 Mesin Status Pelanggan 4-Kondisi

MarbleSend memberlakukan mesin status tunggal yang ketat untuk semua kontak tanpa bendera boolean sampingan. Semua jalur pengiriman menyaring WHERE status = 'active'.

active

Pelanggan Aktif

Opt-in terkonfirmasi, email valid. Berhak menerima campaign, jadwal, dan autoresponder.

pending

Menunggu Konfirmasi Double Opt-In

Mendaftar lewat formulir double opt-in, menanti klik pada email konfirmasi. Dikecualikan dari broadcast sebelum konfirmasi.

unsubscribed

Berhenti Berlangganan

Mengklik tautan berhenti langganan. Tidak akan pernah dikirimi email lagi. Tidak dapat diaktifkan kembali tanpa opt-in baru yang sah.

suppressed

Hard Bounce / Keluhan

Ditekan permanen akibat kotak surat tidak valid (5xx SMTP), keluhan spam, atau penekanan manual admin.

Status Pemicu Transisi Status Tujuan Dampak Pengiriman Campaign
active Pelanggan mengklik tautan berhenti berlangganan atau header RFC 8058 unsubscribed Langsung dikecualikan dari seluruh antrean broadcast dan jadwal mendatang.
active Bounce permanen SMTP 5xx atau soft bounce ke-3 berturut-turut suppressed Dikarantina permanen demi melindungi reputasi pengiriman domain.
pending Pelanggan mengklik link token konfirmasi double opt-in active Dipromosikan menjadi aktif; berhak menerima Campaign dan autoresponder.
suppressed Pembatalan supresi administratif manual dengan konfirmasi active Penghitung soft bounce di-reset; dipulihkan ke antrean pengiriman aktif.

Perlindungan Arsitektur: Nol Flag Boolean Sampingan

MarbleSend menerapkan kolom ENUM tunggal (cm_contacts.status). Platform lain kerap mengalami korupsi data ketika flag boolean seperti is_active, is_unsubscribed, dan is_bounced bertentangan. Di MarbleSend, setiap kueri pengiriman memuat WHERE status = 'active' tanpa ambiguitas.

3.2 Filter Real-Time, Pencarian & Aksi Baris

Tabel Kontak menyuguhkan filter reaktif instan Alpine.js berdasarkan lencana tag, status pelanggan (active, pending, unsubscribed, suppressed), dan pencarian debounce cepat pada email serta nama.

Setiap kontak berada di minimal satu grup (default General). Gunakan filter Grup untuk menyaring tabel dan Kelola Grup untuk membuat, mengganti nama, atau menghapus grup — menghapus grup tidak pernah menghapus kontaknya.

Penyimpanan & Normalisasi Tag JSON

Tag disimpan sebagai array JSON ternormalisasi dalam cm_contacts.tags. Tag bersifat tidak peka huruf besar-kecil, dipangkas, dan diindeks untuk pemfilteran serta segmentasi instan.

Pencarian Cepat Ter-debounce 300ms

Kueri pencarian menyaring secara simultan pada alamat email, nama depan, dan nama belakang dengan debounce 300ms guna meminimalkan beban database.

Paginasi Sisi Server & Skalabilitas

Menjelajahi daftar lebih dari 50.000 pelanggan dengan sangat lancar menggunakan kueri SQL LIMIT dan OFFSET yang hemat alokasi memori.

Edit Langsung

Perbarui nama, metadata khusus, dan tag langsung di tempat tanpa memuat ulang halaman.

Tekan Manual

Segera alihkan kontak ke status suppressed untuk mendiskualifikasi mereka dari seluruh antrean.

Hapus Permanen GDPR

Menghapus bersih profil kontak, log, dan antrean sesuai mandat GDPR Pasal 17.

3.3 Drawer Detail, Jejak Audit GDPR & Ekspor JSON

Mengklik baris kontak akan membuka drawer audit. Menampilkan metrik seumur hidup (total email diterima, open rate, jumlah klik), alamat IP opt-in, waktu opt-in, slug formulir pendaftaran, serta tombol Ekspor JSON GDPR satu klik demi memenuhi Pasal 15 (Hak Akses) dan Pasal 20 (Portabilitas Data).

Timestamp Opt-in & Sumber Izin

Mencatat tanggal, waktu, dan kanal perolehan (Manual, Impor CSV, slug Halaman Signup, atau API) secara presisi untuk verifikasi hukum.

Perekaman IP Address Terverifikasi

Menangkap IP address pelanggan saat pengiriman formulir pendaftaran, menjadi bukti persetujuan sah yang tak terbantahkan di bawah GDPR dan CAN-SPAM.

Telemetri Interaksi Seumur Hidup

Memantau volume pengiriman kumulatif bersama timestamp pembukaan terverifikasi untuk membedakan pelanggan aktif dan tidak aktif.

Eskalasi Otomatis Soft Bounce

Melacak kegagalan pengiriman sementara secara berturut-turut (X / 3). Begitu mencapai kegagalan ke-3 beruntun, status otomatis berubah menjadi suppressed.

3.4 Pengimpor CSV & Pemetaan Kolom

Pengimpor mampu memproses file CSV hingga 50.000 baris. Mendeteksi pemisah otomatis (koma, titik koma, tab) dan menyediakan dropdown visual untuk memetakan kolom: Email, Nama Depan, Nama Belakang, dan Tag.

Pilih grup tujuan kontak yang diimpor (General jika tidak ada). Kontak yang sudah ada ditambahkan ke grup itu; mereka tidak pernah dikeluarkan dari grup yang sudah dimilikinya.

Unggahan Bertahap Aman Memori

Memproses aliran file hingga 50.000 baris dalam transaksi bertahap, menjaga konsumsi memori selalu di bawah 32MB bahkan di shared hosting terbatas.

Deteksi Pemisah Otomatis & Pemetaan Cerdas

Mendeteksi tanda koma, titik koma, dan tab secara otomatis, dilengkapi pemetaan kolom interaktif untuk Email, Nama Depan, Nama Belakang, dan Tag.

Tagging Massal & Audit Pasca-Impor

Menerapkan tag global ke seluruh kontak yang diimpor dalam batch tersebut dan menyajikan laporan audit atas data yang masuk, diperbarui, atau dilewati.

Lewati Duplikat

Mempertahankan data dan tag kontak yang sudah ada. Hanya baris baru yang dimasukkan.

Perbarui Kolom Kosong

Mengisi nama yang belum lengkap dan menyematkan tag baru tanpa menimpa data yang sudah tersimpan.

Timpa Semua

Memperbarui nama dan tag secara menyeluruh sesuai data di file CSV.

3.5 Halaman Pendaftaran Publik (/s/:slug)

Tersedia di Tab 2 Kontak. Buat landing page berlangganan bermerek dengan judul, deskripsi, label input, dan tombol kirim kustom. Fitur unggulan meliputi:

Pilih grup tempat pelanggan dari halaman ini bergabung (General jika tidak ada). Grup yang dihapus kemudian gugur otomatis.

Total Tayangan Halaman

Memantau jumlah impresi agregat dari seluruh corong pendaftaran yang aktif.

Rata-rata Tingkat Konversi

Menghitung rasio pengiriman terhadap tayangan di seluruh formulir pendaftaran prospek.

Halaman Aktif / Batas Maksimal

Menampilkan jumlah halaman arahan aktif berbanding kapasitas operasional 20 halaman.

Pendaftaran 30 Hari Terakhir

Melacak perolehan kontak baru yang berhasil dikumpulkan dalam jendela waktu 30 hari terakhir.

Integrasi Sematan Multi-Kanal

Sematkan formulir di mana saja menggunakan URL mandiri (/subscribe?slug=...), kode embed HTML murni, iframe responsif, atau cuplikan modal popup.

Engine Double Opt-in

Menghasilkan token konfirmasi bertanda tangan HMAC dengan pengiriman email konfirmasi otomatis.

Penandaan Otomatis

Menyematkan tag pelanggan tertentu saat mendaftar untuk memicu urutan drip terarah.

Pengalihan Kustom

Mengarahkan subscriber baru ke halaman terima kasih atau tautan lead magnet setelah sukses mendaftar.

3.6 Autoresponder & Urutan Drip

Ada di Tab 3 halaman Contacts. Atur email sambutan otomatis yang masuk antrean begitu pelanggan baru menjadi aktif — tepat setelah mendaftar, atau setelah mengonfirmasi double opt-in. Aturan mencocokkan tag atau grup; tidak ada pengaturan jeda. Email dikirim oleh worker latar belakang dan otomatis menghormati aturan suppression.

Aturan bisa dipicu oleh grup, bukan hanya tag. Aturan grup berjalan saat kontak aktif baru dibuat di grup itu atau mengonfirmasi lewat email — bukan saat kontak yang sudah ada ditambahkan ke grup belakangan (sama seperti aturan tag). Menghapus grup menonaktifkan aturan.

Listener Event Berbasis Tag

Berjalan saat pelanggan baru yang aktif membawa tag aturan atau berada di grupnya — tepat setelah halaman signup, panggilan API, atau penambahan manual (single opt-in), atau setelah double opt-in dikonfirmasi. Tidak berjalan untuk impor CSV, maupun saat tag atau grup ditambahkan ke kontak yang sudah ada belakangan.

Perutean SMTP Khusus

Mengarahkan email selamat datang transaksional melalui profil SMTP bereputasi tinggi yang terpisah dari broadcast promosi massal.

Eksekusi Worker Asinkron

Mendelegasikan rendering email dan pengiriman ke worker.php, mencegah timeout web dan menjaga respon formulir tetap instan.

Pencegahan Loop & Proteksi Duplikasi

Mencegah pemicuan berulang, menjamin pelanggan tidak pernah menerima email sambutan ganda sekalipun diberi tag berulang kali.

3.7 Pengelolaan Massal & Segmentasi Daftar (/contacts/list)

Pada /contacts/list, kelola daftar bervolume besar dengan operasi batch: pilih lintas halaman, tambah/hapus tag massal, nonaktifkan kontak dingin sekaligus, atau ekspor segmen kontak terpilih ke file CSV UTF-8.

Tambah ke Grup dan Keluarkan dari Grup berlaku untuk semua kontak terpilih. Mengeluarkan kontak dari grup terakhirnya mengembalikannya ke General.

Penambahan Tag Massal

Menambahkan tag ke semua kontak terpilih dalam satu kueri tanpa menghapus tag pelanggan yang sudah ada.

Penghapusan Tag Massal

Menghapus tag tertentu secara presisi dari kumpulan kontak terpilih di berbagai daftar.

Ekspor CSV Tersaring

Mengalirkan subset pelanggan hasil filter langsung ke file CSV berstandar RFC 4180 lengkap dengan metadata.

Supresi Massal

Mengarantina kontak dingin atau berisiko seketika demi menjaga skor reputasi pengirim.

Berhenti Berlangganan Massal

Memproses permintaan berhenti langganan massal dari sumber eksternal atau saluran Campaign offline.

Pembersihan Permanen GDPR

Menghapus permanen data pelanggan dan log telemetri terkait demi kepatuhan Pasal 17 GDPR.

3.8 Privasi GDPR, Ekspor Audit & Standar Penghapusan

Kontrol privasi bawaan yang mematuhi secara ketat Regulasi Perlindungan Data Umum Uni Eropa (GDPR), CCPA California, serta aturan CAN-SPAM.

Ekspor GDPR (JSON) juga mencantumkan grup tempat kontak berada.

Pasal 15 & 20: Ekspor JSON Terstruktur

Menghasilkan berkas arsip JSON terstruktur lengkap yang mencakup data profil, IP izin, timestamp opt-in, serta log pengiriman penuh.

Pasal 17: Hak untuk Dihapus (Hapus Permanen)

Eksekusi hapus permanen merembet ke cm_contacts, cm_email_logs, dan cm_email_queue, melenyapkan seluruh data yang dapat diidentifikasi.

Perlindungan Batal Supresi

Memerlukan konfirmasi administratif eksplisit untuk memulihkan alamat yang ditekan, mencegah pengiriman keliru ke kotak surat tidak valid.

Modul 04

Studio Template & Penulis Naskah AI (/templates)

8 layout email berbasis tabel yang aman, pratinjau iframe sandbox dengan reset CSS miniatur, penulis naskah AI berorientasi penjualan, dan postingan berita Markdown untuk newsletter.

Inspektur UI Studio Template

Klik komponen apa saja di bawah untuk melihat query database, dampak skema, dan tips operasional
SIDEBAR

Library Template

Pencarian instan & kunci slug
PRESET

Layout Starter

8 layout email berbasis tabel
EDITOR

Editor Kode Mentah

Indentasi Tab & pembersih
PRATINJAU

Viewport Terisolasi

Bingkai desktop & ponsel
TOKEN

Palet Token Dinamis

Injeksi placeholder 1-klik
DIAGNOSTIK

Pengirim Email Uji

Modal verifikasi SMTP langsung
AI COPY

Laci AI Copywriter

Buat & sempurnakan template
AUDIT AI

Peninjau Subjek

Skor 1–100 & audit spam
POSTINGAN

Postingan Berita

Artikel Markdown untuk newsletter

Dampak Database:

Tips Tim Dukungan:

4.1 Library Template, Kustom Slug & Manajemen Metadata

Repositori terpusat untuk semua template email pemasaran, transaksional, dan autoresponder. Dilengkapi filter pencarian instan di sisi klien, ID slug URL yang tidak dapat diubah, dan indikator status draf langsung.

Slug Template yang Tidak Dapat Diubah

ID slug (misalnya #monthly-newsletter) ditentukan saat pembuatan dan dikunci permanen setelah disimpan. Ini menjamin Campaign RSS otomatis dan urutan pemicu tidak pernah rusak karena pengidentifikasi yang diubah.

Pencarian Ter-debounce Sub-Detik

Filter Alpine di sisi klien mencocokkan secara cepat judul template, baris subjek, dan ID slug unik tanpa memicu round-trip database yang tidak perlu.

Sinkronisasi Status Draf Langsung

Kartu indikator bergaris putus-putus khusus membedakan secara visual draf aktif dalam memori dari template produksi yang tersimpan, mencegah penimpaan yang tidak disengaja.

Snapshot Campaign Independen

Mengedit atau menghapus template library tidak pernah mengubah broadcast historis. Campaign yang telah dikirim menyimpan snapshot HTML dan subjek statis independen dalam cm_campaigns.

4.2 8 Layout Starter Responsif Berbasis Tabel Teruji

Mesin email desktop modern (khususnya Microsoft Outlook yang menggunakan HTML Word) tidak mendukung CSS Grid atau Flexbox. MarbleSend menyertakan 8 layout responsif berbasis tabel yang telah teruji di Gmail, Outlook, Apple Mail, dan Yahoo:

1. Kanvas Polos Minimal

Kanvas bersih dengan footer berhenti langganan wajib.

2. Peluncuran Produk

Banner hero, proposisi nilai, dan tombol CTA tegas.

3. Newsletter Bulanan

Editorial terkurasi, sorotan artikel 2 kolom.

4. Newsletter Postingan Berita

Pita header plus blok {{news_posts}} untuk jadwal Postingan berita.

5. Seri Sambutan Onboarding

Sambutan personal, 3 langkah memulai cepat.

6. Undangan Webinar

Lencana tanggal/waktu, profil pembicara, tombol RSVP.

7. Rangkuman Blog

Daftar artikel bernomor, estimasi waktu baca, tag penulis.

8. Penawaran Reaktivasi Pelanggan

Kupon diskon terbatas, copywriting loss-aversion persuasif.

Arsitektur Tabel Bersarang & Inlined CSS

Setiap layout starter disusun menggunakan elemen <table> bersarang dengan batasan piksel eksplisit, cellpadding/cellspacing nol, dan CSS yang disisipkan sebaris (inline) untuk memastikan stabilitas tata letak di semua klien email.

4.3 Editor Kode HTML Mentah & Formatter Bersih

Editor kode terfokus yang dirancang untuk pengembang email, menampilkan penangkapan indentasi Tab, telemetri jumlah karakter real-time, dan penormal spasi otomatis.

Penangkapan Indentasi Tombol Tab

Menekan Tab menyisipkan 2-spasi alih-alih mengalihkan fokus peramban, memungkinkan penataan struktur kode yang mulus langsung di dalam browser.

Pembersih Kode 1-Klik ("Clean")

Menormalkan indentasi yang tidak konsisten, menghapus baris kosong berlebih, dan merapikan markup tabel bersarang tanpa merusak definisi style inline.

Bobot Muatan & Pelindung Pemotongan

Penghitung karakter real-time memantau ukuran template. Menjaga bobot HTML di bawah 102 KB mencegah Gmail memotong pesan Anda dengan footer "[Message clipped]".

Nol Bloat Visual WYSIWYG

Kontrol HTML langsung mencegah kelas CSS yang tidak diinginkan, font web proprietary, dan tag span tersembunyi yang dihasilkan builder visual merusak deliverabilitas email Anda.

4.4 Viewport Responsif Multi-Perangkat Terisolasi

Mensimulasikan klien email desktop dan ponsel dalam kotak pasir iframe yang terisolasi, melindungi antarmuka dashboard dari style liar sekaligus memberikan umpan balik visual instan.

Keamanan Iframe & Isolasi CSS

Atribut sandbox="allow-same-origin" mengisolasi sepenuhnya aturan CSS email agar tidak bocor ke antarmuka admin MarbleSend, mencegah konflik styling.

Pengalih Desktop vs Ponsel 320px

Beralih instan antara lebar kontainer desktop penuh dan viewport ponsel 320px realistis dengan bingkai perangkat untuk memverifikasi responsivitas satu kolom.

Bar Simulasi Subjek Real-Time

Header pratinjau atas menampilkan baris subjek yang dirender secara real-time, menunjukkan bagaimana placeholder personalisasi terlihat oleh penerima sebelum peluncuran.

Banner Peringatan Syntax Dinamis

Secara otomatis memindai markup draf dan menampilkan banner peringatan jika tag placeholder yang belum ditutup atau token yang tidak didukung terdeteksi.

4.5 Token Personalisasi Dinamis & Kepatuhan RFC

Saat pengiriman, mesin template mengganti token secara dinamis dengan atribut penerima, tautan pelacakan aman, ringkasan artikel RSS, dan Postingan berita.

{{name}}

Nama lengkap penerima (kembali ke "there" jika kosong)

{{email}}

Alamat email penerima

{{unsubscribe_link}}

Tautan berhenti berlangganan 1-klik wajib RFC 8058

{{confirm_link}}

URL konfirmasi double opt-in untuk halaman pendaftaran

{{posts}}

Loop postingan blog tersindikasi untuk newsletter RSS otomatis

{{feed_title}}

Judul feed konten RSS/Atom yang tersindikasi

{{latest_post_title}}

Judul artikel blog yang paling baru dipublikasikan

{{posts_count}}

Jumlah postingan feed baru yang disertakan dalam newsletter

{{news_posts}}

Blok Postingan berita untuk jadwal Newsletter (sampul, judul, subjudul, isi)

{{news_posts_count}}

Jumlah Postingan berita dalam pengiriman ini

{{news_latest_post_title}}

Judul Postingan berita terbaru dalam pengiriman ini

Persyaratan Hukum & Perlindungan Deliverabilitas

Setiap broadcast pemasaran wajib menyertakan {{unsubscribe_link}}. Broadcast yang dikirim tanpa mekanisme berhenti berlangganan yang sah melanggar CAN-SPAM, GDPR, dan CASL, memicu pemblokiran domain agresif oleh ISP utama.

4.6 Diagnostik Pengiriman Uji Tunggal & Pemeriksaan Pra-Pengiriman

Alat diagnostik berbasis modal yang memungkinkan pengirim mengirim email uji ke alamat penerima mana pun melalui profil SMTP yang dipilih sebelum penjadwalan atau penyiaran.

Pemilihan Profil Multi-SMTP

Rute pengiriman uji melalui profil SMTP yang dikonfigurasi untuk memverifikasi SPF, DKIM, dan status deliverabilitas pada server perutean email tertentu.

Rendering Placeholder Sintetis

Menggantikan token personalisasi secara otomatis dengan data tiruan realistis (misalnya "John Doe") untuk memeriksa pemformatan dan perataan visual secara akurat.

Pengiriman Langsung Melewati Antrean

Melewati antrean latar belakang (cm_email_queue) untuk mengirim pesan uji secara sinkron melalui MailerFactory, memberikan umpan balik lulus/gagal seketika.

Jaminan Kualitas Inbox & Mode Gelap

Kirim pengujian langsung ke akun Gmail, Outlook, dan Apple Mail pribadi untuk mengaudit inversi warna mode gelap, kontras tombol, dan keterbacaan tipografi.

4.7 Engine AI Copywriting Terikat BYOK

AI Copywriter terintegrasi yang beroperasi langsung via BYOK (Bring Your Own Key) untuk menghasilkan dan menyempurnakan template aman email berkonversi tinggi tanpa latensi proxy pihak ketiga.

Prinsip Krusial: Kualitas Hasil Ditentukan oleh Prompt & Model

MarbleSend tidak mengunci Anda pada satu model AI tertutup. Karena proses pembuatan berjalan melalui provider BYOK pilihan Anda, kualitas tata letak email, kekuatan persuasi, presisi tabel HTML, dan analisis subject secara fundamental ditentukan oleh dua variabel: ketajaman instruksi prompt Anda dan kapasitas penalaran model LLM yang aktif.

1. Spesifisitas & Kedalaman Konteks Prompt Pengguna

Model AI mencerminkan kejelasan instruksi yang Anda berikan. Prompt umum seperti "buat email promo" akan menghasilkan naskah biasa. Untuk hasil yang luar biasa, sertakan konteks terstruktur: target audiens, kendala utama, penawaran inti, gaya bahasa (urgensi, santai, eksekutif), serta Call-to-Action (CTA) yang spesifik. Pada tab Edit Template, berikan instruksi perbaikan terarah (misal: "perpendek paragraf kedua", "tonjolkan diskon 20% pada tombol CTA", atau "tambahkan kotak ringkasan 3 manfaat") untuk memoles template secara bertahap.

2. Tingkatan & Kapasitas Penalaran Model LLM

Pada Settings → AI Providers, Anda dapat menghubungkan model penalaran unggulan (seperti DeepSeek-V4.1-flash, Claude 5 Sonnet, atau GPT-6) maupun model ringan/lokal (seperti 7B–8B parameter via Ollama atau Groq). Model unggulan sangat unggul dalam menyusun tabel HTML email yang rumit, penempatan token personalisasi alami ({{name}}, {{email}}, {{unsubscribe_link}}), dan copywriting berkonversi tinggi. Pada tab Opsi Subject, evaluasi skor 1–100, audit risiko spam, dan saran varian dihitung langsung oleh model aktif — model berkapasitas tinggi memberikan analisis yang jauh lebih tajam dan variasi subject yang lebih memikat.

Standar Pengaman Otomatis MarbleSend (AiService.php)

Terlepas dari panjang prompt atau pilihan model, AiService.php otomatis menyuntikkan instruksi arsitektur email-safe yang kokoh: struktur tabel responsif tunggal (lebar maksimal 600px, kanvas bersih, kartu ber-kontras tinggi), tombol CTA berbasis tabel yang tahan banting di Outlook dan Gmail, bebas gambar eksternal demi menjaga deliverability, serta kewajiban menyematkan token {{unsubscribe_link}} pada footer guna mematuhi regulasi email global.

Pembuatan Template Penuh

Menghasilkan layout email HTML responsif berbasis tabel lengkap yang disesuaikan dengan audiens target, penawaran inti, nada suara, dan panjang bacaan yang ditentukan.

Penyempurnaan Sadar Konteks

Menganalisis template aktif di editor dan menerapkan modifikasi iteratif yang ditargetkan (misalnya "tambahkan bagian fitur 3-kolom" atau "buat CTA lebih mendesak").

Diff Visual Interaktif

Iframe terisolasi berdampingan merender versi "Sebelum" dan "Sesudah" secara bersamaan, memungkinkan pengguna memeriksa perubahan secara visual sebelum menerapkannya.

Panduan Mendapatkan API Key dari Masing-Masing Provider

Setelah memperoleh API key dan menentukan ID model yang ingin digunakan, lakukan pengaturan di MarbleSend dengan langkah-langkah mudah berikut:

6.7 Dual-Mode Mesin AI: BYOK Provider & MarbleSend AI Credits

4.8 Skor Subjek AI & Inspektur Deliverabilitas Interaktif

Memindai baris subjek email di seluruh library template Anda, mengevaluasi probabilitas rasio buka, risiko filter spam, dan pemotongan karakter dengan saran varian 1-klik.

Pemuatan Subjek Seluruh Library

Memindai semua subjek di cm_templates dan menampilkannya dalam daftar yang dapat digulir, menyorot subjek milik template yang sedang diedit.

Penilaian Multi-Faktor 1–100

LLM aktif menganalisis rasa ingin tahu, kejelasan, proposisi nilai, dan urgensi, menghitung skor efektivitas objektif dari 100.

Audit Pemotongan Seluler & Filter Spam

Menandai jumlah karakter yang melebihi batas viewport seluler (disarankan <= 50 karakter) dan mengidentifikasi kata-kata pemicu spam seperti "GRATIS", "URGENT $$$", atau tanda baca berlebih.

Saran Varian Berkonversi Tinggi

Menghasilkan baris subjek alternatif yang berfokus pada rasa ingin tahu, manfaat, atau loss aversion, yang dapat diterapkan langsung ke editor dengan satu klik.

Postingan Berita — Artikel ala Substack untuk Newsletter

Tulis artikel di tab Postingan pada Template (Markdown dengan pratinjau langsung). Jadwal Newsletter yang diatur ke “Postingan berita” mengirim setiap postingan Siap satu kali, dari yang terlama, dengan mengisi placeholder {{news_posts}} di template-nya. Postingan hanya ada di email Anda — tidak ada halaman publik.

Tulis dan tandai Siap

Gunakan toolbar atau Markdown biasa. Postingan baru dikirim setelah Anda mengubahnya dari Draf ke Siap.

Placeholder template

Letakkan {{news_posts}} di tempat artikel harus muncul (starter “Newsletter Postingan Berita” sudah memilikinya). {{news_posts_count}} dan {{news_latest_post_title}} bisa dipakai di subjek.

Jadwalkan

Di Jadwal pilih Newsletter, lalu Sumber konten: Postingan berita. Hanya postingan yang ditandai Siap setelah saat itu yang dikirim, sehingga arsip Anda tidak diputar ulang. Supresi Pintar tidak dipakai.

Aman sejak awal

Teks postingan di-escape sebagai HTML dan hanya tautan serta gambar https yang diizinkan. Jaga setiap email di bawah sekitar 100 KB agar Gmail tidak memotong tautan berhenti berlangganan — editor akan memperingatkan Anda.

Ringkasan ruang kerja Postingan

Buka Template lalu pindah ke tab Postingan. Pustaka ada di kiri dan editor beserta pratinjau langsungnya di kanan — tata letak yang sama dengan studio template.

BagianFungsinya
PustakaMenampilkan setiap postingan dengan lencana Draf atau Siap, berapa kali sudah terkirim, dan kapan terakhir berubah. Kotak pencarian menyaring berdasarkan judul dan subjudul; ikon tempat sampah muncul saat kursor diarahkan.
Judul, subjudul, sampulJudul wajib diisi (maksimal 255 karakter, satu baris). Subjudul (maksimal 500) tampil di bawahnya. Gambar sampul harus berupa URL https — selain itu ditolak saat disimpan.
Sakelar statusPostingan Draf tidak pernah dikirim. Mengubahnya ke Siap mencatat saat ia menjadi Siap; saat itu menentukan jadwal mana yang boleh mengirimnya.
Editor MarkdownTombol toolbar (judul, tebal, miring, tautan, daftar, kutipan, pemisah, gambar) menyisipkan syntax di sekitar teks yang Anda pilih. Satu postingan dapat memuat hingga 100.000 karakter.
Pratinjau langsungMerender postingan yang belum disimpan di dalam template pilihan Anda, memakai kode yang sama dengan pengiriman nyata, dan menampilkan ukuran email dalam KB. Placeholder seperti {{name}} memakai nilai contoh.
Pintasan placeholderTombol di bawah editor menyalin {{news_posts}} agar dapat ditempel ke template.

Referensi Markdown

Teks postingan ditulis dalam subset Markdown yang kecil dan aman. Apa pun di luar daftar ini tetap menjadi teks biasa.

SyntaxHasil
## Heading
### Smaller
Judul (tingkat 1–3 menjadi judul yang aman untuk email)
**bold** *italic*Tebal dan miring
[text](https://example.com)Tautan. Hanya alamat http, https, dan mailto yang ditautkan; skema lain (seperti javascript:) dibiarkan sebagai teks biasa.
- item
1. item
Daftar poin dan daftar bernomor
> quoteKutipan blok
---Garis pemisah
![alt](https://example.com/a.png)Gambar. Hanya https; selalu tambahkan deskripsi singkat untuk pembaca yang memblokir gambar.
(blank line)Paragraf dipisahkan oleh baris kosong; satu pemisah baris tetap menjadi pemisah baris di dalam paragraf.
<script>alert(1)</script>HTML mentah tidak pernah diinterpretasikan: tag <script> atau <img> yang Anda ketik ditampilkan sebagai teks apa adanya.

Keluarga placeholder {{news_posts}}

Letakkan ini di template; jadwal Postingan berita mengisinya saat pengiriman, sebelum token per penerima seperti {{name}} diproses.

PlaceholderMenjadi
{{news_posts}}Blok postingan untuk pengiriman ini: gambar sampul, judul, subjudul, dan isi setiap postingan, dari yang terlama. Wajib ada di isi template.
{{news_posts_count}}Jumlah postingan dalam pengiriman ini, misalnya 1. Berfungsi di subjek dan isi.
{{news_latest_post_title}}Judul postingan terbaru dalam pengiriman ini. Ideal untuk baris subjek.

Wajib ada di isi

Jadwal Postingan berita ditolak saat disimpan jika isi template-nya tidak memuat {{news_posts}}, dan eksekusi gagal dengan aman (postingan tetap tertunda) jika template diedit belakangan.

Tidak pernah terkirim sebagai teks mentah

Jika dipakai di tempat lain — Campaign manual, jadwal RSS, atau jadwal template saja — placeholder diganti teks kosong, dan pemeriksaan pra-kirim Campaign memperingatkan Anda sebelum mengirim.

Dipersonalisasi dan dilacak

Teks postingan melewati alur normal: {{name}} di dalam postingan dipersonalisasi per penerima, tautan mendapat parameter UTM dan pelacakan klik, dan tautan berhenti berlangganan di template Anda tetap utuh.

Siklus hidup postingan

Setiap postingan melewati status sederhana yang sama; lencana di pustaka selalu menunjukkan status saat ini.

Draf

Masih ditulis. Tidak pernah dikirim. Memindahkan postingan Siap kembali ke Draf menghapus waktu Siap-nya.

Siap

Antre untuk dikirim. Jadwal hanya mengirimnya jika ia menjadi Siap setelah mode Postingan berita jadwal itu dinyalakan. Menyimpan postingan yang sudah Siap tidak mengubah posisinya dalam antrean.

Terkirim

Dicatat per jadwal dan tampil sebagai “Terkirim 1×” di pustaka. Jadwal tidak pernah mengirim postingan yang sama dua kali, meskipun Anda mengeditnya kemudian.

Dihapus

Menghapus postingan beserta riwayat pengirimannya. Email yang sudah terkirim tidak terpengaruh, dan postingan yang dihapus tidak dapat dipulihkan.

Ukuran email dan keamanan

Postingan membawa teks lengkapnya di dalam email — tidak ada halaman publik — sehingga ukuran dan keamanan lebih penting daripada digest yang hanya berisi tautan.

Escape dulu

Setiap karakter yang Anda ketik di-escape sebagai HTML sebelum pemformatan diterapkan, sehingga skrip dan tag tidak dapat mencapai kotak masuk penerima.

Hanya https

Gambar dan sampul harus https. Tautan menerima http, https, dan mailto. Skema lain ditampilkan sebagai teks biasa.

Tetap di bawah sekitar 100 KB

Gmail memotong pesan di atas sekitar 102 KB dan menyembunyikan footer, termasuk tautan berhenti berlangganan. Pratinjau menampilkan ukuran dalam KB dan memperingatkan di atas 80 KB; kurangi jumlah postingan per email untuk artikel panjang.

Tanpa arsip publik

Postingan hanya ada di dalam email yang Anda kirim. Tidak ada halaman web, unggah gambar, maupun panggilan AI otomatis — gambar ditautkan lewat URL.

Pemecahan masalah cepat

GejalaYang perlu diperiksa
Pratinjau tidak menampilkan artikelTemplate yang dipilih tidak memiliki placeholder {{news_posts}} (ditandai “tanpa {{news_posts}}” di daftar). Pilih template lain atau tambahkan placeholder-nya.
Peringatan “Email besar”Persingkat postingan, hapus format yang berat, atau turunkan “Postingan per email” di jadwal.
Tautan tidak bisa diklikTulis sebagai [text](https://…) dengan alamat http, https, atau mailto; skema lain dibiarkan sebagai teks.
Gambar tidak munculAlamatnya harus diawali https dan dapat dijangkau publik. Beberapa aplikasi email juga memblokir gambar jarak jauh sampai pembaca mengizinkannya.
Modul 05

Schedules & Otomasi RSS (/schedules)

Pengiriman newsletter berulang (template atau Postingan berita), kalender broadcast bulanan interaktif, mesin kadensi, penargetan audiens dinamis, dan campaign RSS/Atom blog otomatis.

UI Inspector Jadwal, RSS & Postingan Berita

Klik komponen mana saja di bawah untuk melihat query database, dampak skema, dan tips operasional

Interactive Inspector
KALENDER

Matriks Kalender & Bulan

Peta jadwal visual & kadensi
KADENSI

Engine Pengulangan

Harian, mingguan, bulanan & kustom
RSS / ATOM

Poller Blog Otomatis

Deduplikasi hash & cache
AUDIENS

Audiens Dinamis

Query tag saat detik run tepat
AUDIT

Log Occurrence

Audit eksekusi & cegah duplikasi
EKSEKUSI

Run Now On-Demand

Jalankan instan tanpa geser kadensi
OPTIMASI

Optimasi Hosting

8 panduan operasional terkurasi
WORKER

Heartbeat Cron & Lock

Pengaman konkurensi non-blocking
POSTINGAN

Mode Postingan Berita

Newsletter bergaya Substack

Dampak Database:

Tips Tim Dukungan:

5.1 Operasi Dual-Mode: Schedule Manager Interaktif & Tampilan Kalender

MarbleSend menyediakan dua tampilan operasional tersinkronisasi yang disesuaikan dengan kebutuhan alur kerja: Schedule Manager bergaya Bento (/schedules) yang ringkas dan Kalender Bulanan interaktif yang komprehensif (/schedules/list).

Tampilan Tabel Ringkas & Bento

Menampilkan semua siaran berulang dengan hitung mundur run berikutnya, toggle status aktif/jeda, preview template terpilih, dan shortcut eksekusi langsung.

Grid Kalender 7-Kolom Interaktif

Memetakan pengiriman mendatang pada kalender bulanan Minggu–Sabtu standar, dilengkapi highlight hari ini, navigasi bulan, dan chip event yang dapat diklik.

Drawer Detail Jadwal Terpilih

Drawer inspeksi instan yang merender preview template sandboxed, spesifikasi pengulangan, aturan tag penerima, dan tombol aksi cepat.

5.2 Engine Kadensi, Aturan Pengulangan & Normalisasi Zona Waktu UTC

Jadwal berulang dijalankan oleh SchedulerService::computeNextRun(), yang meniadakan perhitungan manual demi matematika DateTimeImmutable PHP yang tangguh.

Penyimpanan UTC Universal dengan Presentasi Terlokalisasi

Semua nilai next_run_at disimpan dalam format UTC di cm_schedules. Saat dirender di browser, waktu dikonversi ke zona waktu tampilan admin sambil tetap menjaga jendela pengiriman penerima.

Pengulangan Harian & Mingguan

Mendukung pengiriman harian pada jam tertentu, atau pemilihan hari mingguan spesifik (misal Selasa dan Kamis pagi) menggunakan pil hari interaktif.

Penyesuaian Tanggal Bulanan (Clamping)

Untuk pengiriman bulanan pada tanggal 29–31, MarbleSend secara otomatis menyesuaikan eksekusi ke hari terakhir yang valid pada bulan-bulan pendek (misal 28/29 Februari).

Kesadaran DST & Zona Waktu

Menggunakan perhitungan DateTimeZone bawaan PHP untuk menjamin siaran terpicu pada jam lokal yang tepat melintasi batas Daylight Saving Time.

5.3 Pipeline Poller Feed RSS & Atom Otomatis

MarbleSend terhubung langsung ke feed blog atau konten Anda menggunakan SimpleXML dan cURL bawaan, mengubah artikel baru menjadi campaign otomatis tanpa alat integrasi pihak ketiga.

Parser Dual-Format (RSS 2.0 & Atom 1.0)

Secara otomatis memeriksa root XML, mengekstrak judul, ringkasan konten, permalink, dan waktu publikasi tanpa dependensi library eksternal.

Diagnostik Feed Pre-Flight Live

Tombol "Test Feed" menghubungi URL feed secara real-time, memvalidasi skema XML, memverifikasi respons HTTP 200, dan menampilkan preview 3 postingan terbaru.

Deduplikasi & Snapshot Awal

Melacak last_rss_item_id dan tanggal publikasi. Saat pembuatan jadwal awal, MarbleSend mencatat ID artikel terbaru sebagai baseline agar tidak menyiarkan arsip lama secara retroaktif.

5.4 Resolusi Audiens Dinamis & Penargetan Penerima saat Waktu Eksekusi

Audiens jadwal juga bisa dibatasi ke satu grup (digabung dengan tag, keduanya harus cocok). Jika grup itu dihapus, jadwal dinonaktifkan, bukan diam-diam mengirim ke siapa pun.

Tidak seperti snapshot campaign statis, siaran terjadwal menentukan daftar penerima secara dinamis pada detik yang sama saat occurrence terpicu.

Ekspansi Audiens Real-Time

Subscriber yang baru mendaftar atau menerima tag beberapa menit sebelum jadwal berjalan akan otomatis disertakan tanpa sinkronisasi manual.

Filter Status Deliverability Ketat

Query pengiriman menerapkan WHERE status = 'active', mengecualikan kontak pending, unsubscribed, dan suppressed dari antrean siaran.

Isolasi Segmen Berbasis Tag

Mendukung pengiriman ke seluruh kontak aktif atau penargetan segmen tertentu yang cocok dengan array tag JSON (misal #digest-mingguan, #pelanggan).

5.5 Log Eksekusi Occurrence, Audit Run & Kebijakan Single Catch-Up

Setiap eksekusi otomatis mencatat baris audit di tabel cm_schedule_occurrences, merinci waktu eksekusi, hasil, jumlah penerima, dan telemetri error.

Telemetri Occurrence 3-Status

Membedakan antara 'completed' (email diantrekan), 'skipped' (tidak ada artikel RSS baru), dan 'failed' (koneksi SMTP terputus, template salah, atau timeout jaringan).

Pengaman Idempotensi Single Catch-Up

Jika cron worker tidak aktif selama beberapa interval yang terlewat, MarbleSend hanya menjalankan maksimal SATU siaran susulan saat aktif kembali dan memajukan next_run_at.

Modal Audit Riwayat Occurrence

Klik "View Execution History" dari bilah samping untuk memeriksa riwayat proses sebelumnya, volume penerima, dan log diagnostik langsung di antarmuka.

5.6 Pengiriman Manual On-Demand ("Run Now") & Override Darurat

Admin dapat melewati hitung mundur jadwal dan langsung memicu siaran seketika dari jadwal apa pun menggunakan aksi "Trigger Send Now".

Kompilasi Antrean Seketika

Seketika merender template, menghitung anggota audiens aktif, dan memasukkan batch email ke cm_email_queue untuk siklus worker terdekat.

Timeline Pengulangan Tetap Terjaga

Memicu siaran on-demand tidak menggeser atau menunda timestamp next_run_at yang sudah terjadwal, menjaga kadensi kalender tetap teratur.

Kegunaan Diagnostik & Berita Penting

Sangat berguna untuk menguji format template langsung dengan data subscriber riil atau menyebarkan buletin darurat di luar jam kerja reguler.

5.7 Konkurensi Worker Aman, Pencegahan Tumpang Tindih & Lock File Non-Blocking

MarbleSend memiliki parameter konkurensi tingkat enterprise yang dirancang khusus untuk mencegah siaran ganda di hosting hemat sumber daya.

Lock Konkurensi flock Non-Blocking

worker.php meminta lock eksklusif pada storage/worker.lock. Jika proses sebelumnya masih mengirim batch melalui relay SMTP lambat, pemanggilan berikutnya keluar secara rapi tanpa bentrok.

Paritas Protokol Dual-Worker

Baik CLI worker.php maupun HTTP cron.php berbagi jalur eksekusi dan mekanisme penguncian yang identik, memastikan konsistensi di cron cPanel maupun webhook.

Klaim Occurrence Atomik

Jadwal yang jatuh tempo direservasi menggunakan prepared statement PDO atomik, mencegah antrean ganda bahkan pada container multi-thread.

5.8 Tuning Performa Shared-Hosting & 8 Tips Optimasi Terkurasi

Kartu Optimization Tip dinamis pada halaman Schedules menyajikan 8 rekomendasi operasional teruji untuk keandalan pengiriman di shared hosting:

1. Jendela Kirim Pagi Optimal

Jadwalkan siaran hari Selasa atau Kamis antara 09:00 dan 10:30 waktu lokal penerima untuk open rate dan klik maksimal.

2. Presisi Cron Worker 1-Menit

Jalankan worker.php setiap menit (* * * * *) dengan proteksi flock untuk menjamin ketepatan sub-menit tanpa tabrakan proses.

3. Klaim Batch Queue Atomik

Query cm_email_queue menggunakan prepared statement terindeks dengan klausa LIMIT untuk mencegah race condition pada volume tinggi.

4. Segmentasi Tag Zona Waktu Subscriber

Kelompokkan kontak dengan tag wilayah (#us-east, #apac, #emea) dan atur jadwal bertahap agar email tidak terkirim jam 03:00 pagi.

5. Buffer Jeda Publikasi RSS

Beri jeda 1–2 jam setelah artikel diterbitkan di CMS sebelum mengirim RSS, memberi waktu node CDN dan cache XML untuk ter-update.

6. Pemangkasan Riwayat Occurrence Rutin

Bersihkan log eksekusi lawas di cm_schedule_occurrences secara berkala agar ukuran database tetap ringan dan query tetap cepat.

7. Strategi Resend 48 Jam Non-Openers

Jadwalkan pengiriman ulang 48–72 jam kemudian ke kontak dengan opened_at IS NULL dengan variasi subject line untuk memulihkan 15–25% engagement.

8. Isolasi Routing Profil SMTP Khusus

Gunakan profil SMTP terpisah antara feed RSS otomatis dan blast promosi bervolume tinggi demi menjaga reputasi domain pengirim.

5.9 Jadwal Postingan Berita (Newsletter Bergaya Substack)

Jadwal Newsletter kini dapat mengirim artikel, bukan satu template tetap. Atur Sumber konten ke “Postingan berita” dan setiap eksekusi mengirim Postingan Siap berikutnya dari Template → Postingan, disisipkan ke template lewat {{news_posts}}. Tidak ada yang dikirim jika tidak ada postingan yang menunggu.

Sumber konten mana yang harus saya pakai?

Hanya template

Template yang sama di setiap eksekusi — untuk pengumuman atau pengingat berulang. Supresi Pintar tersedia.

Digest RSS

Postingan baru dari feed blog eksternal. Eksekusi pertama hanya menandai postingan yang ada sebagai sudah dilihat; eksekusi berikutnya hanya mengirim postingan baru.

Postingan berita

Artikel yang Anda tulis di dalam MarbleSend. Setiap postingan Siap dikirim sekali, dari yang terlama. Terbaik untuk newsletter bergaya Substack.

Siapkan dalam enam langkah

  1. 1Buka Template → Postingan lalu tulis artikel Anda dalam Markdown.
  2. 2Buat atau buka template dan letakkan {{news_posts}} di tempat artikel harus muncul (starter “Newsletter Postingan Berita” sudah memilikinya).
  3. 3Buka Jadwal → Baru, biarkan tipe Newsletter, dan atur Sumber konten ke “Postingan berita”.
  4. 4Pilih template, audiens, profil SMTP, jumlah postingan per email (1–20), dan kadensinya.
  5. 5Simpan. Hanya postingan yang menjadi Siap setelah saat ini yang dapat dikirim oleh jadwal ini.
  6. 6Tandai postingan Siap. Eksekusi berikutnya — atau Jalankan sekarang — mengirimkannya.

Postingan mana yang dikirim di tiap eksekusi

Pada setiap eksekusi, jadwal memilih postingan dengan empat aturan, berurutan.

Hanya yang Siap

Draf diabaikan, seberapa lama pun usianya.

Setelah batas awal

Postingan harus menjadi Siap setelah mode Postingan berita jadwal dinyalakan. Arsip Anda yang sudah ada tidak pernah diputar ulang.

Belum dikirim oleh jadwal ini

Pengiriman dicatat per jadwal, jadi dua jadwal masing-masing dapat mengirim postingan yang sama sekali, tetapi tidak pernah dua kali.

Terlama dulu, sampai batasnya

“Postingan per email” (bawaan 1, maksimal 20) membatasi berapa banyak yang digabung. Sisanya menunggu eksekusi berikutnya.

Contoh: Anda menyimpan jadwal pada hari Senin. Postingan yang menjadi Siap pada hari Jumat diabaikan; yang menjadi Siap pada hari Selasa dikirim pada eksekusi berikutnya, lalu tidak pernah lagi oleh jadwal ini.

Apa yang dicatat setiap eksekusi

Setiap eksekusi muncul di riwayat jadwal. Postingan ditandai terkirim hanya jika batch email benar-benar masuk antrean.

Terkirim

Sebuah Campaign dibuat dan diantrekan, misalnya “1 post · 5 recipients queued”. Postingan ditandai terkirim oleh jadwal ini.

Dilewati: tidak ada postingan baru

Tidak ada postingan Siap yang menunggu. Tidak ada yang dikirim dan jadwal mencoba lagi pada eksekusi berikutnya.

Dilewati: tidak ada penerima

Audiens kosong. Postingan tetap tertunda dan dikirim begitu audiens memiliki kontak aktif.

Gagal

Template hilang atau tidak lagi memuat {{news_posts}}. Postingan tetap tertunda; perbaiki template lalu jalankan lagi.

Jalankan sekarang dan kirim uji

Jalankan sekarang

Eksekusi nyata, dijalankan worker dalam sekitar satu menit. Mengirim postingan yang tertunda dan menandainya terkirim.

Kirim digest uji

Mengirim postingan tertunda berikutnya — atau, jika tidak ada, postingan Siap terbaru — ke satu alamat lewat profil SMTP milik jadwal itu. Tidak pernah menandai apa pun terkirim dan berbagi batas uji 5 per menit.

Mengedit dan menjeda

  • Beralih dari Hanya template ke Postingan berita menetapkan batas awal baru saat itu; beralih kembali menghapusnya.
  • Menyimpan formulir jadwal memeriksa ulang bahwa template memuat {{news_posts}}. Jeda dan Lanjutkan hanya membalik sakelar aktif/nonaktif dan tidak pernah memeriksanya, jadi Anda selalu bisa menjeda.
  • Supresi Pintar dimatikan otomatis pada mode Postingan berita: ia akan mengecualikan semua orang yang menerima edisi sebelumnya.
  • Postingan berita hanya tersedia untuk jadwal Newsletter; jadwal RSS memakai logika feed-nya sendiri.

Membaca layar jadwal

  • Daftar jadwal memberi label “Postingan berita” alih-alih “Newsletter” pada jadwal ini.
  • Panel detail menampilkan berapa postingan Siap yang menunggu untuk jadwal ini.
  • Pada formulir, template tanpa {{news_posts}} ditandai, dan peringatan muncul jika Anda memilihnya.

Pemecahan masalah cepat

GejalaYang perlu diperiksa
Postingan Siap saya tidak terkirimPeriksa bahwa ia menjadi Siap setelah jadwal disimpan (atau dialihkan ke Postingan berita), bahwa jadwal aktif, dan lihat entri riwayat untuk “no recipients” atau “failed”.
Jadwal bilang “no new posts” tepat setelah saya menulis satuPostingan mungkin masih Draf, atau sudah dikirim oleh jadwal ini. Buka Template → Postingan dan periksa lencana serta “Terkirim N×”.
Tidak bisa menyimpan: template harus memuat {{news_posts}}Tambahkan placeholder ke isi template (bukan hanya ke subjek) atau pilih template lain.
Saya ingin mengirim ulang postingan lamaSalin teksnya ke postingan baru dan tandai yang baru itu Siap — jadwal tidak pernah mengirim postingan yang sama dua kali.
Modul 06

Settings & Infrastruktur Sistem (/settings)

Manajemen multi-relay SMTP, detak jantung cron, 23 bahasa, diagnostik deliverability, dan aktivasi lisensi.

UI Inspector Pengaturan & Infrastruktur

Klik komponen apa pun di bawah untuk melihat dampak skema database, proses latar belakang, dan panduan operasional

Interactive Inspector
SMTP

Profil SMTP

BYO SMTP & Managed SES Relay
WORKER

Worker & Cron

Presisi eksekusi 1-menit
LOCALES

23 Bahasa & Tema

Mirror RTL & Mode Gelap/Terang
API KEYS

Kunci REST API

Akses developer berlingkup
WEBHOOKS

Webhook Event

Push event HMAC-SHA256
DELIVERABILITY

Deliverability Suite

SPF, DKIM, DMARC & BIMI
AI BYOK

Penyedia AI

BYOK & MarbleSend Credits
LICENSE

Lisensi Ed25519

Token hibah kriptografis

Dampak Database:

Tips Tim Dukungan:

6.1 Arsitektur Pengiriman Ganda: BYO SMTP & Relay Amazon SES Terkelola

MarbleSend memisahkan eksekusi campaign dari relai pengiriman melalui dua model transport yang tangguh: (1) Bring Your Own (BYO) SMTP untuk menghubungkan server mail mandiri Anda, dan (2) Relay Amazon SES Terkelola via admin.marblesend.com untuk pengiriman cloud kelas enterprise instan tanpa repot setup AWS. Mendukung Opsi 1 Friendly From (0 konfigurasi DNS) dan Opsi 2 Custom Domain Easy DKIM dengan penetapan harga dinamis dan manajemen kredit atomik.

Opsi 1: BYO SMTP (Infrastruktur Relai Mandiri)

Hubungkan penyedia SMTP standar apa pun termasuk Postmark, Mailgun, Brevo, SendGrid, Resend, atau mailbox cPanel hosting Anda. Mendukung Port 587 dengan STARTTLS, Port 465 dengan SSL/TLS implisit, dan Port 25 untuk relai lokal, dengan otentikasi kustom dan header pengirim terisolasi.

6.1.1 Penyedia Server SMTP (Gratis, Komersial & Shared Hosting)

Direktori & Komparasi SMTP

Hubungkan pengiriman email mandiri Anda dengan kredensial SMTP standar. Pilih antara relay cloud khusus berkapasitas tinggi atau mailbox hosting Anda dengan memperhatikan kuota pengiriman.

Pemberitahuan Transparansi Penting: Batasan Kirim Shared Hosting

Mailbox shared hosting standar (cPanel, Webmail) memberlakukan batas kirim per jam dan per hari yang ketat (umumnya 100–500 email/hari, dan fungsi php mail() berbasis skrip sering dibatasi 100/hari atau 10/menit). Mengirim newsletter atau broadcast promosi melalui mailbox hosting standar dapat menyebabkan penolakan bounce 'Quota Exceeded' atau penangguhan akun. Untuk kampanye pemasaran, upgrade ke paket Business Email / Email Marketing khusus atau hubungkan relay cloud.

Dioptimalkan untuk pengiriman volume tinggi, manajemen reputasi IP yang tangguh, dan keterkiriman maksimal.

Penyedia / Website Kuota Gratis Harga Komersial Host & Port SMTP Aturan & Batasan Penting
Amazon SES (Direct) Free tier on EC2 only (62k/mo); Otherwise pay-as-you-go $0.10 / 1,000 emails ($1 per 10k) email-smtp.<region>.amazonaws.com
Port 587 (TLS) or 465 (SSL)
Requires AWS account setup, IAM SMTP user credentials, and sandbox exit request.
Brevo 300 emails / day (Free forever) Starter from ~$9/mo (5k emails) to ~$18/mo (20k emails) smtp-relay.brevo.com
Port 587 (TLS)
Free tier resets daily. Great for low-volume testing without entering a credit card.
Mailgun (Sinch) Trial (5,000 emails for 30 days) Foundation: $35/mo (50,000 emails); Scale: $90/mo smtp.mailgun.org (or smtp.eu.mailgun.org)
Port 587 (TLS) or 465 (SSL)
Robust analytics and deliverability. Supports EU data residency.
Twilio SendGrid 100 emails / day (Free forever) Essentials: ~$19.95/mo (50k emails); Pro: ~$89.95/mo smtp.sendgrid.net
Port 587 (TLS) (User: apikey)
Requires Two-Factor Authentication. Username must literally be apikey.
Postmark (ActiveCampaign) Free Developer trial: 100 emails/mo From $15/mo (10,000 emails), $55/mo (50,000 emails) smtp.postmarkapp.com
Port 587 (TLS) or 2525
Industry-leading transactional speed and strict spam filters. Separate broadcast streams required.
Resend 3,000 emails / month (100 / day free) Pro: $20/mo (50,000 emails/mo) smtp.resend.com
Port 465 (SSL) or 587 (TLS) (User: resend)
Modern developer experience, clean UI, quick domain verification via DNS.

Mailbox cPanel dan hosting standar cocok untuk korespondensi ringan, namun dibatasi ketat untuk email marketing massal.

Host: smtp.hostinger.com | Port 465 (SSL) / 587 (TLS)
Business Email Plans (Per Mailbox)
Free Business Email Rp0 / mo

1 GB storage, 1 forwarding rule, 1 alias, up to 100 mailboxes/domain. Standard webmail & antispam. Strict sending cap (~100-200/day).

Starter Business Email Rp7.900 / mo

5 GB storage, 5 forwarding rules, 5 aliases, expandable mailbox storage. No mailbox limit per domain.

Standard Business Email Rp10.900 / mo

20 GB storage, 20 forwarding rules, 10 aliases, AI Kodee mailbox assistant & smart replies.

Premium Business Email Rp19.900 / mo

50 GB storage, 50 forwarding rules, 30 aliases, full AI suite & priority deliverability.

Hostinger Reach (Email Marketing)
Starter Marketing Rp23.900 / mo

100 recipients, 200 emails / month. Suitable for basic transactional testing.

Grow Marketing Rp36.900 / mo

500 recipients, 500 emails / month, 10 AI credits, remove Reach branding, automations.

Pro Marketing Rp54.900 / mo

1,000 recipients, 7,000 emails / month, 20 AI credits, custom HTML code, send-time optimization.

Namecheap Jellyfish / cPanel

• cPanel Shared: Max ~500 emails/hour per cPanel domain.
• Private Email: Starter (~$1.24/mo per mailbox, 5GB). Pro (~$2.82/mo, 30GB).
• SMTP Host: mail.privateemail.com (Port 465 SSL or 587 TLS).

View Namecheap Email
Bluehost cPanel / M365

• Shared cPanel: Default cap ~500 emails/hour. Internal mail system may defer large sudden bursts.
• Professional Email: Integrated with Microsoft 365 or Google Workspace ($2.99–$9.99/mo).
• SMTP Host: box###.bluehost.com or mail.yourdomain.com (Port 465 SSL).

View Bluehost Email
SiteGround Site Tools

• Site Tools Mail: Included in hosting (StartUp, GrowBig, GoGeek).
• Rate Limits: ~400 emails/hour on StartUp; up to ~800/hour on GoGeek. Strictly intended for transactional mail.
• SMTP Host: mail.yourdomain.com (Port 465 SSL).

View SiteGround Email
DreamHost Custom Panel

• Paid Business Email: ~$1.99/mo per mailbox (25GB storage).
• Strict Outbound Policy: Maximum 100 recipients per hour. Mass marketing prohibited via shared SMTP.
• SMTP Host: smtp.dreamhost.com (Port 465 SSL or 587 TLS).

View DreamHost Email
HostGator cPanel

• cPanel Limit: Max 500 emails/hour per domain on shared plans.
• Workspace Option: Google Workspace addon ($6–$18/mo).
• SMTP Host: mail.yourdomain.com (Port 465 SSL or 587 TLS).

View HostGator Email
GoDaddy Microsoft 365

• M365 Reseller: Email Essentials from ~$1.99–$5.99/mo (10GB-50GB).
• SMTP Relay Note: Direct SMTP AUTH requires enabling Authenticated SMTP in the M365 Admin Portal.
• SMTP Host: smtp.office365.com (Port 587 TLS).

View GoDaddy Email

Pilih port dan protokol keamanan yang sesuai berdasarkan jaringan server dan aturan firewall Anda.

Port 587 (STARTTLS) STANDARD

The modern standard for email client-to-relay submission (RFC 6409). Starts in cleartext and immediately upgrades connection to TLS. Supported by almost all cloud relays.

Port 465 (SSL / SMTPS) ENCRYPTED

Implicit TLS/SSL wrapper connection (RFC 8314). Required by Hostinger, Namecheap cPanel, and selected enterprise relays. Highly reliable when hosting firewalls restrict 587.

Port 25 (Plain / MTA) BLOCKED

Server-to-server MTA routing. Almost universally blocked on cloud hosts (Hostinger, AWS, DigitalOcean, Hetzner, etc.) to combat spam. Do NOT use for outbound SMTP credentials.

6.1.1 Relay Amazon SES Terkelola & Domain Pengirim Kustom

MANAGED SES

Infrastruktur pengiriman cloud enterprise yang dikelola oleh MarbleSend via api.marblesend.com. Mengeliminasi pemblokiran port SMTP, manajemen kredensial IAM, dan risiko reputasi IP di shared hosting. Mendukung dua mode pengirim (Friendly From & Easy DKIM), kredit awal gratis, audit ledger atomik, dan skalabilitas dinamis sesuai kebutuhan.

Opsi 2: Relay Amazon SES Terkelola (Edge sigv4)

Pengiriman cloud Amazon SES kelas enterprise yang telah dikonfigurasi dan dikelola oleh MarbleSend via admin.marblesend.com. Tanpa setup akun AWS, tanpa manajemen kredensial IAM, dan tanpa perlu warming IP. Top-up kredit sesuai kebutuhan dengan visibilitas kuota real-time.

SES Opsi 1: Friendly From (Tanpa Setup DNS)

Pengiriman campaign instan tanpa perlu konfigurasi DNS. Email dikirim via amplop relay@marblesend.com menampilkan nama brand Anda, dan balasan penerima diarahkan langsung ke mailbox pribadi Anda.

SES Opsi 2: Custom Domain & Easy DKIM (3 CNAME)
Easy DKIM

Kirim langsung dengan From: "Brand Anda" <anda@domainanda.com>. Tambahkan 3 record CNAME DNS yang digenerate AWS SES v2 untuk membuktikan kepemilikan domain dan mencapai inbox placement optimal.

Kuota Domain Kustom & Katalog Harga Dinamis

Setiap lisensi aktif mendapatkan 1 identitas domain kustom gratis. Slot domain tambahan dan paket kredit SES (10k, 50k, 100k, 250k) dimuat secara dinamis dari admin.marblesend.com tanpa update aplikasi.

Buku Besar Kredit Atomik, Idempotensi & Auto-Refund

Setiap email yang dikirim melalui MarbleSend SES mereservasi 1 kredit secara atomik menggunakan idempotensi UUID item antrean (cm_addon_ledger.uq_addon_ledger_key). Jika transmisi relai gagal, reservasi langsung dilepaskan dan di-refund otomatis.

6.1.2 Aturan pengiriman dengan SES Relay

Amazon SES hanya cocok untuk pengirim yang menjaga daftarnya tetap bersih, sehingga aturan ini ditegakkan oleh relay MarbleSend sendiri, bukan hanya oleh aplikasi ini. Aturan ini tidak dapat dimatikan dan berlaku untuk setiap email yang dikirim lewat SES Relay.

Identitas pengirim

Sebelum pengiriman pertama, lengkapi Settings → SMTP → Identitas Pengirim & Kebijakan Penggunaan: nama legal, alamat pos, negara, nomor telepon, dan persetujuan atas Kebijakan Penggunaan yang Dapat Diterima. Pengiriman tetap diblokir sampai data tersimpan. Nama dan alamat Anda muncul di footer setiap email; nomor telepon tidak pernah ditampilkan.

Unsubscribe di setiap email

Isi setiap kampanye wajib memuat tag {{unsubscribe_link}}, jika tidak pengiriman ditolak. Selain itu, relay menambahkan header List-Unsubscribe dan one-click serta footer berisi nama, alamat, tautan unsubscribe, dan “Sent with MarbleSend”. Footer tidak dapat dihapus.

Daftar berbasis izin

Selama SES Relay dipakai, halaman pendaftaran dan API selalu memakai double opt-in, pendaftaran publik mewajibkan Cloudflare Turnstile, dan impor CSV memerlukan centang bahwa semua orang telah memberi izin. Orang yang berhenti berlangganan atau di-suppress tidak dapat mendaftar ulang lewat formulir publik.

Bounce dan komplain

Hard bounce dan komplain spam sampai ke MarbleSend secara otomatis dan mengubah kontak menjadi suppressed. Relay juga menolak mengirim ke alamat yang di-suppress, dan tidak ada kredit yang terpakai. Soft bounce dicoba ulang dan baru men-suppress kontak setelah gagal berulang kali.

Batas dan jeda otomatis

Setiap akun memiliki batas kirim harian (default 2.000 email). Jika rasio bounce atau komplain terlalu tinggi, pengiriman berhenti otomatis sampai dukungan meninjau akun, dan juga berhenti bila lisensi tidak aktif. Banner di Settings → SMTP menjelaskan alasannya, dan email dalam antrean menunggu, bukan hilang.

Pengiriman terautentikasi

Email ditandatangani DKIM untuk marblesend.com (atau domain Anda sendiri setelah diverifikasi). Return path memakai mail.marblesend.com, sehingga SPF selaras dan DMARC lolos. Balasan masuk ke alamat Reply-To yang Anda atur.

Panduan DNS Easy DKIM Provider

Direktori Konfigurasi 3 CNAME Easy DKIM (Lintas Provider)

Panduan konfigurasi DNS langkah demi langkah untuk menambahkan 3 record CNAME Easy DKIM Amazon SES di berbagai hosting provider dan registrar domain populer, mencegah kesalahan sintaks umum, dan memastikan verifikasi instan.

Arsitektur DNS Universal & Aturan Emas

Easy DKIM mendelegasikan penandatanganan kriptografis ke Amazon SES via 3 record CNAME. Karena AWS mengelola dan memutar kunci RSA 1024/2048-bit secara otomatis tanpa perlu update DNS manual di masa depan, ketiga record CNAME ini harus tetap aktif secara permanen di DNS Anda.

Tipe Record Host / Nama (Name) Nilai / Target / Mengarah Ke TTL
CNAME <token1>._domainkey.yourdomain.com <token1>.dkim.amazonses.com 300 (or Auto)
CNAME <token2>._domainkey.yourdomain.com <token2>.dkim.amazonses.com 300 (or Auto)
CNAME <token3>._domainkey.yourdomain.com <token3>.dkim.amazonses.com 300 (or Auto)
RULE 1
Aturan 1: Waspadai Jebakan "Double Domain"

Mayoritas registrar dan panel hosting otomatis menambahkan nama root domain Anda di belakang kolom Host/Name. Jika Anda menempelkan "token._domainkey.domainanda.com", server DNS akan menghasilkan "token._domainkey.domainanda.com.domainanda.com", sehingga verifikasi DKIM gagal total. Selalu masukkan hanya "token._domainkey" kecuali provider Anda secara eksplisit mewajibkan FQDN lengkap.

RULE 2
Aturan 2: Gunakan CNAME, Bukan TXT

Berbeda dengan DKIM manual konvensional yang memakai record TXT dengan public key statis (p=MIGf...), Amazon SES Easy DKIM menggunakan 3 record CNAME yang mengarah langsung ke token.dkim.amazonses.com. Jangan memilih tipe TXT.

RULE 3
Aturan 3: Mode Proksi & Cloudflare Grey Cloud

Jika nameserver Anda dikelola Cloudflare atau CDN proksi lainnya, pastikan ketiga record CNAME DKIM disetel ke DNS Only (Awan Abu-abu / Tanpa Proksi). Fitur proksi HTTP akan menutupi target CNAME dan menggagalkan verifikasi kriptografi email.

Perintah Cek DNS Terminal (CLI)
# Check resolution via dig (macOS / Linux):
dig CNAME <token1>._domainkey.yourdomain.com +short

# Check resolution via nslookup (Windows / PowerShell):
nslookup -type=CNAME <token1>._domainkey.yourdomain.com
Hostinger (hPanel DNS Zone)
hPanel DNS
Hostinger hPanel → Domain → Pilih Domain → DNS / Nameserver
Tipe Record Host / Nama (Name) Nilai / Target / Mengarah Ke TTL
CNAME <token>._domainkey (hPanel auto-appends .yourdomain.com) <token>.dkim.amazonses.com 300 (or 14400)
1

Masuk ke dashboard Hostinger hPanel dan buka menu Domain.

2

Pilih domain Anda dan klik menu DNS / Nameserver di bilah sisi kiri.

3

Pada bagian Kelola Catatan DNS, pilih CNAME pada dropdown Tipe.

4

Di kolom Nama, masukkan HANYA token._domainkey (hPanel otomatis menambahkan .domainanda.com di belakang).

5

Di kolom Target, masukkan token.dkim.amazonses.com dan biarkan TTL di 300 atau default (14400).

6

Klik Tambah Catatan. Ulangi proses yang sama untuk ketiga token dari MarbleSend.

Hostinger hPanel menampilkan nama domain Anda berbayang abu-abu di samping kotak input. Jangan menambahkan nama domain atau tanda titik lagi di kolom Nama.
DreamHost (DreamHost Web Panel)
DreamHost Web Panel
DreamHost Panel → Websites → Manage Websites → DNS Settings (atau Domains → Manage Domains → DNS)
Tipe Record Host / Nama (Name) Nilai / Target / Mengarah Ke TTL
CNAME <token>._domainkey (DreamHost appends .yourdomain.com) <token>.dkim.amazonses.com Default
1

Masuk ke DreamHost Web Panel dan navigasi ke Websites > Manage Websites.

2

Cari domain Anda, klik ikon opsi tiga titik atau DNS Settings (atau Domains > Manage Domains > DNS).

3

Gulir ke bawah ke bagian "Add a custom DNS record" lalu klik Add Record.

4

Di kolom Name, masukkan token._domainkey (DreamHost menampilkan akhiran .domainanda.com secara otomatis).

5

Pilih Type CNAME dan masukkan token.dkim.amazonses.com pada kolom Value.

6

Klik Save atau Add Record. Ulangi untuk ketiga token CNAME.

Pembaruan DNS DreamHost membutuhkan waktu sekitar 1–2 jam untuk tersinkronisasi penuh di seluruh kluster nameserver mereka.
Namecheap (Advanced DNS)
Advanced DNS
Namecheap Dashboard → Domain List → Manage → Tab Advanced DNS
Tipe Record Host / Nama (Name) Nilai / Target / Mengarah Ke TTL
CNAME Record <token>._domainkey (never paste root domain here) <token>.dkim.amazonses.com Automatic (or 1 min)
1

Masuk ke Namecheap, buka Domain List dari bilah sisi kiri, dan klik Manage di samping domain Anda.

2

Buka tab Advanced DNS di bagian atas halaman pengelolaan domain.

3

Pada bagian Host Records, klik tombol merah ADD NEW RECORD.

4

Pilih CNAME Record dari menu dropdown Type.

5

Di kolom Host, masukkan HANYA token._domainkey (jangan sertakan nama domain Anda).

6

Di kolom Target, masukkan token.dkim.amazonses.com, set TTL ke Automatic (atau 1 min), lalu klik ikon centang hijau ✓ untuk menyimpan. Ulangi untuk ketiga token.

Jika domain Anda menggunakan Custom DNS (mengarah ke nameserver lain), tab Advanced DNS akan nonaktif; tambahkan record ini di provider DNS aktif Anda.
Bluehost (Account Manager / Zone Editor)
Bluehost DNS
Bluehost Portal → Domains → DNS (atau cPanel → Zone Editor)
Tipe Record Host / Nama (Name) Nilai / Target / Mengarah Ke TTL
CNAME <token>._domainkey (Bluehost handles suffix automatically) <token>.dkim.amazonses.com 4 Hours (or Default)
1

Masuk ke Bluehost Account Manager, klik menu Domains di navigasi kiri, lalu pilih domain Anda.

2

Buka tab DNS (atau buka cPanel Zone Editor jika memakai paket hosting cPanel legacy).

3

Gulir ke bagian CNAME (Alias) dan klik Add Record.

4

Di kolom Host Record, masukkan token._domainkey.

5

Di kolom Points To, masukkan token.dkim.amazonses.com dan pilih TTL (4 Hours atau Default).

6

Klik Save. Ulangi untuk 2 token CNAME lainnya.

Bluehost secara otomatis mengelola akhiran domain di zona DNS. Jangan pernah mengetikkan nama root domain ke dalam kotak Host Record.
SiteGround (Site Tools DNS Zone Editor)
Site Tools DNS
SiteGround Client Area → Websites → Site Tools → Domain → DNS Zone Editor
Tipe Record Host / Nama (Name) Nilai / Target / Mengarah Ke TTL
CNAME <token>._domainkey (Site Tools appends .yourdomain.com) <token>.dkim.amazonses.com 1 hour (3600)
1

Masuk ke SiteGround Client Area, buka Websites, lalu klik Site Tools pada domain Anda.

2

Di menu samping kiri, klik Domain lalu pilih DNS Zone Editor.

3

Klik tab CNAME pada formulir Create New Record.

4

Di kolom Name, masukkan token._domainkey (Site Tools menampilkan .domainanda.com terkunci di sisi kanan).

5

Di kolom Resolves To, masukkan token.dkim.amazonses.com dan biarkan TTL pada default 1 jam (3600).

6

Klik Create. Ulangi untuk ketiga token.

Nameserver SiteGround memperbarui perubahan DNS dalam hitungan detik. Pastikan tidak ada record TXT lama yang berkonflik pada subdomain selector yang sama.
HostGator (cPanel Zone Editor)
cPanel Zone Editor
HostGator Portal → cPanel → Domains → Zone Editor
Tipe Record Host / Nama (Name) Nilai / Target / Mengarah Ke TTL
CNAME <token>._domainkey (cPanel automatically appends dot) <token>.dkim.amazonses.com 14400 (or 3600)
1

Masuk ke HostGator Customer Portal dan buka panel cPanel.

2

Pada bagian Domains, klik Zone Editor.

3

Cari domain Anda lalu klik tombol + CNAME Record (atau Manage > Add Record).

4

Di kolom Name, masukkan token._domainkey (cPanel akan otomatis melengkapinya dengan domain dan titik di akhir).

5

Di kolom CNAME / Record, masukkan token.dkim.amazonses.com.

6

Klik Add a CNAME Record. Ulangi untuk ketiga token.

Di cPanel Zone Editor, pastikan nama record di daftar tabel tercantum sebagai token._domainkey.domainanda.com. tanpa duplikasi berulang.
GoDaddy (Domain Portfolio DNS)
GoDaddy DNS
GoDaddy Account → My Products → Domains → DNS (atau Manage DNS)
Tipe Record Host / Nama (Name) Nilai / Target / Mengarah Ke TTL
CNAME <token>._domainkey (never include root domain in GoDaddy) <token>.dkim.amazonses.com 1/2 Hour (or Default)
1

Masuk ke akun GoDaddy Anda dan buka halaman My Products.

2

Pada daftar Domains, cari domain Anda lalu klik tombol DNS (atau ikon tiga titik > Manage DNS).

3

Pada bagian DNS Records, klik tombol Add New Record.

4

Pilih CNAME dari dropdown Type.

5

Di kolom Name, masukkan HANYA token._domainkey (jangan ketik .domainanda.com!).

6

Di kolom Value, masukkan token.dkim.amazonses.com, pilih TTL 1/2 Hour (atau Default), lalu klik Save. Ulangi untuk ketiga record.

GoDaddy otomatis menambahkan nama domain Anda. Memasukkan domain lengkap akan memicu error sintaks DNS atau menghasilkan record ganda yang tidak valid.
Verifikasi & Propagasi DNS

Setelah menyimpan ketiga record CNAME, propagasi DNS umumnya memakan waktu 5–30 menit (maksimal 24–48 jam tergantung TTL). Kembali ke Pengaturan > SMTP di MarbleSend, buka kartu domain pengirim kustom, lalu klik "Periksa DNS". Begitu divalidasi oleh Amazon SES, badge status akan otomatis berubah menjadi Terverifikasi.

6.2 Worker Background Heartbeat, Cron 1-Menit & Concurrency Guard

MarbleSend mengirim email di latar belakang. Cron job adalah pewaktu di panel hosting Anda yang membangunkan MarbleSend setiap menit supaya dapat menjalankan jadwal dan autoresponder, mengulang pengiriman yang gagal, mengumpulkan bounce, dan melanjutkan Campaign yang panjang. Campaign yang Anda kirim langsung dimulai, tetapi semua yang harus terjadi kemudian bergantung pada pewaktu ini. Jika Settings → Sistem menampilkan Cron Belum Terdeteksi, berarti pewaktu itu belum ada, tidak berjalan setiap menit, atau menunjuk ke tempat yang salah. Tiga langkah di bawah ini memperbaikinya.

Langkah 1: Salin baris cron Anda

Buka Settings → Sistem, cari Perintah Cron Job, lalu klik Salin Perintah. Baris itu sudah memuat folder yang benar dan, bila server Anda memberi tahu kami, PHP yang benar. Pakai persis seperti adanya; contoh di bagian bawah halaman ini hanya menunjukkan bentuk sebuah baris. Jika Settings menyatakan PHP tidak terdeteksi, tanyakan kepada penyedia hosting Anda jalur PHP command-line, lalu ganti kata php di awal baris.

Langkah 2: Tambahkan di panel hosting Anda

Pilih penyedia hosting Anda di bawah ini. Nama menu kadang berubah, jadi cari yang paling mirip. Di panel mana pun, job harus berjalan setiap menit (* * * * *) dan perintahnya adalah baris dari Langkah 1. Plesk, DirectAdmin, dan panel lain menyebutnya Scheduled Tasks atau Cron Jobs.

Hostinger (hPanel)
  1. Buka hPanel → Websites → Dashboard untuk situs Anda, lalu klik Cron Jobs di sidebar.
  2. Atur Type ke Custom. (Tipe PHP hanya menerima jalur sebuah file .php; baris Anda juga memuat perintah PHP.)
  3. Tempel baris dari Langkah 1 ke Command to run.
  4. Atur jadwal ke setiap menit, atau ketik * * * * *.
  5. Klik Save. Job muncul di List of Cron Jobs, tempat Anda juga dapat membaca keluaran terakhirnya.

Hostinger menjalankan cron job dalam UTC. Paket Single mengizinkan 2 cron job; paket Premium ke atas tanpa batas.

Namecheap

Buka cPanel dari akun hosting Namecheap Anda, lalu ikuti langkah berikut.

  1. Buka cPanel dan di bagian Advanced klik Cron Jobs.
  2. Di bawah Add New Cron Job, pilih Once Per Minute (* * * * *) pada Common Settings.
  3. Tempel baris dari Langkah 1 ke Command.
  4. Klik Add New Cron Job. Mulai sekarang job berjalan setiap menit.

Namecheap tidak mengizinkan cron job yang berjalan lebih sering dari setiap 5 menit, atau lebih dari 5 cron job, di server shared. Gunakan Web-Cron di bawah bila Anda butuh setiap menit.

Bluehost
  1. Masuk ke Bluehost Portal, klik Websites, lalu Manage Site untuk situs Anda.
  2. Buka tab Advanced, cari Cron Jobs dan klik Manage, lalu Add Cron.
  3. Pilih frekuensi di Common Settings (atau isi Minute, Hour, Day, Month, dan Weekday).
  4. Tempel baris dari Langkah 1 ke Command, lalu klik Add.

Dokumentasi Bluehost sendiri menyebut hosting shared hanya menjalankan cron job setiap 15 menit atau lebih jarang (satu halaman menyebut 5 menit). Gunakan Web-Cron di bawah bila Anda butuh setiap menit.

HostGator

Di Customer Portal buka Websites → Manage Site → Advanced, lalu di Cron Jobs klik Manage dan Add Cron. Formulirnya memiliki kolom yang sama dengan cPanel, jadi langkah di bawah berlaku. Atau buka cPanel → Advanced → Cron Jobs.

  1. Buka cPanel dan di bagian Advanced klik Cron Jobs.
  2. Di bawah Add New Cron Job, pilih Once Per Minute (* * * * *) pada Common Settings.
  3. Tempel baris dari Langkah 1 ke Command.
  4. Klik Add New Cron Job. Mulai sekarang job berjalan setiap menit.

Halaman bantuan HostGator tidak menyebut interval terpendek yang diizinkan di hosting shared. Jika setiap menit ditolak, gunakan Web-Cron di bawah.

GoDaddy

Di halaman produk GoDaddy Anda, di samping Linux Hosting klik Manage, lalu cPanel Admin, kemudian ikuti langkah berikut.

  1. Buka cPanel dan di bagian Advanced klik Cron Jobs.
  2. Di bawah Add New Cron Job, pilih Once Per Minute (* * * * *) pada Common Settings.
  3. Tempel baris dari Langkah 1 ke Command.
  4. Klik Add New Cron Job. Mulai sekarang job berjalan setiap menit.

Halaman bantuan GoDaddy tidak menyebut interval terpendek yang diizinkan. Jika setiap menit ditolak, gunakan Web-Cron di bawah.

DreamHost
  1. Buka panel DreamHost, masuk ke Cron Jobs dan klik Add New Cron Job.
  2. Pilih pengguna (pengguna SFTP atau shell yang sudah ada), beri job sebuah judul, dan alamat email untuk keluarannya (opsional).
  3. Tempel baris dari Langkah 1 ke Command. DreamHost menyimpan PHP di jalur seperti /usr/local/php83/bin/php (pakai versi PHP Anda).
  4. Atur waktunya dan aktifkan locking supaya dua proses tidak pernah tumpang tindih, lalu simpan.

Pada pengaturan waktu kustom, panel hanya mengizinkan memilih paling banyak 12 menit berbeda per jam, jadi jadwal teratur terpendek yang bisa dibuat adalah setiap 5 menit. Waktu memakai zona Pasifik. Gunakan Web-Cron di bawah bila Anda butuh setiap menit.

SiteGround
  1. Buka Site Tools → Devs → Cron Jobs.
  2. Pilih interval dari daftar (atau atur kolom menit, jam, hari, bulan, dan hari dalam minggu).
  3. Tempel baris dari Langkah 1 ke Command. Alamat email untuk keluaran bersifat opsional.
  4. Klik Create.

Dokumentasi SiteGround menampilkan preset seperti Twice Per Hour dan tidak menyebut interval terpendek. Jika paket Anda tidak punya pilihan setiap menit, gunakan Web-Cron di bawah.

Tidak punya akses cron, atau dibatasi penyedia hosting? Pakai Web-Cron
  1. Buka Settings → Sistem dan salin Web-Cron URL. Jaga kerahasiaannya: URL itu memuat token rahasia Anda.
  2. Buat akun gratis di layanan cron seperti cron-job.org.
  3. Buat sebuah job, tempel URL tersebut, dan atur agar berjalan setiap menit. Simpan dan aktifkan.
  4. Gunakan salah satu: Web-Cron atau cron job dari penyedia hosting Anda, tidak keduanya. Satu sudah cukup.
Langkah 3: Pastikan berjalan

Tunggu satu atau dua menit, lalu muat ulang Settings → Sistem. Badge harus menampilkan Aktif dan Detak Jantung Terakhir harus menunjukkan waktu dari satu menit terakhir. Kesehatan Situs di halaman yang sama harus menampilkan worker sebagai Lulus. Jika penyedia hosting Anda hanya mengizinkan job setiap 5 atau 15 menit, badge bisa berganti antara Aktif dan Cron Belum Terdeteksi, karena ia mengharapkan satu kali jalan dalam 5 menit terakhir; email tetap terkirim setiap kali worker berjalan.

Masih menampilkan Cron Belum Terdeteksi?
  • Perintah PHP salah. Tanyakan kepada penyedia hosting Anda jalur PHP command-line (misalnya /opt/alt/php83/usr/bin/php di Hostinger atau /usr/local/bin/php di banyak hosting cPanel) lalu ganti php di awal baris.
  • Hanya sebagian baris yang tertempel. Tempel seluruh baris, termasuk >/dev/null 2>&1 di akhir.
  • Folder salah. worker.php ada di folder yang memuat public, bukan di dalam public.
  • Untuk melihat galatnya, jalankan job sekali tanpa >/dev/null 2>&1 dan baca keluarannya. Worker yang bekerja mencetak baris seperti worker.php: processed=0.
  • Job itu untuk situs lain di akun yang sama. Periksa folder di dalam perintahnya.
  • Beri waktu hingga 5 menit setelah menyimpan sebelum memeriksa lagi.

Untuk pengguna teknis

Kompilasi email, resolusi query audiens, dispatch pengiriman, dan pemrosesan webhook berjalan asinkron melalui worker latar belakang 1-menit. MarbleSend menerapkan arsitektur dual-entrypoint (CLI worker.php atau HTTP cron.php) yang dilindungi oleh file lock non-blocking untuk mencegah eksekusi tumpang tindih di shared hosting.

Native CLI Crontab (Opsi A)
* * * * * php /home/USER/your-folder/worker.php >/dev/null 2>&1

Berjalan langsung dari shell sistem operasi (* * * * * php /path/to/worker.php >/dev/null 2>&1). Melewati batas timeout HTTP dan gateway sepenuhnya, menjadikannya pilihan ideal di cPanel, Plesk, dan DirectAdmin.

Fallback Web-Cron HTTP (Opsi B)
GET https://your-domain.com/cron.php?token=SECURE_TOKEN

Untuk lingkungan hosting tanpa akses crontab shell, memanggil GET /cron.php?token=SECURE_TOKEN melalui layanan pihak ketiga (mis. cron-job.org atau UptimeRobot) memicu pemrosesan antrean yang sama persis secara aman.

Concurrency Guard flock Non-Blocking

Worker mengunci file storage/worker.lock dengan flock(LOCK_EX | LOCK_NB) saat mulai. Jika proses sebelumnya masih memproses antrean besar, giliran berikutnya keluar dengan aman tanpa race condition atau kehabisan memori.

Klaim Antrean Atomik & Backoff

Mengklaim batch 50 item antrean secara atomik menggunakan query status terindeks. Pengiriman gagal memicu backoff eksponensial dengan counter percobaan hingga batas max_attempts sebelum dialihkan ke status gagal.

6.3 23 Bahasa Native, RTL Arab & Mesin Keamanan Admin

MarbleSend dirancang sebagai platform self-hosted internasional. Dilengkapi 23 kamus bahasa native terkurasi manusia, pembalikan tata letak Right-to-Left otomatis untuk bahasa Arab, kustomisasi tema tri-state persisten, dan perimeter keamanan single-tenant yang tangguh.

23 Bahasa Native Tanpa Dependensi

File bahasa di app/lang/*.php adalah array PHP murni yang dimuat ke memori dalam waktu sub-milidetik, tanpa membutuhkan biner server gettext atau dependensi API penerjemahan eksternal.

Mirroring Tata Letak RTL Dwiarah

Memilih bahasa Arab (ar) otomatis menginjeksi dir='rtl' ke root dokumen HTML, membalikkan bilah navigasi samping, kolom tabel, panel drawer, dan ikon chevron di seluruh UI.

Mesin Tema Tri-State Persisten

Memungkinkan perpindahan mulus antara Dark Palette, Light Palette, dan preferensi OS Sistem. Pilihan aktif disimpan di cookie (marblesend_theme) untuk menjamin nol layout shift saat halaman dimuat.

Keamanan Diperkuat Single-Admin

Kredensial admin yang disimpan di cm_settings.admin_user dienkripsi dengan bcrypt work factor 12. Melindungi dari fiksasi session melalui regenerasi session ID otomatis saat login.

6.3.1 Autentikasi Dua Faktor (TOTP) & Penyiapan Kode QR

Autentikasi dua faktor menambahkan kunci kedua pada akun admin: setelah kata sandi, MarbleSend meminta kode 6 digit yang berganti setiap 30 detik dan hanya bisa dibuat oleh ponsel Anda. Fitur ini opsional, aktif dalam sekitar satu menit, dan bekerja dengan aplikasi authenticator standar seperti Google Authenticator, Microsoft Authenticator, 1Password, Bitwarden, Authy, atau Aegis. Lokasinya: Settings → Bahasa & Akun → Autentikasi dua faktor (TOTP).

Cara kerjanya

MarbleSend memakai standar terbuka TOTP (RFC 6238: HMAC-SHA1, 6 digit, interval 30 detik). Saat diaktifkan, dibuat secret acak yang dibagikan sekali ke aplikasi Anda. Setelah itu, masuk memerlukan kata sandi lalu kode terbaru. Kode yang sudah dipakai tidak bisa dipakai ulang, dan langkah kedua kedaluwarsa setelah 5 menit.

Aktifkan langkah demi langkah

1) Buka Settings → Bahasa & Akun lalu tekan Aktifkan. 2) Di aplikasi authenticator, pilih “Pindai kode QR” dan pindai kotak yang tampil di layar. 3) Ketik kode 6 digit yang kini tampil di aplikasi lalu tekan “Konfirmasi dan aktifkan”. 4) Simpan delapan kode pemulihan yang hanya tampil sekali: salin ke pengelola kata sandi atau cetak.

Kode QR tetap di server Anda

Gambar QR digambar oleh instalasi Anda sendiri sebagai grafik vektor kecil; secret tidak pernah dikirim ke pembuat QR online atau pihak ketiga mana pun. Jika tidak bisa memindai (misalnya aplikasinya ada di ponsel yang sama), gunakan kunci penyiapan atau tautan otpauth di bawah kode QR. Secret disimpan terenkripsi (AES-256-GCM) dengan ENCRYPTION_KEY Anda, seperti kredensial lainnya.

Masuk dengan kode

Setelah kata sandi benar, Anda diminta kode 6 digit. Kode yang salah dibatasi lajunya per akun, sehingga menebak tidak praktis. Jika kode ditolak padahal sudah benar, pastikan tanggal dan jam ponsel diatur otomatis; jam yang salah menghasilkan kode yang salah.

Kode pemulihan

Delapan kode sekali pakai dibuat saat 2FA diaktifkan. Masing-masing berlaku sekali di kolom kode sebagai pengganti kode 6 digit. Kode disimpan hanya sebagai hash sehingga tidak bisa ditampilkan lagi; gunakan “Kode pemulihan baru” (memerlukan kode terbaru) untuk mengganti seluruh set, yang membuat kode lama tidak berlaku.

Ponsel hilang dan tanpa kode pemulihan

Tautan email untuk lupa kata sandi sengaja tidak melewati 2FA, jadi tidak membantu di sini. Di server, jalankan “php tools/reset-admin.php” (SSH atau terminal hosting Anda): perintah ini mereset kata sandi admin, menghapus lockout, mengakhiri semua sesi, dan mematikan 2FA, lalu Anda bisa mengaktifkannya lagi dengan perangkat baru. Untuk mematikannya secara normal, gunakan Nonaktifkan di kartu yang sama (kata sandi plus kode terbaru atau kode pemulihan).

6.3.2 Perlindungan Pendaftaran (Cloudflare Turnstile): Dapatkan Kunci Gratis Anda

Turnstile adalah alternatif CAPTCHA gratis dan ramah privasi dari Cloudflare. Bila aktif, halaman pendaftaran publik Anda (formulir /s/halaman-anda dan /subscribe) memeriksa bahwa pengunjung adalah manusia sebelum langganan diterima, sehingga bot tidak membanjiri daftar dan email konfirmasi Anda. Fitur ini bekerja di atas honeypot bawaan serta batas per-IP dan per-alamat, dan bersifat opsional, kecuali saat Anda mengirim lewat SES Relay (lihat catatan terakhir). Anda memerlukan dua key, yaitu Site key (publik) dan Secret key (privat), dari akun Cloudflare gratis milik Anda sendiri; domain Anda tidak harus memakai Cloudflare untuk DNS.

1 Buat atau masuk ke akun Cloudflare

Buka dash.cloudflare.com lalu daftar (gratis) atau masuk. Anda tidak perlu menambahkan website ke Cloudflare atau mengubah DNS untuk memakai Turnstile.

2 Buka Turnstile dan tambahkan widget

Di menu dashboard buka “Turnstile” (atau cari), lalu tekan “Add widget” (dashboard lama menulis “Add site”). Nama menu kadang berubah; cari Turnstile di bawah Application security.

3 Beri nama widget dan daftarkan hostname

Beri nama apa saja, misalnya “MarbleSend signup”. Di bagian Hostname tambahkan domain tempat MarbleSend berjalan, tanpa https:// atau path, misalnya app.domainanda.com. Jika halaman pendaftaran tampil di domain lain, tambahkan juga. Tambahkan localhost hanya saat menguji di komputer Anda.

4 Pilih mode widget

Pilih Managed (disarankan): sebagian besar pengunjung lolos tanpa teka-teki dan Cloudflare meminta satu klik cepat hanya jika kunjungan tampak mencurigakan. Non-interactive menampilkan bilah proses singkat tanpa klik, dan Invisible tidak menampilkan apa pun. Biarkan pre-clearance mati, lalu tekan Create.

5 Salin kedua kunci

Cloudflare menampilkan Site key (publik) dan Secret key (rahasia). Salin keduanya. Secret hanya dipakai server Anda untuk memverifikasi tiap pengunjung ke Cloudflare, jadi jangan tempel di tempat publik. Anda bisa melihat atau merotasinya nanti di pengaturan widget.

6 Tempel ke MarbleSend

Buka Settings → Bahasa & Akun → Perlindungan pendaftaran (Cloudflare Turnstile), tempel Site key dan Secret key, lalu tekan Simpan. Lencana berubah menjadi “Perlindungan AKTIF”. Untuk mematikannya nanti, kosongkan kedua kolom lalu simpan. Secret yang tersimpan dienkripsi dan tidak pernah ditampilkan lagi; biarkan kolom kosong untuk mempertahankannya.

7 Uji hasilnya

Buka salah satu halaman pendaftaran publik Anda di jendela pribadi browser: widget Turnstile muncul di atas tombol. Daftar dengan alamat uji dan Anda akan menerima email konfirmasi. Pengiriman yang belum lolos pemeriksaan akan ditolak.

Jika Cloudflare tidak terjangkau

Jika server Anda tidak dapat menjangkau layanan verifikasi Cloudflare (gangguan atau koneksi keluar diblokir), MarbleSend biasanya meloloskan pendaftaran dan mencatat kejadiannya agar pengunjung tidak terkunci; honeypot serta batas per-IP dan per-alamat tetap berlaku. Saat Anda mengirim lewat SES Relay, perilakunya sebaliknya dan bersifat fail closed: pendaftaran ditolak sampai Cloudflare dapat dijangkau lagi.

Kunci uji untuk pengembangan

Cloudflare menyediakan kunci tiruan untuk pengujian: Site key 1x00000000000000000000AA dengan Secret key 1x0000000000000000000000000000000AA selalu lolos. Kunci ini tidak pernah melindungi situs sungguhan, jadi ganti dengan kunci Anda sendiri sebelum go-live.

Pemecahan masalah

Widget tidak muncul: pastikan hostname halaman tercantum di widget Turnstile dan tidak ada ekstensi browser yang memblokir challenges.cloudflare.com. “Invalid site key”: Site key tersalin dengan spasi atau milik widget lain. Pengunjung asli ditolak: tempel ulang Secret key; harus berasal dari widget yang sama dengan Site key.

Wajib selama Anda memakai SES Relay

Jika Anda mengirim lewat Managed Amazon SES Relay, Turnstile wajib untuk formulir pendaftaran publik. Sebelum kedua key tersimpan, halaman pendaftaran menampilkan “pendaftaran sementara tidak tersedia” dan Settings → Bahasa & Akun menampilkan pemberitahuan dengan tombol yang membawa Anda ke kartu yang tepat. Dalam mode ini setiap pelanggan baru juga harus mengonfirmasi lewat email (double opt-in), meskipun halaman pendaftaran atau panggilan API meminta single opt-in.

6.4 Kunci REST API Berlingkup & Akses Programatik Developer

REST API memungkinkan website eksternal, landing page, aplikasi mobile, dan plugin resmi WordPress MarbleSend Forms berinteraksi dengan aman ke database kontak dan mesin broadcast Anda. Kunci API menggunakan prefix kriptografis, penyimpanan SHA-256 satu arah, dan pembatasan scope kapabilitas.

Generasi Token & Tampilan Write-Only

Kunci dibuat dengan prefix ms_ diikuti oleh 32 byte acak kriptografis aman via random_bytes(24). Kunci mentah hanya ditampilkan satu kali saat pembuatan dan tidak dapat diambil kembali.

Penyimpanan Hash SHA-256 Satu Arah

Hanya nilai hash SHA-256 (hash('sha256', $rawKey)) yang disimpan di cm_api_keys.key_hash. Sekalipun database dibaca langsung, token aktif tidak dapat didekripsi atau dipulihkan.

Scope Kapabilitas Granular

Batasi kunci pada kapabilitas tertentu: contacts:read, contacts:write, campaigns:read, campaigns:write, campaigns:send, schedules:read, dan schedules:write untuk prinsip hak akses terendah.

Autentikasi Bearer & Audit Log

Permintaan masuk diautentikasi melalui header Authorization: Bearer ms_... yang dievaluasi dengan hash_equals(). Telemetri mencatat stempel waktu last_used_at yang presisi pada setiap panggilan API yang berhasil.

6.5 Outbound Event Webhook & Pengiriman Kriptografis HMAC-SHA256

Event kontak (subscribed, confirmed, unsubscribed, suppressed) kini membawa array groups berisi {id, name} di samping tags.

Webhook menyediakan streaming event HTTP real-time ke endpoint eksternal, memungkinkan integrasi CRM, notifikasi Slack, atau automasi kustom merespons secara instan terhadap pendaftaran subscriber, pengiriman campaign, unsubscribe, dan hard bounce.

Langganan Event Siklus Hidup

Berlangganan pada trigger penting: contact.created, contact.unsubscribed, campaign.sent, campaign.bounced, dan link.clicked dengan pengaturan aktif/nonaktif per webhook.

Header Tanda Tangan HMAC-SHA256

Setiap request POST webhook menyertakan X-MarbleSend-Signature: sha256=... yang dibuat menggunakan hash_hmac('sha256', $payload, $secret), memungkinkan server penerima memverifikasi keaslian.

Mekanisme Circuit Breaker & Retry

Pengiriman webhook yang gagal (HTTP 5xx atau timeout koneksi) memicu retry backoff eksponensial. Endpoint dengan kegagalan beruntun dijeda otomatis untuk mencegah beban server.

Riwayat Audit Pengiriman & Test Ping

Tombol Test Webhook mengirimkan payload uji coba seketika. Drawer riwayat pengiriman menampilkan kode status respons HTTP, latensi eksekusi dalam milidetik, dan pesan error.

6.6 The 4-Pillar Deliverability Suite (SPF, DKIM, DMARC, BIMI)

Deliverability email menentukan apakah pesan Anda masuk ke inbox subscriber atau dialihkan ke folder spam. MarbleSend menyediakan mesin inspeksi DNS bawaan yang menjalankan empat kueri berurutan non-blocking langsung ke nameserver otoritatif tanpa dependensi API pihak ketiga.

1. SPF (Sender Policy Framework)

Mengkueri TXT record domain root untuk sintaks v=spf1. Memverifikasi host SMTP resmi, menandai batas lookup DNS (>10 lookup menyebabkan hardfail), dan memeriksa kualifikasi penegakan (~all atau -all).

2. DKIM (DomainKeys Identified Mail)

Memeriksa selector._domainkey.domain.com untuk memvalidasi kunci publik kriptografis RSA atau Ed25519. Memastikan header email keluar dapat diverifikasi secara kriptografis terhadap domain pengirim.

3. Kebijakan & Penyelarasan DMARC

Memeriksa _dmarc.domain.com untuk tag kebijakan (p=none, p=quarantine, atau p=reject). Di tahun 2026, persyaratan bulk sender Gmail dan Yahoo mewajibkan record DMARC aktif dengan pelaporan rua.

4. Avatar Brand BIMI & VMC

Mengkueri default._bimi.domain.com untuk file logo merek format SVG Tiny P.S. dan Verified Mark Certificate (VMC), menampilkan avatar brand terverifikasi langsung di inbox Gmail, Yahoo, dan Apple Mail.

6.7 Dual-Mode Mesin AI: BYOK Provider & MarbleSend AI Credits

MarbleSend menyediakan mesin AI dual-mode yang fleksibel untuk copywriting, rekomendasi subject, dan audit skor spam: (1) Bring Your Own Key (BYOK) untuk terhubung langsung ke penyedia LLM terkemuka tanpa markup perantara, dan (2) MarbleSend AI Credits untuk akses instan pay-as-you-go ke model terbaik pilihan tanpa repot membuat akun developer atau mengelola API key.

BYOK Mode 1: BYOK (Bring Your Own Key)

Terhubung langsung ke OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Moonshot, OpenRouter, atau instance Ollama privat. API key dienkripsi saat istirahat menggunakan AES-256-GCM. Permintaan mengalir langsung dari server Anda ke API penyedia tanpa biaya perantara atau markup tarif.

METERED Mode 2: MarbleSend AI Credits (Model Pilihan)

Kredit AI prabayar yang dikelola langsung melalui MarbleSend. Menghadirkan model pilihan berkinerja tinggi yang di-benchmark khusus untuk konversi email marketing dan deliverability. Server vendor mengelola routing dan pembaruan model optimal secara dinamis, memotong 1 kredit per generasi secara atomik.

DYNAMIC Harga Edge Dinamis & Checkout Instan

Harga add-on resmi diambil secara dinamis dari admin.marblesend.com. Beli paket isi ulang kredit via gateway pembayaran global dan lokal dengan aktivasi saldo real-time seketika.

PRIVACY Brankas Kunci AES-256-GCM & Privasi Data Ketat

Semua kredensial BYOK dienkripsi aman dengan AES-256-GCM berbasis hardware menggunakan APP_KEY unik instalasi Anda. Tidak ada konten prompt, daftar kontak, atau email penerima yang disimpan atau dicatat oleh server lisensi.

6.7.1 Pemilihan Model Default & Perutean Eksekusi

Menentukan bagaimana MarbleSend merutekan copywriting AI, saran subjek, dan audit deliverability di seluruh aplikasi. Anda dapat beralih antara relay kurasi vendor dan penyedia kustom BYOK langsung.

MarbleSend AI (Relay Terkelola)

Akses zero-configuration ke model kurasi unggulan yang diuji khusus untuk konversi email. Tanpa perlu akun developer eksternal atau kunci API.

BYOK (Bawa Kunci Sendiri)

Komunikasi langsung server-ke-vendor tanpa markup. Pilih penyedia terkonfigurasi dan pengenal model tertentu sebagai mesin generasi default Anda.

Pipeline Generasi Terpadu

Studio Template, Inspektur Skor Subjek AI, dan Asisten AI otomatis mengeksekusi terhadap pemilihan default aktif dengan penanganan error ramah saat kredit habis.

Persistensi Status Sistem

Pilihan aktif disimpan persisten di cm_settings.ai_provider_default, memastikan sinkronisasi eksekusi di seluruh sesi admin dan tugas worker.

6.7.2 Kredit AI MarbleSend & Hub Relay Terkelola

Kredit AI MarbleSend menyediakan infrastruktur bayar-sesuai-penggunaan instan untuk copywriting email tanpa pusing mengelola penagihan, kuota, atau rate limit pihak ketiga.

Alokasi Kredit Awal Gratis

Setiap lisensi yang teraktivasi menerima kredit AI awal gratis yang diambil secara dinamis dari license server, memungkinkan evaluasi instan fitur Asisten AI.

Ledger Atomik & Idempotensi

Generasi dipotong tepat 1 kredit per permintaan via cm_addon_ledger. UUID transaksi unik mencegah pemotongan ganda saat percobaan ulang koneksi.

Katalog Harga Edge Dinamis & Top-Up

Paket kredit (misal ai_100) dimuat secara dinamis dari katalog edge vendor. Pembayaran diproses dengan aman oleh penyedia pembayaran kami.

Saldo Real-Time & 1-Klik Sinkronisasi

Event webhook langsung mengkreditkan akun Anda setelah pembayaran selesai. Tombol refresh 1-klik manual menyediakan sinkronisasi instan dengan server.

6.7.3 Penyedia Terkonfigurasi & Infrastruktur BYOK

Hubungkan dan orkestrasikan beberapa penyedia LLM eksternal dengan penyimpanan kunci terenkripsi, protokol API ganda, dan diagnostik koneksi instan.

Registri Multi-Vendor

Pertahankan koneksi simultan ke OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Kimi/Moonshot, OpenRouter, atau instans privat Ollama.

Protokol Ganda & Base URL Kustom

Mendukung endpoint standar kompatibel OpenAI (/chat/completions) dan format pesan Anthropic (/v1/messages) dengan proxy Base URL kustom.

Brankas Kriptografi AES-256-GCM

Semua kunci API BYOK dienkripsi at-rest dengan akselerasi hardware AES-256-GCM. Kunci tidak pernah diekspos dalam respons HTML atau log sistem.

Diagnostik Pre-Flight Langsung

Tombol uji koneksi mengirimkan probe ringan untuk memverifikasi kredensial dan melaporkan latensi round-trip (ms) sebelum memasang model ke produksi.

Panduan Mendapatkan API Key dari Masing-Masing Provider

MarbleSend terhubung langsung ke server AI dari instalasi hosting Anda tanpa server perantara pihak ketiga. Berikut adalah tautan portal konsol resmi, panduan langkah pembuatan API key, serta direktori referensi model untuk setiap provider yang didukung:

OpenAI GPT-4o / o-series
Format: openai
Base URL: https://api.openai.com/v1
Steps: Masuk ke platform.openai.com → buka Dashboard → pilih menu "API keys" di sidebar kiri → klik "+ Create new secret key" → beri label "MarbleSend" → salin key rahasia Anda (diawali sk-...). Kunjungi platform.openai.com/docs/models untuk daftar ID model terbaru.
Anthropic Claude Claude 3.5 / 3.7 Sonnet
Format: anthropic
Base URL: https://api.anthropic.com/v1
Steps: Masuk ke console.anthropic.com → buka menu Settings → "API Keys" → klik "Create Key" → beri nama "MarbleSend" → salin key rahasia (diawali sk-ant-...). Kunjungi docs.anthropic.com/en/docs/about-claude/models untuk daftar ID model Claude terbaru.
Google Gemini Gemini 2.0 / 2.5 Flash
Format: gemini
Base URL: https://generativelanguage.googleapis.com/v1beta
Steps: Masuk dengan Akun Google di aistudio.google.com → klik tombol "Get API key" di navigasi → klik "Create API key" (pilih atau buat Google Cloud project baru) → salin key Anda (diawali AIzaSy...). Buka ai.google.dev/gemini-api/docs/models/gemini untuk katalog model Gemini terbaru.
DeepSeek DeepSeek-V3 / R1
Format: openai
Base URL: https://api.deepseek.com
Steps: Masuk ke platform.deepseek.com → klik menu "API keys" di sidebar → klik tombol "Create API key" → masukkan nama "MarbleSend" → salin key (diawali sk-...). Kunjungi api-docs.deepseek.com untuk melihat ID model aktif (seperti deepseek-chat dan deepseek-reasoner).
Kimi (Moonshot AI) Kimi k1.5 / Moonshot v1
Format: openai
Base URL: https://api.moonshot.cn/v1
Steps: Masuk ke platform.moonshot.cn → buka Console → pilih "API Key Management" (API Key 管理) → klik "Create" (新建) → salin token rahasia Anda. Buka platform.moonshot.cn/docs untuk melihat ID model Moonshot/Kimi (seperti kimi-k3 dan moonshot-v1-128k).
OpenRouter Aggregator (200+ Models)
Format: openai
Base URL: https://openrouter.ai/api/v1
Steps: Masuk ke openrouter.ai → buka menu Account → "Keys" → klik "Create Key" → atur batas kuota opsional → salin key Anda (diawali sk-or-v1-...). Jelajahi openrouter.ai/models untuk mengakses lebih dari 100 model AI unggulan dan open-source dalam satu gerbang endpoint.
Ollama & Local / Groq Local LLM / Ultra-Fast LPU
Format: openai
Base URL: http://localhost:11434/v1 / https://api.groq.com/openai/v1
Steps:
AI Lokal, Self-Hosted & Provider Alternatif (Ollama, Groq, Mistral, GLM)

Untuk AI lokal tanpa biaya token, instal Ollama (ollama.com), jalankan model pilihan Anda (misal: ollama run llama3.1), atur Base URL ke http://localhost:11434/v1, pilih format OpenAI, dan centang "No Auth". Untuk inferensi cloud super cepat, daftar di console.groq.com untuk membuat API key Groq gratis.

Panduan Konfigurasi di Halaman Settings ➔ AI Providers

Setelah memperoleh API key dan menentukan ID model yang ingin digunakan, lakukan pengaturan di MarbleSend dengan langkah-langkah mudah berikut:

1 1. Buka Menu Settings ➔ Tab AI Providers

Dari sidebar navigasi utama, klik menu Settings, lalu beralih ke tab "AI Providers" (dapat diakses langsung via URL /settings).

2 2. Manfaatkan Quick Add atau Tombol "+ Add Provider"

Klik salah satu preset Quick Add (OpenAI, DeepSeek, Gemini, Anthropic, OpenRouter, dll.) untuk pengisian otomatis, atau klik tombol "+ Add Provider" untuk konfigurasi kustom.

3 3. Verifikasi Format Protokol & Base URL

Pilih format protokol: "OpenAI format" (standar untuk OpenAI, DeepSeek, Gemini, Groq, Ollama) atau "Anthropic format" (khusus Anthropic Claude). Pastikan Base URL sesuai.

4 4. Tempel API Key dengan Enkripsi Aman

Tempelkan secret API key Anda pada kolom yang disediakan. MarbleSend menyimpan seluruh key dengan enkripsi kuat AES-256-GCM via Crypto.php tanpa eksposur plain-text di database.

5 5. Tentukan Model ID & Uji Koneksi (Test Connection)

Ketikkan Model ID yang ingin digunakan beserta batas context window, lalu klik tombol "Test Connection". MarbleSend akan menjalankan ping handshake otentikasi live sebelum disimpan.

6 6. Tetapkan Model Aktif Utama (Set Default)

Pada kartu "Default AI Model" di bagian atas, pilih provider dan model yang baru saja Anda simpan, lalu klik "Save Default". Model ini langsung aktif digunakan pada Templates Studio!

6.8 Mesin Token Hibah Lisensi Kriptografis Ed25519

MarbleSend memverifikasi keaslian produk menggunakan kriptografi asimetris Ed25519 via ekstensi native libsodium PHP. License Grant Token yang ditandatangani diterbitkan saat aktivasi awal dan divalidasi secara lokal tanpa kewajiban koneksi terus-menerus.

Verifikasi Tanda Tangan Ed25519

Memvalidasi tanda tangan digital dengan sodium_crypto_sign_verify_detached(). Modifikasi manual apa pun pada database langsung membatalkan tanda tangan matematis, menjamin integritas mutlak.

Pengikatan Domain & Tingkatan Lisensi

Token yang ditandatangani menyematkan hostname domain berlisensi, tingkatan lisensi (Regular atau Extended), dan hak akses aktif. Pemindahan multi-domain dapat dilakukan langsung dari antarmuka pengaturan.

Ketahanan Grace Period Offline 7 Hari

Gangguan jaringan sementara atau pemeliharaan server lisensi tidak akan pernah menghentikan broadcast email yang sedang berjalan atau eksekusi cron. MarbleSend menyediakan jendela grace period 7 hari sebelum membatasi pengiriman.

Kebijakan Soft-Lock

Jika lisensi kedaluwarsa, MarbleSend memberlakukan soft-lock yang ramah: data subscriber yang ada, campaign, laporan, dan alat ekspor tetap 100% dapat diakses, sementara peluncuran campaign baru dijeda.

Pemeriksaan pembaruan otomatis

Sehari sekali, worker menanyakan ke server lisensi apakah ada versi yang lebih baru. Yang dikirim hanya kode pembelian dan versi terpasang, persis seperti pemeriksaan manual, dan tidak ada yang lain. Matikan lewat “Pembaruan rilis” di tab ini: tidak ada pemeriksaan dan tidak ada banner pembaruan. Instalasi pengembangan (APP_ENV=local) tidak pernah melakukan panggilan ini. Tidak ada data kontak atau Campaigns Anda yang pernah dikirim.

Catatan perubahan dan email pembaruan

“Catatan Perubahan” (di sidebar, di atas Dokumentasi) mencantumkan setiap rilis beserta panduan upgrade-nya. Saat ada rilis yang lebih baru, Anda melihat banner di dashboard (pembaruan keamanan menampilkan banner merah di setiap halaman dan tidak bisa ditutup), titik di samping “Catatan Perubahan”, dan, jika diaktifkan, satu email per versi ke alamat admin melalui profil SMTP bawaan. Catatan rilis ditulis dalam bahasa Inggris.

Buku Panduan Pengurangan Tiket Dukungan

Tanya Jawab & Diagnostik Masalah Sering Terjadi

Solusi instan untuk masalah paling umum pada shared hosting.

7.1 Diagnostik Dashboard & Operasional

7.1.1 Mengapa Dashboard menampilkan status "Worker Not Detected" atau Tidak Aktif?

Penyebab Utama:

Crontab OS tidak berjalan, path PHP CLI keliru, atau file lock worker tertinggal mencegah eksekusi.

Diagnostik & Mekanisme:

Worker memperbarui cm_settings.worker_last_run dengan timestamp UTC setiap detak. Dashboard menandai tidak aktif jika selisih waktu > 180 detik.

Solusi Praktis & Playbook:

Buka Settings → System. Salin baris crontab yang tepat. Jika crontab CLI dibatasi, atur Web-Cron URL di cron-job.org setiap 1 menit. Jika lock macet, periksa storage/worker.lock.

7.1.2 Mengapa tingkat buka dan klik email berbeda antara kartu KPI Dashboard dan log provider SMTP eksternal?

Penyebab Utama:

Pra-pengambilan Apple Mail Privacy Protection (MPP), cache proxy, pemblokiran gambar penerima, atau adblocker yang menghapus parameter UTM.

Diagnostik & Mekanisme:

MarbleSend menyematkan tracking GIF transparan 1x1 pada email keluar untuk mencatat cm_email_logs.opened_at. Jika penerima memblokir gambar, pembukaan tidak tercatat; Apple MPP melakukan pra-pengambilan seketika pada server Apple.

Solusi Praktis & Playbook:

Jadikan Unique Clicks (CTR) sebagai indikator interaksi utama. MarbleSend merutekan semua tautan template melalui public/click.php untuk mencatat klik subscriber yang anti-manipulasi.

7.2 Diagnostik Pengiriman Campaign & Preflight

7.2.1 Mengapa broadcast campaign saya berhenti atau jeda di tengah pengiriman?

Penyebab Utama:

Batas waktu eksekusi web server atau PHP CLI shared hosting (max_execution_time 30s/60s) tercapai saat pengiriman volume besar.

Diagnostik & Mekanisme:

MarbleSend memproses antrean dalam batch atomik 50 penerima. Saat batas waktu mendekat, worker berhenti dengan tertib dan mencatat progres cm_email_queue untuk mencegah kehabisan memori.

Solusi Praktis & Playbook:

Tidak perlu tindakan manual! Detak cron menit berikutnya akan otomatis mengambil batch item pending berikutnya dari cm_email_queue tanpa duplikasi email.

7.2.2 Mengapa Pengecekan Keamanan Preflight 6-Poin Otomatis memblokir peluncuran campaign saya?

Penyebab Utama:

Token wajib {{unsubscribe_link}} hilang, subject line kosong/bermasalah, nol penerima aktif terpilih, atau syntax token tidak tertutup.

Diagnostik & Mekanisme:

Engine Preflight memeriksa 6 vektor kepatuhan dan deliverability kritis sebelum mengizinkan transisi status ke queued atau sending.

Solusi Praktis & Playbook:

Tinjau banner peringatan merah di modal preflight campaign. Masukkan {{unsubscribe_link}} (wajib menurut RFC 8058 dan CAN-SPAM) dan pastikan tag yang dipilih cocok dengan contacts aktif.

7.2.3 Kapan tombol "Resend to Non-openers" aktif, dan bagaimana cara mencegah kelelahan subscriber?

Penyebab Utama:

Tombol aksi di Laporan Campaign dinonaktifkan jika broadcast masih mengirim atau masa jeda aman belum berlalu.

Diagnostik & Mekanisme:

MarbleSend mewajibkan status campaign = completed dan menyarankan jeda setidaknya 24 hingga 48 jam agar subscriber di berbagai zona waktu sempat membaca.

Solusi Praktis & Playbook:

Setelah selesai, klik "Resend to Non-openers". Ini akan membuat child campaign baru yang hanya menargetkan contacts dengan opened_at IS NULL, memungkinkan pengujian subject alternatif.

7.3 Manajemen Contacts, Impor CSV & Bounce

7.3.1 Mengapa CSV Importer melewati baris atau gagal mengimpor record subscriber tertentu?

Penyebab Utama:

Syntax email tidak valid menurut RFC 5322, email duplikat saat "Skip Duplicates" aktif, encoding karakter non-UTF-8, atau contacts tersupresi.

Diagnostik & Mekanisme:

MarbleSend memeriksa setiap baris, memvalidasi syntax via filter_var(FILTER_VALIDATE_EMAIL), dan mencocokkan ke cm_contacts agar tidak menimpa status unsubscribed atau bounced.

Solusi Praktis & Playbook:

Pastikan file CSV disimpan dalam format UTF-8 tanpa BOM. Periksa pemetaan kolom (email, name, tags). Periksa modal ringkasan impor untuk nomor baris yang dilewati.

7.3.2 Bagaimana MarbleSend menangani Soft Bounce vs Hard Bounce?

Penyebab Utama:

Kegagalan pengiriman permanen (kode error SMTP 5xx: mailbox tidak ada) versus kegagalan sementara (kode error SMTP 4xx: mailbox penuh, pembatasan laju).

Diagnostik & Mekanisme:

Respons 5xx langsung meningkatkan status contacts menjadi bounced. Respons 4xx mencatat upaya soft bounce di cm_email_logs dan mencoba ulang hingga 3 kali sebelum status bounced ditetapkan.

Solusi Praktis & Playbook:

Jangan mencoba mengaktifkan kembali contacts yang hard-bounced. Tindakan tersebut akan merusak reputasi domain pengirim di penyedia mailbox utama seperti Gmail dan Yahoo.

7.4 Render Template, Outlook & Desain Email-Safe

7.4.1 Mengapa layout template email saya tampak rusak atau bergeser di Microsoft Outlook desktop?

Penyebab Utama:

Microsoft Outlook untuk Windows menggunakan engine rendering Microsoft Word (MSO) yang tidak mendukung CSS Flexbox, Grid, margin auto, atau tag layout HTML5.

Diagnostik & Mekanisme:

Word MSO hanya mematuhi layout berbasis tabel tradisional (nested <table>, <tr>, <td>) dengan lebar piksel eksplisit dan inline style.

Solusi Praktis & Playbook:

Gunakan 8 starter layout email-safe bawaan MarbleSend. Layout tersebut menggunakan nested table HTML dan komentar kondisional MSO (<!--[if mso]>) agar rendering sempurna di seluruh versi Outlook.

7.4.2 Mengapa Gmail menampilkan "[Message clipped] View entire message" di bagian bawah email saya?

Penyebab Utama:

Ukuran file HTML mentah email melebihi batas ketat 102 KB (104.448 byte) dari Gmail.

Diagnostik & Mekanisme:

Jika muatan HTML melebihi 102 KB, Gmail memotong pesan, memutus konten, serta menyembunyikan link unsubscribe di footer dan tracking pixel.

Solusi Praktis & Playbook:

Tempatkan gambar di server HTTPS eksternal alih-alih menyematkan string base64 inline. Hindari CSS berlebihan. Di Templates Studio, klik pemformat "Clean HTML" sebelum peluncuran.

7.4.3 Mengapa {{news_posts}} kosong atau hilang di email saya?

Penyebab Utama:

Placeholder hanya diisi oleh jadwal Newsletter dengan Sumber konten “Postingan berita”. Pada Campaign manual, jadwal RSS, atau jadwal template saja, ia diganti teks kosong.

Diagnostik & Mekanisme:

Pemeriksaan pra-kirim Campaign menampilkan peringatan ketika template memakai {{news_posts}} tanpa sumber postingan berita; pratinjau di Template → Postingan selalu menampilkan blok yang terisi.

Solusi Praktis & Playbook:

Kirim template lewat jadwal Newsletter yang diatur ke “Postingan berita”, atau hapus placeholder dari template yang dipakai di tempat lain.

7.5 Schedules, RSS Feed & Ritme Worker

7.5.1 Mengapa jadwal RSS otomatis saya tidak mengirim email saat artikel blog baru dipublikasikan?

Penyebab Utama:

URL feed tidak dapat dijangkau, syntax XML feed salah, atau GUID artikel terbaru cocok dengan cm_schedules.last_rss_item_id.

Diagnostik & Mekanisme:

MarbleSend menyimpan hash SHA-256 artikel terakhir di last_rss_item_id. Jika tidak ada <item> atau <entry> baru, worker melewati eksekusi tanpa membuat entri antrean.

Solusi Praktis & Playbook:

Buka jadwal di /schedules dan klik "Test Feed" untuk memeriksa respons live XML. Pastikan RSS menghasilkan tag <pubDate> valid dan <guid> unik. Pastikan next_run_at sudah jatuh tempo.

7.5.2 Apa yang terjadi pada jadwal berulang jika server atau cron worker offline selama beberapa hari?

Penyebab Utama:

Beberapa interval jadwal terlewat saat proses worker tidak dapat berjalan.

Diagnostik & Mekanisme:

MarbleSend menerapkan "Single Catch-Up Policy" yang ketat di SchedulerService. Alih-alih mengantrekan semua putaran yang terlewat (yang akan membanjiri inbox), worker hanya mengeksekusi 1 kejadian terbaru.

Solusi Praktis & Playbook:

Begitu cron aktif kembali, tepat 1 broadcast catch-up dikompilasi dan dikirim. Nilai next_run_at jadwal otomatis dimajukan ke jadwal masa depan berikutnya.

7.5.3 Mengapa postingan Siap saya tidak dikirim oleh jadwal Postingan berita?

Penyebab Utama:

Postingan menjadi Siap sebelum mode Postingan berita jadwal dinyalakan, sudah terkirim oleh jadwal ini, atau audiens/template memblokir eksekusi.

Diagnostik & Mekanisme:

Buka riwayat jadwal: “no new posts” berarti tidak ada yang memenuhi syarat, “no recipients” berarti audiens kosong, dan “failed” berarti template hilang atau tidak memuat {{news_posts}}.

Solusi Praktis & Playbook:

Tandai salinan postingan Siap setelah jadwal ada, perbaiki audiens atau template, lalu gunakan Jalankan sekarang.

7.5.4 Bisakah dua jadwal mengirim postingan yang sama?

Penyebab Utama:

Pengiriman dilacak per jadwal, bukan per postingan.

Diagnostik & Mekanisme:

Setiap jadwal Postingan berita menyimpan catatan sendiri tentang postingan yang telah dikirimnya, sehingga pustaka menampilkan total “Terkirim N×”.

Solusi Praktis & Playbook:

Ya — postingan yang Siap setelah kedua jadwal dibuat dikirim sekali oleh masing-masing; tidak ada jadwal yang mengirimnya dua kali.

7.6 Settings, Deliverability, Webhook & Lisensi

7.6.1 Bagaimana cara mendiagnosis error SMTP "535 Authentication Failed" atau "550 Relay Access Denied"?

Penyebab Utama:

Kredensial SMTP salah, ketidakcocokan port dan enkripsi (Port 587 STARTTLS vs Port 465 SSL), atau alamat email pengirim belum diverifikasi.

Diagnostik & Mekanisme:

Settings → SMTP menyediakan uji socket live yang menampilkan dialog mentah antara PHPMailer dan server SMTP Anda.

Solusi Praktis & Playbook:

Gunakan Port 587 dengan TLS untuk sebagian besar relay. Untuk Gmail/Google Workspace, buat App Password. Untuk Amazon SES, verifikasi domain pengirim. Untuk cPanel, gunakan alamat email lengkap sebagai username.

7.6.2 Mengapa Deliverability Suite melaporkan error validasi SPF, DKIM, atau DMARC?

Penyebab Utama:

Record DNS belum ditambahkan pada domain pengirim, melebihi batas 10 lookup pada SPF, atau prefix selector DKIM tidak cocok.

Diagnostik & Mekanisme:

MarbleSend menjalankan query DNS non-blocking (dns_get_record) langsung ke nameserver otoritatif untuk SPF (root TXT), DKIM (selector._domainkey), dan DMARC (_dmarc).

Solusi Praktis & Playbook:

Tambahkan mekanisme include relay SMTP ke SPF record Anda. Pastikan selector DKIM sesuai rekomendasi relay provider. Pastikan record DMARC menyertakan alamat pelaporan rua yang valid.

7.6.3 Bagaimana cara kerja Circuit Breaker Webhook, dan bagaimana cara mengaktifkan kembali endpoint yang dijeda?

Penyebab Utama:

Endpoint tujuan mengembalikan error HTTP 5xx berulang kali, connection timeout (>10 detik), atau respons 404 Not Found.

Diagnostik & Mekanisme:

Untuk mencegah penumpukan antrean server, MarbleSend melacak upaya delivery dan otomatis menjeda webhook (enabled = 0) setelah kegagalan beruntun berulang.

Solusi Praktis & Playbook:

Buka drawer Riwayat Delivery Webhook untuk memeriksa kode status HTTP dan pesan error. Setelah server penerima diperbaiki, klik "Test Webhook", verifikasi signature HMAC, dan aktifkan kembali.

7.6.4 Bagaimana cara kerja verifikasi Lisensi Ed25519, dan apa yang dimaksud dengan masa tenggang offline 7 hari?

Penyebab Utama:

Koneksi jaringan terputus, kegagalan resolusi DNS, atau downtime sementara pada server lisensi pusat.

Diagnostik & Mekanisme:

Keaslian lisensi diverifikasi secara lokal di memori menggunakan libsodium sodium_crypto_sign_verify_detached(). Mengubah record database secara manual akan merusak signature kriptografis.

Solusi Praktis & Playbook:

MarbleSend menyediakan masa tenggang offline 7 hari (grace_until). Broadcast aktif tetap berjalan normal. Jika kedaluwarsa, data contacts dan laporan tetap 100% dapat diakses di bawah kebijakan soft-lock.

Plugin WordPress & REST API

Integrasi WordPress & Formulir Pihak Ketiga

Kumpulkan pelanggan di situs WordPress lalu kirim ke MarbleSend. Plugin pendamping punya form berlangganan sendiri dan menghubungkan WPForms, Contact Form 7, Fluent Forms, Formidable Forms, dan Forminator.

Inspektur Integrasi Form

Pilih sebuah komponen untuk melihat hook-nya, data yang dikirim, dan tips pengaturannya.

Interactive Inspector
REST API

Jembatan REST API

Tanpa database bersama
WP-CRON

Antrean pengiriman

Penyimpanan transient
NATIVE

MarbleSend Form

Shortcode, Block & Widget
WPFORMS

Hook WPForms

wpforms_process_complete
CF7

Hook Contact Form 7

wpcf7_mail_sent
FLUENT

Hook Fluent Forms

submission_inserted
FORMIDABLE

Formidable Forms

frm_after_create_entry
FORMINATOR

Hook Forminator

submit_before_set_fields
AUTOMATION

Autoresponder tag

Tag dan email sambutan

Dampak Database:

Tips Tim Dukungan:

PRA-SYARAT WAJIB

Pasang plugin pendamping lebih dulu (marblesend-forms.zip)

MarbleSend berjalan di servernya sendiri, jadi WordPress memerlukan plugin kecil untuk mengirim pelanggan ke sana. Plugin ini menjalankan form MarbleSend bawaan dan menghubungkan WPForms, Contact Form 7, Fluent Forms, Formidable Forms, dan Forminator. Plugin ini gratis, memerlukan WordPress 6.3 atau lebih baru dan PHP 7.4 atau lebih baru, dan hanya berkomunikasi dengan MarbleSend lewat REST API.

Di mana menu Settings muncul?

Setelah plugin diaktifkan, WordPress menampilkan dua halaman di bawah Settings pada wp-admin: MarbleSend Forms (URL koneksi, API key, tag default, dan log kegagalan) dan MarbleSend Integrations (pemetaan field untuk tiap plugin form). Keduanya ada di WordPress. Dashboard MarbleSend tidak memilikinya. Form buatan Anda sendiri, beserta grup, tag, dan perlindungan spamnya, dikelola di menu MarbleSend Forms pada sidebar.

1
1. Unduh marblesend-forms.zip

Unduh marblesend-forms.zip dari Settings → Lisensi di MarbleSend, atau langsung dari https://marblesend.com/download/marblesend-forms.zip. Ini zip plugin WordPress yang siap dipasang: unggah apa adanya, tanpa mengekstraknya.

2
2. Pasang dan aktifkan di WordPress

Di wp-admin buka Plugins → Add New → Upload Plugin, pilih marblesend-forms.zip, klik Install Now, lalu Activate Plugin. Untuk memperbarui nanti, unggah zip yang lebih baru dengan cara yang sama. WordPress menawarkan untuk mengganti versi yang terpasang, dan pengaturan Anda tetap ada.

3
3. Hubungkan API key (contacts:write)

Di MarbleSend, buka Settings → API & Webhook dan buat API key dengan scope contacts:write. Di WordPress, buka Settings → MarbleSend Forms, isi MarbleSend Site URL dan key tersebut, simpan, lalu klik Test Connection. Hasilnya harus menampilkan Connected dengan scope contacts:write. Lalu pilih Default Group dan Default Tags dari daftar yang dimuat dari MarbleSend, atau buat grup baru di sana.

4
4. Petakan form Anda

Di wp-admin buka Settings → MarbleSend Integrations. Setiap plugin form yang aktif muncul beserta form-nya. Centang Enabled, isi field email dan, bila form punya, field nama, tambahkan tag bila perlu, lalu simpan. Form bawaan tidak perlu dipetakan.

Tanpa plugin ini, halaman MarbleSend Integrations tidak ada di wp-admin, dan form WordPress Anda tidak bisa mengirim kiriman ke MarbleSend.

8.1 Cara plugin berkomunikasi dengan MarbleSend

Plugin memanggil REST API MarbleSend lewat HTTPS, sehingga WordPress dan MarbleSend bisa berjalan di server berbeda. Plugin tidak punya akses ke database MarbleSend.

Tanpa database bersama

WordPress tidak pernah membaca tabel MarbleSend, dan MarbleSend tidak pernah membaca wp_posts atau wp_users. Keduanya bisa berjalan di host terpisah dengan database terpisah.

API key bercakupan terbatas

Setiap permintaan membawa API key Bearer dari Settings → API & Webhook. Scope contacts:write sudah cukup, sehingga key itu tidak bisa mengirim Campaign atau mengubah jadwal.

Uji koneksi

Test Connection di Settings → MarbleSend Forms memanggil GET /api/verify-key dan menampilkan scope key, sehingga URL atau key yang salah langsung terlihat.

Upsert dan penggabungan tag

Setiap kiriman masuk ke POST /api/contacts. Email baru menjadi kontak. Kontak yang sudah ada mempertahankan statusnya dan tag baru ditambahkan ke tag yang sudah ada; namanya berubah hanya bila form mengirim nama. Dengan double opt-in aktif, kontak baru berstatus pending sampai mengonfirmasi.

API Ingestion Endpoint (cURL Example)
curl -X POST https://your-domain.com/api/contacts \
  -H "Authorization: Bearer ms_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{"email":"visitor@example.com","name":"John Doe","tags":["newsletter","source:wpforms"]}'

Opsional: tambahkan "group_ids":[1,2] untuk memasukkan kontak ke grup tertentu (daftar grup lewat GET /api/groups; jika tidak ada = General). GET /api/contacts menerima group_id untuk memfilter berdasarkan grup.

8.2 Antrean pengiriman dan WP-Cron

MarbleSend yang lambat atau tidak terjangkau tidak boleh membuat form pengunjung macet atau kehilangan lead. Kiriman dari plugin form diantrekan dan dikirim di latar belakang.

Tidak ada yang lambat di permintaan pengunjung

Saat plugin form mengirim, MarbleSend_Integration_Base::dispatch() membersihkan field dan menyimpannya di transient WordPress (set_transient). Tidak ada permintaan ke MarbleSend selama pengunjung menunggu.

WP-Cron mengirim antrean

Satu event WP-Cron, marblesend_forms_process_queue, dijadwalkan sekitar satu menit kemudian dan mengirim kiriman yang antre.

Satu percobaan per item antrean

WP-Cron mengirim tiap item antrean satu kali. Form bawaan memanggil MarbleSend secara langsung lebih dulu dan memasukkan kiriman ke antrean untuk satu percobaan WP-Cron hanya bila panggilan itu gagal. Item antrean disimpan paling lama satu jam.

Kegagalan dicatat

Bila pengiriman gagal, atau item kedaluwarsa sebelum WP-Cron sempat mengirimnya, plugin menambahkan satu baris ke marblesend_forms_log (50 record terakhir disimpan) dan menampilkan pemberitahuan admin di wp-admin. Settings → MarbleSend Forms menampilkan log dan jumlah item yang menunggu.

Transient Queue Enqueuing Snippet
// Non-blocking submission buffer in WordPress
set_transient('marblesend_forms_queue_' . wp_generate_uuid4(), $payload, 3600);
if (!wp_next_scheduled('marblesend_forms_process_queue')) {
    wp_schedule_single_event(time() + 5, 'marblesend_forms_process_queue');
}

8.3 Form berlangganan bawaan

Plugin menyertakan form berlangganan, sehingga Anda tidak memerlukan form builder. Pasang dengan shortcode, blok Gutenberg, atau widget. Ketiganya menjalankan kode yang sama.

Shortcode, blok, atau widget

Gunakan [marblesend_form], blok Gutenberg marblesend/subscribe-form, atau widget MarbleSend Subscribe Form. Shortcode menerima tags, show_name (1 atau 0), dan consent (teks kotak centang wajib). Blok dan widget menawarkan opsi yang sama. Buat form Anda sendiri di MarbleSend Forms → Add New Form dan pasang dengan [marblesend_form id="12"].

Perlindungan dari bot

Field honeypot di luar layar (marblesend_hp), nonce yang diminta saat form dikirim sehingga halaman yang di-cache tidak pernah menyajikan nonce kedaluwarsa, dan batas 5 kiriman per 60 detik per IP (disimpan ter-hash). Permintaan yang mengisi honeypot atau tidak memiliki nonce valid mendapat pesan sukses yang tampak normal lalu dibuang. Permintaan yang terlalu banyak mendapat pesan singkat "harap tunggu". Form yang dibuat di editor juga bisa memakai Cloudflare Turnstile atau Google reCAPTCHA, diatur di Settings → MarbleSend Forms.

Dikirim saat pengunjung menekan kirim

Halaman tidak dimuat ulang. Plugin langsung mengirim kontak ke MarbleSend (batas waktu 5 detik). Bila MarbleSend tidak terjangkau, atau plugin belum dikonfigurasi, kiriman masuk antrean untuk satu percobaan WP-Cron dan pengunjung tetap melihat pesan sukses. Bila permintaannya sendiri gagal, form menampilkan galat dan bisa dikirim lagi.

Nama, tag, dan konfirmasi

Bila pengunjung hanya mengisi email, kontak baru diberi nama dari bagian sebelum @, karena API memerlukan nama. Kontak yang sudah ada mempertahankan namanya. Setiap kontak mendapat tag source:wp-form ditambah tag dari form dan dari Settings → MarbleSend Forms. Dengan double opt-in aktif, pengunjung melihat pesan yang memintanya memeriksa email. Kontak masuk ke grup milik form, atau ke Default Group dari Settings → MarbleSend Forms.

Shortcode & Gutenberg Block Embed Syntax

[marblesend_form tags="newsletter,inbound" show_name="1" consent="I agree to receive email updates and accept the privacy policy."]




8.4 WPForms (Lite & Pro)

WPForms adalah salah satu form builder yang paling banyak dipakai. Plugin membaca kiriman setelah WPForms memvalidasinya, jadi Anda tidak memerlukan add-on WPForms.

Deteksi dan hook

Plugin mendeteksi WPForms dengan function_exists('wpforms') dan mendengarkan aksi wpforms_process_complete (prioritas 10), yang menerima field yang sudah tervalidasi.

ID field

WPForms mengenali field lewat nomor. Pilih sebuah field di builder dan baca ID-nya di bagian atas opsi field, misalnya Field ID #2. Masukkan angka itu ke pemetaan. Field nama yang berisi nama depan dan belakang digabung menjadi satu nama.

Pengaturan

1. Catat ID field Email dan, bila ada, field Nama. 2. Buka Settings → MarbleSend Integrations dan temukan WPForms. 3. Centang Enabled, isi ID dan tag bila perlu. 4. Simpan.

Tag sumber

Setiap kontak dari WPForms mendapat tag source:wpforms di samping tag Anda sendiri, sehingga Anda bisa mengirim Campaign hanya ke kelompok itu.

WPForms Complete Hook Architecture
add_action('wpforms_process_complete', function($fields, $entry, $form_data, $entry_id) {
    $email = $fields[1]['value'] ?? ''; // Numeric Field ID #1
    $name  = $fields[0]['value'] ?? ''; // Numeric Field ID #0
    MarbleSend_Integration_Base::dispatch('wpforms', $form_data['id'], $email, $name);
}, 10, 4);

8.5 Contact Form 7 (CF7)

Contact Form 7 mendefinisikan field sebagai tag dalam templat teks. Plugin terpasang setelah email form terkirim.

Deteksi dan hook

Plugin mendeteksi CF7 dengan class_exists('WPCF7_ContactForm') dan mendengarkan wpcf7_mail_sent (prioritas 10). Lead hanya diteruskan setelah form lolos pemeriksaan spam dan validasi dan Contact Form 7 mengirim emailnya sendiri. Bila pengiriman email gagal di hosting Anda, tidak ada yang diteruskan.

Nama tag

CF7 memberi nama field di tag form, misalnya [email* your-email] dan [text your-name]. Masukkan namanya (your-email, your-name) ke kotak Email Field dan Name Field.

Membaca kiriman

Plugin membaca data kiriman dengan WPCF7_Submission::get_instance()->get_posted_data(), yang bekerja dengan pengiriman AJAX CF7.

Pengaturan

1. Di Contact → Contact Forms buka form dan catat nama tag. 2. Di Settings → MarbleSend Integrations temukan Contact Form 7. 3. Centang Enabled, isi your-email dan, bila form punya, your-name, lalu tambahkan tag bila perlu. 4. Simpan.

Contact Form 7 Mail Sent Hook
add_action('wpcf7_mail_sent', function($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    $data = $submission ? $submission->get_posted_data() : [];
    $email = $data['your-email'] ?? '';
    $name  = $data['your-name'] ?? '';
    MarbleSend_Integration_Base::dispatch('cf7', $contact_form->id(), $email, $name);
}, 10, 1);

8.6 Fluent Forms (Free & Pro)

Plugin mendengarkan aksi yang dijalankan Fluent Forms setelah menyimpan entri.

Deteksi dan hook

Plugin mendeteksi Fluent Forms dengan function_exists('wpFluent') dan mendengarkan fluentform/submission_inserted (prioritas 10), yang menerima $entry_id, $form_data, dan $form.

Name Attribute

Fluent Forms mengenali field lewat Name Attribute-nya, misalnya email untuk Email dan names untuk field Nama (nama depan dan belakang digabung). Temukan di pengaturan field pada Advanced Options.

Daftar form

Halaman Integrations menampilkan daftar form Anda dengan membaca tabel form milik Fluent Forms, sehingga Anda tidak perlu mencari ID form.

Pengaturan

1. Periksa Name Attribute field email dan nama. 2. Di Settings → MarbleSend Integrations, centang Enabled untuk form dan isi keduanya. 3. Tambahkan tag lalu simpan. Kontak baru mendapat tag source:fluentforms.

Fluent Forms Insertion Action
add_action('fluentform/submission_inserted', function($entryId, $formData, $form) {
    $email = $formData['email'] ?? '';
    $name  = is_array($formData['names'] ?? null) ? implode(' ', $formData['names']) : ($formData['first_name'] ?? '');
    MarbleSend_Integration_Base::dispatch('fluentforms', $form->id, $email, $name);
}, 10, 3);

8.7 Formidable Forms (Lite & Pro)

Plugin membaca entri tepat setelah Formidable Forms menyimpannya.

Deteksi dan hook

Plugin mendeteksi Formidable dengan class_exists('FrmForm') dan mendengarkan frm_after_create_entry (prioritas 30), yang menerima $entry_id dan $form_id.

Field ID

Formidable memberi setiap field sebuah Field ID numerik (mis. 12). Masukkan ke pemetaan; field key tidak didukung. Data diambil lewat FrmEntry::getOne($entry_id)->metas.

Hanya entri yang tersimpan

Plugin berjalan setelah entri dibuat, sehingga hanya kiriman yang lolos validasi Formidable yang diteruskan.

Langkah Pengaturan Bertahap

1. Di builder Formidable, klik field email dan catat Field ID-nya. 2. Di Settings → MarbleSend Integrations, aktifkan form dan masukkan Field ID. 3. Simpan pemetaan. Lead yang masuk mendapat tag source:formidable.

Formidable Metas Extraction Hook
add_action('frm_after_create_entry', function($entryId, $formId) {
    $entry = FrmEntry::getOne($entryId, true);
    $email = $entry->metas[12] ?? $entry->metas['email-address'] ?? '';
    $name  = $entry->metas[11] ?? $entry->metas['full-name'] ?? '';
    MarbleSend_Integration_Base::dispatch('formidable', $formId, $email, $name);
}, 30, 2);

8.8 Forminator (Free & Pro)

Plugin mendengarkan hook yang dijalankan Forminator saat memproses kiriman.

Deteksi dan hook

Plugin mendeteksi Forminator dengan class_exists('Forminator_API') dan mendengarkan forminator_custom_form_submit_before_set_fields (prioritas 10), yang menerima $entry, $form_id, dan $field_data.

Element ID

Forminator memberi setiap field sebuah element ID seperti email-1, name-1, atau text-1. Masukkan ID ini ke pemetaan. Editor form menampilkannya.

Daftar form

Halaman Integrations menampilkan form Forminator Anda berikut namanya, dibaca dengan Forminator_API::get_forms().

Pengaturan

1. Buka Forminator dan catat element ID (email-1, name-1). 2. Di Settings → MarbleSend Integrations, temukan Forminator dan isi ID tersebut. 3. Tambahkan tag lalu simpan. 4. Kirim uji coba dan pastikan kontak memiliki tag source:forminator.

Forminator Submission Pre-Field Hook
add_action('forminator_custom_form_submit_before_set_fields', function($formId, $response, $fieldData) {
    $fields = array_column($fieldData, 'value', 'name');
    $email  = $fields['email-1'] ?? '';
    $name   = $fields['name-1'] ?? '';
    MarbleSend_Integration_Base::dispatch('forminator', $formId, $email, $name);
}, 10, 3);

8.9 Tag, segmen, dan autoresponder

Kontak dari plugin WordPress masuk ke grup yang dipilih di Settings → MarbleSend Forms (Default Group) atau di form, dan masuk ke General bila tidak ada yang dipilih. Gunakan tag untuk segmentasi, atau pindahkan ke grup dari Contacts.

Menangkap email hanyalah langkah pertama. Tag menentukan apa yang terjadi pada kontak berikutnya.

Tag sumber

Selain tag Anda sendiri, setiap kontak mendapat source:<slug>: source:wp-form, source:wpforms, source:cf7, source:fluentforms, source:formidable, atau source:forminator. Pakai tag ini untuk mengirim Campaign ke pelanggan satu plugin form.

Email sambutan

Di /contacts → Autoresponders, buat aturan untuk tag yang Anda berikan ke form WordPress. Saat kontak menjadi aktif (langsung setelah mengirim, atau setelah mengonfirmasi double opt-in), MarbleSend mengantrekan email sambutan dengan templat dan profil SMTP pilihan Anda.

Tanpa layanan otomasi di tengah

Plugin mengirim lead langsung ke instalasi MarbleSend Anda sendiri. Layanan seperti Zapier atau Make tidak ada di jalurnya.

Double opt-in dan consent record

Dengan double opt-in aktif, kontak baru disimpan berstatus pending dengan consent_source = 'api'. MarbleSend mengirim tautan konfirmasi lewat email ({{confirm_link}}). Saat kontak mengklik tautan itu, status berubah menjadi active dan waktu serta alamat IP dicatat untuk GDPR.

Autoresponder Tag Structure (JSON Payload)
{
  "email": "lead@agency.com",
  "name": "Jane Smith",
  "tags": ["source:wpforms", "ebook-download", "vip-inbound"],
  "consent_source": "api"
}

8.10 Pemecahan masalah

Masalah umum saat menghubungkan form WordPress, lengkap dengan penyebab, cara memeriksa, dan cara memperbaikinya.

Mengapa kiriman terlambat muncul, atau tidak muncul sama sekali, di MarbleSend?

Penyebab Utama:

WP-Cron hanya berjalan saat ada yang mengunjungi situs. Di situs sepi atau staging, kiriman yang antre menunggu kunjungan berikutnya. Kiriman yang antre disimpan satu jam. Bila WP-Cron tidak berjalan dalam waktu itu, kiriman hilang dan marblesend_forms_log mencatat bahwa satu kiriman kedaluwarsa (log tidak bisa menyebut pengunjungnya, karena data tersimpannya ikut kedaluwarsa).

Diagnostik & Mekanisme:

Buka Settings → MarbleSend Forms di wp-admin. Jumlah pending menunjukkan item yang menunggu marblesend_forms_process_queue. Entri log yang menyebut kiriman antre kedaluwarsa berarti WP-Cron tidak berjalan lebih dari satu jam.

Solusi Praktis & Playbook:

Buka https://your-site.com/wp-cron.php?doing_wp_cron untuk menjalankannya sekali, atau siapkan cron job server yang sebenarnya (* * * * * wget -q -O - https://your-site.com/wp-cron.php >/dev/null 2>&1).

Mengapa log menulis "Skipped: no valid email in form submission"?

Penyebab Utama:

Ada salah ketik pada field email di pemetaan, atau pengunjung mengirim alamat kosong atau tidak valid yang ditolak sanitize_email().

Diagnostik & Mekanisme:

MarbleSend_Integration_Base::log_skip() menulis entri ke marblesend_forms_log setiap kali form yang aktif tidak menghasilkan email valid.

Solusi Praktis & Playbook:

Periksa pengenal yang dipakai form builder Anda: angka untuk WPForms (misalnya 2) dan Formidable Forms, nama tag untuk Contact Form 7 (your-email), Name Attribute untuk Fluent Forms (email), dan element ID untuk Forminator (email-1).

Mengapa WordPress melaporkan API key tidak valid atau scope kurang?

Penyebab Utama:

Key di WordPress sudah dicabut, kedaluwarsa, dihapus di MarbleSend, atau dibuat tanpa scope contacts:write.

Diagnostik & Mekanisme:

Test Connection memanggil GET /api/verify-key. Jawaban HTTP 401 atau 403 berarti autentikasi gagal.

Solusi Praktis & Playbook:

Di MarbleSend buka Settings → API & Webhook dan buat key baru dengan scope contacts:write (atau admin). Salin token yang diawali ms_ ke Settings → MarbleSend Forms di WordPress.

Mengapa lead Contact Form 7 hilang saat form menampilkan galat?

Penyebab Utama:

Plugin hanya meneruskan lead setelah Contact Form 7 mengirim emailnya sendiri. Bila email gagal, CF7 menampilkan pesan galatnya dan lead tidak diteruskan.

Diagnostik & Mekanisme:

Kirim form itu sendiri. Bila Anda melihat "There was an error trying to send your message", CF7 tidak bisa mengirim emailnya.

Solusi Praktis & Playbook:

Perbaiki pengiriman email di situs WordPress Anda, misalnya dengan plugin SMTP. Begitu CF7 bisa mengirim emailnya, lead sampai ke MarbleSend.

Mengapa sebuah kontak dinamai dengan alamat emailnya?

Penyebab Utama:

Form tidak punya field nama, atau tidak ada field nama yang dipetakan. API MarbleSend memerlukan nama, sehingga kontak baru mendapat bagian email sebelum @.

Diagnostik & Mekanisme:

Lihat baris form di Settings → MarbleSend Integrations: kotak Name Field kosong. Kontak yang sudah ada tidak terpengaruh, karena ia mempertahankan namanya.

Solusi Praktis & Playbook:

Tambahkan field nama ke form dan isi di pemetaan. Kontak yang sudah ada mempertahankan nama saat ini; ubah di /contacts bila perlu.