← Blog Agency playbooks • 9 min read How agencies run 40+ isolated client staging & production apps on $60/mo of Hetzner servers (with automatic PR previews and clean client handoff)
Every agency that hosts client work eventually hits the same wall: the hosting bill grows with the client list, but the agency’s own price to the client doesn’t. A platform that charges per seat, per project or per gigabyte turns every new client into a smaller margin than the last one, right up until hosting is the line item the client questions on the invoice. That math is the actual reason agencies end up looking for an alternative, not a dislike of Vercel or Render as products.
The fix isn’t a cheaper per-seat platform. It’s not billing per client at all. Below is a worked example: 20 clients, each with a staging and a production copy of their app (40 running environments), isolated from each other, on real Hetzner server prices and a flat Railyard team price, compared against what the same 40 environments cost on Vercel or Render’s own published plans.
TL;DR
| Vercel | Render | Railyard + Hetzner | |
|---|---|---|---|
| Pricing model | Pro: $20/mo per member, includes $20 of usage, then usage-billed | Pro workspace: $25/mo flat + compute from ~$7/mo per service | $99/mo Team, flat, unlimited servers and apps |
| 40 running client environments | Not priced per app: cost is usage (bandwidth, function invocations) across all 40, which is where agencies overrun the base plan | 40 services × ~$7/mo minimum = $280/mo compute + $25 workspace = $305/mo floor, before any service needs more than the cheapest instance | Included in the flat fee; the only added cost is the servers themselves |
| A client requiring SSO | SAML SSO is a $300/mo add-on on top of Pro | Scale plan ($499/mo flat) adds SSO and SCIM | Included at $99/mo Team |
| Server cost for 40 environments | N/A (no server, it’s Vercel’s infrastructure) | N/A (no server, it’s Render’s infrastructure) | 10 Hetzner CX23 servers (2 vCPU, 4 GB, €5.99/mo each) = €59.90/mo, billed by Hetzner directly |
| Isolation per client | Project-level, shared platform | Service-level, shared platform | A dedicated server (or environment) per client, private network, separate database |
The Render row alone crosses $500/mo before a single client’s app needs more RAM than Render’s starter instance gives it. The Vercel row doesn’t have a clean per-app number because its billing isn’t per app, which is exactly the problem: an agency can’t quote a client a hosting cost from Vercel’s pricing page, only from last month’s invoice.
Why per-seat and per-app billing breaks for an agency specifically
A single-product team on Vercel or Render is paying for their own usage. An agency is paying for twenty different clients’ usage on one account, and every one of those clients’ traffic spikes, failed builds and preview deploys lands on the agency’s own bill, not the client’s. Render’s $7/mo figure is a starting price for the smallest instance size; a client’s real production app, the one actually serving their customers, needs more than that the moment it’s not a toy. Multiply any realistic per-service number by 40 running environments and the agency is managing a bill that moves every month for reasons that have nothing to do with the agency’s own work.
Railyard’s $99/mo Team plan is flat: unlimited servers and apps, deploy approvals, single sign-on and SCIM, and an audit log, for one price regardless of how many clients are on the account. The only number that moves is what Hetzner, DigitalOcean or whichever provider the agency already uses charges for the servers themselves, and that bill comes from the provider directly, with nothing added on top.
The isolation model: one client, one server (or one environment)
There are two honest ways to isolate client work on Railyard, and which one fits depends on the client.
A dedicated server per client. The agency connects a Hetzner (or DigitalOcean, Vultr, AWS) account, and each client gets their own server. Their staging and production apps, their database, their logs, all live on that one box, with nothing from another client’s account anywhere near it. This is the simplest model to explain to a client who asks “where does my data live,” and it’s the one the worked table below uses.
One shared server, one environment per client. For smaller clients where a dedicated server is overkill, several clients’ projects can share a server. Isolation still holds: every app gets its own database, provisioned per app with its own user and credentials, and every app’s private name (<name>.railyard.internal) only resolves to that app’s own container: a reference between two different clients’ apps simply doesn’t exist, there’s no shared network path to configure wrong. Networking covers how that private resolution actually works across servers once private networking is turned on for the team.
Either way, environments are full copies of a project: turning on an environment gives a client a real staging copy with its own database, not a shared sandbox that happens to have the same code.
The worked cost table: 40 environments, $60/mo of Hetzner
Ten Hetzner CX23 servers (2 vCPU, 4 GB RAM, 40 GB disk, €5.99/month each, Hetzner’s cheapest shared-vCPU plan as of this writing) comes to €59.90/month, billed by Hetzner directly. Put one client on each server, running a web process and a worker, each with a staging and a production copy:
| Per client | × 10 clients | |
|---|---|---|
| Services | Web + worker | 20 processes |
| Environments | Staging + production | 40 running apps |
| Server | 1 dedicated Hetzner CX23 (€5.99/mo) | €59.90/mo total |
Four containers per client sounds tight on 4 GB of RAM, and it would be if all four ran at full load simultaneously. They don’t: staging environments sleep after 30 minutes of no traffic by default, freeing RAM back for production, so a client’s box only has to carry its production load most of the time plus occasional staging traffic when the agency or the client is actually looking at it. That’s enough headroom for the kind of client work most agencies run (marketing sites, small internal tools, early-stage products), not for a client whose production app is already under heavy load, which is exactly the client you’d give a bigger box or a server of their own.
Scale this past 10 clients and the only number that changes is how many Hetzner servers the agency is renting, at Hetzner’s price, with no markup. 20 clients is 20 servers at roughly €120/month; the Railyard side of the bill stays $99/month flat whether that’s 10 clients or 200.
PR previews clients actually understand
With GitHub connected and previews turned on for an app, every pull request gets its own live copy, removed automatically when the PR closes. That’s a URL the agency can drop straight into a client Slack thread or an email, something like “here’s the homepage redesign, click around,” without spinning up a separate staging deploy by hand for every round of feedback. It’s included on Pro and Team, not a line item that shows up once the agency account crosses some usage threshold.
Clean handoff when the project ends
Two different things can happen at the end of an engagement, and they’re not the same feature.
If every client’s work has lived inside the agency’s own Team, nothing about the handoff is automatic: the agency keeps the servers, or transfers ownership of the specific server and app records to the client’s own account by hand.
If the agency used client workspaces instead (a feature on the Agency plan, $199/mo, which adds client workspaces under one agency bill on top of everything Team includes: SSO, SCIM, deploy approvals, audit log, replicated into each workspace), each client already lives in their own team from day one, with their own servers billed to their own cloud account. Ending the engagement is a client handover: the agency invites the client’s own email as the new owner of that workspace, and the client workspace detaches from the agency’s billing and admin access cleanly. The client ends up owning exactly the infrastructure they were already running on, nothing more.
Team at $99/mo is the right fit for an agency that wants one place to manage every client’s apps under its own account, with the margin advantage of a flat price. Agency at $199/mo is the right fit the moment “give the client their own bill and a clean exit” is actually part of how the agency sells engagements.
Teams, SSO and the audit log
The moment a client’s own security review asks for single sign-on, Vercel answers with a $300/month add-on and Render answers by pushing the agency onto its $499/month Scale plan. On Railyard’s Team plan, SSO over OpenID Connect or SAML, SCIM provisioning, and the audit log that records every deploy, variable change and approval are already included at $99/mo. See Teams, SSO and access for how OpenID Connect, SAML and SCIM are actually wired up, and how team SSH keys get added to every server in their own managed block without touching keys the agency added itself.
Who this is actually for
This isn’t a pitch for every agency. An agency running two or three clients on one server, with nobody asking about SSO, probably doesn’t need any of this; the free plan or a single Pro team covers that fine. This is for the agency that’s already paying $500 or more a month across client projects on a per-seat platform, managing a bill that moves for reasons outside its control, and that wants a hosting cost it can actually quote a client from a price list instead of last month’s invoice. See pricing for the full plan breakdown, or agencies for the rest of what the Agency plan includes.
FAQ
Do I need the Agency plan, or does Team cover this?
Team ($99/mo) covers unlimited servers and apps, SSO, deploy approvals and an audit log under one account, enough for an agency that manages every client’s apps itself. Agency ($199/mo) adds client workspaces: separate workspaces per client, each with Team’s own features, handed over to the client cleanly when the engagement ends.
Does each client need their own server?
No. A dedicated server per client is the simplest model and the one this post’s worked table uses, but smaller clients can share a server, each with their own environment, database and private name, isolated from each other without needing a dedicated box each.
What happens to a client’s app if the agency’s Railyard account is canceled?
The app is a container on a server billed by the agency’s own cloud provider; canceling the Railyard subscription doesn’t stop it. A client workspace that’s already been handed over to the client isn’t affected by anything happening on the agency’s own account at all, since it’s a separate team by then.
How is this cheaper than Render once you add up the server costs?
It isn’t automatically cheaper for one client; it’s cheaper at scale, because the Railyard fee doesn’t grow per client the way Render’s per-service compute does. Ten clients cost $99/mo plus roughly €60/mo in Hetzner servers; twenty clients cost the same $99/mo plus roughly €120/mo in servers. Render’s compute line grows with every added service, on top of a $25 or $499 workspace fee.
Can I migrate existing clients off Vercel or Render?
Yes, for Heroku, Render, Railway and Fly.io specifically. Importing from another platform brings over config, process types and managed databases directly from an API token. Vercel projects move over as a fresh deploy from the client’s repository rather than an automated import, since Vercel’s own API doesn’t expose the same process-level config the others do.