URM Commission
One record, from a student's first enquiry to the commission an agent is paid.
- Role
- Architecture and most of the code
- Timeline
- 2025 to now
- Type
- Agent portal and commission platform
- Stack
- Node.js, Express, EJS, Prisma, PostgreSQL


The problem
Education recruitment is handled by agents, counselors, universities and a finance team who each see a different part of the same student. When those parts live in separate tools, nobody can say where a student stands or what an agent is owed.
What we built
A multi-role operations portal on one record: agents source and nurture leads, counselors convert them through admissions, and administrators run the catalog, contracts and finance. A public site and an agent application funnel feed the same pipeline.
My role
I designed the portal and wrote most of the code myself, as technical co-founder of URM ENROLL. The repository is private.
How it fits together
- Express app with server-rendered views
- Prisma domain model on Neon Postgres
- A configurable commission engine with an event ledger
- Passkeys, two-factor sign-in and single sign-on
The hard part
Four roles need four different views of one lifecycle without seeing each other's data, and every financial figure has to stay explainable months later. Access control, audit trails and the commission rules are all part of the same design problem.
Where it stands
Live at agents-portal.enrollurm.com for the agent partner programme. Stripe checkout and payouts are built in and switch on when the company starts taking payments. I don't publish adoption or revenue figures here.
What I took from it
Money makes correctness visible. A figure that cannot be traced back through the record that produced it is a defect, however good the interface looks.
Sources and scope
Sources: the repository's README and source tree, inspected September 2026, and the live site. The screenshot shows the public landing page.
