Deeve Technologies
Client workSaaS ProductWeb Application

TaxPilot PH BIR-Compliant DAT File Generator

TaxPilot PH converts Excel and CSV files into BIR-compliant SLSP, QAP, SAWT, and MAP .DAT files in seconds. A multi-tenant SaaS built for Philippine accountants, bookkeepers, and SMEs.

ClientJCeleste's Accounting Firm
RoleSenior Full-Stack Architect & Product Designer
Year2026
TypeSaaS Product, Web Application
Updated23 Sep 2026
Taxpilot PH, DAT Compliant Generator
Taxpilot PH, DAT Compliant Generator
Overview

TaxPilot converts Excel and CSV into BIR-compliant .DAT files for Philippine tax submission.

SLSP, QAP, SAWT and MAP formats, built multi-tenant so an accounting firm handles many client companies from one deployment.

Built with
.DAT filesBIRMAPMulti-tenantMVCPhilippinesPHPQAPSAWTSLSPTax compliance
The problem

What was in the way

BIR submission formats are exact.

A .DAT file is not a flexible export. It is a fixed specification with defined field positions, lengths and separators, and a file that is almost right is rejected. There is no partial credit and no helpful error message pointing at line 412.

Accounting staff were building them by hand from Excel. That is slow, and worse, it is silently error-prone. A misaligned column produces a file that looks fine, submits, and fails, usually near a deadline, usually with no clear indication of which of four hundred rows caused it.

The deeper problem is that this work is repetitive and high stakes at the same time, which is the worst combination for human error. The hundredth file gets the same attention as the first only in theory.

What I built

Six parts, each with a reason

Upload to .DAT in one step

Users upload Excel or CSV and the application outputs correctly formatted SLSP, QAP, SAWT and MAP files ready for submission.

The transformation is the product. Everything else on the page exists to support it.

Why it matters as a reference

Most integration work is against APIs that tolerate small mistakes. A malformed field gets a 400 with an explanation, and you fix it.

Compliance output does not work like that. The receiving system is a government one, it does not negotiate, and the feedback loop is slow and unhelpful.

If your project involves matching an external specification exactly, whether that is a government format, an EDI feed or a partner import, this is the closest example of how I approach it.

Format compliance as the core requirement

The whole value is matching a published government specification exactly, field by field.

This is the opposite of a feature you iterate towards. Ninety-five percent correct is zero percent useful, because the file is rejected either way. So the implementation is written against the specification rather than against sample files, and validated before output rather than after submission.

Google OAuth sign-in

Removes password management for a professional user base that already lives in Google Workspace.

Validation before output, not after rejection

Problems are surfaced against the uploaded spreadsheet, in terms the accountant recognises, before a file is generated.

Telling someone their file was rejected is useless. Telling them row 87 has a TIN with the wrong number of digits is actionable, and it moves the error discovery from the government portal near a deadline to the upload screen with time to fix it.

Multi-tenancy

Built as SaaS so an accounting firm handles multiple client companies with isolated data rather than separate installations.

An accounting firm is the real customer here, not a single business. One firm files for dozens of companies, and separate installations would mean dozens of upgrades every time the specification changes.

How it was built

The engineering underneath

Custom MVCPHP with MySQL, Tailwind CSS and Google OAuth, multi-tenant, on its own subdomain
Not LaravelThe job is one transformation done exactly right: upload, validate, transform, download
Separate definitionsFormat definitions sit apart from the transformation code, so a specification change is an edit

Custom PHP MVC with MySQL and a Tailwind interface.

Custom MVC rather than Laravel, deliberately. The application is narrow and well defined: upload, validate, transform, download. A framework would have added weight and a dependency surface for a codebase whose entire job is one transformation done exactly right.

The other reason is maintenance. This has to keep working when the BIR changes a specification, and the change may land with someone other than me. A small readable codebase where the format logic lives in one obvious place is easier to hand over than a framework application where it is distributed across service classes.

Format definitions are kept separate from the transformation code, so a specification change is an edit to a definition rather than a rewrite.

PHP with a custom MVC architecture, MySQL, Tailwind CSS, Google OAuth. Multi-tenant. Deployed on its own subdomain.

.DAT filesBIRMAPMulti-tenantMVCPhilippinesPHPQAPSAWTSLSPTax compliance
More work

Projects like this

All projects
Why it matters for your project

I build software, and I measure whether it works.

The same questions I research are the ones I ask on client builds: is it reliable, is it fast, is it easy to use, and is it secure. Those four drove satisfaction in my ICT portal study, and they shape how I scope and test every project.