A fintech startup
Rebuilt a slow, drop-off-heavy onboarding flow into a fast, typed, multi-step experience with resumable sessions — cutting abandonment and speeding up KYC.
The challenge
New users were abandoning a long, single-page sign-up before finishing KYC. Every reload lost their progress, validation errors surfaced too late, and the backend coupling made even small changes risky to ship.
What we did
- Rebuilt onboarding as a typed, multi-step flow with resumable, server-persisted sessions so no progress is ever lost.
- Moved validation inline and early, with clear, human error messages at each step instead of one wall at the end.
- Split the KYC provider integration behind a clean service boundary, so verification changes ship without touching the UI.
- Instrumented each step to see exactly where drop-off happened — and kept iterating against real funnel data.
Outcomes
Services
Stack
Key engineering decisions
The choices that shaped this build — and the reasoning behind them. It’s how we think about a problem, not just what we shipped.
Next.js for the funnel, a Go service for KYC
Onboarding is public and conversion-critical, so we wanted server rendering and fast first paint — Next.js's strength. Identity checks are CPU-bound and latency-sensitive, so we isolated them in a Go service with predictable performance under load. One language per job, not one framework for everything.
Resumable, server-persisted multi-step flow
We replaced a single long form with a typed, multi-step flow whose state is persisted server-side after every step, so a dropped connection or a returning user never loses progress. Validation moved inline and early, with human-readable errors at each step instead of one wall at the end.
KYC provider behind a hardened service boundary
Sensitive identity data flows only through a single, isolated service with least-privilege access and audited I/O — never through the client or the public app tier. That boundary also lets us swap or add verification providers without touching the UI or widening the data's blast radius.
Step-level funnel instrumentation
Every step emits structured events, so we can see exactly where users hesitate or drop and iterate against real data instead of guesses. Several of the biggest wins came from removing friction the analytics surfaced, not from redesigns.
Engineering notes
Because each step is independently persisted and validated, the flow degrades gracefully on flaky mobile connections — a reload resumes exactly where the user left off. That resilience, more than any single optimisation, is what moved the completion numbers.
Have something to build?
Tell us what you're working on. We'll get back to you with a clear, honest take on how we can help.