portfolio Anshul Bisen
ask my work

The compliance audit that exposed every shortcut we took in our first year

Our first formal compliance audit surfaced 23 findings. Hardcoded keys, PII in logs, missing audit trails. None malicious, all "we will fix that later." The remediation sprint that followed.

In late April 2025, we went through our first formal compliance audit. An external firm spent two weeks reviewing our codebase, infrastructure, access controls, logging practices, and data handling procedures. They produced a 47-page report with 23 findings. Reading that report was one of the most uncomfortable professional experiences of my career. Not because the findings were surprising. Because every single one was something I knew about and had deferred.

Where the data model or query started fighting back.

By this phase the work was no longer “just build it.” It also builds on what I learned earlier in “The quarterly planning meeting that taught me product managers and engineers solve different problems.” Every architecture choice had a people cost, an audit cost, and a recovery cost when production disagreed with the plan. That is roughly when the line between FinanceOps systems and projects like flowscape or ftryos got interesting to me: the design only counts if the operators can live with it.

The operational artifact behind the argument.

The 23 Findings

The findings ranged from critical to informational. None of them represented malicious intent or gross negligence. All of them were shortcuts taken during the first year of building when we were moving fast and telling ourselves we would come back to fix things later. “Later” arrived in the form of two auditors with laptops and a checklist.

  • Three API keys hardcoded in environment files checked into a private GitHub repository
  • Customer PII appearing in application logs including email addresses and phone numbers in error stack traces
  • No audit trail for financial transaction state changes, only application logs that could be modified
  • Database backups stored without encryption at rest
  • Admin panel accessible without multi-factor authentication
  • Third-party dependencies with known critical vulnerabilities not patched for over 90 days
  • No documented incident response procedure
  • Employee offboarding did not include credential rotation for shared service accounts

The eight items above were the critical and high-severity findings. The remaining fifteen were medium and low: missing security headers, overly permissive CORS configuration, no rate limiting on authentication endpoints, incomplete data retention policies, and similar operational gaps.

Every single finding had the same root cause: speed over security in year one. When you are three engineers trying to build a fintech product, ship it to clients, and keep the lights on, security practices feel like overhead that slows you down. They are not overhead. They are the foundation that makes everything else trustworthy. I knew this intellectually. I still cut corners.

The Remediation Sprint

We blocked the next two sprints for remediation. No feature work. No bug fixes unless they were client-critical. Every engineer focused exclusively on audit findings. The prioritization was straightforward: fix the eight critical and high items first, then work through the mediums.

  1. Rotated all hardcoded API keys and migrated secrets to HashiCorp Vault within 48 hours
  2. Implemented PII scrubbing middleware that strips sensitive fields from log payloads before they reach Loki
  3. Added immutable audit logging for all financial transactions using a separate append-only PostgreSQL table with database-level write protection
  4. Enabled encryption at rest for all database backups and verified with a restore test
  5. Deployed multi-factor authentication on the admin panel using TOTP
  6. Ran automated dependency vulnerability scanning and patched all critical and high CVEs
  7. Wrote and tested an incident response playbook with the full team
  8. Implemented automated credential rotation for shared service accounts and removed access for former employees

The total remediation took 11 working days. Two weeks of engineering capacity devoted entirely to fixing things that should have been right from the start. The feature work that was deferred during those two weeks cost us a client milestone deadline. The cost of the audit findings was not just the engineering time to fix them. It was the downstream impact on commitments we had already made.

Why Self-Auditing Matters

The most frustrating part of the audit was that I knew about most of the findings before the auditors found them. The hardcoded keys were on our internal “fix eventually” list. The PII in logs was something I had noticed months ago and added a Jira ticket for. The missing audit trail was a known gap we kept deferring in favor of feature work.

If I had run a self-audit in month six, the remediation would have been smaller, cheaper, and less disruptive. The findings would have been caught when the codebase was simpler, the team was smaller, and the client commitments were fewer. Instead, we waited until an external audit forced the issue and then scrambled. The lesson is not that audits are valuable. The lesson is that self-auditing early is cheaper than waiting for someone else to audit you.

  • Schedule a quarterly self-audit against your compliance framework, even if nobody is asking for one
  • Maintain a living document of known security gaps with severity ratings and remediation estimates
  • Treat security gaps the same as production bugs: triage, prioritize, and track to resolution
  • Block feature work for remediation when critical gaps are identified, do not wait for the backlog to clear

What Changed Permanently

The audit changed how we operate. Not because the auditors told us to change, but because the experience of reading 23 findings that I already knew about made me confront how easily “we will fix it later” becomes “we never fixed it.”

The system after the boring-but-correct fix.

By this stage the job had changed. I was no longer just picking a tool or fixing a bug. I was carrying the blast radius across product, compliance, sales, and hiring. That is exactly why I kept pressure-testing the same lesson inside ftryos and pipeline-sdk.

Every startup takes shortcuts in year one. The ones that survive in fintech are the ones that go back and fix those shortcuts before a regulator or an auditor forces them to. Self-audit before someone else audits you. The findings will be the same. The urgency and the cost will be very different.

We now run a quarterly internal security review against our compliance checklist. Each review takes half a day and typically surfaces two to three new findings. We remediate them in the same sprint. The quarterly reviews have become routine and unexciting, which is exactly the point. Security maintenance should be boring. The audit taught us what happens when you let it become exciting.