Why I Built This
An offhand comment made me think โ my portfolio was impressive, my experience was solid, but my technical accounting skills? Still unproven.
I'm at SJCC. My accounting classes haven't even started yet. So instead of waiting, I had an idea: what if auditing was a game you could actually practice?
I built a sandbox that generates randomized company transactions seeded with real fraud patterns. Every round is unique. You review the transactions, flag what looks suspicious, identify the fraud type, and submit your audit for scoring.
Honestly? I expected it to be easy. It wasn't. That told me it was worth building.
Turns out I could.
How It Works
Each audit session generates a fictional company with 18โ22 randomized transactions. Hidden inside are 6โ10 fraudulent entries across 3โ5 active fraud types. Your job is to find them.
I Audited My Own Code
The first version of this tool had a logic error. When a Duplicate PO was detected, the risk calculator summed both transactions โ the original and the duplicate โ inflating the at-risk figure. A $5,000 fraudulent charge was reporting $10,000 at risk.
Under GAAP, only the second payment is the loss. The first is a legitimate obligation. The model was double-counting.
I caught it, traced it through the aggregation logic, and refactored the calculation to only count the flagged transaction as exposure. The Total Issues counter was also updated to treat a duplicate pair as one finding โ consistent with how an auditor would document it in a workpaper.
Professional skepticism doesn't stop at the data. It applies to the systems you build to analyze it.
Under the Hood
Every audit is generated fresh โ no two rounds are the same. Each session picks a random company from a pool of 8 fictional firms across different industries, then assigns a randomized fiscal year, employee count, and revenue figure. Transaction count varies between 18โ22 per round, and PO/TXN counters start at random offsets so the IDs never look patterned.
A Fisher-Yates shuffle determines which transaction slots receive fraud assignments, so the position of red flags changes every time. From there, 3โ5 fraud types are activated per round and distributed across 6โ10 fraud slots using modulo cycling โ ensuring variety without clustering.
Each fraud type has its own dedicated generation rules โ amount ranges, vendor pools, approver filters, and document states are all set independently: