Free tiers make it possible to deploy an Express API without paying upfront, but they come with limits that break production workloads. Apps scale to zero when idle, databases cap connections at 50, and bandwidth runs out after 100 GB. Understanding the constraints prevents surprises.
What a free tier actually includes
PandaStack's free tier includes:
- 5 container apps (Express APIs, Python backends, Go services)
- 1 managed database (PostgreSQL or MySQL)
- 100 GB bandwidth per month
- 300 build pipeline minutes per month
- 50 database connections (total across all apps)
- 7 days backup retention
- Apps scale to zero after idle (cold start on next request)
This is enough for hobby projects, internal tools, and development staging environments. It is not enough for customer-facing production APIs with uptime SLAs.
Cold starts and scale-to-zero
Free-tier container apps scale to zero after 15 minutes of inactivity. The platform shuts down the pod to save resources. When the next request arrives, the platform spins up a new pod, which takes a few hundred milliseconds. Subsequent requests hit the warm instance and return instantly.
For a personal blog backend or a weekend side project, cold starts are tolerable. For a user-facing API where every request must respond in under 100ms, they are not.
Deploy a free-tier Express API with the CLI:
panda login
panda projects create \
--name express-free \
--repo yourorg/express-api \
--branch main \
--auto-deployThe platform detects the Node.js runtime, installs dependencies, and starts the app. The first request after 15 minutes of idle triggers a cold start. Upgrade to Pro ($15/mo) to keep pods running on stable nodes with no scale-to-zero.
Database connection limits
A free-tier managed PostgreSQL database allows 50 concurrent connections. If you run 3 replicas of your Express API and each holds a connection pool of 10, you consume 30 connections. Add a background worker and a cronjob that query the database, and you approach the limit.
When the connection pool is exhausted, new requests fail with connection pool timeout errors. Either reduce the pool size per replica:
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(process.env.DATABASE_URL, {
pool: {
max: 5, // lower than default to stay under the 50-connection limit
min: 1
}
});Or upgrade to Pro (300 connection limit).
Bandwidth limits
The free tier includes 100 GB of bandwidth per month. An API serving JSON responses averages 5 KB per request. 100 GB covers roughly 20 million requests per month, or about 7,700 requests per hour continuously.
If your API serves file downloads or returns large JSON payloads, you hit the limit faster. The platform does not hard-cut traffic when you exceed the limit on the free tier, but repeated overages trigger a prompt to upgrade.
Build minutes
The free tier includes 300 build pipeline minutes per month. A typical Express API build (install dependencies, run the start command) takes 1–2 minutes. 300 minutes covers roughly 150 deploys per month — more than enough for continuous deployment on every push.
If your build runs integration tests, compiles TypeScript, or processes assets, build times increase. Monitor usage in the dashboard and upgrade if you run out of minutes mid-month.
Deploy via the deploy button
Make your Express API one-click deployable for free:
[](https://dashboard.pandastack.io/deploy?repo=yourorg/express-api&type=container)When someone clicks the button, PandaStack clones the repo, detects Node.js, installs dependencies, and starts the app on the free tier. If your repo includes a pandastack.json with required environment variables, the deploy screen prompts for them:
{
"type": "container",
"env": [
{ "name": "DATABASE_URL", "description": "PostgreSQL connection string" },
{ "name": "JWT_SECRET", "description": "Secret for signing tokens" }
]
}This prevents the app from booting with missing configuration.
When to upgrade
Upgrade from free to Pro ($15/mo) when:
- Cold starts break user experience — Pro tier runs on stable nodes with no scale-to-zero
- Database connection pool exhaustion — Pro allows 300 connections vs 50 on free
- Bandwidth exceeds 100 GB/month — Pro includes 500 GB
- Build minutes run out — Pro includes 1,000 minutes/month
The free tier is genuinely free — no credit card required, no time limit, no surprise charges. Use it to validate an idea, build a prototype, or run internal tools. Upgrade when you need guaranteed uptime.
Deploy via the API
For CI pipelines, use the API with a psk_ token:
curl -X POST https://api.pandastack.io/v1/projects \
-H "Authorization: Bearer $PANDASTACK_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"slug": "container",
"name": "express-free",
"repositoryName": "yourorg/express-api",
"branch": "main",
"autoDeploy": true,
"env": [{ "name": "NODE_ENV", "value": "production" }]
}'The API works the same on free and paid tiers. The only difference is the infrastructure behind it (preemptible nodes with scale-to-zero vs stable nodes with guaranteed uptime).
What you give up on free
Free-tier apps run on preemptible nodes (Google Cloud spot instances). The platform can evict them with 30 seconds' notice, triggering a pod restart. Paid tiers run on stable nodes with no evictions.
Free-tier databases get a small storage volume (10 GB included). If your database grows beyond that, upgrade or connect to an external database (like a managed PostgreSQL instance on another provider).
Free hosting is real. The limits are documented upfront. Use it for what it is: a zero-cost option for non-production workloads.
References
- [PandaStack pricing](https://pandastack.io/pricing)
- [PandaStack free tier limits](https://docs.pandastack.io)
- [Express production best practices](https://expressjs.com/en/advanced/best-practice-performance.html)