Project
Upvoit SaaS re-architecture
5× backend throughput and 40% lower API latency after a 15-day Clean Architecture + CQRS cutover — with zero scheduled downtime.
5×Throughput
40%Latency cut
15Days
0Downtime
Context
- Product
- Multi-tenant field-force management SaaS in live customer testing — scheduling, reporting, and mobile workflows.
- Constraint
- Monolithic .NET codebase with daily feature pressure. Merge conflicts and deployment risk were blocking parallel development.
- Requirement
- Re-architect without a feature freeze or customer-facing outage.
Role & scope
Senior .NET developer and architecture lead on a squad of four.
- Defined Clean Architecture layer boundaries and module ownership for parallel work
- Split read/write paths with CQRS — reporting queries separated from write workflows
- Owned migration sequencing and rollout plan alongside ongoing feature delivery
- Coordinated daily with team leads on merge strategy and cutover criteria
Key decisions
Clean Architecture over incremental patches
Isolated domains and testable boundaries. Cost: a focused 15-day sprint instead of slow coupling drift.
CQRS for read/write separation
Heavy reporting reads and complex writes had different query shapes. CQRS allowed independent optimization.
Parallel cutover — no feature freeze
Re-architecture ran alongside daily requirements. Higher short-term team load accepted to avoid business interruption.
Architecture
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Web / API │────▶│ Application │────▶│ Domain │
│ (ASP.NET) │ │ (CQRS) │ │ Models │
└─────────────┘ └──────┬───────┘ └─────────────┘
│
┌────────────┴────────────┐
▼ ▼
┌────────────┐ ┌────────────┐
│ Commands │ │ Queries │
│ (writes) │ │ (reads) │
└─────┬──────┘ └─────┬──────┘
└───────────┬───────────┘
▼
┌─────────────┐
│ MSSQL │
└─────────────┘
Results
| 5× | Backend throughput after architecture cutover |
| 40% | Reduction in average API latency |
| 15 days | Full re-architecture delivered on live platform |
| 0 | Scheduled downtime during migration |
Retrospective
- Merge-conflict volume was the early signal of architecture debt — earlier boundary documentation would have reduced sprint pressure.
- Would formalize module ownership on day one for any greenfield SaaS with multiple contributors.