TL;DR
Self-hosting WordPress for roughly 1,000 daily active users runs €15–€40 per month on Hetzner, $25–$60 on DigitalOcean, and $30–$70 on Linode — all of which undercut managed hosts like Kinsta ($35+), WP Engine ($25+ but throttled), and WordPress.com Business ($25/mo, with plugin restrictions lifted only at higher tiers). The catch: you are also buying yourself a part-time sysadmin job. This guide gives you a line-item monthly spreadsheet, a sane reference architecture, and a performance checklist that lets a €4.50 VPS handle traffic that "needs" a $200 plan.
What "1,000 users" actually means
Before we price anything, define the workload. "1,000 users" is meaningless without a unit. For this guide we'll assume:
- ~1,000 daily active visitors (roughly 30k/month)
- ~3 pageviews per session, so ~90k pageviews/month
- Peak concurrency around 20–30 simultaneous requests
- A content site (blog, docs, small e-commerce catalog) — not a logged-in app like BuddyPress or LearnDash, which change the math entirely
- 80%+ cache hit rate from page caching (which any competent stack achieves)
That last point is the whole game. A properly cached WordPress site serves most requests as static HTML from nginx or a CDN, never touching PHP-FPM or MySQL. The "WordPress is slow" reputation is almost entirely a story about unconfigured stacks.
Reference architecture
Here's the stack I'd deploy for this workload on any of the three providers:
- Web tier: nginx + PHP-FPM 8.3, WordPress 6.x, Redis Object Cache, FastCGI page cache
- Database: MariaDB 11 (or MySQL 8) co-located on the same box
- Object storage: S3-compatible bucket for media offload (Hetzner Object Storage, DO Spaces, Linode Object Storage)
- CDN: Cloudflare free tier in front of everything
- Backups: Nightly
mysqldump+wp-contentrsync to a second region's object storage - Monitoring: UptimeRobot free tier + Netdata Cloud free tier
That's it. No Kubernetes, no separate DB instance, no load balancer. At 1,000 users you do not need horizontal scaling — you need a single well-tuned box and a CDN.
Month-by-month cost spreadsheet
All prices are 2026 list pricing. Hetzner is in EUR (Falkenstein/Helsinki), DO and Linode in USD.
Hetzner build
| Line item | Spec | Monthly |
|---|---|---|
| App + DB server | CX22 (2 vCPU, 4 GB, 40 GB NVMe) | €4.51 |
| Backups (built-in snapshots) | 20% surcharge | €0.90 |
| Object storage | 100 GB included tier | €5.94 |
| Egress | ~50 GB (most served by CDN) | included in 20 TB |
| CDN | Cloudflare Free | €0 |
| Monitoring | UptimeRobot + Netdata Free | €0 |
| Domain | .com averaged | €1.00 |
| Total | ~€12.35 |
If you want a bit more headroom — say you run WooCommerce or have spiky traffic — bump to a CX32 (4 vCPU, 8 GB) for €7.55 and you're at roughly €15.50/month all-in.
DigitalOcean build
| Line item | Spec | Monthly |
|---|---|---|
| Droplet | Premium AMD 2 vCPU / 2 GB | $18 |
| Automated backups | 20% | $3.60 |
| Spaces object storage | 250 GB included | $5 |
| Snapshot for DR | ~10 GB | $0.60 |
| CDN | Cloudflare Free | $0 |
| Monitoring | DO built-in + UptimeRobot | $0 |
| Total | ~$27.20 |
The cheapest $6 Basic Droplet (1 vCPU, 1 GB) technically works, but you will swap under load and curse your life. The 2 GB tier is the realistic floor.
Linode (Akamai) build
| Line item | Spec | Monthly |
|---|---|---|
| Shared CPU 2 GB | Nanode 2GB | $12 |
| Backups | Linode Backup Service | $2.50 |
| Object Storage | 250 GB tier | $5 |
| CDN | Cloudflare Free | $0 |
| Total | ~$19.50 |
Linode's $5 Nanode 1GB is roughly equivalent to DO's $6 droplet — fine for a brochure site, painful for anything dynamic. Step up to the 2 GB plan.
Managed WordPress comparison
| Provider | Plan | Monthly | Visits cap | Notes |
|---|---|---|---|---|
| WordPress.com | Business | $25 | "unlimited" but throttled | Plugins/themes only on Business+ |
| Kinsta | Starter | $35 | 35,000 visits | Overage ~$2/1k visits |
| WP Engine | Essential Startup | $25 | 25,000 visits | 10 GB storage, overage fees |
| Cloudways (DO 2GB) | DO 2GB managed | $33 | n/a | DO infra + $14 management markup |
| Pressable | Build | $25 | 30,000 visits | Automattic-owned |
So the comparison at this scale looks like:
- Hetzner DIY:
€12/mo ($13) - Linode DIY: ~$20/mo
- DigitalOcean DIY: ~$27/mo
- Managed WP: $25–$35/mo
The raw dollar gap with managed hosts is smaller than people pretend — maybe $10–$20/month. The real reason to self-host is what managed hosts won't let you do: install whatever plugin you want, run custom cron, SSH in, use a non-standard PHP extension, or grow past their visit cap without a sudden 3x bill.
Where managed hosts win
Be honest about this part. For an extra $15–$20/month you get:
- Automatic WP core + plugin updates with visual regression testing
- Staging environments with a one-click push to prod
- Edge caching tuned specifically for WP
- Someone to call at 2 a.m. when the site is down
- WAF and brute-force protection without configuration
- Free migrations
If your time is worth more than $40/hour and you'd spend even one hour a month on infra, managed hosting is mathematically cheaper. The osscostcalc calculator on this site lets you plug in your hourly rate and see the crossover point — it usually lands around 1–2 hours/month of toil.
The performance-tuning checklist
A CX22 will fall over at 50 concurrent requests if you install WordPress with defaults. With the following checklist, the same box handles 500+ req/s of cached traffic and ~30 req/s of uncached.
nginx + PHP-FPM
- Enable FastCGI page cache with a 1-hour TTL for anonymous users, bypass for logged-in
- Set
pm = ondemandwithpm.max_children = 15on a 4 GB box (rule of thumb: RAM ÷ 60 MB per worker) - Enable HTTP/2 and Brotli
- Set
client_max_body_size 64m;so media uploads don't 413
PHP
- PHP 8.3, OPcache enabled with
opcache.memory_consumption=256 opcache.validate_timestamps=0in prod (and a deploy hook to reset)- JIT enabled (
opcache.jit=tracing,opcache.jit_buffer_size=128M)
MariaDB
innodb_buffer_pool_size= 40% of RAM (1.5 GB on a 4 GB box)query_cache_type=0(deprecated, hurts more than helps)- Use Percona's
mysqltuner.plafter a week of real traffic and follow its advice
WordPress layer
- Redis Object Cache (the official plugin) — drops DB query load by 60–90%
- A page cache plugin (W3 Total Cache, LiteSpeed Cache, or WP Super Cache) configured for disk + nginx integration
- WP-Cron disabled in
wp-config.php(DISABLE_WP_CRON), replaced with a real system cron hittingwp-cron.phpevery 5 minutes - Offload media to object storage with the WP Offload Media or Media Cloud plugin
- Limit Heartbeat API to 60s intervals or disable on front-end
CDN
- Cloudflare in "Cache Everything" page rule for
/*with a bypass cookie forwordpress_logged_in_* - Enable Tiered Cache and Argo if you have international traffic ($5/mo extra, often worth it)
With this in place, your origin handles maybe 5–10% of total requests. Your bottleneck becomes admin/cart traffic, which is exactly what you have CPU headroom for.
Backups and disaster recovery
The single biggest mistake self-hosters make is treating provider snapshots as backups. They are not. If your account gets suspended, your snapshots vanish with it.
Minimum viable DR for this stack:
- Nightly
mysqldump --single-transactionpiped through gzip to object storage in a different provider or region - Weekly
wp-contenttarball to the same destination - 30-day retention with lifecycle rules
- A quarterly restore drill — actually spin up a fresh VPS and restore. Untested backups don't exist.
Tools that make this painless: restic to S3-compatible storage, or the wp-cli backup workflow scripted into a systemd timer. Budget another €1–€2/month for cross-region storage.
Hidden costs people forget
- TLS: Free via Let's Encrypt, but you need certbot configured and renewing
- Email: Transactional email from your VPS will get marked as spam. Use Amazon SES (~$0.10/1000), Postmark, or Mailgun. Budget $1–$5/month.
- Security patching: Unattended-upgrades for the OS, plus a habit of
wp plugin update --allweekly - Your time: Realistically 1–3 hours/month if nothing breaks, 8+ hours the month something does
Decision checklist
Use this before you provision anything:
- Will you actually configure Redis and a CDN? If no, pay for managed hosting. An unoptimized self-host is worse than Kinsta in every dimension.
- Do you have a working backup restore tested in the last 90 days? If no, you don't have backups.
- Is your traffic geographically concentrated? EU traffic → Hetzner Falkenstein is unbeatable. US traffic → DO NYC or Linode Newark. Global → CDN matters more than origin location.
- Are you running WooCommerce or a membership site? Double the RAM and the budget; cache hit rates collapse for logged-in users.
- What's your hourly rate × expected toil hours? Plug it into the comparison tool on this site alongside the provider prices. If toil cost > $20/month, managed wins.
- Do you need a plugin WordPress.com bans? (SEO plugins, custom analytics, certain caching plugins.) That alone forces you to self-host or pay $25/mo for Business tier minimum.
For most technical readers running a content site at this scale, a €15/month Hetzner CX22 with the checklist above is the right answer. For everyone else, $35/month to Kinsta buys real peace of mind. Both are defensible; what isn't defensible is a $6 droplet with default WordPress settings and no backups.