Fintech compliance is not a checkbox. It is an architecture constraint.
Compliance that lives in code survives team turnover. Compliance that lives in spreadsheets does not.
Most engineering teams treat compliance as a post-build audit. The compliance team shows up after the feature ships, checks some boxes, flags some issues, and engineers grudgingly make changes. This workflow guarantees that compliance is always an afterthought, always friction, and always incomplete.
At FinanceOps, we learned a different lesson. Compliance is an architecture constraint. It belongs in the same conversation as latency requirements, data model design, and deployment topology. When you treat it that way, it stops being friction and starts being a forcing function for better engineering.
By this point I cared less about sounding smart and more about making the tradeoff legible. It also builds on what I learned earlier in “Cross-functional friction is a feature, not a bug, if you build the right feedback loops.” The systems had enough history that every database or eventing opinion had receipts behind it. That is the same posture I now bring to longer-lived experiments like ftryos and pipeline-sdk: if the constraint is real, say it plainly and design around it.
SOC 2 as a Service Boundary
When we started the SOC 2 process, the auditors wanted to know which services had access to personally identifiable financial data. The honest answer was: all of them. Our monolith had no internal access boundaries. Any service could query any table. Any engineer could access any customer record in the development database.
The SOC 2 requirement forced us to do something we should have done anyway: draw real service boundaries based on data sensitivity. Payment data got its own service with its own database and explicit API contracts. Customer PII got encrypted at rest with column-level encryption, not just disk-level. Access logs became a first-class requirement, not an afterthought.
The resulting architecture was cleaner than what we had before. Not because we were trying to be clean, but because compliance forced us to think about data flow with precision we had been avoiding.
Data Residency in the Deployment Pipeline
One of our enterprise customers required that their financial data never leave the EU. This was not a feature request. It was a contract requirement with penalty clauses. The naive approach would have been a manual checklist: make sure EU customer data goes to EU servers.
Instead, we encoded it in the deployment pipeline:
- Every customer record carries a region tag in the database
- The API gateway routes requests based on customer region before hitting application code
- The deployment pipeline validates that region-specific services only deploy to the correct infrastructure
- CI runs a static analysis check that flags any code path where cross-region data access is possible
The result: data residency is enforced by infrastructure, not by human memory. When a new engineer joins and writes a feature, they cannot accidentally violate data residency because the system will not let them. That is the difference between compliance as a checkbox and compliance as architecture.
The Compliance-as-Code Principle
Every compliance requirement we encounter now goes through the same evaluation: can this be encoded in code, infrastructure, or pipeline rules? If yes, it goes there first. The spreadsheet exists only as documentation of what the code already enforces.
- Access control: RBAC enforced at the API layer, not just the UI layer
- Audit logging: middleware that automatically logs every state-changing operation with actor, timestamp, and before/after snapshots
- Data retention: PostgreSQL partitioning with automated partition drops after the retention window
- Encryption: enforced at the ORM layer so developers literally cannot write an unencrypted PII field
- Change management: every production deployment requires a linked ticket, enforced by CI
Why This Matters Beyond Compliance
The teams that treat compliance as separate from engineering build two systems: the system they want and the system the auditors need. Those systems inevitably drift apart. The spreadsheet says one thing. The code does another. The audit finds the gap six months later, and suddenly you have an urgent remediation project that disrupts the entire roadmap.
By the time I wrote this, the lesson was bigger than the tool or incident. The job had become setting defaults a team could trust, then proving those defaults in systems like ftryos and pipeline-sdk. That is leadership work, not just technical taste.
Compliance that lives in code survives team turnover, sprint pressure, and late-night hotfixes. Compliance that lives in spreadsheets survives until the next deadline.
I now tell every engineering leader I meet the same thing: read your compliance requirements as architecture constraints, not as post-build checklists. They will make your system better, your deployments safer, and your audits boring. Boring audits are the goal.
Treating compliance as an architecture constraint rather than a bolted-on requirement changed how we designed every new feature. Instead of building first and adding compliance checks later, we started with the regulatory requirements and designed the data model to satisfy them natively. Audit trails became a core feature of the event system, not an afterthought. Field-level encryption was part of the schema definition, not a migration task. The shift added upfront design time but eliminated entire categories of compliance-related rework. When the next audit arrived, we could demonstrate compliance through architecture rather than through hastily assembled documentation. Teams that internalize compliance as a design input rather than a deployment checkbox ship faster in regulated industries because they never have to stop and retrofit what should have been there from the beginning. The architecture-first approach also made onboarding new engineers simpler because the compliance requirements were encoded in the system design itself, not in a separate document that engineers had to remember to consult. Compliance became invisible in the best possible way — baked into every data flow rather than bolted onto specific endpoints.