Dokumentasi & Ensiklopedia Sistem
Panduan teknis komprehensif, direktori elemen UI, dan manual optimasi shared-hosting untuk MarbleSend.
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.
Bebas SQL Injection
Setiap kueri database menggunakan prepared statements ketat tanpa beban ORM.
Enkripsi Saat Diam
Kredensial SMTP, kunci API AI, dan secret webhook dienkripsi via Crypto.php.
Tanpa Pengiriman Ganda
Worker mengklaim batch antrean secara atomik lewat pembaruan status MySQL dengan penanganan batas waktu ketat.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 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 & 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.
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 backendTotal Terkirim
Agregasi log & Penghitung bulananDibuka / Open Rate
Piksel pelacak 1x1 & Catatan Apple MPPDiklik / CTR
Injektor redirect klikAudiens Berhenti Langganan
Tingkat berhenti langganan & kepatuhan RFCDetak Jantung Worker
Status cron & Interval 1 menitGrafik Pertumbuhan Volume
Skala 7h, 30h, 90h, YTDTabel Siaran Terbaru
Siklus status & jejak auditKesehatan Deliverabilitas
Kesiapan profil SMTP1.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.
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).
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.
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.
status = 'completed'
status = 'sending'
status = 'failed'
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.
Menampilkan subjek campaign, tanggal pembuatan, dan tag asal (manual, recurring, rss, atau resend_unopened).
Jumlah pesan terkirim vs gagal, disertai persentase open rate dan click rate langsung.
Pintasan langsung ke Laporan Campaign untuk log aktivitas per penerima dan modal Kirim Ulang ke Belum Buka.
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.
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 operasionalMonitor Pengiriman Live
Statistik & event real-timePemilih Penerima
Filter tag & pilih semuaEditor Tiga Tampilan
Kode, split & pratinjauEngine Pemeriksaan Preflight
Inspeksi otomatis 6 titikDiagnostik Uji Kirim
Sampel live tanpa antreanPenulis Ulang UTM & Link
Parameter UTM & pelacakan 302Riwayat Siaran
Filter status & asalLaporan Detail Pasca-Kirim
CTR, MPP & auto-resend2.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
Mengirim74% selesai
7,420 / 10,000 email
Dalam Antrean
2,528
Sedang Dikirim
40
Berhasil
7,420
Gagal
12
Aktivitas Terbaru Status real-time
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.
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.
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.
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.
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:
4 Metrik Kinerja Bento
Melacak volume Terkirim (100%), Kegagalan pengiriman, Pembukaan unik dengan rasio buka, dan Klik unik dengan CTR.
Kurva Keterlibatan Per Jam
Menampilkan kluster pembukaan per jam selama 72 jam pertama untuk menemukan jendela waktu pengiriman optimal bagi pelanggan.
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.
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 operasionalState Machine 4-Status
active/pending/unsub/suppEngine Pencarian & Filter
Tag, status & debounceDrawer Audit & Izin
IP, timestamp & bounceImporter CSV RFC 4180
50rb baris & proteksi dedupHalaman Pendaftaran Mandiri
Double opt-in & funnelsAutoresponder Tag
Aturan drip berbasis eventHub Manajemen Massal
Segmentasi lintas halamanPrivasi GDPR & Penghapusan
Ekspor JSON & hapus permanen3.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'.
Pelanggan Aktif
Opt-in terkonfirmasi, email valid. Berhak menerima campaign, jadwal, dan autoresponder.
Menunggu Konfirmasi Double Opt-In
Mendaftar lewat formulir double opt-in, menanti klik pada email konfirmasi. Dikecualikan dari broadcast sebelum konfirmasi.
Berhenti Berlangganan
Mengklik tautan berhenti langganan. Tidak akan pernah dikirimi email lagi. Tidak dapat diaktifkan kembali tanpa opt-in baru yang sah.
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.
Perbarui nama, metadata khusus, dan tag langsung di tempat tanpa memuat ulang halaman.
Segera alihkan kontak ke status suppressed untuk mendiskualifikasi mereka dari seluruh antrean.
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.
Memantau jumlah impresi agregat dari seluruh corong pendaftaran yang aktif.
Menghitung rasio pengiriman terhadap tayangan di seluruh formulir pendaftaran prospek.
Menampilkan jumlah halaman arahan aktif berbanding kapasitas operasional 20 halaman.
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.
Menghasilkan token konfirmasi bertanda tangan HMAC dengan pengiriman email konfirmasi otomatis.
Menyematkan tag pelanggan tertentu saat mendaftar untuk memicu urutan drip terarah.
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.
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 operasionalLibrary Template
Pencarian instan & kunci slugLayout Starter
8 layout email berbasis tabelEditor Kode Mentah
Indentasi Tab & pembersihViewport Terisolasi
Bingkai desktop & ponselPalet Token Dinamis
Injeksi placeholder 1-klikPengirim Email Uji
Modal verifikasi SMTP langsungLaci AI Copywriter
Buat & sempurnakan templatePeninjau Subjek
Skor 1–100 & audit spamPostingan Berita
Artikel Markdown untuk newsletter4.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:
Kanvas bersih dengan footer berhenti langganan wajib.
Banner hero, proposisi nilai, dan tombol CTA tegas.
Editorial terkurasi, sorotan artikel 2 kolom.
Pita header plus blok {{news_posts}} untuk jadwal Postingan berita.
Sambutan personal, 3 langkah memulai cepat.
Lencana tanggal/waktu, profil pembicara, tombol RSVP.
Daftar artikel bernomor, estimasi waktu baca, tag penulis.
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.
Nama lengkap penerima (kembali ke "there" jika kosong)
Alamat email penerima
Tautan berhenti berlangganan 1-klik wajib RFC 8058
URL konfirmasi double opt-in untuk halaman pendaftaran
Loop postingan blog tersindikasi untuk newsletter RSS otomatis
Judul feed konten RSS/Atom yang tersindikasi
Judul artikel blog yang paling baru dipublikasikan
Jumlah postingan feed baru yang disertakan dalam newsletter
Blok Postingan berita untuk jadwal Newsletter (sampul, judul, subjudul, isi)
Jumlah Postingan berita dalam pengiriman ini
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:
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.
| Bagian | Fungsinya |
|---|---|
| Pustaka | Menampilkan 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, sampul | Judul 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 status | Postingan Draf tidak pernah dikirim. Mengubahnya ke Siap mencatat saat ia menjadi Siap; saat itu menentukan jadwal mana yang boleh mengirimnya. |
| Editor Markdown | Tombol 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 langsung | Merender 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 placeholder | Tombol 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.
| Syntax | Hasil |
|---|---|
| ## 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 |
| > quote | Kutipan blok |
| --- | Garis pemisah |
|  | 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.
| Placeholder | Menjadi |
|---|---|
| {{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
| Gejala | Yang perlu diperiksa |
|---|---|
| Pratinjau tidak menampilkan artikel | Template 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 diklik | Tulis sebagai [text](https://…) dengan alamat http, https, atau mailto; skema lain dibiarkan sebagai teks. |
| Gambar tidak muncul | Alamatnya harus diawali https dan dapat dijangkau publik. Beberapa aplikasi email juga memblokir gambar jarak jauh sampai pembaca mengizinkannya. |
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
Matriks Kalender & Bulan
Peta jadwal visual & kadensiEngine Pengulangan
Harian, mingguan, bulanan & kustomPoller Blog Otomatis
Deduplikasi hash & cacheAudiens Dinamis
Query tag saat detik run tepatLog Occurrence
Audit eksekusi & cegah duplikasiRun Now On-Demand
Jalankan instan tanpa geser kadensiOptimasi Hosting
8 panduan operasional terkurasiHeartbeat Cron & Lock
Pengaman konkurensi non-blockingMode Postingan Berita
Newsletter bergaya Substack5.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:
Jadwalkan siaran hari Selasa atau Kamis antara 09:00 dan 10:30 waktu lokal penerima untuk open rate dan klik maksimal.
Jalankan worker.php setiap menit (* * * * *) dengan proteksi flock untuk menjamin ketepatan sub-menit tanpa tabrakan proses.
Query cm_email_queue menggunakan prepared statement terindeks dengan klausa LIMIT untuk mencegah race condition pada volume tinggi.
Kelompokkan kontak dengan tag wilayah (#us-east, #apac, #emea) dan atur jadwal bertahap agar email tidak terkirim jam 03:00 pagi.
Beri jeda 1–2 jam setelah artikel diterbitkan di CMS sebelum mengirim RSS, memberi waktu node CDN dan cache XML untuk ter-update.
Bersihkan log eksekusi lawas di cm_schedule_occurrences secara berkala agar ukuran database tetap ringan dan query tetap cepat.
Jadwalkan pengiriman ulang 48–72 jam kemudian ke kontak dengan opened_at IS NULL dengan variasi subject line untuk memulihkan 15–25% engagement.
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
- 1Buka Template → Postingan lalu tulis artikel Anda dalam Markdown.
- 2Buat atau buka template dan letakkan {{news_posts}} di tempat artikel harus muncul (starter “Newsletter Postingan Berita” sudah memilikinya).
- 3Buka Jadwal → Baru, biarkan tipe Newsletter, dan atur Sumber konten ke “Postingan berita”.
- 4Pilih template, audiens, profil SMTP, jumlah postingan per email (1–20), dan kadensinya.
- 5Simpan. Hanya postingan yang menjadi Siap setelah saat ini yang dapat dikirim oleh jadwal ini.
- 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.
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
| Gejala | Yang perlu diperiksa |
|---|---|
| Postingan Siap saya tidak terkirim | Periksa 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 satu | Postingan 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 lama | Salin teksnya ke postingan baru dan tandai yang baru itu Siap — jadwal tidak pernah mengirim postingan yang sama dua kali. |
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
Profil SMTP
BYO SMTP & Managed SES RelayWorker & Cron
Presisi eksekusi 1-menit23 Bahasa & Tema
Mirror RTL & Mode Gelap/TerangKunci REST API
Akses developer berlingkupWebhook Event
Push event HMAC-SHA256Deliverability Suite
SPF, DKIM, DMARC & BIMIPenyedia AI
BYOK & MarbleSend CreditsLisensi Ed25519
Token hibah kriptografis6.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.
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 SMTPHubungkan pengiriman email mandiri Anda dengan kredensial SMTP standar. Pilih antara relay cloud khusus berkapasitas tinggi atau mailbox hosting Anda dengan memperhatikan kuota pengiriman.
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.
Business Email Plans (Per Mailbox)
1 GB storage, 1 forwarding rule, 1 alias, up to 100 mailboxes/domain. Standard webmail & antispam. Strict sending cap (~100-200/day).
5 GB storage, 5 forwarding rules, 5 aliases, expandable mailbox storage. No mailbox limit per domain.
20 GB storage, 20 forwarding rules, 10 aliases, AI Kodee mailbox assistant & smart replies.
50 GB storage, 50 forwarding rules, 30 aliases, full AI suite & priority deliverability.
Hostinger Reach (Email Marketing)
100 recipients, 200 emails / month. Suitable for basic transactional testing.
500 recipients, 500 emails / month, 10 AI credits, remove Reach branding, automations.
1,000 recipients, 7,000 emails / month, 20 AI credits, custom HTML code, send-time optimization.
• 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).
• 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).
• 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).
• 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).
• 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).
• 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).
Pilih port dan protokol keamanan yang sesuai berdasarkan jaringan server dan aturan firewall Anda.
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.
Implicit TLS/SSL wrapper connection (RFC 8314). Required by Hostinger, Namecheap cPanel, and selected enterprise relays. Highly reliable when hosting firewalls restrict 587.
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 SESInfrastruktur 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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) |
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.
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.
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.
# 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| 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) |
Masuk ke dashboard Hostinger hPanel dan buka menu Domain.
Pilih domain Anda dan klik menu DNS / Nameserver di bilah sisi kiri.
Pada bagian Kelola Catatan DNS, pilih CNAME pada dropdown Tipe.
Di kolom Nama, masukkan HANYA token._domainkey (hPanel otomatis menambahkan .domainanda.com di belakang).
Di kolom Target, masukkan token.dkim.amazonses.com dan biarkan TTL di 300 atau default (14400).
Klik Tambah Catatan. Ulangi proses yang sama untuk ketiga token dari MarbleSend.
DreamHost (DreamHost Web Panel)
DreamHost Web Panel| Tipe Record | Host / Nama (Name) | Nilai / Target / Mengarah Ke | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (DreamHost appends .yourdomain.com) | <token>.dkim.amazonses.com | Default |
Masuk ke DreamHost Web Panel dan navigasi ke Websites > Manage Websites.
Cari domain Anda, klik ikon opsi tiga titik atau DNS Settings (atau Domains > Manage Domains > DNS).
Gulir ke bawah ke bagian "Add a custom DNS record" lalu klik Add Record.
Di kolom Name, masukkan token._domainkey (DreamHost menampilkan akhiran .domainanda.com secara otomatis).
Pilih Type CNAME dan masukkan token.dkim.amazonses.com pada kolom Value.
Klik Save atau Add Record. Ulangi untuk ketiga token CNAME.
Namecheap (Advanced DNS)
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) |
Masuk ke Namecheap, buka Domain List dari bilah sisi kiri, dan klik Manage di samping domain Anda.
Buka tab Advanced DNS di bagian atas halaman pengelolaan domain.
Pada bagian Host Records, klik tombol merah ADD NEW RECORD.
Pilih CNAME Record dari menu dropdown Type.
Di kolom Host, masukkan HANYA token._domainkey (jangan sertakan nama domain Anda).
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.
Bluehost (Account Manager / Zone Editor)
Bluehost DNS| 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) |
Masuk ke Bluehost Account Manager, klik menu Domains di navigasi kiri, lalu pilih domain Anda.
Buka tab DNS (atau buka cPanel Zone Editor jika memakai paket hosting cPanel legacy).
Gulir ke bagian CNAME (Alias) dan klik Add Record.
Di kolom Host Record, masukkan token._domainkey.
Di kolom Points To, masukkan token.dkim.amazonses.com dan pilih TTL (4 Hours atau Default).
Klik Save. Ulangi untuk 2 token CNAME lainnya.
SiteGround (Site Tools DNS Zone Editor)
Site Tools DNS| 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) |
Masuk ke SiteGround Client Area, buka Websites, lalu klik Site Tools pada domain Anda.
Di menu samping kiri, klik Domain lalu pilih DNS Zone Editor.
Klik tab CNAME pada formulir Create New Record.
Di kolom Name, masukkan token._domainkey (Site Tools menampilkan .domainanda.com terkunci di sisi kanan).
Di kolom Resolves To, masukkan token.dkim.amazonses.com dan biarkan TTL pada default 1 jam (3600).
Klik Create. Ulangi untuk ketiga token.
HostGator (cPanel Zone Editor)
cPanel 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) |
Masuk ke HostGator Customer Portal dan buka panel cPanel.
Pada bagian Domains, klik Zone Editor.
Cari domain Anda lalu klik tombol + CNAME Record (atau Manage > Add Record).
Di kolom Name, masukkan token._domainkey (cPanel akan otomatis melengkapinya dengan domain dan titik di akhir).
Di kolom CNAME / Record, masukkan token.dkim.amazonses.com.
Klik Add a CNAME Record. Ulangi untuk ketiga token.
GoDaddy (Domain Portfolio DNS)
GoDaddy 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) |
Masuk ke akun GoDaddy Anda dan buka halaman My Products.
Pada daftar Domains, cari domain Anda lalu klik tombol DNS (atau ikon tiga titik > Manage DNS).
Pada bagian DNS Records, klik tombol Add New Record.
Pilih CNAME dari dropdown Type.
Di kolom Name, masukkan HANYA token._domainkey (jangan ketik .domainanda.com!).
Di kolom Value, masukkan token.dkim.amazonses.com, pilih TTL 1/2 Hour (atau Default), lalu klik Save. Ulangi untuk ketiga record.
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.
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.
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)
- Buka hPanel → Websites → Dashboard untuk situs Anda, lalu klik Cron Jobs di sidebar.
- Atur Type ke Custom. (Tipe PHP hanya menerima jalur sebuah file .php; baris Anda juga memuat perintah PHP.)
- Tempel baris dari Langkah 1 ke Command to run.
- Atur jadwal ke setiap menit, atau ketik * * * * *.
- 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.
- Buka cPanel dan di bagian Advanced klik Cron Jobs.
- Di bawah Add New Cron Job, pilih Once Per Minute (* * * * *) pada Common Settings.
- Tempel baris dari Langkah 1 ke Command.
- 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
- Masuk ke Bluehost Portal, klik Websites, lalu Manage Site untuk situs Anda.
- Buka tab Advanced, cari Cron Jobs dan klik Manage, lalu Add Cron.
- Pilih frekuensi di Common Settings (atau isi Minute, Hour, Day, Month, dan Weekday).
- 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.
- Buka cPanel dan di bagian Advanced klik Cron Jobs.
- Di bawah Add New Cron Job, pilih Once Per Minute (* * * * *) pada Common Settings.
- Tempel baris dari Langkah 1 ke Command.
- 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.
- Buka cPanel dan di bagian Advanced klik Cron Jobs.
- Di bawah Add New Cron Job, pilih Once Per Minute (* * * * *) pada Common Settings.
- Tempel baris dari Langkah 1 ke Command.
- 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
- Buka panel DreamHost, masuk ke Cron Jobs dan klik Add New Cron Job.
- Pilih pengguna (pengguna SFTP atau shell yang sudah ada), beri job sebuah judul, dan alamat email untuk keluarannya (opsional).
- Tempel baris dari Langkah 1 ke Command. DreamHost menyimpan PHP di jalur seperti /usr/local/php83/bin/php (pakai versi PHP Anda).
- 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
- Buka Site Tools → Devs → Cron Jobs.
- Pilih interval dari daftar (atau atur kolom menit, jam, hari, bulan, dan hari dalam minggu).
- Tempel baris dari Langkah 1 ke Command. Alamat email untuk keluaran bersifat opsional.
- 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.
- Buka Settings → Sistem dan salin Web-Cron URL. Jaga kerahasiaannya: URL itu memuat token rahasia Anda.
- Buat akun gratis di layanan cron seperti cron-job.org.
- Buat sebuah job, tempel URL tersebut, dan atur agar berjalan setiap menit. Simpan dan aktifkan.
- Gunakan salah satu: Web-Cron atau cron job dari penyedia hosting Anda, tidak keduanya. Satu sudah cukup.
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.
- 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.
* * * * * 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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
Buka dash.cloudflare.com lalu daftar (gratis) atau masuk. Anda tidak perlu menambahkan website ke Cloudflare atau mengubah DNS untuk memakai Turnstile.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
Berlangganan pada trigger penting: contact.created, contact.unsubscribed, campaign.sent, campaign.bounced, dan link.clicked dengan pengaturan aktif/nonaktif per webhook.
Setiap request POST webhook menyertakan X-MarbleSend-Signature: sha256=... yang dibuat menggunakan hash_hmac('sha256', $payload, $secret), memungkinkan server penerima memverifikasi keaslian.
Pengiriman webhook yang gagal (HTTP 5xx atau timeout koneksi) memicu retry backoff eksponensial. Endpoint dengan kegagalan beruntun dijeda otomatis untuk mencegah beban server.
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.
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).
Memeriksa selector._domainkey.domain.com untuk memvalidasi kunci publik kriptografis RSA atau Ed25519. Memastikan header email keluar dapat diverifikasi secara kriptografis terhadap domain pengirim.
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.
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.
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.
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.
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.
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.
Akses zero-configuration ke model kurasi unggulan yang diuji khusus untuk konversi email. Tanpa perlu akun developer eksternal atau kunci API.
Komunikasi langsung server-ke-vendor tanpa markup. Pilih penyedia terkonfigurasi dan pengenal model tertentu sebagai mesin generasi default Anda.
Studio Template, Inspektur Skor Subjek AI, dan Asisten AI otomatis mengeksekusi terhadap pemilihan default aktif dengan penanganan error ramah saat kredit habis.
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.
Setiap lisensi yang teraktivasi menerima kredit AI awal gratis yang diambil secara dinamis dari license server, memungkinkan evaluasi instan fitur Asisten AI.
Generasi dipotong tepat 1 kredit per permintaan via cm_addon_ledger. UUID transaksi unik mencegah pemotongan ganda saat percobaan ulang koneksi.
Paket kredit (misal ai_100) dimuat secara dinamis dari katalog edge vendor. Pembayaran diproses dengan aman oleh penyedia pembayaran kami.
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.
Pertahankan koneksi simultan ke OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Kimi/Moonshot, OpenRouter, atau instans privat Ollama.
Mendukung endpoint standar kompatibel OpenAI (/chat/completions) dan format pesan Anthropic (/v1/messages) dengan proxy Base URL kustom.
Semua kunci API BYOK dienkripsi at-rest dengan akselerasi hardware AES-256-GCM. Kunci tidak pernah diekspos dalam respons HTML atau log sistem.
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:
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:
Dari sidebar navigasi utama, klik menu Settings, lalu beralih ke tab "AI Providers" (dapat diakses langsung via URL /settings).
Klik salah satu preset Quick Add (OpenAI, DeepSeek, Gemini, Anthropic, OpenRouter, dll.) untuk pengisian otomatis, atau klik tombol "+ Add Provider" untuk konfigurasi kustom.
Pilih format protokol: "OpenAI format" (standar untuk OpenAI, DeepSeek, Gemini, Groq, Ollama) atau "Anthropic format" (khusus Anthropic Claude). Pastikan Base URL sesuai.
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.
Ketikkan Model ID yang ingin digunakan beserta batas context window, lalu klik tombol "Test Connection". MarbleSend akan menjalankan ping handshake otentikasi live sebelum disimpan.
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.
Memvalidasi tanda tangan digital dengan sodium_crypto_sign_verify_detached(). Modifikasi manual apa pun pada database langsung membatalkan tanda tangan matematis, menjamin integritas mutlak.
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.
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.
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.
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” (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.
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?
Crontab OS tidak berjalan, path PHP CLI keliru, atau file lock worker tertinggal mencegah eksekusi.
Worker memperbarui cm_settings.worker_last_run dengan timestamp UTC setiap detak. Dashboard menandai tidak aktif jika selisih waktu > 180 detik.
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?
Pra-pengambilan Apple Mail Privacy Protection (MPP), cache proxy, pemblokiran gambar penerima, atau adblocker yang menghapus parameter UTM.
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.
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?
Batas waktu eksekusi web server atau PHP CLI shared hosting (max_execution_time 30s/60s) tercapai saat pengiriman volume besar.
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.
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?
Token wajib {{unsubscribe_link}} hilang, subject line kosong/bermasalah, nol penerima aktif terpilih, atau syntax token tidak tertutup.
Engine Preflight memeriksa 6 vektor kepatuhan dan deliverability kritis sebelum mengizinkan transisi status ke queued atau sending.
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?
Tombol aksi di Laporan Campaign dinonaktifkan jika broadcast masih mengirim atau masa jeda aman belum berlalu.
MarbleSend mewajibkan status campaign = completed dan menyarankan jeda setidaknya 24 hingga 48 jam agar subscriber di berbagai zona waktu sempat membaca.
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?
Syntax email tidak valid menurut RFC 5322, email duplikat saat "Skip Duplicates" aktif, encoding karakter non-UTF-8, atau contacts tersupresi.
MarbleSend memeriksa setiap baris, memvalidasi syntax via filter_var(FILTER_VALIDATE_EMAIL), dan mencocokkan ke cm_contacts agar tidak menimpa status unsubscribed atau bounced.
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?
Kegagalan pengiriman permanen (kode error SMTP 5xx: mailbox tidak ada) versus kegagalan sementara (kode error SMTP 4xx: mailbox penuh, pembatasan laju).
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.
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?
Microsoft Outlook untuk Windows menggunakan engine rendering Microsoft Word (MSO) yang tidak mendukung CSS Flexbox, Grid, margin auto, atau tag layout HTML5.
Word MSO hanya mematuhi layout berbasis tabel tradisional (nested <table>, <tr>, <td>) dengan lebar piksel eksplisit dan inline style.
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?
Ukuran file HTML mentah email melebihi batas ketat 102 KB (104.448 byte) dari Gmail.
Jika muatan HTML melebihi 102 KB, Gmail memotong pesan, memutus konten, serta menyembunyikan link unsubscribe di footer dan tracking pixel.
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?
Placeholder hanya diisi oleh jadwal Newsletter dengan Sumber konten “Postingan berita”. Pada Campaign manual, jadwal RSS, atau jadwal template saja, ia diganti teks kosong.
Pemeriksaan pra-kirim Campaign menampilkan peringatan ketika template memakai {{news_posts}} tanpa sumber postingan berita; pratinjau di Template → Postingan selalu menampilkan blok yang terisi.
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?
URL feed tidak dapat dijangkau, syntax XML feed salah, atau GUID artikel terbaru cocok dengan cm_schedules.last_rss_item_id.
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.
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?
Beberapa interval jadwal terlewat saat proses worker tidak dapat berjalan.
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.
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?
Postingan menjadi Siap sebelum mode Postingan berita jadwal dinyalakan, sudah terkirim oleh jadwal ini, atau audiens/template memblokir eksekusi.
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}}.
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?
Pengiriman dilacak per jadwal, bukan per postingan.
Setiap jadwal Postingan berita menyimpan catatan sendiri tentang postingan yang telah dikirimnya, sehingga pustaka menampilkan total “Terkirim N×”.
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"?
Kredensial SMTP salah, ketidakcocokan port dan enkripsi (Port 587 STARTTLS vs Port 465 SSL), atau alamat email pengirim belum diverifikasi.
Settings → SMTP menyediakan uji socket live yang menampilkan dialog mentah antara PHPMailer dan server SMTP Anda.
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?
Record DNS belum ditambahkan pada domain pengirim, melebihi batas 10 lookup pada SPF, atau prefix selector DKIM tidak cocok.
MarbleSend menjalankan query DNS non-blocking (dns_get_record) langsung ke nameserver otoritatif untuk SPF (root TXT), DKIM (selector._domainkey), dan DMARC (_dmarc).
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?
Endpoint tujuan mengembalikan error HTTP 5xx berulang kali, connection timeout (>10 detik), atau respons 404 Not Found.
Untuk mencegah penumpukan antrean server, MarbleSend melacak upaya delivery dan otomatis menjeda webhook (enabled = 0) setelah kegagalan beruntun berulang.
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?
Koneksi jaringan terputus, kegagalan resolusi DNS, atau downtime sementara pada server lisensi pusat.
Keaslian lisensi diverifikasi secara lokal di memori menggunakan libsodium sodium_crypto_sign_verify_detached(). Mengubah record database secara manual akan merusak signature kriptografis.
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.
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.
Jembatan REST API
Tanpa database bersamaAntrean pengiriman
Penyimpanan transientMarbleSend Form
Shortcode, Block & WidgetHook WPForms
wpforms_process_completeHook Contact Form 7
wpcf7_mail_sentHook Fluent Forms
submission_insertedFormidable Forms
frm_after_create_entryHook Forminator
submit_before_set_fieldsAutoresponder tag
Tag dan email sambutanPasang 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. 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. 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. 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. 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.
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.
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.
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.
Test Connection di Settings → MarbleSend Forms memanggil GET /api/verify-key dan menampilkan scope key, sehingga URL atau key yang salah langsung terlihat.
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.
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.
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.
Satu event WP-Cron, marblesend_forms_process_queue, dijadwalkan sekitar satu menit kemudian dan mengirim kiriman yang antre.
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.
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.
// 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.
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"].
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.
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.
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.
[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.
Plugin mendeteksi WPForms dengan function_exists('wpforms') dan mendengarkan aksi wpforms_process_complete (prioritas 10), yang menerima field yang sudah tervalidasi.
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.
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.
Setiap kontak dari WPForms mendapat tag source:wpforms di samping tag Anda sendiri, sehingga Anda bisa mengirim Campaign hanya ke kelompok itu.
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.
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.
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.
Plugin membaca data kiriman dengan WPCF7_Submission::get_instance()->get_posted_data(), yang bekerja dengan pengiriman AJAX CF7.
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.
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.
Plugin mendeteksi Fluent Forms dengan function_exists('wpFluent') dan mendengarkan fluentform/submission_inserted (prioritas 10), yang menerima $entry_id, $form_data, dan $form.
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.
Halaman Integrations menampilkan daftar form Anda dengan membaca tabel form milik Fluent Forms, sehingga Anda tidak perlu mencari ID form.
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.
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.
Plugin mendeteksi Formidable dengan class_exists('FrmForm') dan mendengarkan frm_after_create_entry (prioritas 30), yang menerima $entry_id dan $form_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.
Plugin berjalan setelah entri dibuat, sehingga hanya kiriman yang lolos validasi Formidable yang diteruskan.
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.
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.
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.
Forminator memberi setiap field sebuah element ID seperti email-1, name-1, atau text-1. Masukkan ID ini ke pemetaan. Editor form menampilkannya.
Halaman Integrations menampilkan form Forminator Anda berikut namanya, dibaca dengan Forminator_API::get_forms().
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.
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.
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.
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.
Plugin mengirim lead langsung ke instalasi MarbleSend Anda sendiri. Layanan seperti Zapier atau Make tidak ada di jalurnya.
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.
{
"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?
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).
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.
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"?
Ada salah ketik pada field email di pemetaan, atau pengunjung mengirim alamat kosong atau tidak valid yang ditolak sanitize_email().
MarbleSend_Integration_Base::log_skip() menulis entri ke marblesend_forms_log setiap kali form yang aktif tidak menghasilkan email valid.
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?
Key di WordPress sudah dicabut, kedaluwarsa, dihapus di MarbleSend, atau dibuat tanpa scope contacts:write.
Test Connection memanggil GET /api/verify-key. Jawaban HTTP 401 atau 403 berarti autentikasi gagal.
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?
Plugin hanya meneruskan lead setelah Contact Form 7 mengirim emailnya sendiri. Bila email gagal, CF7 menampilkan pesan galatnya dan lead tidak diteruskan.
Kirim form itu sendiri. Bila Anda melihat "There was an error trying to send your message", CF7 tidak bisa mengirim emailnya.
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?
Form tidak punya field nama, atau tidak ada field nama yang dipetakan. API MarbleSend memerlukan nama, sehingga kontak baru mendapat bagian email sebelum @.
Lihat baris form di Settings → MarbleSend Integrations: kotak Name Field kosong. Kontak yang sudah ada tidak terpengaruh, karena ia mempertahankan namanya.
Tambahkan field nama ke form dan isi di pemetaan. Kontak yang sudah ada mempertahankan nama saat ini; ubah di /contacts bila perlu.