<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aan Chen</title>
    <description>The latest articles on DEV Community by Aan Chen (@signcrypt).</description>
    <link>https://dev.to/signcrypt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4219280%2Ffd211063-b8a7-45c1-84d0-585abfd2e3b3.jpeg</url>
      <title>DEV Community: Aan Chen</title>
      <link>https://dev.to/signcrypt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/signcrypt"/>
    <language>en</language>
    <item>
      <title>The 11 contract clauses every Indonesian wedding photographer needs (and how to make the numbers agree)</title>
      <dc:creator>Aan Chen</dc:creator>
      <pubDate>Sat, 31 Oct 2026 23:27:32 +0000</pubDate>
      <link>https://dev.to/signcrypt/the-11-contract-clauses-every-indonesian-wedding-photographer-needs-and-how-to-make-the-numbers-a4d</link>
      <guid>https://dev.to/signcrypt/the-11-contract-clauses-every-indonesian-wedding-photographer-needs-and-how-to-make-the-numbers-a4d</guid>
      <description>&lt;p&gt;Most freelance wedding photographers and videographers in Indonesia still close deals in a WhatsApp thread: a screenshot of the pricelist, a "DP 30% ya kak", and a bank transfer. It works right up until the wedding is postponed, the client wants the RAW files, or the second photographer gets sick. Then there is nothing to point at.&lt;/p&gt;

&lt;p&gt;I spent this week turning the disputes I have seen (and a few I have been part of) into a plain-language contract template and a quotation workbook. This post is the thinking behind it: which clauses actually prevent fights, what the Indonesian legal hooks are, and how to make the numbers in your quotation, payment schedule and contract agree with each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a one-page "terms" screenshot is not enough
&lt;/h2&gt;

&lt;p&gt;A contract in Indonesia does not need a notary, a lawyer, or even stamp duty to be valid. Article 1320 of the Civil Code (KUHPerdata) asks for four things: agreement, capacity, a specific object, and a lawful cause. A WhatsApp exchange can meet all four.&lt;/p&gt;

&lt;p&gt;The problem is not validity, it is &lt;em&gt;specificity&lt;/em&gt;. "Paket full day" means ten hours to you and "until the last guest leaves" to the client. A contract earns its keep by writing down the twelve things people later remember differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 11 clauses, and the fight each one prevents
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Parties.&lt;/strong&gt; Full names, NIK (ID number), address, WhatsApp. For a couple, get both signatures or a simple power of attorney. The fight this prevents: "I never agreed to that, my fiancé did."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Scope.&lt;/strong&gt; Copy the quotation line by line: item codes, quantities, hours, number of crew. Then add a sentence saying anything not listed is not included. The fight: "I thought the drone was part of the package."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Date, venue, rundown deadline.&lt;/strong&gt; Put the start and end time in the contract and require the final rundown and shot list by H-7. The fight: "You missed the ring exchange" — when the rundown moved it and nobody told you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Price, tax status, payment schedule.&lt;/strong&gt; State whether you are a PKP (VAT-registered) vendor. In 2026 the general PPN rate is still 11%; the 12% rate applies only to luxury goods. Most solo vendors are &lt;em&gt;not&lt;/em&gt; PKP and must not charge PPN at all. Then a table: DP 30% at signing, 40% at H-30, 30% at H-7. The fight: "I'll pay the rest after I see the photos."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Late payment.&lt;/strong&gt; A small daily penalty (0.1% is common) capped at 5%, plus the right to not show up if the balance is unpaid at H-1. You will almost never enforce the penalty; its job is to make the H-1 rule credible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Cancellation by the client.&lt;/strong&gt; The DP is non-refundable because you blocked the date. Cancellation inside 30 days owes up to the second instalment. Spell out the refund percentage after full payment. The fight: every cancellation, ever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Rescheduling.&lt;/strong&gt; One reschedule, 30 days' notice, a fee (10% is typical), subject to availability, new date within 12 months, pricelist increases are on the client. Pandemic-era postponements taught everyone why this clause exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Force majeure.&lt;/strong&gt; Disaster, epidemic, government policy, riots. Obligations pause, no reschedule fee, but costs already spent (rentals, travel, third-party vendors) are not refunded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Deliverables and revisions.&lt;/strong&gt; Exact counts and formats: "900+ edited JPGs, one 25×35 cm album with 30 pages, one 5–7 minute 1080p highlight film, delivered via download link within 45 working days of the event, after full payment." Two rounds of minor revisions inside 14 days. State how long you keep RAW files (6 months) and that RAW is not included unless bought.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Copyright and portfolio.&lt;/strong&gt; Under Law 28/2014 on Copyright, the photographer is the creator and owns the copyright. The client gets a perpetual, non-exclusive licence for personal use. Ask permission to post the work as portfolio, offer an explicit opt-out, and promise not to publish anything beyond first names. Clients who are asked rarely object; clients who are not asked sometimes do, loudly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Liability cap and disputes.&lt;/strong&gt; If a card fails, you compensate proportionally for the lost part, and total liability never exceeds what the client paid. Disputes go to musyawarah for 30 days, then the district court where the vendor is domiciled.&lt;/p&gt;

&lt;p&gt;Then the signature block. Stamp duty (meterai Rp10,000 under Law 10/2020) is only needed to use the document as evidence in court, not for validity, so one physical or e-meterai on the client's signature is enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the numbers agree
&lt;/h2&gt;

&lt;p&gt;The most common inconsistency I see is not legal, it is arithmetic. The quotation says DP 30%, the chat says "DP dulu 5 juta", and the contract says 40%. Three documents, three numbers.&lt;/p&gt;

&lt;p&gt;The fix is to have one place where the percentages live and let everything else read from it. In a spreadsheet that looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mulai!B19  = 30%   (DP)
Mulai!B20  = 40%   (second instalment)
Mulai!B21  = 1 - B19 - B20   (balance, computed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then the quotation's terms line is a formula, not typed text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;="DP "&amp;amp;TEXT(Mulai!B19,"0%")&amp;amp;" saat booking, "
 &amp;amp;TEXT(Mulai!B20,"0%")&amp;amp;" H-"&amp;amp;Mulai!B23&amp;amp;", pelunasan "
 &amp;amp;TEXT(Mulai!B21,"0%")&amp;amp;" H-"&amp;amp;Mulai!B24&amp;amp;"."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payment schedule does the same for dates. If the event is in &lt;code&gt;B5&lt;/code&gt; and the second instalment is due 30 days before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(B5="","",B5-Mulai!B23)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the status column decides what to chase today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(D9=0,"-",IF(F9&amp;gt;=D9,"LUNAS",
  IF(AND(E9&amp;lt;&amp;gt;"",TODAY()&amp;gt;E9),"TERLAMBAT",
  IF(F9&amp;gt;0,"SEBAGIAN","BELUM"))))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two more things worth stealing even if you build your own sheet. Guard the VAT line so non-PKP vendors can never accidentally add it: &lt;code&gt;=IF(Mulai!$B$17="Ya",ROUND(subtotal*rate,0),0)&lt;/code&gt;. And make the quotation pull item names and prices from a pricelist by code with &lt;code&gt;INDEX/MATCH&lt;/code&gt;, so you cannot quote last year's price:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(INDEX(Pricelist!$E$5:$E$64,
   MATCH(A13,Pricelist!$A$5:$A$64,0)),0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The template, if you don't want to build it
&lt;/h2&gt;

&lt;p&gt;I packaged all of this as &lt;a href="https://libertybound0.gumroad.com/l/wedding-vendor-pack" rel="noopener noreferrer"&gt;Wedding Vendor Indonesia — Penawaran &amp;amp; Kontrak Pack 2026&lt;/a&gt;: a seven-sheet Excel workbook (pricelist, auto quotation, payment schedule, receipt, client tracker with monthly revenue, contract checklist) plus the 11-clause contract and a handover report as a Word file, all in Bahasa Indonesia with the fill-in fields highlighted. It is USD 9 and has no macros.&lt;/p&gt;

&lt;p&gt;If you are a photographer rather than a vendor-of-everything, the &lt;a href="https://libertybound0.gumroad.com/l/photo-booking-pack" rel="noopener noreferrer"&gt;Photographer Booking &amp;amp; Shot-List Pack&lt;/a&gt; covers the booking and shot-list side.&lt;/p&gt;

&lt;p&gt;Usual caveat: I am not a lawyer and this is not legal advice. For a Rp100 million decoration contract, pay a lawyer for an hour. For a Rp8 million photo package, a clear template and a conversation about clause 6 before signing will prevent most of the pain.&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>productivity</category>
      <category>business</category>
      <category>excel</category>
    </item>
    <item>
      <title>I ran a Gumroad store with Claude Code skills — here are 3 of them, free</title>
      <dc:creator>Aan Chen</dc:creator>
      <pubDate>Sat, 31 Oct 2026 16:28:12 +0000</pubDate>
      <link>https://dev.to/signcrypt/i-ran-a-gumroad-store-with-claude-code-skills-here-are-3-of-them-free-ac0</link>
      <guid>https://dev.to/signcrypt/i-ran-a-gumroad-store-with-claude-code-skills-here-are-3-of-them-free-ac0</guid>
      <description>&lt;p&gt;Two weeks ago I had zero digital products. Today there are two on Gumroad — an Indonesian freelancer tax tracker (6 sheets, 4,942 formulas) and a photographer booking pack (7 sheets, 2,797 formulas) — plus the listings and the article that promote them. Claude Code did almost all of it. Not because it's magic, but because I stopped prompting and started writing &lt;strong&gt;skills&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's what that means in practice, and three of the skills, free.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a skill is (the 20-second version)
&lt;/h2&gt;

&lt;p&gt;A skill is a folder with a &lt;code&gt;SKILL.md&lt;/code&gt; file. The front matter tells Claude &lt;em&gt;when&lt;/em&gt; to use it; the body tells it &lt;em&gt;how&lt;/em&gt;. Drop it in &lt;code&gt;~/.claude/skills/&lt;/code&gt; and Claude picks it up by itself when your request matches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;skills/invoice-generator/SKILL.md
---
&lt;/span&gt;name: invoice-generator
description: "Generate a professional invoice as .xlsx from client, line items,"
&lt;span class="gh"&gt;  tax and payment terms. Use when the user says invoice, tagihan, bill a client...
---
# Invoice generator&lt;/span&gt;
&lt;span class="gu"&gt;## Inputs to collect (ask only for what is missing)&lt;/span&gt;
&lt;span class="gu"&gt;## Steps&lt;/span&gt;
&lt;span class="gu"&gt;## Output&lt;/span&gt;
&lt;span class="gu"&gt;## Test prompt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference between a prompt and a skill is the &lt;strong&gt;Steps&lt;/strong&gt; and &lt;strong&gt;verify&lt;/strong&gt; parts. A prompt says "make an invoice". A skill says: build it with openpyxl, put &lt;code&gt;=B12*C12&lt;/code&gt; in the Amount column, &lt;code&gt;=SUM(D12:D14)&lt;/code&gt; in Subtotal, save as &lt;code&gt;Invoice-&amp;lt;no&amp;gt;-&amp;lt;client&amp;gt;.xlsx&lt;/code&gt;, &lt;strong&gt;then reload the file and confirm the totals are formulas, not numbers&lt;/strong&gt;. That last line is why the output is sellable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skill 1 — invoice-generator
&lt;/h2&gt;

&lt;p&gt;Ask: &lt;em&gt;"Invoice PT Nusa for 2 days wedding coverage at 4.5jt/day plus 300 edited photos at 15k each, PPh 23 withheld, due in 30 days."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What you get back: an &lt;code&gt;.xlsx&lt;/code&gt; where Subtotal = 13,500,000, PPh 23 = −270,000, Amount received = 13,230,000 — computed by formulas, which I checked by recalculating in LibreOffice headless. The helper that does the heavy lifting is ~60 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;xlsx_helpers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;make_invoice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count_formulas&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;make_invoice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inv.xlsx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Demo Studio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PT Nusa&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wedding coverage (day)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4_500_000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Edited photos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15_000&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
    &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IDR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tax_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pph23&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;count_formulas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Skill 2 — gumroad-listing-writer
&lt;/h2&gt;

&lt;p&gt;The rule that matters: &lt;strong&gt;open the product file first and pull real counts&lt;/strong&gt;. Sheet names, formula counts, page counts. Then write name (≤60 chars), slug, 140-char summary, a sectioned description (promise → what's inside → who it's for / not for → how to use → requirements → licence → FAQ), and 6–10 Discover tags split across &lt;em&gt;format&lt;/em&gt;, &lt;em&gt;audience&lt;/em&gt; and &lt;em&gt;job&lt;/em&gt;. Every listing on my store came out of this skill, and none of them contain a number I didn't verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skill 3 — cold-email-from-url
&lt;/h2&gt;

&lt;p&gt;Give it a business's URL. It fetches the site, finds one specific thing that's good and one concrete gap (2019 copyright, no booking button, images that take 6 s), and writes a ≤110-word email with a tiny ask, plus a ≤50-word WhatsApp version with no links. No "I hope this finds you well". It's the skill I'd use if I were doing local-business outreach — the method a few people on r/passive_income reported closing $299/mo retainers with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get them
&lt;/h2&gt;

&lt;p&gt;Free, MIT: &lt;strong&gt;github.com/signcrypt/claude-ops-pack-sampler&lt;/strong&gt; — clone, copy &lt;code&gt;skills/*&lt;/code&gt; into &lt;code&gt;~/.claude/skills/&lt;/code&gt;, done.&lt;/p&gt;

&lt;p&gt;The full pack has 50 skills (16 business ops, 17 dev ops, 17 marketing), four helper scripts and a validator that checks every skill and runs the scripts. It's $19 on Gumroad: &lt;a href="https://libertybound0.gumroad.com/l/claude-ops-pack" rel="noopener noreferrer"&gt;https://libertybound0.gumroad.com/l/claude-ops-pack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question for you:&lt;/strong&gt; which repetitive thing in your week would you turn into a skill first? I'm adding skills based on replies.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>claude</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Indonesian freelancers: the 2% that disappears from your invoice (PPh 23, PPh 21, and how to track it)</title>
      <dc:creator>Aan Chen</dc:creator>
      <pubDate>Sat, 31 Oct 2026 15:46:00 +0000</pubDate>
      <link>https://dev.to/signcrypt/indonesian-freelancers-the-2-that-disappears-from-your-invoice-pph-23-pph-21-and-how-to-track-1o53</link>
      <guid>https://dev.to/signcrypt/indonesian-freelancers-the-2-that-disappears-from-your-invoice-pph-23-pph-21-and-how-to-track-1o53</guid>
      <description>&lt;p&gt;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 &lt;strong&gt;PPh 23&lt;/strong&gt; and, in theory, paid it to the tax office on your behalf.&lt;/p&gt;

&lt;p&gt;The problem is not the 2%. The problem is what happens next: most freelancers never collect the &lt;em&gt;bukti potong&lt;/em&gt; (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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four situations you will meet
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Individual or foreign client → no withholding.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Indonesian company client, you have an NPWP → PPh 23 at 2%.&lt;/strong&gt; 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 &lt;strong&gt;tax credit&lt;/strong&gt;: it reduces what you owe when you file your SPT Tahunan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Same, but you have no NPWP → 4%.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Client treats you as a "non-employee individual" → PPh 21.&lt;/strong&gt; 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 &lt;strong&gt;2.5% effective&lt;/strong&gt;, 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.&lt;/p&gt;

&lt;p&gt;Separately, if you have opted into the &lt;strong&gt;final 0.5% UMKM scheme&lt;/strong&gt; (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.&lt;/p&gt;

&lt;h2&gt;
  
  
  And then there is VAT
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cash math on one invoice
&lt;/h2&gt;

&lt;p&gt;Take a Rp25,000,000 video project for a PT, you have an NPWP, you are not PKP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you never claim that Rp500,000, you donated it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What your tracker needs, minimum
&lt;/h2&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;An invoice register&lt;/strong&gt; where each row records DPP, the withholding type (none / PPh 23 2% / PPh 23 4% / PPh 21), and computes PPh, PPN, total billed, and &lt;em&gt;net cash expected&lt;/em&gt;. Net cash expected is the number you reconcile against your bank statement — not the invoice total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A due-date and days-late column.&lt;/strong&gt; Corporate clients pay on their schedule, not yours. You want to see "14 days late" without doing date arithmetic in your head.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A bukti potong checklist&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A monthly dashboard&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A printable invoice&lt;/strong&gt; 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).&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h2&gt;
  
  
  If you want the spreadsheet already built
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;It is $9 on Gumroad: &lt;strong&gt;&lt;a href="https://libertybound0.gumroad.com/l/invoice-pajak-tracker" rel="noopener noreferrer"&gt;Freelancer Indonesia — Invoice &amp;amp; Pajak Tracker 2026&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you would rather build your own, the five-part structure above is the whole design — take it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three habits that matter more than the tool
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Put your NPWP/NIK on every invoice to a company. No NPWP on the invoice is how you end up at 4%.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>finance</category>
      <category>indonesia</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
