18 June 2026 • 9 min read
How a Tier-2 Indian Bank Cut Digital Onboarding Time by 68% with Flutter, NestJS, and AWS
In 2025, a mid-sized Indian bank with 1,200 branches and 4 million customers was losing 38% of new applicants before account activation. The legacy web-and-SMS onboarding flow was fragmented, slow, and failing on rural Android devices. This case study details how Waterskyne architected a unified cross-platform experience using Flutter for mobile, NestJS for backend orchestration, and AWS cloud infrastructure to rebuild the entire digital customer onboarding pipeline—reducing drop-off by 68% and cutting activation time from 11 days to under 3 within six months of launch.
Overview
In early 2025, Sumavadi Urban Cooperative Bank (name changed for confidentiality), a 40-year-old institution headquartered in Pune with 1,200 branches across Maharashtra and Karnataka, approached us with a crisis. Their digital banking channel was hemorrhaging new customers. Despite spending ₹2.3 crore on a legacy core-banking modernization effort the previous year, the bank's digital onboarding funnel converted only 62% of applicants into fully activated accounts. The rest abandoned the process midway—often after visiting a branch three or more times.
The mandate was clear: rebuild the customer onboarding stack from scratch using modern, maintainable technology that could operate reliably on the budget Android smartphones common in rural and semi-urban India. The bank's executive team set a target of 85% completion rate within twelve months, with a hard budget of ₹4.2 crore.
Challenge
The existing system was a patchwork of technologies that had evolved over two decades. Customers began on a legacy ASP.NET web portal, received OTPs through an aging SMS gateway, uploaded documents through a file-upload form that crashed on Firefox for Android, and ultimately had to visit a branch to complete KYC in person. The technical debt was crippling. Key pain points included:
- Fragmented user journey: Four different systems handled registration, OTP verification, document upload, and branch scheduling, with no cohesive session management.
- Browser incompatibility: The web portal was built for desktop Chrome and Internet Explorer, with broken layouts on mobile Safari and Android WebView.
- Document rejection opacity: 27% of document uploads failed silently or were rejected days later with no real-time feedback, forcing customers to restart.
- No offline capability: Rural customers with intermittent connectivity lost all form progress when the network dropped.
- Core banking latency: Each API call to the mainframe took 400–800 ms on a good day, making the web experience feel sluggish even on fast networks.
- High operational cost: Each successful onboarding cost the bank ₹1,840 in staff time, branch overhead, and reconciliation work.
Adding to the technical challenge was the bank's strict compliance requirement: all Personally Identifiable Information (PII) had to be processed and stored within India, data retention policies had to comply with RBI guidelines, and the entire stack had to pass an annual penetration test.
Goals
We defined success through four measurable objectives, each tied to a specific quantitative target:
- Reduce onboarding completion rate from 62% to 85%+ within six months of go-live.
- Cut total onboarding time from 11 days to under 3 days, end-to-end, with less than 30 minutes of active customer effort.
- Reduce per-onboarding operational cost from ₹1,840 to under ₹600 by eliminating redundant branch verification steps.
- Achieve 99.5% uptime for the onboarding platform during business hours, with graceful degradation for offline or low-connectivity scenarios.
Non-functional goals included full RBI/NPCI compliance, WCAG 2.1 accessibility compliance, and a design system that the bank's in-house team could maintain after handover.
Approach
We proposed a mobile-first, API-first architecture centered on three pillars: a single Flutter application for Android and iOS sharing one codebase, a NestJS backend providing typed, documented REST and gRPC endpoints, and AWS cloud services for hosting, queuing, and storage with all data residency within ap-south-1 (Mumbai region).
Rather than doing a big-bang replacement, we adopted a strangler-fig migration pattern. The Flutter app handled new customer onboarding end-to-end, while existing customers continued using the legacy portal during a six-month overlap period. We used a thin API gateway layer to route traffic appropriately, allowing us to decommission old systems incrementally.
The team structure reflected this modular approach. Three Flutter developers built the customer-facing app, two NestJS engineers built the orchestration layer, one AWS specialist handled infrastructure, and a dedicated QA engineer ran automated regression tests on every pull request. A design lead managed the component library using Figma and Storybook.
Implementation
Mobile Layer: Flutter
The Flutter application was the centerpiece of the new experience. We built it with a custom design system—Arogya Components—inspired by Material 3 but tuned for the Indian context: large touch targets for users with limited dexterity, high-contrast mode for outdoor sunlight readability, and 12 regional language options using Flutter's built-in internationalization.
One of the most impactful decisions was implementing offline-first document capture using Hive. Customers could photograph their PAN card, Aadhaar, and proof of address while on a bus or in a low-network area. Images were stored in encrypted local storage with AES-256 and uploaded automatically when connectivity returned. This alone eliminated 14% of abandonment caused by interrupted uploads.
On the verification side, we integrated Google ML Kit's on-device text recognition to auto-fill form fields from captured document images. This reduced manual data entry by an estimated 40% and gave customers immediate visual confirmation that their documents were readable before submission.
Backend Layer: NestJS
The NestJS backend served as the smart orchestration layer between the Flutter app, the bank's core banking system, third-party KYC providers, and internal notification services. We organized the codebase into feature modules—each isolated with Drizzle ORM for type-safe database access, and all public endpoints documented via Swagger/OpenAPI.
Key NestJS patterns we implemented:
- Event-driven microservices using RabbitMQ queues for asynchronous document processing, decoupling the user-facing response from time-consuming OCR and verification tasks.
- CQRS pattern for the onboarding state machine, separating read and write concerns and enabling efficient audit logging required for regulatory compliance.
- Guards and interceptors at the module level to enforce tenant isolation, input validation, and consistent error responses across all endpoints.
- BullMQ-based scheduled jobs for timeout management—if a customer didn't complete step three within 48 hours, the system sent a gentle SMS reminder before expiring the session.
Connecting to the bank's legacy mainframe was the hardest integration problem. The core banking system exposed only a proprietary TCP protocol over an internal network. We built a NestJS microservice adapter that maintained a persistent connection pool, translated REST calls to the binary protocol, and introduced a response cache layer using Redis that reduced average lookup latency from 720 ms to 180 ms for frequently accessed data.
Infrastructure: AWS
We deployed the NestJS backend on AWS ECS with Fargate for containerized auto-scaling, fronted by an Application Load Balancer with SSL termination and WAF rules. All data resided in ap-south-1, with RDS PostgreSQL handling transactional data and S3 (with bucket policies restricted to India) storing encrypted document scans.
For the frontend, we used AWS CloudFront with regional edge caching to serve Flutter web assets in under 100 ms for users across India. The mobile apps were distributed via a private Firebase App Distribution pipeline for closed beta, and through the Play Store and App Store after production approval. Infrastructure was managed through Terraform, with the entire stack reproducible from a single terraform apply command—a requirement the bank's audit team appreciated during quarterly reviews.
Results
The platform went live in a phased rollout: pilot with 2 branches in April 2025, expanded to 120 branches by May, and full rollout across all 1,200 branches by July 2025. The numbers spoke for themselves:
- Onboarding completion rate jumped from 62% to 91.4% within three months of full rollout.
- Average time-to-account-activation dropped from 11.2 days to 2.6 days.
- Per-customer onboarding cost fell from ₹1,840 to ₹487, a 74% reduction driven by eliminated branch verification steps and automated KYC.
- App store rating reached 4.7 stars within 45 days of launch, with 93% of reviews in regional languages praising ease of use.
- Zero security incidents in the first six months of production, with two successful penetration tests and one RBI compliance audit.
Perhaps the most unexpected outcome was a 42% increase in rural account openings. The bank's analytics team reported that 58% of new accounts in previously underserved districts came through the app, not branches—a demographic the bank had struggled to reach with its legacy digital channels.
Metrics Snapshot
| Metric | Before | After | Change |
|---|---|---|---|
| Onboarding completion rate | 62% | 91.4% | +47.4% |
| Time to activation | 11.2 days | 2.6 days | -76.8% |
| Cost per onboarding | ₹1,840 | ₹487 | -73.5% |
| Monthly new accounts | 3,200 | 8,700 | +171.9% |
| App store rating | N/A | 4.7/5 | New channel |
| System uptime | 94.1% | 99.8% | +5.7 pp |
Metrics tracked over a 12-month window (pre- and post-launch) across all 1,200 branches. Financial figures audited by the bank's internal compliance team in Q3 2025.
Lessons Learned
This project confirmed three principles we now apply to every enterprise engagement:
1. Offline-first is not optional for India's next billion users. Initially, we treated offline support as a nice-to-have. Midway through development, beta feedback from rural customers changed our minds. Implementing Hive-based local persistence and sync logic added three weeks to the schedule but delivered 14% fewer drop-offs—more than justifying the delay. If you're building a consumer app in India, design for the network, not around it.
2. NestJS's modular architecture saved us during regulatory change. Six weeks after launch, the RBI updated KYC norms requiring additional address verification fields. Because our NestJS backend used feature modules and DTO-driven validation, we shipped the change to staging in two hours and production in eight—with zero downtime and no database migrations. A monolithic architecture would have taken days.
3. Terraform-managed infrastructure pays dividends during audits. The bank's quarterly security audit required a full inventory of every cloud resource, its configuration, and its access policy. With Terraform, we generated this in 20 minutes. With manual console changes, it would have been a week-long archaeology project. Treating infrastructure as code isn't just DevOps best practice—it's a risk management tool.
The biggest surprise was customer behavior. We expected the app to be used mostly by educated urban users, but rural adoption exceeded urban by 15 percentage points. The bank's regional-language support, large touch targets, and document-feedback UX had hit a genuine underserved need. That insight is now shaping our product design principles across every engagement in the financial services vertical.
