After the Hetzner issues I blogged about last week, we evaluated alternatives. Here's the methodology, the data, and what we found.
Picking the Candidates
German S3-compatible object storage is a narrower field than you'd think once you add real constraints.
We excluded the enterprise hyperscalers upfront: STACKIT (Schwarz Group — Lidl's cloud arm, "European hyperscaler") and Open Telekom Cloud (Deutsche Telekom) are both legitimate for large regulated enterprises. But they're built for procurement processes, not developer self-service. Signing up, creating a bucket, and running a benchmark should take 10 minutes. Neither of those makes that easy, and neither is priced for lean SaaS teams.
That left four candidates we actually wanted to test:
| Provider | Location | Notes |
|---|---|---|
| Hetzner (nbg1) | Nuremberg | The Platzhirsch — everyone's default, and the one with the capacity issues |
| IONOS (eu-central-4) | Frankfurt | Well-known German provider, developer-friendly S3 API |
| Intercolo (de-fra) | Frankfurt | Smaller German incumbent, competitive pricing |
| Plusserver (de-west-1) | Cologne | German-owned, GDPR-focused positioning |
The selection was deliberate: one dominant player, and three smaller German incumbents we hadn't tried before. All four offer S3-compatible APIs, self-serve signup, and pricing that makes sense for a startup.
What We Didn't Benchmark — and Why
For completeness, here's the full German/EU provider landscape and why the others didn't make the cut:
| Provider | 1TB storage/month | Egress | Why skipped |
|---|---|---|---|
| Hetzner | €6.49 (incl. 1TB egress) | €1/TB extra | ✅ Benchmarked |
| Intercolo | €4.99 on-demand (€2.49+ contracted) | 1TB/TB included | ✅ Benchmarked |
| IONOS | €7.00 | Free¹ | ✅ Benchmarked |
| Plusserver | €22.00 | Free | ✅ Benchmarked |
| Open Telekom Cloud | €24.08 | €74.41/TB | Enterprise pricing — €98.49/month with 1TB egress |
| STACKIT | €26.62 | — | Enterprise hyperscaler, procurement-oriented |
¹ IONOS charges for Object Query: €0.0014/GB data scan, €0.0005/GB data return — relevant for analytics workloads, negligible for standard asset serving.
Open Telekom Cloud and STACKIT both have legitimate EU credentials and proper compliance posture — but their pricing reflects enterprise procurement, not startup self-service. At €98.49/month for 1TB in + 1TB out (OTC) vs €6.49 for the same on Hetzner, the gap doesn't justify evaluation for our use case.
The Test Setup
We built a benchmark tool that uploads a 300-file corpus to each provider and downloads it in three rounds, taking the median. The corpus covers realistic production file sizes:
| Tier | Count | Size range | Represents |
|---|---|---|---|
| Tiny | 100 | 2–10 KB | JSON configs, manifests |
| Thumb | 100 | 20–150 KB | Thumbnails, icons |
| Asset | 50 | 200–500 KB | Compressed assets |
| Large | 25 | 5–25 MB | 3D models, textures |
| XL | 25 | 30–80 MB | Large video files |
Files contain random bytes — incompressible — for realistic network load. The two metrics that matter: TTFB (time to first byte — measures per-request latency) and throughput (MB/s — measures raw bandwidth).
Test machine: office workstation, 1 Gbps uplink. More on that uplink in a moment.
Round 1: Something Looks Wrong
First run, all four providers, 300-file corpus:
| Provider | Large file throughput p50 |
|---|---|
| Hetzner (nbg1) | 11.0 MB/s |
| Intercolo (de-fra) | 11.4 MB/s |
| IONOS (eu-central-4) | 11.0 MB/s |
| Plusserver (de-west-1) | 11.4 MB/s |
Four completely different storage backends. All capped at ~11 MB/s. That's too uniform to be real.
It was our fault. The test machine had a misconfigured NIC — it was running at 100 Mbps instead of 1 Gbps. We were measuring our own bottleneck.
Lesson learned: before benchmarking providers, benchmark your test machine. If every backend looks identical, the problem is probably yours.
After fixing the uplink: completely different picture.
Round 2: The Real Test
Same corpus, 1 Gbps uplink. This is where the providers separated:
Large File Throughput (MB/s)
| Provider | avg | p50 | p90 |
|---|---|---|---|
| IONOS (eu-central-4) | 87.3 | 87.1 | 96.2 |
| Hetzner (nbg1) | 72.4 | 72.6 | 84.1 |
| Intercolo (de-fra) | 12.6 | 12.8 | 13.1 |
| Plusserver (de-west-1) | 16.1 | 16.4 | 17.2 |
IONOS and Hetzner unlocked immediately. Intercolo and Plusserver stayed stuck at 12–16 MB/s — roughly 100–130 Mbps. That's not a coincidence; that's a hard bandwidth cap on their object storage product.
For context: at 16 MB/s, downloading a 100 MB file takes over 6 seconds. That's a dealbreaker for serving production assets to end users.
Intercolo and Plusserver were eliminated at this point.
Small File TTFB (ms) — Same Run
| Provider | avg | p50 | p90 | max |
|---|---|---|---|---|
| IONOS (eu-central-4) | 22 | 14 | 42 | 179 |
| Intercolo (de-fra) | 51 | 38 | 78 | 129 |
| Plusserver (de-west-1) | 61 | 38 | 99 | 174 |
| Hetzner (nbg1) | 123 | 66 | 185 | 543 |
Worth noting: Intercolo and Plusserver are actually competitive on latency — 38ms p50 is reasonable. Their problem is purely the bandwidth cap. If they ever lift it, they'd be worth re-evaluating.
Final Comparison: IONOS vs Hetzner
With Intercolo and Plusserver out, we ran the full corpus across multiple days for a clean IONOS vs Hetzner result.
TTFB — Small Files
| avg | p50 | p90 | max | |
|---|---|---|---|---|
| IONOS | 21ms | 12ms | 40ms | 211ms |
| Hetzner | 108ms | 100ms | 182ms | 376ms |
IONOS is 8× faster on median small-file latency. For anything serving many small objects — API responses, thumbnails, manifests — that gap is significant.
Throughput — Large Files
| avg | p50 | p90 | |
|---|---|---|---|
| IONOS | 88.3 MB/s | 93.4 MB/s | 103.7 MB/s |
| Hetzner | 56.7 MB/s | 61.2 MB/s | 78.5 MB/s |
IONOS leads by ~56% on average throughput. Hetzner's 61 MB/s is usable for production — it's not bad — but it's not close.
Parallel Load (5× Concurrent Large Files)
| Aggregate MB/s | Wall time | |
|---|---|---|
| Hetzner | 103.0 | 16.8s |
| IONOS | 106.5 | 16.2s |
Under heavy parallelism, both providers converge near 100–107 MB/s aggregate. At 5× concurrency the local uplink becomes the bottleneck, not the storage backend. Neither provider's advantage compounds at scale — it's roughly a wash.
The Verdict
IONOS is the clear winner for latency-sensitive or throughput-critical workloads:
- 12ms median TTFB for small files (Hetzner: 100ms)
- 93 MB/s median throughput for large files (Hetzner: 61 MB/s)
- Frankfurt-based, EU-owned, developer-friendly, sensible pricing
Hetzner is acceptable if bulk throughput at low cost is the priority — but given the ongoing capacity issues, we'd be cautious about committing new workloads to NBG1 right now. Their own advice is to use HEL instead.
Intercolo and Plusserver: promising on latency, eliminated on throughput. Hard bandwidth caps of ~100–130 Mbps are not production-grade for asset delivery. Would revisit if that changes.
STACKIT and Open Telekom Cloud: didn't benchmark. Enterprise procurement, enterprise pricing. Not the right tool for this use case.
The Bigger Picture
We started this evaluation because Hetzner Object Storage was causing us problems. We ended it with a clear answer: IONOS is the better backend for our workload.
But the more useful takeaway might be simpler: even in Germany, not all S3-compatible storage is equal, and the cheapest option isn't always the most reliable one. Given that Hetzner's issues have been running for months with minimal public documentation, it's worth checking your own stack.
Test run: 2026-03-06 to 2026-03-08. 300-file corpus, 3 rounds per file, median reported. Test machine: office workstation, 1 Gbps uplink. Results reflect our network path and may vary.
