
The problem
Ledgend Group ran a boutique executive search practice out of a spreadsheet. Everything lived there: candidates, client conversations, submittals, fees. Enterprise applicant tracking systems are built for recruiting floors of fifty, not for a small desk placing partners and managing directors across private equity, investment banking and asset management.
What we built
We built the entity model a search firm actually works in: candidates, companies, contacts, positions, submittals, placements. A submittal moves across seven stages on a board, and its stage history is written by a database trigger rather than trusted to the app. Resume uploads go to Claude, which returns parsed fields the recruiter reviews before anything is saved. Recruiters search in the Boolean syntax they already know, compiled down to a Postgres full-text query across names, titles, tags and the text of a candidate's current resume. Fee math is computed by Postgres, and a placement marked paid is locked at the row-level security layer, not just in the interface.
The result
One database instead of one spreadsheet.
Candidates, pipelines, placements, commissions and invoices live in one Postgres database with row-level security, an append-only audit log, and 261 passing tests behind it.
Also shipped
- CSV and spreadsheet import with column auto-mapping
- Append-only audit log covering fee edits, merges and role changes
- Invoice PDFs generated straight from the placement record