Logo
Logo
SaaS/ B2B
By Muhammad Abubakar1 min read

IRCC Tracker: How I Rescued a Vibe-Coded MVP at 20K Users– Without a Single Minute of Downtime

When a Canadian immigration tracking app built on Lovable+Supabase suddenly hit 20,000 users (in just six months), the scrappy MVP infrastructure that got it there started showing some serious cracks. That’s when I was brought in to fix what was breaking. Here’s exactly how I did it quietly, safely, and without taking the app down for a single paying user!

IRCC Tracker: How I Rescued a Vibe-Coded MVP at 20K Users– Without a Single Minute of Downtime

The Problem: A Faltering Database

The IRCC Tracker app gives Canadian immigration applicants deeper insights into their application status compared to the official government portal. Even though the app had strong early traction and everything was running live, behind the scenes, the database was struggling.

Here’s what I was dealing with:

Redundant, unoptimized data

Piling up silently and dragging every query down with it.

Critical historical queries timing out

Users were receiving incomplete, truncated insights — a trust-killer for a paid product.

Infrastructure built for cost, not scale

The MVP architecture made restructuring risky without a carefully controlled approach.

Zero downtime tolerance

Thousands of active users including paying subscribers — any outage meant real revenue loss.

No migration or deployment pipeline

Every change I made carried direct production risk with no safety net in place.

You should have a clear picture of what I was dealing with now– this wasn’t a greenfield project. Every decision I made had to work around a live, revenue-generating app. Here is the approach I followed.

My Approach: Incremental, Safe, and Surgical

For a live app like this project, I couldn’t do a big-bang rewrite. Instead, I built a methodical, zero-risk optimization strategy from the ground up.

01
Creating a Safety Backup

Backup first, always. This is a guiding principle I follow as a developer. Before touching anything, I ran a full pg_dump and verified the database backup. This simple yet effective rule is implicit in my process– No rollback point, no work begins.

02
Data Audit and Identifying the Problem

I always audit before acting. I dug into the database structure to map out exactly what was redundant, duplicated, or just dead weight. I used EXPLAIN ANALYZE to trace exactly which queries were choking and why.

03
Phased Data Cleanup

Next, I wrote targeted SQL scripts to remove redundant records and restructure data. This was executed in controlled phases to avoid long locks and minimize impact on active user sessions.

04
Query and Index Optimization

After the cleanup, I reworked the highest-impact queries for efficiency, added indexes on frequently accessed paths, and pruned unnecessary indexes that I noticed were silently killing write performance. The difference was noticeable and immediate.

05
Performance Benchmarking

Finally, I benchmarked everything. Using pgbench and query analysis tools, I measured before-and-after performance at each stage. There’s no guessing when it comes to my work; every change is validated with data.

And that’s a brief summary of my zero-downtime execution strategy– without service disruption, avoiding heavy locks, and ensuring all users experienced no interruption during optimization.

Technical Results

Metric
Database storage
Outcome
Reduced by 75%
Result
Lowered infrastructure costs
Metric
Query performance
Outcome
Improved by ~70%
Result
Eliminated timeouts
Metric
Historical data truncation
Outcome
Eliminated completely
Result
Full historical retention
Metric
Dataset Quality
Outcome
100% complete
Result
Accurate insights
Metric
Downtime
Outcome
Reduced to zero
Result
No user impact

Business Impact (ROI)

Beyond all the technical wins, these optimizations had a real business impact for my client:

Cost Saving

75% smaller storage footprint

Lower infrastructure cost

Faster UX

Queries 70% faster

Instant insights

Zero Downtime

0 outages

No churn

Scalability

20K+ users ready

No rebuild needed

Full Data

No truncation

Complete history

Confidence

Safe deployments

Predictable system

The app was live. The users were paying. The stakes were real. And so, I shipped every fix without anyone noticing, which is exactly how it should be!

Dealing with a live app that’s outgrown its infrastructure? I’ve been there. Let’s Talk.

Questions? Comments? Feel free to send a message!