Penggajian: Payroll Otomatis (PPh21 + BPJS)
Generate slip gaji bulanan otomatis. Komponen gaji custom, PPh21 sesuai PMK terbaru, BPJS Kesehatan + Ketenagakerjaan, export CSV bank (BCA/Mandiri/BNI/BRI/Permata/CIMB/Danamon).
- 1
Apa itu Penggajian SatuTim
Plugin Payroll Indonesia-first: hitung gaji bulanan staff workspace dengan auto-compute komponen wajib pajak Indonesia. Bukan generic payroll Silicon Valley, ini PMK 168/2023 PPh21 + BPJS Kesehatan 1%/4% + BPJS Ketenagakerjaan (JHT 2%/3.7%, JKK by risk, JKM, JP 1%/2%).
Workflow standar (HR admin tiap akhir bulan):
- Setup profil gaji per karyawan (sekali, update kalau ada perubahan kontrak)
- Generate Payroll Run untuk periode YYYY-MM
- Review draft slip per orang, edit kalau perlu
- Finalisasi (lock slip, gak bisa edit lagi tanpa audit log)
- Export CSV bank → upload ke mobile banking BCA / internet banking corporate
- Tandai paid setelah transfer berhasil
Aktifkan di Pengaturan → Plugin → Payroll.
- Plugin Pro+, Free plan tidak punya akses Payroll
- Standalone, tidak butuh plugin Absensi untuk berfungsi, tapi sinergi jelas (Absensi → potong telat otomatis ke slip)
- 2
Setup profil gaji per karyawan
Sebelum generate payroll, setiap karyawan butuh profil gaji aktif. Buka /payroll/profil → pilih staff → Edit Profil:
- Tipe karyawan:
tetap(PKWTT) /kontrak(PKWT) /harian/freelance - Gaji pokok bulanan (rupiah, integer, mis.
5000000= 5jt) - Hari kerja per bulan (default 22, dipakai pro-rate kalau partial month)
- PTKP status (Penghasilan Tidak Kena Pajak):
TK0-TK3= Tidak Kawin (TK0 = single, TK3 = 3 tanggungan)K0-K3= Kawin (K0 = istri/suami saja, K3 = 3 anak)- Wajib benar, salah PTKP = salah PPh21 = kebawa ke SPT tahunan
- NPWP (15 digit, format
XX.XXX.XXX.X-XXX.XXXatau plain). Tanpa NPWP = PPh21 +20% surcharge. - Bank + Nomor rekening + Nama rekening (buat export CSV bank). Supported: BCA, Mandiri, BNI, BRI, Permata, CIMB Niaga, Danamon, Other (generic CSV).
- Komponen tetap (array), tunjangan/potongan bulanan:
Tunjangan Transport, typeadd, amount500000, taxabletrueTunjangan Makan, typeadd, amount500000, taxablefalse(kalau natura/disediakan kantor)Potongan Pinjaman, typesub, amount200000, taxablefalse- BPJS Kesehatan flag (enabled? + nomor BPJS Kes). Kalau aktif → auto-potong 1% dari basis BPJS (gaji pokok + tunjangan taxable, capped 12jt).
- BPJS Ketenagakerjaan flag (enabled? + nomor BPJS Ket). Kalau aktif → auto-potong JHT 2% + JP 1% dari staff. Employer-side auto-compute (untuk laporan, tidak dipotong slip).
- Status aktif (toggle), non-aktif = di-skip waktu generate run.
Click Simpan.
- Punya 20+ karyawan? Pakai bulk import CSV (step berikutnya), gak perlu input satu-per-satu.
Sekali setup, profile re-use tiap bulan. Update profile = trigger audit log entry (workspace_id, target_user, old vs new value). - Tipe karyawan:
- 3
Bulk import karyawan via CSV
Punya banyak karyawan (10+)? Gak usah input satu-per-satu. Buka /payroll → tab "Karyawan" → klik tombol "Import CSV" (sebelah "Tambah Karyawan").
Step 1, Download template
Klik tombol "Download template" di dialog. Filetemplate-import-karyawan.csvke-download. Berisi 3 contoh baris (Andi, Sari, Budi) sebagai panduan format.Kolom yang didukung:
email(WAJIB), harus match anggota workspace yang sudah adanama_lengkap(opsional, info aja)tipe_karyawan,tetap/kontrak/harian/freelance(defaulttetap)gaji_pokok(WAJIB), integer, boleh format5.000.000atauRp 5000000, akan auto-parseworkday_per_bulan, 1-31 (default 22)ptkp_status(WAJIB),TK0/TK1/TK2/TK3/K0/K1/K2/K3npwp, string, boleh emptybank_code,bca/mandiri/bni/bri/permata/cimb/danamon/otherbank_account_no,bank_account_name, stringbpjs_kesehatan,bpjs_ketenagakerjaan,ya/tidak/true/false/1/0bpjs_kes_number,bpjs_ket_number, stringis_active,ya/tidak(defaultya)
Step 2, Edit di Excel atau Google Sheets
Buka template di Excel/Sheets. Edit baris contoh (Andi/Sari/Budi) atau hapus, lalu tambah baris baru sesuai data karyawan kamu. Simpan sebagai CSV (Comma delimited), bukan .xlsx.Step 3, Upload + Preview
Drag & drop file ke zona upload, atau klik "Pilih file CSV". Server akan parse + validate baris-per-baris dalam ~2 detik. Dialog kasih lihat:- 4 stat card: Total baris · Siap import · Error · Sudah ada
- List error kalau ada (per baris, dengan alasan: "email invalid", "PTKP K4 tidak valid", "email belum jadi anggota workspace", dst)
- Preview tabel 100 baris pertama yang valid dengan: row number, nama/email, tipe, gaji, PTKP, status (Baru/Sudah ada)
Step 4, Pilih mode (kalau ada existing)
Kalau ada karyawan yang sudah punya profil gaji, ada 2 pilihan mode:- Update profil yang sudah ada, overwrite gaji & data lain dari CSV. Komponen tetap (tunjangan custom) TIDAK ke-overwrite, preserved (data safety).
- Skip yang sudah ada, cuma create profil baru, skip yang udah eksis.
Step 5, Confirm import
Klik "Import N baris". Server re-validate (gak trust client state), apply upsert per row, audit log entry tertulis. Dialog kasih lihat summary final: inserted X, updated Y, skipped Z, errors W.- Email karyawan WAJIB sudah jadi anggota workspace. Invite mereka dulu di Settings → Members kalau belum ada, sebelum import.
- Max 2 MB per upload, max 2000 baris per file. Lebih dari itu? Split jadi beberapa file.
- Mode "Update existing" aman, `fixedComponents` (tunjangan custom yang sudah di-setup manual) preserved, gak ke-overwrite jadi kosong.
- CSV gak ke-store di server, di-parse in-memory, dibuang setelah import selesai. Audit log cuma simpan ringkasan (jumlah inserted/updated), bukan content CSV.
CSV bisa berisi gaji + nomor rekening + NPWP, sensitive data. Hapus file dari Downloads setelah import selesai. Jangan share di chat tim biasa. - 4
Generate Payroll Run untuk periode
Setelah profil semua staff siap, generate run. Buka /payroll → tab "Payroll Runs" → + Generate Run:
- Periode format Tahun-Bulan (mis. 2026-05 untuk Mei 2026)
- Klik Generate
Sistem proses (~3-10 detik per 50 staff):
- Ambil semua profil gaji aktif di workspace
- Per staff: ambil gaji pokok + komponen tetap dari profil
- Kalau plugin Lembur aktif: tarik pengajuan lembur yang sudah disetujui dalam periode → tambah ke Lembur
- Kalau plugin Lembur aktif: tarik reimbursement yang disetujui → tambah ke Reimbursement
- Kalau plugin Absensi aktif + tarif denda telat > 0: hitung total menit telat dalam periode × tarif → potongan telat
- Hitung penghasilan kena pajak bulanan = gaji pokok + tunjangan taxable + lembur
- Hitung gaji kotor = taxable + non-taxable + reimbursement
- Hitung PPh21 via tarif progresif (5%/15%/25%/30%/35%) dengan PTKP staff + surcharge tanpa NPWP
- Hitung BPJS kalau diaktifkan (Kes 1%/4%, Ket sesuai JHT/JKK/JKM/JP)
- Gaji bersih = kotor - potongan - telat - PPh21 - potongan BPJS
- Buat slip gaji dengan status Draft
Status run: Draft. Bisa di-review sebelum finalisasi.
- Periode unique per workspace, tidak bisa generate 2x periode sama. Kalau salah, delete run dulu (admin only) baru re-generate.
- Generate idempotent, overwrite slip kalau run yang sama re-trigger
- 5
Review draft slip per staff
Buka run yang baru di-generate → list semua payslip. Per slip kelihatan:
- Nama + foto staff
- Periode
- Gaji pokok
- Tunjangan / komponen tetap (expandable)
- Lembur, reimburse, potongan telat
- Taxable income breakdown
- PPh21 amount
- BPJS Kes / Ket deduction
- Net salary final (highlighted)
Click salah satu slip → detail view. Bisa edit manual kalau ada penyesuaian (mis. bonus ad-hoc, koreksi error). Edit di-track ke audit log: siapa edit, kapan, field apa yang berubah, alasan (text input wajib).
Validasi: net salary negatif → warning merah. Net salary kurang dari UMR provinsi (kalau diset) → warning kuning. Bisa di-flag tapi tidak block, judgment admin.
Edit slip = legal/HR sensitive. Audit log immutable, retention sesuai plan workspace. - 6
Finalisasi run (lock slip)
Selesai review semua slip + yakin dengan angkanya? Klik "Finalisasi Run". Yang terjadi:
- Status run: Draft → Finalized
- Semua slip dalam run: status → Finalized (read-only, gak bisa edit tanpa unlock)
- Tercatat di log audit: event finalisasi payroll dengan periode + total net + jumlah slip
- Notif push ke setiap staff: "Slip gaji Mei 2026 siap. Cek detail di SatuTim Absensi 💰"
- Notif dalam aplikasi ke setiap staff: tautan langsung ke slip gaji mereka
Staff buka aplikasi mobile (SatuTim Absensi) → menu "Slip Gaji" → daftar slip historis mereka. Tap slip → lihat detail breakdown + download PDF.
Finalisasi belum berarti dibayar. Belum ada uang yang ditransfer. Cuma mengunci data + memberi tahu staff.
- Re-open slip untuk edit pasca-finalisasi: butuh role workspace owner + alasan tertulis (audit log)
- 7
Export CSV bank untuk transfer
Run sudah finalized. Sekarang transfer uang ke staff. SatuTim tidak memproses pembayaran sendiri, tapi membuat file CSV format bank Indonesia yang bisa diupload massal ke internet banking corporate.
Buka detail run → Export Bank CSV → pilih format bank:
- BCA, format Auto Debet Massal (KlikBCA Bisnis)
- Mandiri, format Auto-Pay Mandiri Cash Management
- BNI, format BNI Direct
- BRI, format Cash Management BRI
- Permata, format Permata e-Business
- CIMB, format CIMB BizChannel
- Danamon, format Danamon Cash Management
- Other, generic CSV (recipient, amount, description) buat custom integration
Download file → login ke mobile/web banking corporate → upload massal → review summary (total amount, jumlah penerima) → execute transfer. Setiap bank punya quota harian, fee per transfer, dan SLA, cek dengan bank kamu.
File CSV juga include kolom email recipient, beberapa bank kirim notif e-receipt ke email tersebut.
CSV bank sensitive, berisi nomor rekening + nominal. Jangan share di chat tim biasa. Best practice: download via VPN/secure connection, hapus dari Downloads setelah upload. - 8
Tandai paid setelah transfer
Transfer udah jalan di bank. Balik ke SatuTim. Buka detail run → Tandai Dibayar. Yang terjadi:
- Status run: Finalized → Dibayar
- Semua slip: status → Dibayar, dengan tanggal pembayaran tercatat
- Tercatat di log audit: event pembayaran payroll dengan periode
Slip di mobile staff sekarang bertanda "✅ Dibayar 15 Mei 2026". Sebelumnya cuma "Siap" (Finalized).
Staff bisa download slip PDF kapan saja untuk:
- Pengajuan KPR (bank butuh slip 3 bulan terakhir)
- Pengajuan kartu kredit
- Reimburse dari kantor lain (tax purposes)
- Personal archive
Format PDF: kop workspace logo + nama + alamat, periode, breakdown lengkap (komponen, pajak, BPJS, net), watermark "TIDAK BERLAKU SEBAGAI SURAT KETERANGAN BANK" (compliance).
- 9
PPh21 calculator Indonesia (TER + progresif)
SatuTim implement PMK 168/2023, efektif Januari 2024, masih berlaku sampe 2026:
Bulanan (TER, Tarif Efektif Rata-Rata) untuk karyawan tetap dengan gaji teratur:
- Lookup di tabel TER berdasarkan PTKP status + gaji bulanan bracket
- Rates: 0% / 0.25% / 0.5% / ... / 34% (progressive monthly)
- Lebih sederhana dari PP 36/1983 era, gak perlu hitung PPh21 disetahunkan tiap bulan
Akhir tahun / SPT Tahunan:
- Recalc dengan progressive rate 5% / 15% / 25% / 30% / 35% atas PKP setahun
- Bayar selisih kalau TER bulanan kurang, refund kalau over
SatuTim auto-compute TER bulanan tiap generate run. Tahunan recap muncul di /payroll/reports/yearly (Phase 2, kalau belum aktif, manual export bulanan + sum).
Special case:
- Karyawan tanpa NPWP → tarif +20% (UU HPP Pasal 21)
- Karyawan kontrak/freelance → PPh21 final 2.5% kalau bukti potong
- Severance pay (pesangon) → tarif khusus tidak masuk monthly run
- PTKP single TK0 = 54jt/tahun (4.5jt/bulan). Income di bawah ini → PPh21 = 0
- Update PTKP kalau staff menikah / lahir anak, penghematan PPh signifikan
Pajak Indonesia rules berubah tiap tahun via PMK baru. SatuTim update implementation per release, cek release notes. Kalau ragu, konsultasi PB Indonesia (Pajak Bumi). - 10
BPJS Kesehatan + Ketenagakerjaan auto-compute
Dua sistem BPJS Indonesia, keduanya wajib untuk karyawan tetap (PKWTT):
BPJS Kesehatan (UU 24/2011):
- Iuran 5% dari gaji bulanan (capped basis Rp 12jt, penghasilan di atas dihitung sebagai 12jt)
- Pembagian: 4% employer + 1% employee
- Slip potong: 1% basis (mis. gaji 6jt → potongan 60rb)
- Auto-pay BPJS Kes via internet banking biasa
BPJS Ketenagakerjaan (UU 24/2011 + PP 86/2013):
- JHT (Jaminan Hari Tua), total 5.7%: 2% employee + 3.7% employer
- JKK (Jaminan Kecelakaan Kerja), 0.24% s/d 1.74% by risk class (low-risk office: 0.24%, factory: 1.74%), 100% employer
- JKM (Jaminan Kematian), 0.3%, 100% employer
- JP (Jaminan Pensiun), total 3%: 1% employee + 2% employer (capped basis Rp 9.55jt)
Slip potong total: 2% (JHT) + 1% (JP) = 3% dari basis BPJS staff. Employer-side dilaporkan tapi gak dipotong slip, bayar terpisah via auto-debit BPJS.
SatuTim punya toggle BPJS Kesehatan dan BPJS Ketenagakerjaan per profil, kontraktor / freelance biasanya dimatikan.
Self-employed / freelance daftar BPJS Kesehatan mandiri (kelas 1/2/3, flat fee). BPJS Ketenagakerjaan tidak wajib untuk freelance. Update profile sesuai status karyawan. - 11
Sinergi dengan plugin Absensi & HR Requests
Payroll lebih powerful kalau plugin lain juga aktif:
+ Absensi:
- Tarif denda telat per menit di konfigurasi Absensi → otomatis dipotong slip
- Mis. tarif Rp 500/menit, staff telat total 60 menit bulan ini → potongan Rp 30rb auto
- Tidak ada hitung ganda, Absensi cuma menghitung denda, Payroll yang membebankan ke slip
+ HR Requests (Lembur):
- Pengajuan lembur disetujui → nominalnya otomatis masuk ke Lembur di slip
- Pengajuan reimbursement disetujui → nominalnya otomatis masuk ke Reimbursement (non-taxable secara default)
- Pengajuan justifikasi keterlambatan disetujui → potongan telat dikecualikan dari slip
Workflow ideal akhir bulan:
- Tanggal 25: HR remind staff pending pengajuan lembur/reimburse, submit batas tgl 28
- Tanggal 29: admin approve/reject pengajuan, finalisasi attendance bulan
- Tanggal 30: generate payroll run (auto-include semua yang approved)
- Tanggal 1 berikutnya: finalize + transfer + mark paid
Kalau plugin Absensi/Overtime disable, generate run skip semua perhitungan terkait, fallback ke basic salary + komponen tetap.
- Workflow ini terdokumentasi di Knowledge Base internal HR, bisa di-customize per workspace
- 12
Multi-bank export & batch limit
Workspace dengan 50+ staff kemungkinan punya kombinasi bank: 30 di BCA, 15 di Mandiri, 5 di Bank lain. Export mendukung batch per-bank, pilih format bank di menu Export Bank CSV:
- Format BCA → CSV cuma berisi staff yang banknya BCA
- Format Mandiri → CSV cuma Mandiri
- Format Other → CSV generic (semua staff dengan bank lainnya)
Upload masing-masing ke internet banking bank-nya. Mandiri Cash Management punya quota 100 transfer/hari untuk Corporate Basic, pilah jadi 2 batch kalau lebih.
Format CSV per bank:
- BCA: kolom Account Number | Account Name | Amount | Description
- Mandiri: include Bank Code prefix (008 = BCA, 014 = BCA Syariah, etc. untuk transfer antar bank dari rekening Mandiri)
- BNI/BRI: format mirip dengan kolom tambahan untuk receipient bank code
Untuk transfer antar-bank (mis. dari rekening Mandiri perusahaan ke staff BCA), file CSV harus include bank code recipient, SatuTim auto-fill dari profile staff.
Beberapa bank charge fee per transfer (mis. Rp 6,500 transfer antar bank). Untuk hemat, payroll perusahaan idealnya pakai rekening yang sama dengan mayoritas staff, beda bank charge ke perusahaan, bukan staff. - 13
Compliance + audit log
Payroll = legal sensitive. SatuTim mencatat semua aktivitas ke log audit yang tidak bisa diubah:
- Profil gaji dibuat / diubah, siapa setup/edit profil, target user, field yang berubah
- Payroll di-generate, kapan run di-generate, oleh siapa, periode, total slip + total net
- Run difinalisasi
- Run ditandai dibayar
- Slip diedit manual, dengan rincian field yang berubah
- Slip dihitung ulang, pasca-edit profil retroaktif
Akses log audit: Pengaturan → Audit Log → filter kategori Payroll. Retensi sesuai plan workspace (30 hari Pro, 90 hari Business, unlimited Enterprise + SLA).
Why audit matters:
- Disputes dengan staff: "kenapa gaji bulan lalu kurang?" → cek audit log siapa edit slip
- Inspection pajak (Direktorat Jenderal Pajak): bisa minta history setoran PPh21, audit log proof of timeliness
- Inspection BPJS: sama, history setoran iuran proof of compliance
- Internal investigation: kalau ada suspicious payroll fraud (mis. ghost employee), audit log shows trail.
Export audit log CSV untuk arsip eksternal, beberapa company law / accounting policy require keep 5-10 tahun retention di physical storage. Plan workspace kasih digital retention; physical archive = compliance company.
- 14
Troubleshooting payroll
Masalah umum + fix:
"Belum ada profil gaji aktif" saat generate run:
→ Profile semua staff disable atau workspace belum setup. Cek /payroll/profil, toggle aktif ON minimal 1 staff."Payroll periode ini sudah pernah di-generate":
→ Run untuk periode itu sudah ada. Buka existing run, delete dulu (admin only) baru re-generate. Atau edit slip yang sudah ada (kalau status masih draft).Net salary minus (negative):
→ Komponen pemotong (sub) terlalu besar, atau salah satu of: lateness deduction terlalu besar, PPh21 lebih besar dari gross. Solusi: cek profile, kurangi potongan, atau adjust tarif denda di Absensi config.PPh21 jadi sangat besar:
→ Cek PTKP status, TK0 (single) lebih besar pajaknya daripada K3 (kawin 3 anak). Pastikan PTKP benar.
→ Cek NPWP, kalau NULL/empty, +20% surcharge. Update profile dengan NPWP.BPJS deduction tidak muncul di slip:
→ Opsi BPJS Kesehatan / Ketenagakerjaan di profile masih off. Toggle ON di profile staff.Export CSV bank gak include staff X:
→ Profile X belum diisi nomor rekening. Update profile dengan rekening valid. Atau staff X di-export ke format "other" terpisah.Slip belum sampai ke staff (PWA):
→ Cek push notif permission di device staff. Kalau gak izinkan, slip tetap accessible via web, buka /payslips manual.Lembur approved tapi gak masuk slip:
→ Pastikan tanggal mulai lembur dalam rentang periode payroll. Lembur tanggal 5 Juni gak masuk run Mei.Lateness deduction = 0 padahal staff sering telat:
→ Cek tarif denda per menit di /absensi/admin → Konfigurasi, kalau 0, gak ada potongan finansial. Set tarif aktif buat compute.Masih bingung? /support/new dengan: screenshot slip, run ID, periode, expected vs actual.