← Back to all posts

Kirim Slip Gaji (Payslip) PDF Otomatis dengan MailAnvil + Node.js

2026-10-11 · MailAnvil Team

Kirim Slip Gaji (Payslip) PDF Otomatis dengan MailAnvil + Node.js

Setiap tanggal 25, tim HR dan software payroll di Indonesia menghadapi pekerjaan yang sama: generate ratusan slip gaji PDF, lalu kirim satu per satu ke email karyawan. Dikirim manual dari Gmail, selain makan waktu berjam-jam, juga rawan salah kirim — dan email bulk dari akun Gmail pribadi sering masuk spam.

Tutorial ini membuktikan bahwa seluruh proses bisa otomatis dengan MailAnvil: payroll engine Anda generate PDF payslip, kirim via email API, dan setiap pengiriman tercatat statusnya (delivered, bounced, failed) di dashboard. Tidak ada lagi "apakah Pak Budi sudah terima slip-nya?"

Kenapa email API, bukan SMTP langsung?

Prasyarat

  1. Akun MailAnvil di app.mailanvil.com (signup gratis).
  2. Domain perusahaan terverifikasi — tambahkan di tab Domains, tunggu status verified. Tanpa ini, API menolak pengiriman (proteksi deliverability).
  3. Node.js 18+.

Langkah 1 — Generate PDF payslip

Anggap payroll engine Anda sudah punya fungsi ini. Contoh dengan pdfkit:

import PDFDocument from 'pdfkit';

function buatPayslip(karyawan) {
  return new Promise((resolve) => {
    const doc = new PDFDocument({ size: 'A4', margin: 40 });
    const chunks = [];
    doc.on('data', (c) => chunks.push(c));
    doc.on('end', () => resolve(Buffer.concat(chunks)));

    doc.fontSize(16).text(karyawan.perusahaan, { align: 'center' });
    doc.fontSize(12).text('Slip Gaji — Oktober 2026', { align: 'center' });
    doc.moveDown(2);
    doc.fontSize(11)
      .text(`Nama       : ${karyawan.nama}`)
      .text(`Posisi     : ${karyawan.posisi}`)
      .text(`Gaji Pokok : Rp ${karyawan.gaji.toLocaleString('id-ID')}`)
      .text(`Tunjangan  : Rp ${karyawan.tunjangan.toLocaleString('id-ID')}`)
      .text(`Potongan   : Rp ${karyawan.potongan.toLocaleString('id-ID')}`)
      .text(`Take Home  : Rp ${karyawan.takeHome.toLocaleString('id-ID')}`);
    doc.end();
  });
}

Langkah 2 — Kirim via MailAnvil (dengan attachment)

MailAnvil menerima attachment langsung di payload POST /v1/send — hingga 10 file, total 25 MB. PDF payslip biasanya 30–100 KB, jadi sangat aman. Attachment dikirim sebagai base64:

const res = await fetch('https://api.mailanvil.com/v1/send', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${process.env.MAILANVIL_API_KEY}`,
    'Idempotency-Key': `payslip-${karyawan.nik}-2026-10`,
  },
  body: JSON.stringify({
    from: `[email protected]`,
    to: karyawan.email,
    subject: 'Slip Gaji — Oktober 2026',
    html: `
      <p>Selamat pagi ${karyawan.nama},</p>
      <p>Terlampir slip gaji Anda periode Oktober 2026.
      Untuk pertanyaan kompensasi, hubungi <a href="mailto:[email protected]">[email protected]</a>.</p>
      <p>Salam,<br>Tim HR</p>
    `,
    text: `Slip gaji Oktober 2026 terlampir. Hubungi [email protected] untuk pertanyaan.`,
    attachments: [{
      filename: `slip-gaji-${karyawan.nik}-2026-10.pdf`,
      content: pdfBuffer.toString('base64'),
      content_type: 'application/pdf',
    }],
  }),
});

const data = await res.json();
console.log(data.id); // simpan untuk tracking status

Dua detail penting di kode atas:

Langkah 3 — Loop untuk seluruh karyawan + cek status

for (const karyawan of daftarKaryawan) {
  const pdf = await buatPayslip(karyawan);
  await kirimPayslip(karyawan, pdf);
  await sleep(300); // sosokkan ritme pengiriman
}

Besoknya, cek tab Logs di dashboard: setiap email punya status delivered / bounced. Filter bounced, perbarui email karyawan di database payroll, kirim ulang. Atau otomatis via endpoint GET /v1/emails.

Siapa yang pakai pola ini di Indonesia?

Semua polanya sama: satu template HTML, satu PDF per penerima, satu API key, dan log yang bisa diaudit.

CTA

Coba MailAnvil gratis di mailanvil.com — 3.000 email/bulan, tanpa kartu kredit, pembayaran Pro via QRIS/GoPay.