Skip to content
AuditAnalyticsAutomationAI

Automation that produces its own evidence.

I build tested Python systems for internal audit, compliance, and accounting teams — access reviews, segregation-of-duties testing, transaction anomaly detection, and document verification. Every run leaves a queryable trail of what it checked and why it flagged.

Open to select engagementsChattanooga, TNRemote
$1B+
Insurer — accounting automation delivered end to end
F1000
Fraud investigation led with SQL, Python, Power BI
MSBA
UGA Terry College of Business — Business Analytics
PCAP
Python certified · Certified Arbutus Analytics Professional
01Capabilities

Four disciplines that only matter together.

Analytics without audit context finds the wrong things. Automation without engineering discipline breaks quietly. AI without a gate is a liability. The combination is the offer.

01

Audit

Control testing that runs on a schedule instead of on a quarter.

  • Segregation-of-duties conflict detection across ERP role assignments
  • User access reviews — ingest messy exports, emit a defensible exception report
  • SOX and HIPAA control evidence captured as the run happens
  • Native to the Workiva, ACL, and Arbutus toolchain your team already runs
02

Analytics

The number, and the reason the number is what it is.

  • Transaction, expense, and vendor anomaly detection
  • Fraud analytics — Benford's law, duplicate testing, threshold-split detection
  • Power BI and Tableau reporting built for senior leadership, not for analysts
  • SQL straight against source systems, including SAP and ERP extracts
03

Automation

Processes that stop needing a person to remember them.

  • End-to-end accounting and close automation
  • Python and PowerShell pipelines with scheduled, monitored runs
  • Idempotent and restart-safe — a failed run resumes, it doesn't double-post
  • Unit-tested, version-controlled, and reviewable by someone who isn't me
04

AI

Applied where it earns its place, gated where it doesn't.

  • Document OCR and signature verification on uploaded evidence
  • Unstructured documents to structured, queryable tables
  • LLM agents with hard guardrails, evals, and a log of every decision
  • Human review gates on anything with consequences — by design, not by default
02Live demo

This is the job, running in your browser.

Fourteen synthetic journal entries, four control tests. Press run and watch it work the population row by row — the same shape of output a real engagement produces, minus the client data.

journal_entries_q2.csv
SOD-01DUP-02THR-03CAL-04
EntryDateVendorAmountPostedApprovedResult
JE-104106-01MonMeridian Supply Co12,480.00r.alvarezk.nguyen
JE-104206-06SatDelta Freight Ltd8,215.40j.okafork.nguyen
JE-104306-08MonCardinal Print1,340.75r.alvarezm.shah
JE-104406-09TueRidgeline Legal22,750.00s.patelk.nguyen
JE-104506-10WedOrchard Facilities4,950.00j.okaform.shah
JE-104606-10WedOrchard Facilities4,980.00j.okaform.shah
JE-104706-11ThuBasalt Consulting9,600.00s.patels.patel
JE-104806-12FriNorthgate Utilities3,187.22r.alvarezk.nguyen
JE-104906-15MonPinewood Logistics15,420.90m.shahk.nguyen
JE-105006-16TueCardinal Print1,340.75r.alvarezm.shah
JE-105106-18ThuHarbor Point Media7,300.00j.okafork.nguyen
JE-105206-21SunDelta Freight Ltd6,140.00s.patelm.shah
JE-105306-22MonMeridian Supply Co2,018.60r.alvarezk.nguyen
JE-105406-24WedIronwood Services4,875.00m.shahk.nguyen
Rows scanned
0 / 14
Exceptions
0
Clean
0
Status
Ready

Synthetic data. Every exception above was planted deliberately — the point is the mechanism, not the findings. A real engagement runs the same four tests against millions of rows and writes each outcome to a table you can query afterwards.

03Work

Built on synthetic data, so you can actually see it.

My strongest production work sits behind client NDAs and will not appear on a public site. So these are reconstructions: same techniques, same architecture, fabricated or public data. Status is marked honestly — some are running, some are not built yet.

01In build

User Access Review Engine

PythonpandasSQLPydantic
Problem

Quarterly access reviews arrive as inconsistent exports from a dozen systems. The format fights the reviewer, so the reviewer rubber-stamps — and the control becomes theatre.

Approach

Normalise heterogeneous exports into one schema, reconcile against the HR roster, and emit a reviewer-ready exception report: terminated users with live accounts, orphaned credentials, privilege creep, and dormant admin access. The reviewer sees only what actually needs a decision.

02In build

Segregation-of-Duties Conflict Engine

PythonNetworkXSQL
Problem

ERP role assignments accumulate quietly until one person can create a vendor, approve it, and pay it. Nobody granted that combination — it assembled itself over four years of job changes.

Approach

A conflict matrix evaluated over synthetic ERP role and permission data, resolving transitive access through nested roles and inherited groups. Conflicts are ranked by whether a mitigating control already covers them, so the output is a work queue rather than a wall of noise.

03Planned

Benford & Anomaly Suite

PythonscipyPlotly
Problem

Fraud hides in populations far too large to sample by hand, and manual sampling finds what it happens to land on rather than what is actually wrong.

Approach

Leading-digit conformity testing, duplicate detection, approval-threshold split detection, and round-number bias — run against a public procurement dataset so the whole thing is reproducible by anyone who wants to check the maths.

04Planned

Document OCR & Signature Verification

PythonOpenCVTesseract
Problem

Signed evidence arrives as scans. Verifying that the right person signed the right document is manual, slow, and the first thing dropped when a deadline compresses.

Approach

OCR extraction with signature-region detection, writing structured results and confidence scores to SQL. Anything below threshold routes to a human rather than being silently accepted — the AI is a filter, not the decision-maker.

05Live

cash-trader

PythonSQLitepytestAlpaca API
Problem

An autonomous system that moves money needs to be structurally unable to malfunction, not merely unlikely to. This is here as engineering evidence, not as a trading pitch.

Approach

Strategy code is architecturally forbidden from importing the broker or the ledger; a risk gate is the sole path to execution. Settled-cash accounting, idempotent order IDs that survive restarts, latching breakers, a stale-data guard, and every rule outcome for every proposed order written to an audit table. Backtests run the identical live stack.

04About

Who you'd actually be working with.

I spent three years at a data analytics and IT audit consultancy building automation for organisations where getting it wrong is expensive — end-to-end accounting automation for a billion-dollar insurer, a data-driven fraud investigation for a Fortune 1000 chain, and segregation-of-duties and access-review programmes across multiple clients. I scoped the engagements, drafted the statements of work, managed the client relationships, and wrote the code.

Today I work in ERP systems and reporting full time, and build audit automation for a large insurance broker alongside it.

What I care about is the part most automation skips: proving what it did. Anyone can write a script that produces a number. A control that cannot produce its own evidence isn't a control — it's a number you have to take on faith, which is exactly what an auditor is not allowed to do.

Based in Chattanooga, TN — where five of the six largest employers carry a permanent controls burden. Working locally and remotely.

Credentials
MS Business Analytics
University of Georgia, Terry College
BA Business Administration
Reinhardt University, cum laude
PCAP
Certified Associate in Python Programming
Arbutus
Certified Arbutus Analytics Professional
Toolchain
PythonSQLPowerShellRPower BITableauACLArbutusWorkivaSAP dataSalesforceExcel

Contact

If a control in your shop still runs on spreadsheets and hope, let's talk about it.