Aplikasi Anda sudah berjalan. Email sudah terkirim. Semuanya sudah di-test.
Lalu suatu hari Anda terima surat peringatan dari seseorang yang tidak Anda kenal. Atau lebih buruk: email Anda mulai bounce, reputation domain anjlok, dan Anda tidak tahu kenapa.
Masalahnya hampir selalu sama: Anda mengasumsikan CAN-SPAM hanya urusan perusahaan besar dengan departemen hukum.
Ternyata tidak.
CAN-SPAM adalah undang-undang AS , Controlling the Assault of Non-Solicited Pornography and Marketing Act 2003 , dan berlaku untuk setiap email komersial yang dikirim ke penerima di Amerika Serikat, tanpa peduli di mana server Anda berdiri atau di mana perusahaan Anda berdiri.
Jika aplikasi Anda punya user di AS, CAN-SPAM berlaku untuk Anda. Tidak ada pengecualian.
Artikel ini membahas apa yang developer perlu implementasi secara teknis, bukan teori hukum. Langsung ke kode.
Daftar Isi
Tujuh Requirement yang Benar-Benar Penting
CAN-SPAM punya tujuh ketentuan utama. Kebanyakan developer cuma tahu satu atau dua. Berikut daftarnya.
1. Header Information yang Akurat
Aturannya: Informasi “From,” “To,” dan routing harus akurat dan mengidentifikasi orang atau bisnis yang mengirim pesan.
Apa artinya di kode:
# Salah , noreply generik yang tidak identifikasi bisnis Anda
FROM: [email protected]
# Benar , identifikasi bisnis secara jelas
FROM: Nama Aplikasi Anda <[email protected]>
Alamat From harus alamat yang benar-benar Anda kontrol. Gunakan [email protected] atau domain no-reply yang tidak punya kaitan dengan bisnis Anda itu langsung pelanggaran.
Implementasi di Laravel:
Mail::from('[email protected]', 'Nama Aplikasi Anda')
->send(new MailableAnda());
Di Node.js dengan Nodemailer:
transporter.sendMail({
from: '"Nama Aplikasi Anda" <[email protected]>',
// ...
});
2. Subject Line yang Tidak Menyesatkan
Aturannya: Subject line harus secara akurat mencerminkan isi email. Tidak boleh pakai umpan-dan-swich agar seseorang membuka email.
Apa artinya di kode:
# Salah , subject menipu
Subject: Pesanan Anda sudah dikirim!
# Isi aktual: promosi komersial
# Benar , subject sesuai isi
Subject: Pesanan #12345 Anda sudah dikirim.
Subject: Promo Mingguan dari StoreName , April 2026
Ini sebagian besar kebijakan konten, tapi perlu dipaksakan di template email Anda:
// Di Laravel , enforce prefix konsistensi
public function build()
{
$this->subject('Nama App: ' . $this->order->subject)
->view('emails.order.shipped');
}
3. Identifikasi Jelas sebagai Iklan
Aturannya: Email komersial harus jelas identitasnya sebagai iklan jika memang ituatnya.
Apa artinya di kode:
Ini berlaku untuk email promosi. Email transaksional (konfirmasi pesanan, reset password, receipt) secara umum dibebaskan. Batas antara keduanya penting:
- Transaksional: Konfirmasi pesanan, notifikasi pengiriman, alert akun, reset password
- Komersial/Promosi: Promo, newsletter, pengumuman produk, kampanye re-engagement
Jika kirim konten promosi, label dengan jujur.
// Di template email promosi
public function build()
{
return $this->subject('Promo Mingguan , ' . config('app.name'))
->view('emails.promosi.mingguan')
->with(['isPromosi' => true]);
}
4. Alamat Fisik yang Valid
Aturannya: Setiap email komersial harus menyertakan alamat pos fisik yang valid dari pengirim.
Apa artinya di kode:
Ini adalah requirement yang paling sering dilupakan developer. Anda perlu menyertakan alamat fisik di setiap email komersial.
// Di footer template email (Laravel)
<div style="font-size: 12px; color: #666;">
{{ config('app.name') }}<br>
Jl. Bisnis No. 123, Suite 100<br>
Jakarta, Indonesia 12345<br>
<a href="{{ url('/unsubscribe') }}">Unsubscribe</a>
</div>
Alamat ini harus alamat street. PO box saja tidak cukup menurut CAN-SPAM. Jika Anda bisnis kecil atau solo developer, Anda bisa pakai alamat registered agent atau virtual office, tapi harus alamat fisik yang nyata.
5. Mekanisme Opt-Out
Aturannya: Anda harus menyediakan cara yang jelas dan fungsional bagi penerima untuk unsubscribe dari email komersial di masa depan.
Apa artinya di kode:
Ini tidak bisa ditawar. Setiap email komersial harus punya link unsubscribe yang bekerja.
// Laravel , tambah unsubscribe token ke setiap email keluar
public function build()
{
$unsubscribeUrl = url('/unsubscribe/' . base64_encode($this->user->email));
$this->with(['unsubscribe_url' => $unsubscribeUrl]);
}
// Di template email
<a href="{{ $unsubscribe_url }}" style="color: #999;">Unsubscribe</a>
// Node.js , Nodemailer
const unsubscribeUrl = `https://yourapp.com/unsubscribe?token=${user.unsubscribeToken}`;
mailOptions.headers = {
'List-Unsubscribe': `<${unsubscribeUrl}>`
};
Anda wajib memproses request unsubscribe dalam 10 hari kerja.
6. Request Opt-Out Harus Dihormati
Aturannya: Setelah penerima unsubscribe, Anda tidak boleh kirim email komersial lagi kepada mereka.
Apa artinya di kode:
// Laravel , controller unsubscribe
public function unsubscribe($token)
{
$email = base64_decode($token);
$user = User::where('email', $email)->first();
if ($user) {
// Tandai unsubscribe, jangan hapus
$user->update(['email_opted_out' => true]);
// Hentikan semua job email promosi untuk user ini
$user->emailSubscriptions()->delete();
}
return view('emails.unsubscribed');
}
// Node.js , endpoint unsubscribe
app.get('/unsubscribe', async (req, res) => {
const { token } = req.query;
const email = Buffer.from(token, 'base64').toString('utf8');
await User.query()
.where('email', email)
.patch({ email_opted_out: true });
await EmailSubscription.query()
.where('user_email', email)
.delete();
res.send('Anda telah unsubscribe.');
});
Penting: Jangan tanya biaya, jangan minta informasi identitas tambahan di luar email, jangan pakai link yang menipu untuk memproses opt-out. Email transaksional masih boleh dikirim ke user yang sudah unsubscribe dari promosi.
7. Tanggung Jawab atas Pesan yang Dikirim Pihak Ketiga
Aturannya: Anda secara hukum bertanggung jawab atas email yang dikirim pihak ketiga atas nama Anda.
Apa artinya:
Jika pakai email service provider, platform marketing, atau pihak ketiga apapun untuk kirim email atas nama Anda, Anda tetap secara hukum bertanggung jawab atas kepatuhan CAN-SPAM. Ini berarti:
- Pilih provider dengan track record compliance yang jelas
- Audit third-party sender secara berkala
- Pastikan pengaturan kontraktual mengikat mereka pada standar compliance
Ini salah satu alasan kenapa pakai SMTP provider Indonesia yang terpercaya seperti KIRIM.EMAIL penting , mereka yang menangani infrastruktur compliance, jadi Anda tidak perlu bangun dari nol.
Konsekuensi Jika Salah
Enforcement CAN-SPAM sebagian besar reaktif. FTC tidak pre-approve email. Pelanggaran biasanya ditemukan melalui:
- Keluhan penerima , spam filter dan laporan user memicu investigasi
- Keluhan kompetitor , ya, ini terjadi
- Monitoring industri , email service provider berbagi data pola abuse
Denda bisa mencapai $51.744 per email (disesuaikan dengan inflasi). Satu blast ke 10.000 subscriber dengan error compliance bisa secara teknis bernilai $517 juta. Dalam praktiknya, FTC memprioritaskan pelanggaran skala besar, tapi kasus kecil juga pernah dituntut.
Lebih segera: deliverability email terganggu. ESP besar seperti Gmail, Yahoo, dan Microsoft melacak complaint rate. Jika email Anda menghasilkan complaint di atas 0,1 persen, domain Anda akan di-flag. Artinya email transaksional Anda juga mulai masuk spam.
Yang Sering Terlewat Developer Indonesia
Kebanyakan developer Indonesia bekerja dengan userbase Indonesia, jadi mereka pikir CAN-SPAM tidak berlaku untuk mereka. Ini asumsi yang berbahaya.
Jika 5 persen user Anda berbasis di AS, CAN-SPAM berlaku untuk email ke user-user tersebut. Anda butuh sistem yang:
- Identifikasi geografi user saat signup
- Terapkan aturan CAN-SPAM untuk user berbasis AS
- Jaga record consent dan unsubscribe terpisah
// Laravel , terapkan aturan CAN-SPAM berdasarkan negara user
public function kirimEmailPromosi(User $user, PromosiMail $mail)
{
if ($user->country === 'US') {
// Requirement wajib CAN-SPAM untuk user AS
$mail->withUnsubscribeToken($user->unsubscribeToken)
->withAlamatFisik(config('app.physical_address'));
}
Mail::to($user)->send($mail);
}
Checklist Compliance Sebelum Kirim
Sebelum kirim campaign email komersial, jalankan checklist ini:
- Alamat From pakai domain Anda dan identifikasi bisnis secara jelas
- Subject line sesuai dengan isi email
- Email promosi jelas teridentifikasi sebagai komersial
- Alamat fisik ada di footer setiap email komersial
- Link unsubscribe ada dan fungsional di setiap email komersial
- Request opt-out diproses dalam 10 hari kerja
- User yang sudah unsubscribe tidak terima email komersial lagi
- Email transaksional dan promosi dikirim secara terpisah
- Third-party sender terikat kontrak pada compliance CAN-SPAM
- Complaint rate dipantau (harus di bawah 0,1 persen)
Kesimpulan
CAN-SPAM bukan saranansaran. Ini undang-undang federal yang berlaku untuk email komersial ke penerima AS, tanpa peduli di mana perusahaan Anda berdiri.
Kabar baiknya: mengimplementasi ketujuh requirement ini tidak sesulit kelihatannya. Sebagian besar pekerjaan cuma soal template dan beberapa query database.
Yang sulit adalah membangun disiplin untuk melakukannya untuk setiap email yang Anda kirim, terutama yang otomatis , yang ditulis sekali dan kemudian terlupakan.
Karena audit compliance adalah waktu yang buruk untuk descobrir bahwa welcome series Anda tidak punya link unsubscribe selama 18 bulan.
Masalahnya, compliance infrastructure yang benar itu tidak murah dan tidak trivial untuk dibangun sendiri. Anda harus tangani unsubscribe token, physical address tracking, audit trail, dan processing request dalam 10 hari kerja, sambil menjaga email transaksional tetap jalan terpisah.
KIRIM.EMAIL menangani bagian infrastructure email compliance ini sebagai bagian dari layanan standar. Data center di Indonesia, tidak ada kurs USD, dan ada tracking delivery yang jelas sehingga Anda tahu email benar-benar sampai, bukan cuma tahu script sudah jalan.
Coba lihat di kirim.email/dev.
- CAN-SPAM untuk Developer: Yang Harus Anda Implementasi di Kode Anda - April 2, 2026
- Integrasi SMTP Laravel: Kapan Anda Benar-Benar Perlu Pakai Queue untuk Email - April 1, 2026
- Email Marketing untuk Public Relations: Panduan Praktis 2026 - March 31, 2026
