Vertical = bigger machine (more CPU/RAM). Horizontal = more machines behind a load balancer.
Go vertical first. It's one dashboard click, requires zero code changes, and modern cloud machines go absurdly big. Most apps never outgrow a well-sized single server plus a separate database.
Horizontal comes when vertical gets expensive or you need redundancy — but it demands your app be stateless: no sessions in memory, no files on local disk, everything shared (Redis, S3, database). That's a real refactor, so architects say 'design stateless from day one, scale vertically until it hurts'.
Before either: check it's not just a missing database index. 'Slow at 500 users' is almost never a scaling problem — it's an unoptimized query problem.
Real numbers for perspective: a $40/month VPS with Postgres tuned properly handles thousands of requests per second for a typical CRUD app. Most 'we need to scale' conversations at small startups are actually 'we need an index on that column' conversations.