If you freelance in Indonesia and invoice a company (PT, CV, yayasan), you have probably had this experience: you bill Rp10,000,000, and Rp9,800,000 lands in your account. Nobody stole from you. The client withheld PPh 23 and, in theory, paid it to the tax office on your behalf.

The problem is not the 2%. The problem is what happens next: most freelancers never collect the bukti potong (withholding slip), never claim the credit on their annual SPT, and effectively pay that tax twice. Over a year of corporate clients that is real money.

This post is the mental model I wish someone had given me, plus the spreadsheet structure I use to keep it straight. Not tax advice; verify rates with your consultant or pajak.go.id.

The four situations you will meet

1. Individual or foreign client → no withholding. Ibu Sari paying for her wedding photos, or a Singapore startup paying you via Wise, does not withhold anything. You receive the full invoice amount and handle your own tax later.

2. Indonesian company client, you have an NPWP → PPh 23 at 2%. Services (jasa) billed to a badan usaha are subject to Article 23 withholding. The client deducts 2% of the DPP (the service value before VAT) and must give you a bukti potong. That slip is a tax credit: it reduces what you owe when you file your SPT Tahunan.

3. Same, but you have no NPWP → 4%. The rate doubles. Getting an NPWP (or using your NIK, which now functions as one) is the single highest-ROI piece of admin a freelancer can do.

4. Client treats you as a "non-employee individual" → PPh 21. Some companies run freelancer payments through PPh 21 instead of 23. The common computation is 50% of gross × the Article 17 bracket (5% on the first tier), so about 2.5% effective, rising as your cumulative payments from that client cross bracket thresholds. Ask the client's finance team which article they apply; it changes which slip you get.

Separately, if you have opted into the final 0.5% UMKM scheme (PP 55/2022, turnover under Rp4.8 billion), that is something you deposit yourself monthly on gross turnover. It is not withheld by clients, so it does not reduce the cash on your invoice — but it does need to show up in your bookkeeping as a liability.

And then there is VAT

If you are a PKP (registered for VAT), you add PPN on top of the DPP. The effective rate most freelancers apply in 2025–2026 is 11% (the nominal 12% with a reduced base). If you are not PKP, you do not charge PPN at all — do not add it "just to be safe", that creates problems for your client.

The cash math on one invoice

Take a Rp25,000,000 video project for a PT, you have an NPWP, you are not PKP:

DPP (service value) 25,000,000 PPN (not PKP) 0 Total invoice 25,000,000 PPh 23 withheld (2%) -500,000 Cash you receive 24,500,000 Tax credit you must claim 500,000 ← needs the bukti potong 

If you never claim that Rp500,000, you donated it.

What your tracker needs, minimum

I tried doing this in a notes app, then in a plain invoice list. Neither survived a year. The structure that actually works has five parts:

  1. An invoice register where each row records DPP, the withholding type (none / PPh 23 2% / PPh 23 4% / PPh 21), and computes PPh, PPN, total billed, and net cash expected. Net cash expected is the number you reconcile against your bank statement — not the invoice total.
  2. A due-date and days-late column. Corporate clients pay on their schedule, not yours. You want to see "14 days late" without doing date arithmetic in your head.
  3. A bukti potong checklist: one line per invoice that had withholding, with a yes/no "slip received". Chase these quarterly, not in March when the SPT is due and the finance person who handled your invoice has left.
  4. A monthly dashboard: gross turnover, total PPh withheld (your credit), PPN collected (your liability if PKP), receivables outstanding, and if you are on the 0.5% scheme, the amount to deposit. Also a running "turnover vs Rp4.8 billion" bar, because crossing it changes your regime.
  5. A printable invoice that pulls from the register, so you never retype amounts and the withholding note is printed on the document ("Dipotong PPh 23 2% oleh pemberi kerja" — it reminds the client to issue the slip).

Everything should key off a settings block with the rates in editable cells. Rates change; your formulas should not.

If you want the spreadsheet already built

I packaged exactly this structure as an Excel workbook: 300-row invoice register, client database with per-client default withholding, printable invoice sheet, monthly dashboard with KPIs, bukti potong checklist, and a settings sheet where every rate is editable. Bilingual Indonesian/English, no macros, works in Excel 2016+, LibreOffice, and Google Sheets import. All formulas are open, so you can inspect or change anything.

It is $9 on Gumroad: Freelancer Indonesia — Invoice & Pajak Tracker 2026

If you would rather build your own, the five-part structure above is the whole design — take it.

Three habits that matter more than the tool

  • Put your NPWP/NIK on every invoice to a company. No NPWP on the invoice is how you end up at 4%.
  • Ask for the bukti potong in the same email where you confirm receipt of payment. Finance teams respond to "thank you, payment received, could you send the bukti potong PPh 23 for invoice INV-2026-004" far better than to a cold request three months later.
  • Reconcile monthly against net cash, not invoice totals. Every unexplained gap between the two is either a withholding you forgot or a client who short-paid.

Questions about a specific setup (PKP vs non-PKP, PPh 21 vs 23 from the same client) are welcome in the comments; I will answer what I can and say so when it needs a consultant.