Serverless Redis and Kafka billed per request, reachable over HTTP so it works from edge functions that cannot hold a TCP connection.
Build me the cache and queue I actually need instead of Upstash: something my edge functions can reach over HTTP, without a per-request bill. Read this first: what the fee buys is genuinely useful — an HTTP interface, so a runtime that cannot hold a TCP connection can still use a key-value store, per-request billing so an idle project costs nothing, and replication across regions. If your application runs entirely on edge functions in many regions, that is hard to replace and probably worth paying for. If it runs on one machine, or if you can put one small process near it, this is an afternoon. STACK - Valkey or Redis in a container on the same machine as the application, or on a private network beside it - Node 20+ with Fastify for a thin HTTP layer, only if something genuinely cannot open a TCP connection - Caddy in front of the HTTP layer, and nothing exposed otherwise THE FIRST QUESTION - Do you need a separate key-value store at all? If the application is one process on one machine, an in-process cache with a size limit is faster than any network round trip and needs nothing running - If you need it shared between processes, or to survive a restart, then run one. If you already have SQLite, it will handle a queue and a rate limiter perfectly well up to a surprising volume - Reach for a dedicated store when you actually need its data structures — sorted sets, expiring keys at volume, pub/sub — not because it is what one does RUNNING IT - One container, bound to localhost or a private network. Never a public interface: an open key-value store is found by a scanner within the hour and is a well-known route into a machine - A password, and a rename or disabling of the administrative commands - A memory limit with an eviction policy chosen deliberately — evicting least-recently-used keys is right for a cache and catastrophic for a queue. If both live in the same instance, use separate databases or separate instances, and say why - Persistence: append-only file for anything that must survive a restart, or none at all for a pure cache. Decide per use, and write the decision down - A health check and a restart policy THE HTTP LAYER, IF YOU NEED ONE - A small service exposing exactly the operations your application uses: get, set with an expiry, increment, delete, and the queue and rate-limit endpoints below - Not a general command proxy. Exposing arbitrary commands over HTTP is exposing the store itself, and the allow-list is the security boundary - Token authentication per application, with scopes and a key prefix per token so one service cannot read another's keys - Rate limited, with a request size cap and a timeout - Pipelining: accept a batch of operations in one request, because a round trip from an edge function is the cost you are trying to amortise - Keep it thin. Every feature added here is a feature to secure WHAT IT IS ACTUALLY USED FOR - A cache: get, set with a time to live, and a stampede guard so a thousand simultaneous misses do not all recompute the same value - A rate limiter: a sliding window or a token bucket, implemented as a single atomic script so it is correct under concurrency. A rate limiter with a read-then-write race is not a rate limiter - A queue: a list or a stream with a consumer group, an acknowledgement, a visibility timeout so a crashed worker's message is redelivered, and a dead-letter list after a retry limit - A lock: a key set only if absent, with an expiry and a random token checked on release, so a slow holder cannot release somebody else's lock. Write it correctly or use a library that already has - Sessions, which mostly do not need this — a signed cookie or a database row is simpler and survives a restart REGIONS - If the application is genuinely in several regions, this is where the honest answer is to pay somebody. Replicating a key-value store across continents with sensible consistency is not an afternoon - If it is one region with users everywhere, put the cache next to the application, not next to the users. The database round trip is what you are saving, and that is local either way WATCHING IT - Memory used against the limit, eviction rate, hit rate, connected clients, and the slow log - Queue depth and the age of the oldest unacknowledged message, which is the number that tells you a consumer has died - Alert on eviction in an instance that holds a queue, because that means data was silently dropped OPERATIONS - .env: REDIS_URL, HTTP_TOKENS, BASE_URL, MAX_REQUEST_BYTES - Backups only for the instances holding something that matters; a cache needs none, and saying which is which is part of the design - Health endpoint that sets, reads and deletes a key WHAT MATTERS MOST The allow-list and the eviction policy. Expose only the operations you use, and never let a queue live in an instance that evicts. Then check whether you needed a separate store at all — the cheapest cache is the one already inside the process. Give me the compose file, the HTTP layer, the atomic scripts for rate limiting and locking, the queue helpers, .env.example, and a README that opens with the question of whether you need this at all.
What you lose
- An HTTP interface to Redis, which is what makes it usable from edge runtimes at all
- Per-request billing, so an idle project costs nothing
- Replication across regions without you configuring any of it
If you would rather not build
- Postgres as a cache table, for modest volumes
- Cloudflare KV, if you are already there
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $10/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Why this verdict
our own opinion · changed only by a person
78/100
Verdict yes at 78. Redis is free and the HTTP shim is fifty lines. The command allow list is the part not to skip.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Upstash
answered from the record above
Is Upstash free?
No — the plan we track is $10 a month. Pay as you go per request with a free allowance; the fixed plan starts around $10/month.
Can you replace Upstash by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 78 out of 100, build time one session. Read what you lose before you decide.
How much does Upstash cost?
$10 a month on Pay as you go — $120 a year. Recorded 10 Aug 2026.
What do you lose by replacing Upstash?
An HTTP interface to Redis, which is what makes it usable from edge runtimes at all; Per-request billing, so an idle project costs nothing; Replication across regions without you configuring any of it. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Upstash?
Yes: Valkey, Redis. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

