$osscostcalc.comSelf-hosting cost intelligence

Self-Hosted WordPress at 1,000 Users: A Real Cost Breakdown

9 min read·1,675 words·Cost

TL;DR

Self-hosting WordPress for ~1,000 daily users costs €15–€40/month on Hetzner with sensible caching, versus $35–$300/month for Kinsta, WP Engine, or WordPress.com Business. The savings are real, but only if you actually configure Redis, a CDN, and off-box backups — otherwise you are renting a future outage.

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-content rsync 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 = ondemand with pm.max_children = 15 on 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=0 in 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.pl after 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 hitting wp-cron.php every 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 for wordpress_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-transaction piped through gzip to object storage in a different provider or region
  • Weekly wp-content tarball 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 --all weekly
  • Your time: Realistically 1–3 hours/month if nothing breaks, 8+ hours the month something does

Decision checklist

Use this before you provision anything:

  1. 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.
  2. Do you have a working backup restore tested in the last 90 days? If no, you don't have backups.
  3. 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.
  4. Are you running WooCommerce or a membership site? Double the RAM and the budget; cache hit rates collapse for logged-in users.
  5. 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.
  6. 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.

wordpressself-hostinghetznerdigitaloceanlinodecost-analysis