all posts

The Best TimescaleDB Hosting Platforms in 2026

Ajay Kumar··9 min read

TimescaleDB is a Postgres extension that makes time-series workloads behave. It gives you hypertables (automatic time-based partitioning you don't have to write DDL for), continuous aggregates (materialised rollups that refresh incrementally rather than recomputing), and columnar compression that routinely gets 90%+ on sensor-shaped data. All of it inside Postgres, with your existing client libraries and your existing SQL.

I'm Ajay, I build PandaStack. We run managed Postgres and, like most managed Postgres providers, we do not offer TimescaleDB — and the reason why is the most useful thing in this post, because it explains the shape of the entire market.

Why this list is shorter than you'd expect

TimescaleDB ships in two pieces. The Apache-2 licensed core gives you hypertables and the basic time-series machinery. The features most people actually want it for — columnar compression, continuous aggregates with real incremental refresh, data retention and tiering policies — live in the Timescale License (TSL) portion, which explicitly forbids offering the software as a managed database service.

That clause is why you can't find TimescaleDB on the big managed Postgres menus. It isn't technical reluctance; a provider that offered it would be violating the licence. AWS's response was to build their own extension (pg_partman plus their own bits) rather than ship Timescale. Everyone else's response was to not offer it.

The practical consequence: your options are Timescale's own cloud, running it yourself, or one of the handful of vendors with a commercial arrangement. There is no long tail here, and any provider claiming full TimescaleDB support is worth a second look at what exactly they mean.

The options

Timescale Cloud (Tiger Data)

The first-party service, from the company that writes the extension. You get everything including the TSL features, plus the operational pieces they've built on top: object-storage tiering for cold chunks, automatic compression policies, and read replicas. Backups, PITR and upgrades are handled. If you have decided you want TimescaleDB, this is the default and everything else is a reason not to use it — cost at scale, region availability, or a requirement that data stay in your own account.

Self-hosted on your own machines

Entirely legitimate — the licence restricts offering it as a service to third parties, not running it for your own workload. You install the extension into a Postgres you already operate, and you get the full feature set. What you take on is ordinary Postgres operations plus one extra concern: extension and Postgres version compatibility. Timescale supports a specific matrix, and a major Postgres upgrade needs the extension upgraded in the right order or the database comes up with an unusable extension.

This is the right answer more often than people assume, because time-series workloads are frequently single-instance and internal — a metrics store, a sensor archive, an event log for one product. If it doesn't need multi-region high availability, one well-backed-up node running TimescaleDB is not a heavy thing to own.

Kubernetes operators

CloudNativePG and Zalando's Postgres Operator both let you build a container image with the TimescaleDB extension baked in and run it under a declarative Postgres operator, which gets you failover, backup scheduling and rolling upgrades. Good if Kubernetes is already your substrate. Note that the operators manage Postgres, not the extension — Timescale's own upgrade steps still need running as SQL, so bake that into your migration process rather than assuming the operator handles it.

A microVM for development and CI

For local development, integration tests and one-off analysis, running Postgres-with-TimescaleDB in a disposable VM is the cheapest path and keeps your CI honest — testing time-series queries against a plain Postgres that lacks the extension is how you discover on deploy that time_bucket doesn't exist. On PandaStack a sandbox gives you a full Linux userspace, so it's a standard install:

# Inside a sandbox: Postgres plus the extension, for tests.
apt-get install -y postgresql-16 postgresql-16-timescaledb
timescaledb-tune --quiet --yes
service postgresql restart

psql -U postgres -c "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;"

Because a sandbox boots from a snapshot rather than a cold boot, an ephemeral test database per CI job is fast enough to be routine rather than something you batch to save time. That's the same pattern as running any real dependency in tests instead of mocking it.

Do you actually need TimescaleDB?

This is worth ten minutes before you commit, because plain Postgres has closed a lot of the gap and the answer for a meaningful number of workloads is no.

Declarative partitioning covers the basic case

Postgres has had native range partitioning since 10, and it has improved every release since — partition pruning at both plan and execution time, partition-wise joins and aggregates. The main thing hypertables give you over it is automation: you don't write the partition DDL, and chunks are created as data arrives. That's real convenience, but pg_partman does the same job as a plain extension with no licensing constraints.

-- Plain Postgres: monthly range partitions, no extension required.
CREATE TABLE readings (
  ts          timestamptz NOT NULL,
  sensor_id   bigint      NOT NULL,
  value       double precision NOT NULL
) PARTITION BY RANGE (ts);

CREATE TABLE readings_2026_09 PARTITION OF readings
  FOR VALUES FROM ('2026-09-01') TO ('2026-10-01');

-- Dropping old data becomes a metadata operation, not a mass DELETE.
DROP TABLE readings_2026_03;

That DROP TABLE is the single biggest operational win of partitioning and you get it without any extension. Deleting a month of rows from an unpartitioned table is a long-running write that bloats the heap and gives vacuum a lot of work. Dropping a partition is instant.

Rollups are a materialised view and a cron job

Continuous aggregates are genuinely nicer than the hand-rolled version, because they refresh incrementally and can transparently combine materialised history with live recent data. But the hand-rolled version is not hard, and if you already have a scheduler it is maybe twenty lines:

-- Hourly rollup, refreshed on a schedule. Idempotent by construction:
-- re-running for the same window overwrites rather than double-counting.
INSERT INTO readings_hourly (bucket, sensor_id, avg_value, n)
SELECT date_trunc('hour', ts), sensor_id, avg(value), count(*)
  FROM readings
 WHERE ts >= date_trunc('hour', now()) - interval '3 hours'
   AND ts <  date_trunc('hour', now())
 GROUP BY 1, 2
ON CONFLICT (bucket, sensor_id) DO UPDATE
  SET avg_value = EXCLUDED.avg_value, n = EXCLUDED.n;

The three-hour lookback is deliberate: it lets late-arriving data correct itself without a full recompute. Run it every fifteen minutes from a managed scheduler and you have most of what a continuous aggregate gives you.

Where TimescaleDB still clearly wins

  • Compression. 90%+ on sensor-shaped data is not something you can approximate with vanilla Postgres, and at high ingest volumes it dominates the storage bill.
  • Very high ingest rates. Hypertable chunk management and the insert path are tuned for continuous writes in a way hand-partitioned tables aren't.
  • Time-series SQL ergonomics. time_bucket_gapfill, locf, first/last aggregates — writing these by hand in plain SQL is possible and unpleasant.
  • Automatic retention and tiering. Dropping chunks past a threshold and moving cold ones to object storage as declared policy rather than as your own cron job.

The summary

Timescale Cloud if you've decided you want TimescaleDB, because the licence means there is no competitive managed market. Self-hosted if you want the full feature set on your own hardware and the workload is a single instance, which time-series workloads often are. A Kubernetes operator with a custom image if that's already your substrate. And before any of it, check whether native partitioning plus a scheduled rollup covers you — for a lot of teams it does, it costs nothing, and it keeps you on the managed Postgres provider you already have.

Frequently asked questions

Why don't managed Postgres providers offer TimescaleDB?

Because the licence forbids it. TimescaleDB's core is Apache-2, but the features most people want — columnar compression, incremental continuous aggregates, retention and tiering policies — are under the Timescale License, which explicitly prohibits offering the software as a managed database service to third parties. That is a legal constraint rather than a technical one, which is why the managed market consists of Timescale's own cloud and very little else. Running it yourself for your own workload is entirely permitted.

Can plain Postgres partitioning replace hypertables?

For many workloads, yes. Native declarative range partitioning gives you the biggest operational win — dropping a month of data becomes an instant DROP TABLE instead of a long, bloating DELETE — plus partition pruning and partition-wise aggregates. pg_partman automates partition creation the way hypertables do, with no licensing constraints. What you don't get is compression, the time-series SQL functions like time_bucket_gapfill, or an insert path tuned for very high continuous ingest.

How do I replicate continuous aggregates without TimescaleDB?

A rollup table plus a scheduled upsert. Aggregate a recent window with date_trunc and GROUP BY, then INSERT ... ON CONFLICT DO UPDATE into the rollup table so re-running is idempotent. Use a lookback window of a few hours rather than just the last bucket, so late-arriving data corrects itself without a full recompute. Run it every ten or fifteen minutes from whatever scheduler you already have. It is less elegant than a continuous aggregate — no transparent merging of live and materialised data — but it is about twenty lines and it works on any Postgres.

Does TimescaleDB work with standard Postgres clients and ORMs?

Yes. It is a Postgres extension, not a separate database, so the wire protocol, client libraries, connection poolers and ORMs all work unchanged. A hypertable looks like an ordinary table to your application. The only place tooling gets confused is schema introspection: some migration tools see the underlying chunk tables and try to manage them, so exclude the internal Timescale schemas from your migration tool's scope.

Should I test against TimescaleDB in CI or is plain Postgres enough?

Test against the extension. Time-series queries using time_bucket, gapfill or the Timescale-specific aggregates simply fail on a plain Postgres, so a CI suite running against vanilla Postgres will pass right up until deploy. Running a real Postgres with the extension installed in a disposable VM per test run is cheap enough to be routine — and it catches the version-compatibility problems, which is the other place Timescale bites you.

Keep reading

Run code in a microVM in one API call.

49ms p50 cold start. Fork, snapshot, and scale to zero.

Start free
Written by Ajay Kumar, Founder, PandaStack.