You’ve shipped your MVP. Users are signing up. Then at 500 concurrent users, something catches fire. Was it the database? The API? Your payment processor integration? Most founders guess wrong because they’ve never scaled before.
The truth is, things break in a specific order as you grow. Understanding that order saves you thousands in wasted engineering time and keeps your product moving instead of limping along.
Database Queries Kill You First
The first real bottleneck isn’t usually the database itself-it’s how you talk to it.
A common pattern: your application runs fine with 100 users because each query takes 50 milliseconds. At 1,000 concurrent users, you’re now running hundreds of queries per second. If those queries lack proper indexing, or if you’re fetching related data inefficiently (the classic N+1 problem where you query once for a user, then query again for each piece of related data), your response time balloons from 50ms to 2-3 seconds. Users see timeouts. Your error rate spikes.
What actually breaks:
- Unindexed queries on large tables (a table with 10 million rows will scan the entire thing unless you’ve indexed the columns you filter on)
- Missing foreign key indexes (if users table doesn’t index the account_id column, joins get slow)
- Selecting all columns when you need three (bandwidth waste; slower parsing)
- No connection pooling between your app and database (opening a new connection per request is expensive)
Most founders don’t see this coming because their local development database has 100 test records. Production has millions. The query that took 2ms locally takes 200ms live.
Fix: profile your slow queries early. Use your database’s query analyser (EXPLAIN in PostgreSQL, for example). Index aggressively before you hit scale. A fintech platform we worked with discovered they were running eight separate queries on the user dashboard that could be combined into one-just by looking at their slowest endpoints.
File Storage and Image Handling Will Surprise You
If your product lets users upload files or generate images (especially with AI), this becomes urgent around 5,000-10,000 active users.
Storing files on your server’s disk doesn’t scale. Your server runs out of space. Serving files from disk is slow. Resizing images on-the-fly burns CPU. If your server crashes, you lose uploads.
The fix is cloud object storage (S3-compatible services). But this creates new problems:
- Bandwidth costs explode. Storing 1GB is cheap. Serving it 10,000 times isn’t. A SaaS product we built with image generation was paying AUD $2,000/month in storage before we switched to a CDN.
- Image processing becomes a bottleneck. If your app is resizing a user’s 50MB photo on request, that’s locking up a server thread. You need a background job system (Redis queues, for example) to handle this asynchronously.
- User experience degrades. Without a CDN, a user in Perth downloading a file served from your US server waits an extra 200ms. Multiply that by your monthly active users.
Plan for this before your storage bill shocks you. Use cloud storage from day one if your product touches files.
Your API Rate Limiting and Authentication Layer
Around 2,000-5,000 API calls per minute, authentication becomes expensive.
If every API request hits your database to validate a user’s auth token, you’re adding latency and database load. If you’re not caching authentication state (using Redis or similar), you’re doing extra work per request.
What breaks specifically:
- No token caching means every request does a database lookup. On high traffic, this alone can consume 30-40% of your database capacity.
- Rate limiting that hits the database (instead of checking against an in-memory cache) is slow and expensive.
- Weak rate limiting lets bots or angry users hammer your API and take it down.
Most startups overlook this because they’re focused on features. But if a competitor scrapes your API, or a user’s webhook integration runs in a loop, you’ll lose hours of uptime.
Implement rate limiting early. Cache auth tokens in Redis. Separate your public API from your internal API if you have both.
Background Jobs and Queue Systems
Once you’re doing anything async-sending emails, generating reports, processing uploads, training AI models-a queue system becomes essential.
Many founders try to handle this with cron jobs initially. A cron job runs on a schedule; every 5 minutes, it checks for work to do. This breaks fast because:
- If a job takes 6 minutes and cron runs every 5, jobs pile up and overlap.
- If the server handling cron jobs crashes, nothing runs until someone notices.
- You can’t prioritise urgent work over routine work.
- Scaling cron jobs across multiple servers is a nightmare.
Around 500-1,000 active users, add a proper queue system (Bull with Node.js, Celery with Python, Sidekiq with Rails). This gives you:
- Guaranteed job execution even if the server restarts.
- Easy priority queues (urgent customer support emails jump the line).
- Simple horizontal scaling (run workers on separate machines).
- Dead-letter queues for failed jobs (instead of silently losing them).
Caching Layers and Session Management
The last common breaking point: you’re reading the same data repeatedly from the database.
A user’s profile, settings, or feature flags are fetched on every page load, every API call. With 1,000 concurrent users, that’s thousands of identical queries per second.
Add Redis or Memcached. Cache hot data (user settings, feature flags, session tokens) for 5-60 minutes. Invalidate the cache when the data changes. Suddenly, your database load drops by 60-70%.
This is often the last piece because it’s easy to forget and because the ROI is huge but the upfront complexity feels optional.
Plan, Don’t Panic
Scaling breaks things in order: query performance, file storage, authentication, background jobs, caching. Understanding this order means you spend engineering effort on the right problems at the right time.
Ship your MVP fast. Monitor what’s slow. Fix in order of impact. If you’re building a new product or expanding an existing one and want a technical partner who thinks about this from day one, talk to Amora about your build. We design systems to scale from the start and ship MVPs live in 28 days.
Got something you want built?
Amora Digital is an Australian software and AI agency. We scope it, build it, and ship it – live in 28 days. No offshore teams. No surprises.