Why I Left Vercel
Last week, Vercel paused my account. The trigger was free-tier CPU overage. The deeper cause was that my workload, which is a Next.js 16 production site with a small but real audience, had outgrown what the free tier covers. Fair enough on Vercel's part, except for one thing: when I tried to upgrade to Pro, my Indian payment cards were rejected at the $20-per-month checkout.
This isn't a Vercel-specific problem. Stripe-based US-first SaaS platforms regularly fail to accept Indian cards on subscription products, especially for higher-tier plans where the underwriting is stricter. I was now in the position of having a paused production site, a customer base waiting for it to come back, and no clean path to upgrading on the platform that was hosting me.
I gave Vercel about 90 minutes of trying. Then I went looking for an alternative.
Seven days later, my site is on a Hostinger KVM 2 VPS in Mumbai, the move cost $10 per month versus what would have been $20+ on Vercel Pro, and most things are running better than they did on Vercel. Some things are running worse. Here's the honest version.
TL;DR
- Vercel paused free-tier account, refused Indian cards on Pro plan, forced migration.
- Moved to Hostinger KVM 2 ($10/mo), 8GB RAM, 2 cores, 100GB disk, Mumbai data center.
- Setup took 4 hours, including DNS migration through Cloudflare.
- Site has been live on Hostinger for 7 days. One downtime incident (OOM during a build, fixed by adding swap).
- Cost is half of Vercel Pro. Latency to my Indian audience improved from ~150ms (US edge) to ~30ms (Mumbai). Build speed is comparable.
- The trade-off: I now run nginx, PM2, certbot, and a system swap config myself. If you want zero ops, stay on Vercel. If you want full control at half the price and don't mind 3-4 hours of one-time setup plus occasional ops work, Hostinger wins.
What I Was Running On Vercel
For context, the workload that exceeded Vercel free tier:
- Next.js 16 with App Router, server components, API routes, dynamic rendering on most pages.
- About 5,000 monthly visitors at the time, growing.
- Several cron jobs firing every 6 hours via Vercel Cron (newsletter drips, scheduled emails).
- Heavy build pipeline. The repo includes 2,300+ skill files in JSON, 99 blog posts, a research PDF, and a few large content files. Production builds were genuinely heavy.
- External services unchanged across migration: Upstash Redis, Razorpay, PayPal, Cloudflare DNS.
The build pipeline is what tipped me into free-tier overage. Each push triggered a full Next.js production build, which was using more CPU minutes than the tier allowed. Fair limitation, just not affordable to upgrade out of with Indian-card billing.
What I Picked
I looked at three options:
- DigitalOcean. Solid, but their cheapest VPS is $4/mo for 1GB RAM, and the next tier up at $12/mo gives you 2GB. To match what I'd actually need (4-8GB), you're at $24-48/mo.
- Linode (Akamai). Similar pricing to DigitalOcean. Slightly older UI.
- Hostinger KVM VPS. $10/mo for KVM 2, which is 8GB RAM, 2 cores, 100GB disk. Mumbai data center option for India latency.
The deciding factors for Hostinger:
- Indian-card-friendly billing. They take Indian credit cards and UPI without the underwriting issues that killed me on Vercel and Stripe. This was 80% of the decision.
- Mumbai data center. Real latency advantage for my mostly-Indian audience. Static page TTFB went from ~140ms (Vercel's nearest edge) to ~25ms (Mumbai).
- Price-to-resources ratio. 8GB RAM at $10/mo is genuinely cheap. The same memory on DigitalOcean is 3x the cost.
The risk: Hostinger has a reputation for being a budget host with shared hosting that's slow. The KVM VPS line is a different product, properly virtualized with dedicated resources. Reviews of the VPS specifically (not the shared hosting) are positive.
I signed up. Plan was Hostinger KVM 2. Took the card payment, server provisioned in about 4 minutes, SSH in.
The Actual Migration
Four hours of work over two evenings. Steps in the order I did them:
1. Provision the VPS and install the basics
Ubuntu 24.04 LTS, root SSH access. First commands:
apt update && apt upgrade -y
apt install -y nginx certbot python3-certbot-nginx git curl
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
npm install -g pm2
Node 22, nginx, certbot, pm2. Standard Linux web stack. About 6 minutes.
2. Clone the repo and build
mkdir -p /var/www && cd /var/www
git clone https://github.com/Samarth0211/claude-skills-hub.git
cd claude-skills-hub
npm install
npm run build
First build took ~3 minutes. No issues.
3. Start the app under PM2
pm2 start "npm run start" --name clskills
pm2 save
pm2 startup
App running on port 3000, PM2 keeps it alive on crashes, comes back on reboot.
4. Configure nginx as reverse proxy
/etc/nginx/sites-available/clskillshub.com:
server {
listen 80;
server_name clskillshub.com www.clskillshub.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Symlink to sites-enabled, reload nginx, test that the IP serves the site.
5. Migrate DNS through Cloudflare
This was the hairy part, and the one I'd do differently in hindsight.
Domain was registered at Hostinger but using Vercel's nameservers (ns1.vercel-dns.com, ns2.vercel-dns.com) from when I first set up Vercel. The clean migration is:
- Add the domain to Cloudflare (free plan), let Cloudflare assign you their nameservers.
- At your registrar, change the nameservers to Cloudflare's pair.
- In Cloudflare DNS, add A records for
@andwwwpointing to the Hostinger IP.
What I did wrong: I added the records to Cloudflare correctly, but at the registrar I added Cloudflare's nameservers WITHOUT removing Vercel's. For a few days the domain had four nameservers listed (two Cloudflare, two Vercel). Some DNS resolvers cached the Vercel delegation, queried Vercel's nameservers, and got back the old Vercel deployment IPs.
The symptom was random 50% of users getting a Vercel paused page instead of my actual site. Took me a day to diagnose. Fix: at the registrar, remove the Vercel nameservers entirely so only Cloudflare remains. Then in Vercel's project Domains UI AND in Vercel's account-level DNS Domains UI, remove the domain. That second one is non-obvious and easy to miss.
If you're migrating, do both nameserver changes AND zone deletions in the same session. Don't leave one provider half-configured for any meaningful time.
6. Issue Let's Encrypt cert
certbot --nginx -d clskillshub.com -d www.clskillshub.com
Certbot reads the nginx config, talks to Let's Encrypt, drops in the cert, modifies the nginx config to listen on 443. Renewal cron is auto-installed. I went one further and got a wildcard cert (*.clskillshub.com) so future subdomains are covered, but the basic -d form is enough for most cases.
7. Migrate environment variables
vercel env pull from local before the migration gave me a .env.production.local file. I scp'd it to the VPS.
One sharp edge: Vercel's env export adds literal \n characters to multi-line values that aren't actually multi-line in source. Razorpay signing keys and the SMTP password came out with trailing \n characters that broke signature verification at runtime. The fix:
sed -i 's/\\n\"$/\"/' .env.production.local
If you migrate Vercel envs to anywhere else, run that sed BEFORE you start the app.
8. Set up PM2 startup so the app survives reboots
pm2 startup
pm2 save
With systemd integration. If the VPS reboots (Hostinger does monthly maintenance), the app comes back without me touching it.
Total migration time: 4 hours including the DNS confusion. Without that mistake, probably 2 hours.
The Incidents That Happened in the First 7 Days
Day 2: OOM during a build
First real outage. I pushed a deploy, the build process spiked memory to 6GB+ during Turbopack's bundling pass, and the kernel OOM killer started picking processes. Ended up killing the SSH daemon and the running Next.js server. Site was unreachable for ~30 minutes until I rebooted via the Hostinger panel.
Diagnosis: I'd thought I was on a 2GB plan (KVM 2 sounded like 2GB RAM to me). Turns out the "KVM 2" name refers to the plan tier, not the memory. I actually had 8GB RAM. The OOM happened because I had no swap configured at all, and Next.js builds can briefly spike past available RAM even when the floor is high.
Fix:
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
sysctl vm.swappiness=10
2GB swap, swappiness low so the kernel prefers RAM. Build spikes now use swap as overflow instead of crashing the box. Hasn't happened again.
This was 100% my mistake, not Hostinger's.
Day 4: DNS split-brain
The Vercel nameserver leftover I described above. Some users hit the live site, some hit Vercel's paused-deployment page. Took a day to diagnose because from my own networks (mobile, mostly), the site worked, so I didn't notice the issue until a user emailed.
Fix described above: remove Vercel nameservers from registrar, delete the zone from Vercel's team-level DNS panel. Once cached delegations expired (24-48 hours), problem fully resolved.
This was also my mistake, but Vercel's UX of having two separate Domains pages (project-level and team-level) made it harder to find than it should have been.
Other minor things
- One Razorpay payment failure on day 3 because of the
\nenv var issue. Fixed in 5 minutes. - One certbot renewal that initially failed because nginx was reloading during the cert challenge. Auto-retry succeeded on the next run.
- A few SSH disconnects when my laptop went to sleep mid-deploy. Annoying but not the host's fault.
What Hostinger Does Better Than Vercel For My Workload
Cost. $10/mo versus what would have been $20/mo on Pro. Half price. Over a year, that's $120 saved, which is real money for a solo founder.
Latency to my actual users. My audience is roughly 60% Indian, 30% US, 10% other. Vercel's edge served the US users fast and the Indian users slowly (their nearest edge for India is Singapore). Hostinger Mumbai serves Indian users fast (~25ms TTFB) and US users slower (~200ms). For my audience that's a net improvement on real-user-monitored latency.
No build-minute pricing surprises. On Vercel I was nervous about every push because deploys consumed billed minutes. On Hostinger, builds happen on the VPS using its included CPU, so a deploy storm has no marginal cost.
Full Linux access for ad-hoc tasks. Need to debug something? ssh in, run a script, look at logs, restart a process. On Vercel, every diagnostic was through their dashboard or CLI, which works but is more abstract.
Indian-card billing actually works. Razorpay-friendly Hostinger billing, no payment-rejection issues that killed my Vercel Pro plan attempt.
What Vercel Does Better Than Hostinger
Zero ops. On Vercel you push to git and the deploy happens. On Hostinger I run a deploy.sh script that pulls, builds, and restarts PM2. Not hard but it's an extra concept.
Edge runtime. Vercel's edge runtime would have served static content from a node closest to each user globally. Hostinger Mumbai is fast for Indians, slow for everyone else. If your audience is genuinely global with a strong American skew, Vercel still wins on global TTFB.
Preview deployments. Vercel auto-builds every PR and gives you a preview URL. I built nothing equivalent on the VPS. For a solo project this is fine, for a team it's a real loss.
Built-in observability. Vercel's analytics, speed insights, and log streaming are all immediate. On the VPS I wired up basic logging through PM2 and rely on Cloudflare analytics for traffic. Less polished.
Cron via UI. Vercel Cron is a checkbox in vercel.json. On the VPS, you edit the system crontab. Same effect, less ergonomic.
When Each One Is The Right Choice
Stay on Vercel if:
- Your audience is US-centric and you benefit from edge runtime to all of North America
- You don't want to think about ops at all
- You're on the free tier and not over the line, OR you can afford Pro and your cards work for it
- You value preview deployments per PR (real for teams)
Move to a VPS like Hostinger if:
- You're paying for Pro/Business and the price feels high relative to your usage
- Your audience has geographic concentration that Vercel's edge doesn't naturally serve well (India, Brazil, Southeast Asia)
- You're an Indian founder running into Stripe/Vercel billing issues with Indian cards
- You want the option to host other small apps on the same machine (I'm planning to host a second project as a subdomain on this same VPS, which costs nothing extra)
- You're comfortable spending 4 hours one-time setting up nginx, PM2, certbot, and willing to do occasional ops work
What I'd Tell Anyone Considering The Move
Do all the migration steps in one session. Don't leave Vercel half-deconfigured. Half-migrated DNS is the worst outage profile because users get inconsistent behavior depending on which resolver they hit.
Add swap from day one. Even if your plan has 8GB RAM, Next.js production builds can spike. Cost: 30 seconds of setup. Saves you a 30-minute outage.
Write a deploy.sh script the first day. Manual git pull && npm run build && pm2 restart works once. The third time you do it you'll forget a step. Script it.
Use Cloudflare for DNS. Their UI is clean, their nameservers are fast, and the free tier covers everything most projects need.
Don't move on a Friday. Move on a Saturday morning so you have all weekend if something breaks. Mine actually did break (the OOM and the DNS issue), and having time to fix without customer pressure helped.
The Bottom Line
For an indie founder running a Next.js production site at low to moderate scale, with an audience that benefits from Mumbai or another regional data center, Hostinger KVM 2 at $10/mo is meaningfully better than Vercel Pro at $20/mo. The trade-off is 4 hours of one-time setup plus occasional Linux ops work.
If you're in a similar position (Vercel paused you, your cards don't work for Pro, you want to control more of your stack, you want to host multiple small projects on one machine), Hostinger's KVM VPS plans are at this link. I get a small commission if you sign up through that link, which I'm using to help cover the cost of running this site. I'm a paying customer either way.
The full ops playbook I wrote up while doing this migration is also worth reading if you're going to commit. It covers the deploy script, the OOM debugging, the certbot config, and the cron setup.
Related Reading
- GPT-5.5 Pro vs Claude Opus 4.7 - what I run on the new VPS
- Claude Code April 2026 Updates - the dev tool I use most
- My full stack page - every tool listed with affiliate disclosure
Sources and tools mentioned
Some links in this post are affiliate links. I'm a paying Hostinger customer regardless. If you sign up via my link, I get a commission at no extra cost to you, which helps fund the free guide and research on this site.
Questions about a specific part of the migration, or stuck on a step yourself? Reply on the newsletter and I answer every email.
