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. 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, JKM, JP 1%/2%). JKK dihitung tetap 0,54% (kelas risiko rendah) untuk semua karyawan; kelas risiko belum bisa diatur.

    Alur standar ini dikerjakan pemilik (owner) workspace tiap akhir bulan — di aplikasi, tab Profil gaji dan Generate hanya muncul untuk owner; anggota lain cuma melihat tab Slip saya:

    1. Setup profil gaji per karyawan (sekali, update kalau ada perubahan kontrak)
    2. Generate Payroll Run untuk periode YYYY-MM
    3. Cek draft slip per orang (slip tidak bisa diedit langsung; kalau ada yang salah, perbaiki profil gaji/datanya, hapus run yang masih Draft, lalu Generate ulang)
    4. Finalisasi (slip terkunci permanen, tidak bisa diubah atau dihapus lagi)
    5. Export CSV bank → upload ke mobile banking BCA / internet banking corporate
    6. Tandai paid setelah transfer berhasil

    Aktifkan lewat Menu Lainnya → Plugin → Kelola Plugin, lalu nyalakan toggle Payroll (hanya pemilik/owner workspace yang bisa). Setelah aktif, menu Payroll muncul di grup Plugin.

    • Plugin Payroll bisa diaktifkan di semua paket, termasuk Free.
    • Standalone, tidak butuh plugin Absensi untuk berfungsi, tapi sinergi jelas (Absensi → potong telat otomatis ke slip)
  2. 2

    Setup profil gaji per karyawan

    Sebelum generate payroll, setiap karyawan butuh profil gaji aktif. Buka Menu Lainnya → Plugin → Payroll, pilih tab Profil gaji. Klik nama karyawan untuk Edit profil, atau klik Tambah profil lalu pilih Karyawan (anggota workspace):

    • Tipe karyawan: tetap (PKWTT) / kontrak (PKWT) / harian / freelance
    • Gaji pokok bulanan (rupiah, integer, mis. 5000000 = 5jt)
    • Hari kerja per bulan (default 22) tidak ada di form — hanya bisa diisi lewat Import CSV (kolom workday_per_bulan). Angka ini dipakai untuk tarif harian potongan izin tanpa bayar; gaji pokok tidak di-pro-rata untuk bulan masuk/keluar.
    • 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.XXX atau 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 (tunjangan / potongan): klik + Tambah komponen, isi nama dan nominal, pilih + Tambah (tunjangan) atau − Potong (potongan), lalu Kena pajak atau Non pajak. Contoh:
    • Tunjangan Transport 500000 · + Tambah · Kena pajak
    • Tunjangan Makan 500000 · + Tambah · Non pajak (kalau natura/disediakan kantor)
    • Potongan Pinjaman 200000 · − Potong
    • BPJS belum bisa diatur dari form profil. Aktifkan lewat Import CSV: isi kolom bpjs_kesehatan / bpjs_ketenagakerjaan = ya (nomornya di bpjs_kes_number / bpjs_ket_number) dan pilih mode Update profil yang sudah ada. Kalau aktif, gaji dipotong 1% BPJS Kesehatan (dasar gaji pokok + tunjangan kena pajak, maks. Rp12 juta) serta JHT 2% + JP 1%. Catatan: menyimpan profil lewat form saat ini ikut mematikan BPJS lagi, jadi impor ulang CSV setelah mengedit profil.
    • Tidak ada toggle aktif/nonaktif di form. Status aktif hanya bisa diubah lewat Import CSV (kolom is_active = ya/tidak); profil nonaktif dilewati saat Generate.

    Click Simpan.

    • Punya 20+ karyawan? Pakai bulk import CSV (step berikutnya), gak perlu input satu-per-satu.
    Sekali setup, profile re-use tiap bulan. Setiap simpan profil tercatat di **Audit Trail** (siapa, karyawan mana, gaji pokok/PTKP/jenis karyawan yang baru — nilai lama tidak disimpan). Audit Trail hanya tersedia di paket Business.
  3. 3

    Bulk import karyawan via CSV

    Punya banyak karyawan (10+)? Gak usah input satu-per-satu. Buka Menu Lainnya → Plugin → Payroll → tab Profil gaji, lalu klik Import CSV (di sebelah tombol Tambah profil).

    Step 1, Download template
    Klik tombol "Download template" di dialog. File template-import-karyawan.csv ke-download. Berisi 3 contoh baris (Andi, Sari, Budi) sebagai panduan format.

    Kolom yang didukung:

    • email (WAJIB), harus match anggota workspace yang sudah ada
    • nama_lengkap (opsional, info aja)
    • tipe_karyawan, tetap / kontrak / harian / freelance (default tetap)
    • gaji_pokok (WAJIB), integer, boleh format 5.000.000 atau Rp 5000000, akan auto-parse
    • workday_per_bulan, 1-31 (default 22)
    • ptkp_status: TK0/TK1/TK2/TK3/K0/K1/K2/K3 (kalau kosong otomatis dianggap TK0, jadi sebaiknya selalu diisi)
    • npwp, string, boleh empty
    • bank_code, bca / mandiri / bni / bri / permata / cimb / danamon / other
    • bank_account_no, bank_account_name, string
    • bpjs_kesehatan, bpjs_ketenagakerjaan, ya / tidak / true / false / 1 / 0
    • bpjs_kes_number, bpjs_ket_number, string
    • is_active, ya / tidak (default ya)

    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, misalnya: Email "…" tidak valid, PTKP "K4" invalid (pakai: TK0, TK1, TK2, TK3, K0, K1, K2, K3), Email "…" belum jadi anggota workspace — invite dulu sebelum import payroll)
    • 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. Undang mereka dulu lewat menu **Tim** → pilih timnya → tombol **Undang**, baru 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. 4

    Generate Payroll Run untuk periode

    Setelah profil semua staff siap, generate run. Buka Payroll → tab Generate. Pilih bulan dan tahun, klik Generate, lalu konfirmasi Generate di dialog. Kamu langsung dibawa ke detail run.

    Sistem proses (~3-10 detik per 50 staff):

    1. Ambil semua profil gaji aktif di workspace
    2. Per staff: ambil gaji pokok + komponen tetap dari profil
    3. Lembur: kalau plugin Absensi Online aktif, lembur dihitung dari menit lembur di catatan absensi × aturan lembur di Absensi Online → Pengaturan (pengali, hari libur/akhir pekan, batas mingguan); nominal pengajuan lembur diabaikan. Kalau Absensi tidak aktif tapi plugin Hitung Lembur & Keterlambatan aktif, nominal pengajuan lembur yang disetujui (tanggal mulainya di periode itu) masuk ke Lembur.
    4. Kalau plugin Lembur aktif: tarik reimbursement yang disetujui → tambah ke Reimbursement
    5. Kalau plugin Absensi aktif + tarif denda telat > 0: hitung total menit telat dalam periode × tarif → potongan telat
    6. Hitung penghasilan kena pajak bulanan = gaji pokok + tunjangan taxable + lembur
    7. Hitung gaji kotor = taxable + non-taxable + reimbursement
    8. Hitung PPh21 metode TER (PMK 168/2023): Januari–November = bruto bulanan (termasuk premi JKK, JKM, dan BPJS Kesehatan bagian perusahaan) × tarif TER sesuai kategori PTKP (+20% kalau tanpa NPWP). Di slip Desember dihitung ulang setahun dengan tarif progresif 5–35%; kelebihan potong dikembalikan di slip itu.
    9. Hitung BPJS kalau diaktifkan (Kes 1%/4%, Ket sesuai JHT/JKK/JKM/JP)
    10. Gaji bersih = bruto − potongan komponen − potongan telat − potongan izin tanpa bayar − PPh21 − potongan BPJS karyawan (+ pengembalian kelebihan PPh21 di slip Desember)
    11. Buat slip gaji dengan status Draft

    Status run: Draft. Bisa di-review sebelum finalisasi.

    • Satu periode cuma bisa di-generate sekali. Kalau salah dan run masih **Draft**, buka detail run → **Hapus**, lalu Generate ulang. Run yang sudah **Difinalisasi** atau **Dibayar** tidak bisa dihapus.
    • Generate ulang periode yang sama tidak menimpa slip; sistem menolak dengan pesan "Payroll periode … sudah pernah di-generate". Hapus dulu run Draft-nya kalau mau hitung ulang.
  5. 5

    Review draft slip per staff

    Buka run yang baru di-generate → list semua payslip. Di detail run terlihat daftar slip: nama, PPh21, dan gaji bersih.

    Click salah satu slip → detail view. Rinciannya: Gaji pokok, tiap komponen tetap, Lembur (plus rincian lembur), Reimbursement, Potongan telat, Potongan izin tanpa bayar (kalau ada), PPh21, Bruto, dan Netto. Potongan BPJS belum tampil sebagai baris tersendiri, tapi sudah ikut mengurangi Netto. Slip tidak bisa diedit manual. Untuk bonus ad-hoc atau koreksi: hapus run yang masih Draft (detail run → Hapus), tambah/ubah komponen di profil gaji (mis. Bonus · + Tambah), lalu Generate ulang.

    Belum ada peringatan otomatis untuk gaji bersih minus atau di bawah UMR — cek angka Netto tiap slip sebelum finalisasi.

    Edit slip = legal/HR sensitive. Catatan audit tidak bisa diedit, disimpan 1 tahun (semua paket), dan hanya bisa dilihat di **Audit Trail** pada paket Business.
  6. 6

    Finalisasi run (lock slip)

    Selesai review semua slip + yakin dengan angkanya? Klik Finalisasi di detail run, lalu konfirmasi Finalisasi. Yang terjadi:

    1. Status run: Draft → Finalized
    2. Semua slip dalam run: status → Finalized (read-only, gak bisa edit tanpa unlock)
    3. Tercatat di Audit Trail: finalisasi payroll beserta periode dan jumlah slip
    4. Notif push ke setiap staff: "Slip gaji Mei 2026 siap. Cek detail di SatuTim Absensi 💰"
    5. 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.

    • Run yang sudah difinalisasi tidak bisa dibuka lagi, diedit, atau dihapus — pastikan semua angka benar sebelum klik **Finalisasi**.
  7. 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.

    Di detail run, pilih bank di dropdown (BCA/MANDIRI/BNI/BRI/PERMATA/CIMB/DANAMON/OTHER), lalu klik Export bank. File payroll-<periode>-<bank>.csv akan terunduh.

    • BCA, format Auto Debet Massal (KlikBCA Bisnis)
    • Mandiri, format Auto-Pay Mandiri Cash Management
    • BNI, format BNI Direct
    • BRI, format Cash Management BRI
    • Permata, CIMB, Danamon: file CSV umum (account_no, account_name, amount, description, email) — sesuaikan kolomnya dengan template bank kamu
    • 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.

    Kolom email penerima hanya ada di format BCA dan format umum (Permata/CIMB/Danamon/Other), 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. 8

    Tandai paid setelah transfer

    Transfer udah jalan di bank. Balik ke SatuTim. Buka detail run → Tandai Dibayar. Yang terjadi:

    1. Status run: Finalized → Dibayar
    2. Semua slip: status → Dibayar, dengan tanggal pembayaran tercatat
    3. Tercatat di log audit: event pembayaran payroll dengan periode

    Di aplikasi absensi, status slip berubah jadi Dibayar (sebelumnya Difinalisasi).

    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

    Isi PDF: nama workspace, periode, nama karyawan, status PTKP, NPWP, jenis karyawan, rincian PENDAPATAN dan POTONGAN (komponen, lembur, reimbursement, potongan telat/izin, PPh21), GAJI BERSIH, rekening tujuan, dan catatan "Slip ini di-generate otomatis dan sah tanpa tanda tangan basah." Belum ada logo, alamat, watermark, maupun baris BPJS.

  9. 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. Belum ada halaman rekap tahunan. Rekonsiliasi setahun otomatis dihitung di slip Desember; untuk rekap, unduh Excel di tiap detail run lalu jumlahkan.

    Special case:

    • Karyawan tanpa NPWP → tarif +20% (UU HPP Pasal 21)
    • SatuTim menghitung PPh21 semua jenis karyawan (tetap, kontrak, harian, freelance) dengan metode TER pegawai tetap. Skema pajak lain (mis. bukan pegawai) belum didukung — hitung terpisah kalau perlu.
    • 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 menyesuaikan perhitungan lewat pembaruan aplikasi. Kalau ragu, konsultasikan dengan konsultan pajak.
  10. 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), ditanggung perusahaan. Tarif resminya 0,24%–1,74% sesuai kelas risiko, tapi SatuTim saat ini selalu memakai 0,54% (risiko rendah)
    • JKM (Jaminan Kematian), 0.3%, 100% employer
    • JP (Jaminan Pensiun), total 3%: 1% employee + 2% employer (dasar upah maksimal Rp11.086.300, berlaku mulai Maret 2026; batas ini naik tiap Maret dan otomatis mengikuti periode gaji)

    Slip potong total: 2% (JHT) + 1% (JP) = 3% dari basis BPJS staff. Iuran bagian perusahaan dihitung dan disimpan sistem (juga dipakai untuk dasar PPh21), tidak dipotong dari slip, dan belum ditampilkan di slip atau laporan mana pun; bayar terpisah via auto-debit BPJS.

    BPJS per karyawan diatur lewat Import CSV (kolom bpjs_kesehatan dan bpjs_ketenagakerjaan: ya/tidak) — belum ada toggle di form profil. Untuk kontraktor/freelance isi tidak.

    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. 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 yang disetujui masuk ke Lembur hanya kalau plugin Absensi Online tidak aktif. Kalau Absensi aktif, Lembur dihitung dari menit lembur di catatan absensi (aturan lembur di Absensi Online → Pengaturan)
    • 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:

    1. Tanggal 25: HR remind staff pending pengajuan lembur/reimburse, submit batas tgl 28
    2. Tanggal 29: admin approve/reject pengajuan, finalisasi attendance bulan
    3. Tanggal 30: generate payroll run (auto-include semua yang approved)
    4. Tanggal 1 berikutnya: finalize + transfer + mark paid

    Kalau plugin Absensi/Overtime disable, generate run skip semua perhitungan terkait, fallback ke basic salary + komponen tetap.

    • Alur di atas hanya contoh. Kalau mau dijadikan SOP tim, tulis sendiri di menu **Docs**.
  12. 12

    Multi-bank export & batch limit

    Workspace dengan 50+ staff kemungkinan punya kombinasi bank: 30 di BCA, 15 di Mandiri, 5 di Bank lain. Pilihan format hanya mengubah susunan kolom. Setiap file berisi semua karyawan di run yang punya nomor rekening, apa pun bank-nya — kalau perlu file per bank, pisahkan barisnya di Excel sebelum upload.

    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.

    Kolom tiap format:

    • BCA: No Rekening, Nama Penerima, Nominal, Berita, Email
    • Mandiri: rekening, nama, nominal, keterangan (dipisah tanda garis tegak, tanpa header)
    • BNI: BENEFICIARY_ACCOUNT, BENEFICIARY_NAME, AMOUNT, REMARK
    • BRI: NoRekening, NamaPenerima, Jumlah, Keterangan

    File export belum menyertakan kode bank penerima. Untuk transfer antar-bank, tambahkan kode bank sendiri sesuai template bank kamu.

    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. 13

    Compliance + audit log

    Payroll = legal sensitive. SatuTim mencatat semua aktivitas ke log audit yang tidak bisa diubah:

    • Profil gaji dibuat/diubah: siapa, karyawan mana, serta gaji pokok/PTKP/jenis karyawan terbaru; impor CSV tercatat sebagai ringkasan jumlah baris
    • Payroll di-generate, kapan run di-generate, oleh siapa, periode, total slip + total net
    • Run difinalisasi
    • Run ditandai dibayar

    Akses log audit: buka Pengaturan → Fitur Business → Audit Trail (paket Business, owner/admin). Ketik payroll di kotak Cari aktivitas... untuk menyaring 50 aktivitas terbaru; untuk riwayat lebih lama pakai Export CSV. Audit Trail menyimpan catatan selama 1 tahun (lalu terhapus otomatis) dan hanya tersedia di paket Business.

    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. 14

    Troubleshooting payroll

    Masalah umum + fix:

    "Belum ada profil gaji aktif" saat generate run:
    → Profile semua staff disable atau workspace belum setup. Pastikan minimal satu karyawan sudah punya profil di Payroll → tab Profil gaji. Profil yang dinonaktifkan lewat CSV (is_active = tidak) diaktifkan lagi dengan impor ulang is_active = ya.

    "Payroll periode ini sudah pernah di-generate":
    → Run untuk periode itu sudah ada. Buka run periode itu: kalau masih Draft, klik Hapus lalu Generate ulang. Kalau sudah Difinalisasi/Dibayar, run tidak bisa dihapus atau diubah.

    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:
    → Potongan BPJS memang tidak tampil sebagai baris di slip/PDF, tapi sudah mengurangi Netto. Kalau Netto belum terpotong BPJS, aktifkan lewat Import CSV (bpjs_kesehatan/bpjs_ketenagakerjaan = ya, mode Update profil yang sudah ada), lalu hapus run Draft dan Generate ulang.

    Export CSV bank gak include staff X:
    → Pastikan No rekening di profil X terisi; karyawan tanpa nomor rekening tidak ikut di file export format apa pun.

    Slip belum sampai ke staff (PWA):
    → Cek push notif permission di device staff. Kalau gak izinkan, slip tetap bisa dibuka tanpa notifikasi: di web lewat Menu Lainnya → Plugin → Payroll → tab Slip saya, atau di aplikasi absensi (attendance.satutim.id) menu Slip Gaji.

    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 Menu Lainnya → Plugin → Absensi Online → tab Pengaturan → Potongan telat (Rp/menit), kalau 0, gak ada potongan finansial. Set tarif aktif buat compute.

    Masih bingung? /support/new dengan: screenshot slip, run ID, periode, expected vs actual.