Build the mental model
Choosing where to deploy an application starts with one question: what are you actually deploying? A static website with no server-side logic fits static hosting or a CDN — fast, cheap, simple.
A modern frontend built with a framework like React or Vue, without heavy server rendering needs, usually fits a managed frontend platform built for that workflow. A full-stack framework app that mixes frontend and backend in one codebase fits a managed full-stack platform designed around that pattern.
A standalone Node.js or Python backend often fits a PaaS, a container, or a small server, depending on how much control you need. A long-running backend process — one that can't be swapped for short-lived functions — needs a container, a VM, or a managed service built for persistent workloads.
- A project centered on a database points toward a managed database service or a BaaS
- Need authentication and a database working together quickly — a BaaS may be the fastest path
- Need code running close to users at the network edge — look at edge platforms
- Need full control over infrastructure — a major cloud provider with VMs and containers gives you that control at the cost of more setup work
A helper, not a rule
This is a decision helper, not an absolute rule set. Real projects mix requirements, and the right answer always comes from re-checking the tree against your actual constraints, not from memorizing a chart.
PLATFORM DECISION TREE (CONDENSED)
----------------------------------
START: What are you deploying?
|
+-- Static site, no server logic ------> Static hosting / CDN
+-- Modern frontend (no heavy SSR) ----> Managed frontend platform
+-- Full-stack framework app ----------> Managed full-stack platform
+-- Standalone Node/Python backend ----> PaaS / container / server
+-- Long-running backend process ------> Container / VM / managed svc
+-- Data is the main thing ------------> Managed DB / BaaS
+-- Need auth + DB fast ----------------> BaaS may fit
+-- Need edge execution ----------------> Edge platform
+-- Need full infra control ------------> Major cloud (VM+containers)
NOTE: helper, not law -- re-check against real requirementsConnect it to a real scenario
Describe the project
A small internal dashboard: it renders data server-side, needs a database, and has no edge or compliance requirements.
Check: static?
No — it needs server rendering.
Check: full-stack framework?
If yes — that points to a managed full-stack platform for the app itself, and a managed database service or BaaS for storage, depending on how much you want bundled together.
Compare with a different case
Compare that to a public API serving mobile clients with a long-running WebSocket connection: not static, not a full-stack framework app, and it needs a persistent connection — that points toward a container or VM rather than a short-lived-function platform.
The tree doesn't hand you a vendor name; it narrows the category, and you still choose a specific provider based on cost, team familiarity, and existing infrastructure.
Try the working example
function recommendPlatformCategory(needs) {
const {
isStatic = false,
isFullStackFramework = false,
needsLongRunningBackend = false,
needsDatabase = false,
needsAuthQuickly = false,
needsEdge = false,
needsFullControl = false,
} = needs;
// Order matters: check the most specific / highest-priority signals first.
if (needsFullControl) {
return "major-cloud-provider (VM / containers, full infra control)";
}
if (needsEdge) {
return "edge-platform (code runs close to users)";
}
if (isStatic) {
return "static-hosting-or-cdn";
}
if (needsAuthQuickly && needsDatabase) {
return "baas (bundled auth + database)";
}
if (isFullStackFramework) {
return "managed-full-stack-platform";
}
if (needsLongRunningBackend) {
return "container-or-vm-or-managed-persistent-service";
}
if (needsDatabase) {
return "managed-database-service";
}
// Default: a frontend-leaning app with no special constraints.
return "managed-frontend-platform";
}
const examples = [
{ name: "Marketing site (plain HTML)", needs: { isStatic: true } },
{ name: "Internal dashboard (SSR + DB)", needs: { isFullStackFramework: true, needsDatabase: true } },
{ name: "Weekend auth+DB prototype", needs: { needsAuthQuickly: true, needsDatabase: true } },
{ name: "WebSocket API server", needs: { needsLongRunningBackend: true } },
];
for (const ex of examples) {
console.log(ex.name, "->", recommendPlatformCategory(ex.needs));
}Marketing site (plain HTML) -> static-hosting-or-cdn
Internal dashboard (SSR + DB) -> managed-full-stack-platform
Weekend auth+DB prototype -> baas (bundled auth + database)
WebSocket API server -> container-or-vm-or-managed-persistent-service5-minute try-it
Write a needs object for a project you're currently working on (or imagining) and see which category comes back. Check the result against the platform you would have actually picked
One important caution
Treating the decision tree as absolute law instead of re-checking it against real requirements
Looking for a single category and forgetting that real projects often mix several requirements at once
Wikipedia: Platform as a service — Cloud Providers & Platforms