Case Study
KodeData
Founder & CEO · 2026 – Now
kodedata.comKodeData builds Koda, a collections and telephony platform for lending call centers in Indonesia. Agents use it to work through overdue accounts, supervisors use it to see what is happening on the floor right now, and the whole thing sits on a voice stack we run ourselves rather than rent.
I started it in 2026 after leaving my last engineering job. I write the code, run the infrastructure, and sit in the calls where the product gets sold. That combination is the point: the features that matter turned out to be the ones you only notice by watching someone use the thing for eight hours straight.
The problem
A collections floor runs on phone calls, and most of them are still dialed by hand. An agent reads a number, types it, waits through the ringing, and more often than not reaches nobody. Then they do it again. The actual conversation, the part the business is paying for, is a small fraction of the day.
Everything above that is guesswork too. Which accounts got worked today, which agent is actually on a call versus staring at a screen, whether a number is dead or the person simply is not picking up: none of it is visible unless somebody builds it. So we built it.
What it looks like
Screens below come from a demo tenant with generated data. Nothing here belongs to a real customer.




The part I am proudest of
Manual dialing has a failure mode nobody was measuring: the agent hangs up while the phone is still ringing. It feels like nothing. It is one impatient click, repeated a few hundred times a day, and the calls it kills are the ones that were about to connect.
So we started measuring it. Koda now separates a dead number from an unanswered one, tells a carrier fault apart from a refusal, stops redialing numbers proven dead, and shows each agent how long they wait before giving up next to how long the people they are calling actually take to pick up. That last comparison is per tenant, because the answer differs by portfolio and a borrowed benchmark would be worse than none.
It is advisory, not a brake. Nothing stops an agent from hanging up early. But once a supervisor can see it, it stops being invisible, and it turned into the clearest argument for moving a floor off manual dialing altogether.
How it is built
TypeScript
One language across the API, the dashboard, and the tooling.
Hono on Node
Small, fast, and boring in the way a billing-adjacent API should be.
PostgreSQL
Every call, outcome, and promise to pay is an auditable row.
Asterisk
We run the telephony ourselves instead of renting somebody's dialer.
Next.js
The dashboard supervisors live in all day.
Flutter
Where the work needs to leave the desk.
Running the telephony ourselves is the decision everything else hangs on. It is more work than buying a dialer, and it is the reason we can answer questions about call quality that a rented platform will not tell you.
Want to see it properly
A screenshot only goes so far. If you run a floor that still dials by hand, a live walkthrough on your own numbers is a better use of both our time.
fakhridanial29@gmail.com