All projects

Payroll Formatter

A small Windows tool that prepares a company group's e-Bupot tax uploads in minutes, where the payroll team used to spend 2 to 3 days digging the figures out of the database by hand. It cost 99% less than a year on the vendor's new platform, and the client owns the code.

Client
A private client's payroll team
Role
Freelance developer, on my own
When
Mar 2025
Minutes instead of 2 to 3 days for each tax upload
  • Python
  • Tkinter
  • pyodbc
  • MS Access
  • openpyxl
  • PyInstaller
  • Rust

What it is

In 2025 Indonesia moved withholding-tax reporting to e-Bupot, with its own spreadsheet formats for the upload: BPMP for each month's PPh 21 slip and BPA1 for the yearly 1721-A1.

The client is a group of companies whose payroll lives in an old Microsoft Access program. Its exports did not match the new formats, so each period someone went through the database sub-company by sub-company, found every employee's figures by hand and retyped them: 2 to 3 days of work.

The program's vendor offered a way out: move to its new platform, with a fee for every user, every month.

My part

I built it in March 2025: the first working version, both forms, in a day, then refinements over the next three weeks. It ships as a single .exe the payroll staff run on their own machine.

From days to minutes

The problem. The group has many sub-companies, and the figures each tax form needs sit in an Access database only the old payroll program was meant to read. Each period the payroll team looked them up by hand, company by company and employee by employee, for 2 to 3 days.

What I did.
  • Read the database directly through the Access ODBC driver, as a 32-bit build to match the client's Office.
  • Pull every employee in the export with one query per run, instead of one lookup per person.
  • Match each employee by national ID, falling back to tax ID, and take each person's latest month for the yearly slip.

What changed. Drop in the period's export and the tool finds every figure itself. Preparing the upload went from 2 to 3 days of lookups to a couple of minutes, with the numbers taken from the source instead of retyped.

2–3 daysMinutes

to prepare each period's tax upload

99% cheaper than renting it

The problem. The vendor's new platform charged a monthly fee for every person on payroll, which across the whole group added up to a large bill every month, for a job that comes down to reshaping one export into two upload files.

What I did.
  • Scoped the tool to exactly that job: read the payroll the client already has, write the two e-Bupot forms.
  • Built it to run on the payroll staff's own machine, with no server, subscription or per-user fee.
  • Handed over the code with the tool, so the client owns both.

What changed. The client paid once: 99% less than a year on the vendor's platform, and nothing to pay after.

99%

less than a year on the vendor's platform, paid once instead of every month

Writing the new forms

The problem. The new formats are strict about columns and codes, and the payroll exports were not always laid out the same way.

What I did.
  • Matched the Indonesian column headings loosely, so small differences between exports still work.
  • Put the tax rules in code: the rate from tax and gross pay, a default deduction date, full or part year and months worked, the gross-up allowance.
  • Filled the employer's branch ID from its tax ID as you type.
  • Wrote the BPMP file with its 16 columns and BPA1 with its 31, under names that never overwrite last month's.

What changed. Drop in the month's export, pick the form, and get a file ready for upload to e-Bupot.

Shipping one small file

The problem. The payroll staff needed something they could double-click, on a machine with nothing extra installed.

What I did.
  • A drag-and-drop window in Tkinter, packed into one .exe with PyInstaller.
  • Left out the heavy libraries the tool never uses, then wrote a version without pandas.
  • Tried a Rust port with iced for a smaller native binary; the trimmed Python build was the one that shipped.

What changed. The payroll staff got a single .exe they double-click, with nothing else to install.

Have a project in mind?

Tell me what you need built, web or mobile, design to backend. I will come back with a plan.

Hiring a software engineer?

I am open to full-time roles. Let’s talk about your team and the work.