Set up PPN so the numbers reconcile
Start with accounts, not templates. You need PPN Keluaran and PPN Masukan as separate liability and asset accounts, plus a third for input VAT that cannot be credited, because mixing them is how a reconciliation becomes archaeology. Then build Sales Taxes and Charges Templates and Purchase Taxes and Charges Templates that post into them, and Item Tax Templates for anything zero-rated, exempt, or treated differently.
One more setup decision: item-level versus document-level tax. Item Tax Templates are the right answer when a single invoice mixes standard-rated and exempt goods, which happens more often than clients expect — freight, packaging, and certain agricultural products all behave differently. Deciding this after a thousand invoices have been posted means editing a thousand invoices.
The 12 percent rate combined with the DPP Nilai Lain mechanism at eleven-twelfths of the selling price produces an effective 11 percent for most goods and services. You can configure that as a 12 percent rate on an adjusted base or as an effective 11 percent on the full base. Both are arithmetically identical; pick one, document which, and make sure the faktur print format shows the DPP the way DJP expects to see it.
Then fix rounding before you post anything at all. Tax invoices are expressed in whole rupiah while ERPNext defaults to two decimal places. Set currency precision appropriately for an IDR company, configure the Round Off account, and test with a five-line invoice full of awkward unit prices. Half a rupiah per line across 3.000 invoices a month accumulates into a variance somebody eventually has to explain.
PPh 23 and PPh 21 without spreadsheets
PPh 23 withholding on services is 2 percent of DPP where the vendor holds an NPWP and 4 percent where they do not. ERPNext handles this through Tax Withholding Category applied at supplier level, with thresholds and a cumulative option for annual limits. The critical detail is the posting: withholding must credit a Hutang PPh 23 liability account rather than reduce the expense, or your GL and your bukti potong will never agree.
- Set the withholding category on the Supplier record so it applies automatically rather than from memory
- Use the cumulative threshold option wherever the regulation applies a limit across the year
- Confirm the treatment for vendors without an NPWP before the first payment run, not after it
- Reconcile the withholding liability account against the bukti potong register every single month
PPh 21 belongs in payroll rather than accounts payable. ERPNext HR supports income tax slabs, but the TER method for monthly withholding needs a slab structure per category plus the December recalculation. Keep PTKP status as a field on the employee alongside BPJS Kesehatan and Ketenagakerjaan settings, with employer and employee portions separated and the applicable ceilings configured, or the annual reconciliation will not land.
e-Faktur and the Coretax transition
Coretax replaced the older DJP applications and changed several assumptions along the way. The sixteen-digit NPWP, NITKU identifiers per place of business, and a different upload layout all affect your configuration. Add custom fields for the faktur pajak serial number, NITKU per branch, and the buyer’s tax identity, then validate uniqueness on the serial so the same number cannot be issued twice by two users on the same afternoon.
Number series management stays genuinely manual. NSFP ranges are allocated to you rather than generated by your ERP, so build a small tracker: allocated range, used, remaining, and an alert when fewer than a hundred numbers are left. Running out of faktur numbers mid-month stops invoicing completely, and requesting a new range is not instant.
e-Bupot Unifikasi and monthly reconciliation
e-Bupot Unifikasi covers PPh 23, 26, and final 4(2) withholding in one monthly submission. Generate the source data from the withholding entries ERPNext already created, export it in the required layout, and reconcile the total against the liability account before submitting. When the two disagree, the difference is almost always a manual journal entry somebody posted straight to the tax account to fix something last month.
- Lock the tax liability accounts against manual journal entries except for one named finance role
- Reconcile PPN Keluaran, PPN Masukan, and every withholding account monthly, never quarterly
- Keep the SPT reconciliation as a saved report in ERPNext so anyone can rerun it on demand
- Archive submitted files and receipts against the period inside the system, not on a shared drive
The pitfalls we see most
The recurring pitfalls are boringly consistent. Tax invoice date diverging from posting date because somebody backdated a document. Credit notes issued without deciding whether the situation calls for a retur or a faktur pengganti. Non-creditable input VAT sitting quietly in the creditable account. Multi-branch companies putting one NITKU on every invoice. And most often, twelve months of small rounding differences nobody reconciled because month one looked fine.
Assign the reconciliation to finance rather than to IT. The person who files the SPT should be the person who runs the report, because they are the only one who will notice that a number looks wrong. Handing tax reconciliation to a systems team turns an accounting control into a data-matching exercise, and data-matching exercises always agree with themselves.
The fix for all of them is identical: reconcile monthly, inside the system, against the filed SPT, with a named owner. Twenty minutes a month prevents the three-week exercise that arrives with an audit letter, when the control account has drifted by an amount nobody can decompose and the person who posted the adjustment left in March.
