<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Definite Blog</title>
        <link>https://definite.app/</link>
        <description>Latest articles from Definite</description>
        <lastBuildDate>Mon, 12 Oct 2026 00:16:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved 2026</copyright>
        <item>
            <title><![CDATA[Cloudera Alternatives: Full-Stack Self-Hosted Data Platforms Without the Hadoop Baggage]]></title>
            <link>https://definite.app/blog/cloudera-alternatives</link>
            <guid>https://definite.app/blog/cloudera-alternatives</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Teams searching for Cloudera alternatives usually want to keep one thing and lose another. Keep: a serious data platform running inside their own environment. Lose: the Hadoop estate required to operate it.

That trade did not exist for most of the 2010s. Cloudera (and Hortonworks, which it merged with in 2019) was the on-prem data platform, and the price of admission was HDFS, YARN, Hive, ZooKeeper, and a platform team keeping a couple dozen coordinated services healthy. The trade exists now. A modern [lakehouse](/blog/what-is-a-data-lakehouse) is three pieces: object storage, open table formats, and query engines. You can run all of it on your own Kubernetes as a full-stack self-hosted data platform, without inheriting a single Hadoop daemon.

This guide covers the honest options: which are full platforms, which are query layers, and when staying on Cloudera is actually the right call.

*Disclosure: Definite is one of the tools in this guide. We wrote it. We've tried to be accurate about the others; factor that in.*

## Quick comparison

| Platform | What it is | Runs in your environment? | Stack coverage | Best for |
|----------|------------|---------------------------|----------------|----------|
| **Definite** | Full-stack self-hosted data platform | Yes, single Helm chart, air-gap supported | Connectors, lakehouse, semantic layer, BI, AI analyst | One platform instead of an assembly project |
| **IBM watsonx.data** | Multi-engine lakehouse on OpenShift | Yes, on Red Hat OpenShift | Lakehouse core plus engines; BI separate | IBM estates, large enterprise |
| **IOMETE** | Spark + Iceberg lakehouse on Kubernetes | Yes, air-gap supported | Lakehouse core; BI and most ingestion separate | Sovereign, regulated, Spark-scale workloads |
| **Starburst Enterprise** | Enterprise Trino (query layer) | Yes, Helm or bare metal | Query engine and federation only | Federated SQL across a messy estate |
| **Dremio** | Iceberg-native query engine + semantic layer | Yes, self-managed on Kubernetes | Query and semantic tier; ingestion and BI separate | Fast SQL on existing Iceberg tables |
| **Cloudera** | Hadoop-lineage full platform | Yes | Broadest: storage, SQL, streaming, ML, governance | Existing Hadoop estates |
| **Databricks** | Cloud lakehouse | No, control plane is always SaaS | Full stack, cloud only | Petabyte Spark, if SaaS control is acceptable |

## Why teams look for Cloudera alternatives

Credit first. Cloudera is the merged Cloudera and Hortonworks business, taken private by KKR and Clayton, Dubilier & Rice in 2021 for about $5.3 billion, and the platform is genuinely broad: storage, SQL engines, streaming, machine learning, and governance, on-prem and in the cloud. It has also been modernizing in the right direction: Apache Iceberg support, a REST catalog, lineage via the Octopai acquisition, container orchestration via Taikun. Nobody leaves Cloudera because it lacks features.

They leave for three reasons.

**The Hadoop estate.** CDP still carries its lineage: HDFS or Ozone, YARN, Hive metastore, ZooKeeper, Ranger, Atlas, and the rest. Every service needs configuration, monitoring, patching, and someone who understands it at 2am. Modern lakehouse platforms deliver the same outcomes with a fraction of the moving parts, because object storage and open table formats do the work that used to take a dozen daemons.

**Per-node economics.** Cloudera prices Private Cloud per node per year, with list figures reported around $10,000 per node before variable charges. A modest 20-node cluster runs six figures annually before you pay the team that operates it. The model assumes Hadoop-era scale-out; modern engines do more work on fewer nodes, and per-node pricing punishes exactly that efficiency.

**Upgrades are projects.** Ask anyone who migrated CDH or HDP to CDP. Major version changes on a platform with this many services get scheduled in quarters, not sprints.

The real question is whether you want to modernize inside a Hadoop-lineage platform, or start from a platform that never had Hadoop in it.

## Know what you're buying: full stack, lakehouse core, or query layer

Cloudera replacements fall into three buckets, and mixing them up wastes evaluation cycles.

**Full-stack platforms** cover the whole path: ingestion, storage, transformation, semantic modeling, BI, and an AI layer. Cloudera is one. Definite is one.

**Lakehouse cores** give you table formats and engines on your object storage. IBM watsonx.data and IOMETE live here. You attach BI and much of your ingestion.

**Query layers** are engines. Starburst and Dremio are the leaders. They query data where it lives, brilliantly, but storage management, pipelines, and dashboards are your problem. A query layer is not a data platform.

None of these buckets is wrong. But if the thing driving you off Cloudera is operational load, notice that replacing it with a query layer plus [a self-hosted BI tool](/blog/best-self-hosted-bi-tools) plus pipelines plus a catalog recreates the ops burden with newer logos.

## Definite

[Definite](https://www.definite.app/) is a full-stack self-hosted data platform: connectors for your databases and SaaS tools, a lakehouse built on DuckDB and DuckLake over your object store, SQL transformations, a semantic layer, BI, and Fi, an AI analyst that runs against a model endpoint you control. It deploys as a single Helm chart into your Kubernetes: private cloud, bare metal, or fully air-gapped with a self-hosted model. The full architecture is written up in [the self-hostable data stack](/blog/self-hostable-data-stack-private-cloud-ai-data-agent).

The contrast with Cloudera is the operating model, not the deployment model. Both run in your environment. But there is no HDFS to babysit and no service sprawl: data lives in your object storage, metadata lives in Postgres, and compute is DuckDB. Dashboards are sub-second. One team member with Kubernetes experience can run it. For procurement: SOC 2 Type II is complete ([trust.definite.app](https://trust.definite.app)) and we sign HIPAA BAAs.

The honest limit is scale. Definite runs a fast single-node engine, not a distributed Spark cluster. That covers the large majority of analytics workloads (100+ TB with partition pruning), and it will not cover petabyte-wide, shuffle-heavy Spark jobs. If your Cloudera cluster earns its keep running thousand-core distributed jobs, look at IOMETE or watsonx.data below.

**Best for:** teams that want to replace the whole Cloudera surface (pipelines, tables, SQL, BI, AI) with one platform and a much smaller ops footprint.

## IBM watsonx.data

[IBM watsonx.data](https://www.ibm.com/products/watsonx-data) is IBM's open lakehouse: Presto and Spark engines over Iceberg tables with shared metadata, deployable on-prem on Red Hat OpenShift as well as SaaS. If you already run Db2 or Netezza, those engines work against the same tables, which is a genuinely good story for IBM shops.

Strengths: real on-prem support from a vendor that will exist in 20 years, multiple engines on one copy of data, and deep integration with IBM storage and governance.

Trade-offs: it is an IBM platform. You deploy on OpenShift, buy through IBM procurement, and adopt IBM's surrounding stack. BI is not included; Cognos or your existing tools sit on top. It trades Hadoop complexity for enterprise-software complexity, which may be a trade you're fine with.

**Best for:** large enterprises with existing IBM relationships replacing Cloudera as part of a broader platform decision.

## IOMETE

[IOMETE](https://iomete.com/) is a Kubernetes-native lakehouse built on Apache Spark and Apache Iceberg that deploys entirely inside your infrastructure, air-gapped included, with no vendor-operated data plane. Philosophically it is the closest cousin to Cloudera's on-prem DNA, and IOMETE cites a multi-petabyte data lake at Dell among its reference deployments.

Strengths: the sovereignty story is the whole product, and because it is Spark-based it handles heavy distributed jobs the way Cloudera does. If you are migrating big Spark pipelines off CDP and they must stay big Spark pipelines, IOMETE is the natural landing spot.

Trade-offs: it is a lakehouse core, not a full stack. You get compute, tables, catalog, and SQL. Ingestion from SaaS sources, BI, and the AI layer come from tools you attach. Count the parts you will still be operating.

**Best for:** regulated and sovereign environments that need a Spark and Iceberg lakehouse core at large scale.

## Starburst Enterprise

[Starburst Enterprise](https://www.starburst.io/) is the enterprise distribution of Trino, deployed by Helm chart on your Kubernetes or on bare metal. It is the best federated SQL story on the market: query data across HDFS, object storage, and dozens of databases without moving it first. That makes it a popular first step off Hadoop, because it can query the Hive tables you already have while the migration happens underneath it.

Be clear about what it is: a query layer. Starburst does not ingest your SaaS data, manage your storage, or give your team dashboards. Around it you will still run pipelines, a catalog, BI, and whatever AI layer you adopt.

**Best for:** federated queries across a heterogeneous estate, and as a bridge engine during a Hadoop migration.

## Dremio

[Dremio](https://www.dremio.com/) is an Iceberg-native lakehouse query engine, self-managed on Kubernetes or as a cloud service. It bundles more than Starburst: an integrated Iceberg catalog with automatic table optimization, a semantic layer, and query acceleration (Reflections) that can make BI on lake tables feel like BI on a mart.

Same category caveat. Dremio is the query and semantic tier, not the whole platform. Ingestion and dashboards still come from elsewhere. Replace Cloudera with Dremio and you have replaced Impala and Hive, roughly, not the rest of the estate.

**Best for:** fast SQL and semantic modeling on Iceberg data you already have, with BI tools you already own.

## What about Databricks?

Databricks comes up in every Cloudera conversation because it is the default Spark platform. For on-prem buyers there is a hard stop: the control plane (UI, notebooks, scheduler, Unity Catalog) always runs as Databricks SaaS and requires a live connection. Classic compute runs in your own cloud account, which is a real residency win, but there is no on-prem, bare-metal, or air-gapped Databricks. Full details in [Databricks on-premise: the real options](/blog/databricks-on-premise). The same question about Snowflake has [a one-word answer](/blog/snowflake-on-premise).

If "runs in our environment" is why you are leaving Cloudera, Databricks is not on your list.

## Migrating from Cloudera or Hadoop to a lakehouse

The migration is more mechanical than it looks, because every Hadoop component has a leaner modern equivalent:

| Hadoop / Cloudera piece | Modern lakehouse equivalent |
|-------------------------|------------------------------|
| HDFS | S3-compatible object storage (MinIO, Ceph, Dell ECS) or your cloud's object store |
| Hive metastore and Hive tables | Open table format with a catalog: Iceberg on most platforms, DuckLake on Definite |
| Impala / Hive SQL | The platform engine: DuckDB, Trino, Presto, or Spark SQL |
| Sqoop / Flume / NiFi | Managed connectors and pipelines |
| Oozie and YARN scheduling | Platform-native scheduling and orchestration |
| Ranger and Atlas | Platform RBAC, governance, and lineage |
| Hue and bolt-on BI | Built-in BI, or the BI tools you already run |

The order that works:

1. **Move bytes first.** DistCp from HDFS to object storage. Boring, parallelizable, low-risk, and it immediately frees you from disk-bound cluster sizing.
2. **Convert tables.** Hive external tables over Parquet convert to open table formats without rewriting the underlying data. Do this while both platforms can read the files.
3. **Port workloads in dependency order.** SQL travels well; most Impala and Hive queries port with syntax fixes. Scrutinize the Spark jobs: many exist only to work around Hadoop-era limitations and collapse into a few SQL transformations on a modern engine.
4. **Run in parallel, then decommission.** Point reports at the new platform, reconcile numbers for a few cycles, then start turning off nodes. The payoff shows up when the node count (and the renewal quote) drops.

One honest warning: HBase, Kafka, and streaming workloads do not map to an analytics lakehouse. If your Cloudera estate carries them, plan those separately (managed Kafka, a proper key-value store) rather than pretending a lakehouse absorbs them.

## When Cloudera is still the right answer

Some situations genuinely favor staying put.

- **A large, healthy Hadoop estate.** If thousands of production jobs run fine and the platform team knows the stack cold, migration cost can exceed years of the savings.
- **You use the breadth.** If you depend on HBase, NiFi-based streaming, and the ML tooling in one contract, no modern alternative matches that surface area in a single vendor.
- **One throat to choke.** A single support organization accountable for a huge hybrid estate has real value at enterprise scale, and Cloudera's support org is built for exactly that.
- **Petabyte-scale distributed compute is the core workload.** Cloudera runs some of the largest clusters on earth. If that is your daily reality, the Hadoop estate is earning its complexity.

The pattern: Cloudera remains a rational choice when the estate is the asset. It stops being rational when the estate is the overhead.

## FAQ

**What is the best Cloudera alternative for on-prem analytics?** It depends on how much of the stack you want from one vendor. Definite is the closest full-stack option: connectors, lakehouse, semantic layer, BI, and an AI analyst in a single Helm chart. IBM watsonx.data and IOMETE cover the lakehouse core. Starburst and Dremio are query layers on storage and pipelines you manage yourself.

**Can I replace Cloudera without moving to the cloud?** Yes. Modern lakehouse platforms deploy into your own Kubernetes, on bare metal or private cloud, and several support air-gapped operation. You get object storage, open table formats, SQL engines, and BI without operating the Hadoop service stack.

**Do I still need Hadoop for on-prem big data?** No. Object storage replaced HDFS, open table formats replaced Hive tables, and modern engines replaced MapReduce and most of the YARN estate. Spark still matters for heavy distributed jobs, but you no longer need a 20-service Hadoop platform to run analytics on-prem.

**Are Starburst and Dremio full replacements for Cloudera?** Not on their own. Both are excellent query layers, but a Cloudera estate also covers ingestion, storage management, governance, and scheduling. Replacing it with a query engine means assembling and operating the rest of the stack yourself.

**Is Databricks an on-prem Cloudera replacement?** No. Databricks classic compute runs in your cloud account, but the control plane (UI, notebooks, scheduler, Unity Catalog) always runs as Databricks SaaS and requires a live connection. There is no on-prem, bare-metal, or air-gapped Databricks.

**How hard is migrating off Cloudera?** Data moves more easily than workloads. Copy HDFS data to object storage, convert Hive tables to an open table format, then port jobs in dependency order. SQL travels well; plan a period of running both platforms in parallel. HBase, Kafka, and streaming workloads need their own plan because they do not map to an analytics lakehouse.

---

If the goal is Cloudera's deployment model without Cloudera's operating model, that is the exact shape Definite is built for. The architecture is on the [private deployment](/platform/private-deployment) page, or [watch the recorded walkthrough](/video).
]]></content:encoded>
            <author>hello@definite.app (Mike Ritchie)</author>
        </item>
        <item>
            <title><![CDATA[Databricks Alternatives for Teams That Don't Need Spark (2026)]]></title>
            <link>https://definite.app/blog/databricks-alternatives</link>
            <guid>https://definite.app/blog/databricks-alternatives</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Databricks is a genuinely great product. If you have petabytes of data, a data platform team, and real machine learning workloads, it might be the best product on the market.

Most teams evaluating it have none of those things.

The typical mid-market company has a few hundred gigabytes to a few terabytes spread across Postgres, Stripe, Salesforce, and a pile of SaaS tools. For that workload, Databricks means learning what a DBU is, tuning clusters, and paying Spark's coordination overhead on jobs a laptop could run. You get lakehouse economics in theory. In practice you get a platform built for a scale you will never hit.

This guide covers seven alternatives honestly: what each one is actually good at, where it falls short for a lean team, and what the cost model looks like.

*Disclosure: Definite is our product and it's first on the list. We've tried to be accurate about the others. Factor that in.*

## Do you actually have Spark-scale data?

Start here, because it decides everything else.

Spark exists to coordinate work across many machines. That coordination has a real cost: shuffles, serialization, cluster spin-up, and a config surface that takes an engineer to operate. The cost is worth paying when no single machine can hold the job.

For most companies, a single machine can hold the job. Jordan Tigani, one of the founding engineers on BigQuery, made the case in [Big Data is Dead](https://motherduck.com/blog/big-data-is-dead/): most companies never accumulate the data volumes these systems were designed for, and roughly [90% of queries process less than 100 MB of data](https://motherduck.com/blog/big-data-is-dead/). Meanwhile a single cloud node now comes with hundreds of gigabytes of RAM and fast NVMe storage. DuckDB-class engines handle the vast majority of real analytical workloads on one node, sub-second, with zero cluster management.

The engine stopped being the bottleneck. The stack around it (connectors, modeling, BI, and now AI) is where the time and money actually go. Keep that in mind as you read vendor pitches about infinite scale. The question is not whether a platform can handle a petabyte. It's what it costs you, in dollars and engineering hours, at 500 GB.

## The comparison

| Platform | What it is | Pricing shape | Best for |
|---|---|---|---|
| **Databricks** | Spark-based lakehouse platform | DBU consumption (serverless SQL about $0.70/DBU) | Petabyte-scale engineering and ML |
| **Definite** | All-in-one analytics platform on a DuckDB lakehouse | Free tier, then flat monthly | Lean teams that want the whole stack |
| **Snowflake** | Cloud data warehouse | Credit-based consumption | SQL analytics with a data team |
| **ClickHouse** | Open-source real-time OLAP database | Free self-hosted; Cloud is usage-based | High-concurrency, real-time dashboards |
| **MotherDuck** | Serverless DuckDB service | Per-second compute, free tier | Engineers who want managed DuckDB |
| **Microsoft Fabric** | Bundled Microsoft data platform | Capacity units (F SKUs) | Committed Microsoft shops |
| **Starburst (Trino)** | Distributed federated SQL engine | Credit-based per cluster-hour | Querying data across many sources |
| **BigQuery** | Serverless cloud warehouse | $6.25/TiB scanned, or slot capacity | GCP-native teams with spiky workloads |

## 1. Definite

[Definite](https://www.definite.app/) replaces the whole stack Databricks anchors: engine, ingestion, modeling, BI, and AI. One product covers 500+ connectors, a [lakehouse](/blog/what-is-a-data-lakehouse) built on DuckDB and DuckLake, SQL transformations, a semantic layer, dashboards, and Fi, an AI analyst that can query, model, and build on your data rather than just autocomplete SQL.

The architecture is the single-node thesis applied end to end. Your data lands in open formats on object storage, queries run on DuckDB, and dashboards come back sub-second without a cluster in sight. Storage costs object-storage prices. Nobody on your team learns Spark. If your security review requires everything inside your own cloud, the same platform deploys via a single Helm chart into your Kubernetes, AI analyst included.

The limits, honestly. Definite is commercial, not open source. It's younger than everything else on this list. And the engine is single-node DuckDB: brilliant for sub-second analytics on the workloads most companies actually have, the wrong tool for petabyte-wide Spark shuffles or training large models. If that's your workload, stay on Databricks. The direct comparison is in [Definite vs Databricks](/blog/definite-vs-databricks).

**Cost shape:** free tier (2 users, 2 connectors), flat monthly from $250 with usage credits, enterprise custom. Details on the [pricing page](/pricing).

**Choose it if:** you want lakehouse economics without cluster management, and you'd rather buy one integrated system than assemble five tools around a warehouse.

## 2. Snowflake

The strongest pure SQL experience in the market. Storage and compute separate cleanly, warehouses resize in seconds, the ecosystem is enormous, and analysts are productive on day one because everything is just SQL. If Databricks feels like an engineering platform, Snowflake feels like a database, and that's a compliment.

The limits. Consumption pricing is the whole story. Credits burn per second while warehouses run, and costs are a function of usage patterns you can't fully predict. Companies routinely see bills far above what they budgeted. And Snowflake is still just the warehouse: connectors, transformations, and BI are separate purchases with separate bills. We compared it to Databricks directly in [Databricks vs Snowflake](/blog/databricks-vs-snowflake-2026); the honest summary is that they've converged into two flavors of the same enterprise platform.

**Cost shape:** credit-based consumption, billed per second of warehouse uptime. Predictable only if your workloads are.

**Choose it if:** you have a data team, SQL-heavy workloads, and enough governance discipline to keep consumption in check.

## 3. ClickHouse

The fastest thing on this list for its sweet spot. ClickHouse is an open-source (Apache 2.0) columnar database built for real-time analytics: billions of rows, thousands of queries per second, millisecond responses on live event data. Customer-facing dashboards and event analytics at high concurrency are exactly what it was built for, and nothing here beats it there.

The limits. Self-hosting it properly is a real operations job: replication, Keeper, storage management, upgrades. The SQL dialect has quirks, and the engine strongly prefers denormalized wide tables; heavy multi-way joins are not its natural habitat. Most importantly, it's a database, not a platform. Ingestion, modeling, BI, and AI are all yours to assemble around it.

**Cost shape:** free if you self-host and carry the ops. [ClickHouse Cloud](https://clickhouse.com/pricing) bills compute per unit-hour with scale-to-zero, plus storage around $25 per compressed TB per month.

**Choose it if:** you're building real-time, high-concurrency analytics into a product and you have engineers who want to own a database.

## 4. MotherDuck

MotherDuck's thesis is our thesis: most teams don't have big data, so run DuckDB instead of a cluster. It's a serverless DuckDB service from the team that coined "Big Data is Dead," with per-second billing, a generous free tier, and a genuinely nice developer experience. For an engineer who wants managed DuckDB with sharing and persistence, it's the shortest path.

The limits. MotherDuck is the engine layer, made cloud-shaped. You still bring ingestion, transformations, a semantic layer, and BI; their built-in visualization and AI features are early. It's a great database for a stack someone still has to assemble. We broke down the categories in [MotherDuck alternatives](/blog/motherduck-alternatives), and the same logic applies in reverse here.

**Cost shape:** per-second compute across instance sizes, free tier for small workloads. Genuinely cheap for typical analytical volumes.

**Choose it if:** you're technical, you want DuckDB without managing it, and you're happy assembling the rest of the stack yourself.

## 5. Microsoft Fabric

The most direct "all-in-one" competitor on the list, and if your company already lives in Microsoft 365 and Azure, the pull is real: OneLake storage, Data Factory pipelines, Spark, warehousing, and Power BI under one bill and one security model. For a committed Microsoft enterprise, the consolidation story makes sense.

The limits. Unified branding, not a unified product. Working across Fabric means five query languages: T-SQL, PySpark, DAX, KQL, and Power Query M. The capacity model bills you for a meter that runs whether or not you're querying: entry F2 capacity is about $263/month pay-as-you-go, but real workloads climb SKUs quickly, and free Power BI viewing only arrives at F64, roughly $8,400/month pay-as-you-go. Below that, every report viewer needs a paid license. We wrote up the full picture in [Microsoft Fabric alternatives](/blog/microsoft-fabric-alternative).

**Cost shape:** capacity units, reserved or pay-as-you-go. Fixed-ish, but sized for enterprises, and throttling punishes under-provisioning.

**Choose it if:** you're a Microsoft shop with an E5 agreement and an admin team that already speaks Power BI.

## 6. Starburst (Trino)

Trino, the open-source engine underneath Starburst, does something none of the others here do: it queries data where it already lives. One SQL interface federates across S3, Postgres, Kafka, Snowflake, and dozens of other sources without moving anything. Netflix and Lyft run interactive SQL over petabyte-scale S3 lakes with its Presto lineage. Starburst packages this commercially, with Galaxy as the managed version.

The limits. It's a distributed system, and you inherit distributed-system problems: a coordinator, workers, memory tuning, and query planning across sources with wildly different performance. Federation is also a tax; queries that hammer your production Postgres are a feature and a hazard at once. And Trino is only the query layer. Storage, ingestion, modeling, and BI remain your problem. For a team without Spark-scale data, a distributed coordinator is usually solving a problem you don't have.

**Cost shape:** open-source Trino is free plus ops. [Starburst Galaxy](https://www.starburst.io/pricing/) is credit-based per cluster-hour (their docs price a two-worker cluster at 12 credits per hour), with a free tier.

**Choose it if:** your data genuinely lives in many systems and moving it is harder than federating it.

## 7. BigQuery

The original serverless warehouse, and still the best expression of the idea. No clusters, no capacity planning, no maintenance windows. You send SQL, Google runs it, and it works at any scale from megabytes to petabytes. If you're on GCP, the integration with the rest of the platform is excellent.

The limits. The on-demand model charges $6.25 per TiB scanned, which makes your bill a function of query discipline; one careless SELECT * over a wide table is real money, and BI tools that refresh dashboards all day multiply it. Slot-based pricing fixes predictability but brings back capacity planning. You're committed to Google Cloud, and, same story as Snowflake: it's a warehouse, so ETL, modeling, and BI are still separate tools and bills.

**Cost shape:** $6.25/TiB scanned on-demand, or slot capacity via editions. The first is unpredictable, the second is a commitment.

**Choose it if:** you're GCP-native, your workloads are spiky, and someone owns query hygiene.

## When Databricks is the right call

Credibility requires saying this plainly. Choose Databricks when:

- You process **tens of terabytes or more in single jobs**, where distributed compute is physics, not preference
- You have **real ML workloads**: feature pipelines, model training, GenAI apps on your own data
- You run **streaming at serious volume**
- You need **one governance layer across a large data organization** (Unity Catalog is genuinely good)
- You have **data engineers on staff** who will use the depth you're paying for

If three or more of those apply, stop reading lists like this one and negotiate your Databricks contract. If none apply, you're the person this post is for.

## The choice under the choice

Every option above sits in one of two categories, and picking the category matters more than picking the vendor.

**Different engine, same assembly project.** Snowflake, ClickHouse, MotherDuck, Starburst, and BigQuery all replace Databricks' compute with something simpler or cheaper. Every one of them still needs connectors, transformations, BI, and an AI story bolted around it. You'll spend less on the engine and the same on the stack.

**Integrated platform.** Fabric and Definite sell the whole stack. Fabric is that bet sized for Microsoft enterprises. Definite is that bet sized for lean teams: one product, one flat bill, a lakehouse on DuckDB instead of a cluster on Spark, and an AI analyst that works because it sits on governed, modeled data instead of raw tables.

Most teams searching "Databricks alternatives" don't have an engine problem. They have an assembly problem. Databricks was the heaviest way to solve it; a warehouse plus four more tools is a lighter but still real version of the same project. The alternative worth evaluating is not assembling at all.

## FAQ

**Do I need Spark to replace Databricks?** Almost certainly not. Spark pays off when no single machine can hold the job. Real-world query analysis shows the vast majority of analytical queries scan well under a gigabyte, and single-node engines like DuckDB run them faster and cheaper than a cluster, with nothing to configure.

**What is the best Databricks alternative for a small data team?** An integrated platform. Trading Databricks for Snowflake or BigQuery still leaves you assembling connectors, transformations, and BI around a bare engine. Definite bundles the whole stack (connectors, a DuckDB lakehouse, semantic layer, dashboards, and the Fi AI analyst) into one product.

**Is Databricks overkill for mid-market companies?** Often, yes. It's built around Spark, cluster tuning, and a DBU consumption model that rewards constant optimization. Without petabyte-scale jobs or ML pipelines, you pay the complexity tax and skip the benefit.

**What is cheaper than Databricks?** For typical mid-market workloads: MotherDuck, ClickHouse Cloud, and flat-priced platforms like Definite, against Databricks deployments that commonly run $50K to $200K+ per year. The bigger saving is operational: no clusters to babysit, no data engineer required just to keep pipelines alive.

**When is Databricks actually the right choice?** Spark-scale data engineering, serious machine learning, high-volume streaming, or governance across a large data org. Petabytes plus a platform team means Databricks is excellent. This list is for everyone else.

---

If your data would fit on a good laptop, your analytics stack shouldn't require a cluster. **[Try Definite](https://www.definite.app/)** and see your own data in dashboards this afternoon, or [watch the recorded walkthrough](/video).
]]></content:encoded>
            <author>hello@definite.app (Mike Ritchie)</author>
        </item>
        <item>
            <title><![CDATA[HIPAA-Compliant Analytics: What to Actually Look For]]></title>
            <link>https://definite.app/blog/hipaa-compliant-analytics</link>
            <guid>https://definite.app/blog/hipaa-compliant-analytics</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Every vendor page in this category says the same two words: HIPAA compliant. Some say HIPAA certified, which is impressive, because no such certification exists.

If you're evaluating analytics tools for data that includes PHI, the marketing pages won't answer the questions that matter. This post will. What HIPAA actually requires of an analytics stack, what "certified" claims really mean, a checklist you can run any vendor through, and why the deployment model matters more than the feature list.

One framing note before anything else: HIPAA compliance is a property of your organization and your deployment, not of software. No tool is compliant in a box. The right question is never "is this tool HIPAA compliant?" It's "can I run a compliant deployment on this tool without a year of exceptions?"

## What HIPAA actually requires of an analytics stack

HIPAA doesn't mention dashboards, warehouses, or BI. It regulates protected health information: who can hold it, what safeguards they owe, and what happens when it leaks. Map that onto an analytics stack and six requirements do the real work.

| HIPAA requirement | What it means for analytics | What to verify |
|---|---|---|
| **Business associate agreement** | Every vendor that creates, receives, maintains, or transmits PHI on your behalf must sign a BAA | The vendor signs at the tier you're buying, and its subcontractors are bound by equivalent terms |
| **Access controls** (Security Rule) | Unique user identities, role-based access, and the ability to scope who sees which rows and columns | SSO/SAML, RBAC, row and column-level controls, automatic session handling |
| **Audit controls** (Security Rule) | Mechanisms that record and let you examine activity in systems containing ePHI | Per-user, per-query logs you can actually export and hand to an auditor |
| **Encryption** at rest and in transit | Technically "addressable" today; treat it as mandatory | TLS on every connection, encrypted storage, a real key management story |
| **Minimum necessary** (Privacy Rule) | Users, and any AI feature, should see the least PHI needed for the task | Column masking, row filters, scoped datasets; policy documents don't count |
| **Breach notification** | Your vendor's clock feeds your clock | A concrete notification window written into the BAA |

Two of these deserve a closer look, because they're where analytics vendors most often fall short.

**Audit controls.** The Security Rule requires that you can record and examine activity in systems that contain ePHI. For analytics, that means answering "who queried what, when, and what came back" for every user and every query. Most analytics products log for their own debugging, not for your compliance. If you can't export per-user activity, your auditor will find that gap before your vendor does.

**Encryption.** Here's a nuance most compliance pages skip: encryption under the current Security Rule is an "addressable" specification, not a required one. You can technically document why an alternative is reasonable. Don't. Unencrypted PHI is indefensible after a breach, and HHS has [proposed Security Rule updates](https://www.hhs.gov/hipaa/for-professionals/security/hipaa-security-rule-nprm/factsheet/index.html) that would remove the addressable designation and make encryption at rest and in transit flatly mandatory. The final rule hasn't landed as of mid-2026, but the direction is not subtle. Evaluate vendors as if it already passed.

## The "HIPAA certified" myth

There is no HIPAA certification. HHS does not issue one, endorse one, or recognize one, [and says so directly](https://www.hhs.gov/hipaa/for-professionals/faq/2003/are-we-required-to-certify-our-organizations-compliance-with-the-standards/index.html). This applies to every vendor, including us.

So what do vendors mean when they claim it? Usually one of three things, in descending order of substance:

1. **A third-party HIPAA assessment.** An auditor evaluated the vendor's controls against HIPAA requirements, often folded into a SOC 2 Type II audit. [Piwik PRO's "HIPAA certification"](https://piwik.pro/blog/piwik-pro-is-officially-hipaa-certified/) is this, and to their credit they explain exactly what the assessment was. The audit is real and genuinely useful evidence. Calling it a certification is marketing.
2. **HITRUST certification.** HITRUST CSF is a real, rigorous third-party certification whose controls map to HIPAA. It's the closest thing to "certified" that exists in healthcare. It is still not a government HIPAA certification, and plenty of compliant deployments run on vendors without it.
3. **Self-attestation.** A page that says "we are HIPAA compliant" with no BAA terms, no audit report, and no architecture detail. Treat this as decoration.

The practical takeaway: skip the badge, request two documents. The BAA they'll actually sign at your tier, and the SOC 2 Type II (or HITRUST) report behind their claims. A vendor that hesitates on either has answered your question.

## "HIPAA-compliant analytics" means four different products

One more source of confusion: the phrase covers at least four different categories, and the vendors you'll find in a search are mostly not competing with each other.

| Category | What it does | Representative vendors | Honest take |
|---|---|---|---|
| **Web analytics** | Tracks website visitors, campaigns, conversions | [Piwik PRO](https://piwik.pro/hipaa/) | Strong GA replacement for healthcare marketing; signs BAAs, hosts on covered infrastructure. It analyzes web traffic, not your business data |
| **Product analytics** | Tracks in-app user behavior, funnels, retention | [PostHog](https://posthog.com/docs/privacy/hipaa-compliance) | Excellent product suite; signs BAAs on paid cloud add-on tiers, and an open-source deployment exists for small volumes. Built for event streams, not BI |
| **Marketing data pipelines** | Aggregates ad and campaign data into reports | [Improvado](https://improvado.io/solutions/healthcare) | Deep marketing connector catalog with SOC 2 Type II and BAAs. Scoped to marketing attribution |
| **BI / data platform** | Centralizes operational data (EHR exports, claims, billing, CRM) for reporting and AI analysis | Definite, plus assembled stacks | This is the category the rest of this post is about |

If you need to replace Google Analytics on a hospital website (Google [won't sign a BAA for GA](https://piwik.pro/blog/is-google-analytics-hipaa-compliant/), full stop), Piwik PRO is a reasonable answer and we are not. If you need dashboards, metrics, and an AI analyst over patient, claims, and operations data, web analytics tools were never the question.

## Count your business associates

Here's the evaluation angle almost nobody runs, and the one that decides how painful your compliance program is: count the vendors that touch PHI.

A conventional analytics stack for a healthcare company looks like this: an ETL vendor moves data out of your EHR exports and billing systems, a cloud warehouse stores it, a BI tool queries it, and increasingly an AI assistant sits on top. That's four separate business associates. Four BAAs to negotiate, four subprocessor lists to review, four breach surfaces, four vendors in your annual risk analysis. And the chain has to be unbroken: if your BI tool's AI feature sends prompts to a model provider, that provider needs equivalent terms too. We walked through how that chain works (and where it usually breaks) in [HIPAA-compliant AI tools](/blog/hipaa-compliant-ai-tools).

Every tool you consolidate removes a business associate. An all-in-one platform takes the ETL, storage, BI, and AI layers down to one BAA. A self-hosted deployment takes it further: down to zero new ones.

## The evaluation checklist

Run any analytics vendor through these ten questions. The order matters; the first few disqualify fastest.

1. **Will you sign a BAA at the tier I'm buying?** Plenty of vendors sign BAAs only on enterprise or add-on tiers. PostHog, for example, is upfront that BAAs come with its paid platform add-ons, not the base plan. Know which tier you're actually pricing.
2. **Where does PHI physically live and get processed?** Their cloud, or yours? This single answer sets the size of your vendor review.
3. **Can I export per-user, per-query audit logs?** Not "we have logging." Exportable, reviewable, attributable activity records.
4. **What are the access controls?** SSO/SAML, role-based access, and row and column-level scoping. If everyone with a login can query every column, minimum necessary is fiction.
5. **Is everything encrypted at rest and in transit, and who holds the keys?**
6. **Which subcontractors touch the data?** Ask for the subprocessor list. Every name on it extends your BAA chain.
7. **If there's an AI feature, where does the model run, and is it inside BAA scope?** Modern stacks quietly leak here. A compliant BI tool with an AI assistant calling a consumer model API is not a compliant deployment. The clean patterns are covered in [how to run a HIPAA-compliant LLM](/blog/hipaa-compliant-llm).
8. **Can you actually delete PHI on request?** Retention policy, deletion SLA, and what happens to backups.
9. **What's the breach notification window in the BAA?** Your regulatory clock starts ticking on discovery. Their contractual delay is your risk.
10. **What third-party attestation backs all of the above?** SOC 2 Type II at minimum. Read the report, not the badge.

A vendor that answers all ten crisply is rare. That's the point of asking.

## Why self-hosted deployment simplifies PHI custody

Most of the checklist above exists because your PHI is sitting on someone else's infrastructure. Change that one variable and the problem collapses.

When the analytics platform deploys into your own cloud account (BYOC) or your own data center, PHI never leaves the compliance boundary you've already built, documented, and audited. The consequences stack up fast:

- **No new business associate for the data plane.** The vendor never holds your PHI, so there's nothing to disclose to them. Your existing cloud provider BAA (AWS, Azure, GCP all sign them) keeps covering the infrastructure, same as it covers your EHR integrations today.
- **Your security controls apply natively.** Your network policies, your IAM, your KMS keys, your logging pipeline. No mapping exercise between the vendor's controls and yours.
- **The AI question answers itself.** An AI analyst running inside your environment, calling a model endpoint you already have under your cloud BAA (Bedrock, Azure OpenAI, or a covered Gemini service), adds zero new parties to the PHI path. Compare that with the [consumer AI tools that should never see PHI at all](/blog/is-chatgpt-hipaa-compliant).
- **Vendor reviews get short.** "PHI never reaches the vendor" is a one-line answer to most of the security questionnaire.

Self-hosting used to mean trading compliance simplicity for operational pain: a rack of open-source tools to assemble and babysit. That trade is gone. We laid out the full architecture in [the self-hostable data stack](/blog/self-hostable-data-stack-private-cloud-ai-data-agent); the short version is that a complete platform can now deploy into your environment from a single Helm chart.

## Where Definite stands

The honest version, same as we give compliance officers on calls:

- **Definite is not HIPAA certified, and neither is anything else.** See above.
- **Definite [signs HIPAA BAAs](/enterprise)**, for both Definite Cloud and self-hosted deployments.
- **Definite holds a SOC 2 Type II attestation.** The report and security documentation are at [trust.definite.app](https://trust.definite.app/).
- **The whole stack ships as one platform**: connectors, a DuckDB and DuckLake lakehouse, BI, a semantic layer, and Fi, the AI analyst. One vendor in your PHI path instead of four, and sub-second dashboards as a side effect of the architecture.
- **[Private deployment](/platform/private-deployment)** puts all of it inside your environment via a single Helm chart. PHI never reaches Definite. Fi calls the model endpoint you choose, under the cloud BAA you already hold.
- **Compliance stays shared.** A BAA from us, or from anyone, covers the vendor's side. Your risk analysis, workforce training, and access policies remain yours. Any vendor who says otherwise is selling something.

## FAQ

**Is there such a thing as HIPAA-certified analytics software?** No. HHS does not endorse or recognize any HIPAA certification, for analytics or any other software. When a vendor says "HIPAA certified," it usually means a third-party auditor assessed its HIPAA controls, often as part of a SOC 2 audit. The assessment can be real and useful. The certification is not a thing. Ask for the BAA and the audit report instead.

**What makes an analytics platform HIPAA compliant?** Nothing makes the software itself compliant; compliance attaches to your organization and your deployment. A workable deployment needs a signed BAA with every vendor that touches PHI, role-based access controls, exportable audit logs, encryption at rest and in transit, and minimum-necessary scoping of who (and what, including AI) can see which data. Your own policies, training, and risk analysis remain your job.

**Does Google Analytics sign a BAA?** No. Google states that Google Analytics customers should not send it PHI, and it does not offer a BAA for the product. That is why the healthcare web analytics category (Piwik PRO and others) exists, and why OCR's guidance on tracking technologies pushed hospital marketing teams off GA in the first place.

**Do I need a BAA with every tool in my data stack?** Yes. Every vendor that creates, receives, maintains, or transmits PHI on your behalf is a business associate. In a stitched-together stack that means separate BAAs with your ETL vendor, your warehouse, your BI tool, and your AI layer, plus subcontractor terms behind each one. One missing link makes every PHI-bearing request through that path an impermissible disclosure.

**Is encryption actually required by HIPAA?** Today encryption is an "addressable" specification, meaning you can document an alternative if it is reasonable. In practice, treat it as mandatory: unencrypted PHI is nearly impossible to defend after a breach, and HHS has proposed Security Rule updates that would remove the addressable designation and require encryption at rest and in transit outright.

**Does Definite sign a HIPAA BAA?** Yes, for both Definite Cloud and self-hosted deployments. Definite holds a SOC 2 Type II attestation (report at trust.definite.app), and the private deployment option runs the entire stack, including the Fi AI analyst, inside your own environment, so PHI never reaches Definite at all.

If you're evaluating analytics for PHI and want the short path, the [private deployment](/platform/private-deployment) page has the architecture, or [watch the recorded walkthrough](/video).
]]></content:encoded>
            <author>hello@definite.app (Mike Ritchie)</author>
        </item>
        <item>
            <title><![CDATA[Migrating Off Snowflake: A Step-by-Step Guide]]></title>
            <link>https://definite.app/blog/snowflake-migration-guide</link>
            <guid>https://definite.app/blog/snowflake-migration-guide</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Snowflake is a good database. This guide exists because for a lot of teams it's also the wrong bill. If you've done the optimization pass already (right-sized warehouses, tightened auto-suspend, killed the zombie tables) and the invoice keeps growing anyway, the next question is what a migration actually looks like.

Here's the honest answer: for a typical analytics workload, it's a few weeks of methodical work, not a six-month replatforming project. Your data leaves as Parquet. Your SQL mostly ports. The hard parts are knowing what you run today and having the discipline to operate both systems in parallel before you cut over.

This is the runbook. Seven steps, in order, with the gotchas. It starts with a section on when you should not migrate, because some teams genuinely shouldn't, and figuring that out costs you an hour instead of a quarter.

One disclosure up front: [Definite](https://www.definite.app/) is an all-in-one analytics platform built on a DuckDB and DuckLake lakehouse, and it collapses steps 3 through 5 into an afternoon. The runbook itself is tool-agnostic. You can execute it with open-source parts and your own engineers.

## Step 0: When you should NOT migrate

Migration talk usually starts with the bill. But the bill is only half the equation. Work through this list first:

**You have heavy data sharing dependencies.** If partners or customers consume your data through Secure Data Sharing or Marketplace listings, staying put is defensible. Shares are the one Snowflake feature with no lakehouse equivalent that's zero-work for the consumer. Moving means every downstream party changes how they read your data.

**You have massive concurrency.** Thousands of concurrent queries against one endpoint, spiky and unpredictable, is the workload multi-cluster warehouses were built for. Snowflake handles it well. A single-node engine handles a lot more than people assume, but this specific shape is Snowflake's home turf.

**You're deep into Snowflake-native features.** Snowpipe, Streams and Tasks, Dynamic Tables, Snowpark pipelines, Cortex functions in production paths. Each one is rebuildable. None is portable. If you count dozens of production jobs built on these, the rewrite cost can eat years of savings. Count them honestly before you start.

**You haven't tried optimizing yet.** Right-sizing warehouses and tightening auto-suspend have cut bills 30 to 50% for teams that had never tuned them. That's an afternoon of work. Do the [cheap thing](/blog/reducing-your-snowflake-costs) before the big thing, if only to prove to yourself the savings ceiling isn't enough.

**The bill isn't actually the problem.** If Snowflake costs less per month than a day of engineering time, leave it alone.

None of those apply? Keep reading. For a broader look at where teams land after Snowflake, see our [Snowflake alternatives guide](/blog/snowflake-alternatives-for-startups).

## Step 1: Inventory your workloads and query patterns

You can't migrate what you can't name. Snowflake's `ACCOUNT_USAGE` views tell you exactly what your account does all day, and most teams have never looked.

Start with where the compute goes:

```sql
select
  warehouse_name,
  count(*) as query_count,
  sum(total_elapsed_time) / 1000 / 3600 as total_hours
from snowflake.account_usage.query_history
where start_time > dateadd(day, -30, current_timestamp())
group by 1
order by 3 desc;
```

Then break `query_history` down by user, and join it to the `sessions` view (its `client_application_id` column) to see which tool issued each query. Classify every workload into one of four buckets:

1. **BI dashboards.** Repeated, predictable queries from Looker, Metabase, Tableau, or whatever you run. Usually the majority of query volume and the easiest to port.
2. **Scheduled transformations.** dbt runs, Tasks, stored procedures. Port these as a dependency graph, not a pile of files.
3. **Ad hoc SQL.** Analysts poking around. Low risk; they follow the data.
4. **Applications.** Anything programmatic hitting Snowflake through a driver. Highest risk, migrate last.

While you're in there, find the dead weight. `ACCESS_HISTORY` (Enterprise edition and up) shows which tables were actually read in the last 90 days. In our experience most accounts store far more than they query, and every table nobody reads is a table you don't have to migrate.

The output of this step is a spreadsheet: every workload, its owner, its query volume, its latency expectation, and which bucket it falls in. Boring. Also the thing that separates a three-week migration from a six-month one.

## Step 2: Export to Parquet in your object store

Your data leaves Snowflake through `COPY INTO`, landing as Parquet files in a bucket you own:

```sql
copy into 's3://your-bucket/snowflake-export/orders/'
from analytics.prod.orders
storage_integration = your_s3_integration
file_format = (type = parquet)
header = true
max_file_size = 262144000;
```

Three gotchas, all learned the hard way:

- **Set `max_file_size`.** The default is 16 MB, which fragments a large table into thousands of tiny files that every downstream engine will hate. 250 MB to 1 GB per file is a good target (5 GB is the max).
- **Keep `header = true`.** That's what preserves your column names in the Parquet schema instead of `col1, col2, col3`.
- **Cast `TIMESTAMP_TZ` and `TIMESTAMP_LTZ` columns first.** Snowflake errors when unloading those types to Parquet. Cast to `TIMESTAMP_NTZ` (and store the zone separately if you need it) before the export.

On cost: you pay normal compute for the unload queries, but data transfer is free when the destination bucket is in the same region and cloud as your Snowflake account. Put the bucket next to Snowflake. Cross-region or cross-cloud unloads pay a per-byte transfer fee.

Export in this order: the tables your BI layer reads, then transformation sources, then everything else that survived the dead-weight cut. And note what you just did, because it matters beyond the migration: your data now exists in an open format, in your bucket, readable by any engine ever written. Even if the migration stalls at this step, that copy is the cheapest insurance in data engineering.

## Step 3: Stand up the lakehouse and catalog

A [lakehouse](/blog/what-is-a-data-lakehouse) is three things: Parquet files in your object store (you just made those), a catalog that tracks tables, schemas, and snapshots, and a query engine that reads them. No idle warehouse meter, no per-credit billing. Storage costs whatever your cloud provider charges for the bucket.

In Definite, this layer is DuckLake (the catalog) plus DuckDB (the engine), and the data stays in your object store as plain Parquet. Point the platform at your export bucket and register the tables. If you're assembling it yourself, the same architecture works with open-source parts; the catalog is the piece you can't skip, because without it you have a pile of files instead of tables with schema evolution and time travel.

Here's how the concepts map:

| Snowflake | Lakehouse equivalent |
|-----------|---------------------|
| Database / schema / table | Schema / table in the catalog |
| Virtual warehouse | Query engine (DuckDB); no idle meter, no credits |
| Time Travel | Catalog snapshots |
| Stages | Your object store, directly |
| Snowpipe | Connectors and streaming ingest |
| Streams and Tasks | Scheduled transformations and automations |
| RBAC | RBAC |
| Secure Data Sharing | No direct equivalent (see Step 0) |

The economics of this swap are worth a paragraph. Snowflake's list price for storage is roughly what object storage costs anyway, so storage isn't where you win. The win is compute: you stop paying per-credit rates ($2 to $6 per credit, [depending on edition and region](/blog/understanding-snowflake-pricing)) for a meter that runs whenever anything touches the data, and you stop paying the 60-second minimum every time a warehouse wakes up to serve one dashboard tile.

## Step 4: Port your models and semantic layer

Your transformation SQL is the real migration surface. Good news: SQL dialects have converged, and DuckDB is close to Snowflake for analytics work. `QUALIFY` ports as-is. Window functions port as-is. Most dbt models port with light edits.

The edits you'll actually make:

- **JSON access.** Snowflake's `col:field::string` becomes DuckDB's arrow syntax, `col->>'field'`.
- **`FLATTEN`** becomes `UNNEST`.
- **`IFF(cond, a, b)`** becomes `IF(cond, a, b)` or a `CASE` expression.
- **Date function signatures** differ slightly (`DATEADD` and `DATEDIFF` variants). Mechanical, not architectural.

Port in dependency order: staging models, then marts, then the reporting layer. After each layer, validate against Snowflake with the same two queries on both systems: row counts per table, and a sum of your key measures grouped by month. Any drift gets fixed before you move up a layer.

This is also the moment to rebuild your metric definitions in a semantic layer, once, instead of scattered across dashboard SQL. If revenue is defined in eleven places on Snowflake today, migrate one definition, not eleven. In Definite the semantic layer is built in and Fi, the AI analyst, works from it, so "which of these three revenue numbers is right" stops being a recurring meeting.

## Step 5: Repoint BI and cut over consumers

Now work through the inventory from Step 1, lowest stakes first:

1. **Internal, low-traffic dashboards.** Repoint them, let the owners bang on them for a week.
2. **Scheduled reports and alerts.** Verify a full cycle of each (the Monday report on a Monday).
3. **High-visibility executive dashboards.** By now you've built trust with the earlier tiers.
4. **Applications and embedded analytics.** Last, because their failure modes are customer-facing.

Do not decommission anything yet. Snowflake keeps running through this entire step. Every consumer you repoint is reversible in minutes if something looks wrong, which is exactly why you cut over consumers one at a time instead of flipping the whole company on a Friday.

The typical experience at this step is that dashboards get faster. Dashboard queries that took seconds on a shared warehouse come back sub-second from DuckDB over partitioned Parquet. Your analysts will notice before you tell them.

## Step 6: Run both in parallel and compare

Run both systems for at least one full billing cycle. This is the step impatient teams skip, and it's the one that turns a migration from a leap of faith into a decision with receipts.

Track four things, weekly:

| Metric | How |
|--------|-----|
| Cost | Snowflake invoice vs. object storage + platform cost |
| Latency | p95 dashboard load times on both systems |
| Parity | Row counts and key-metric sums, both systems, same day |
| Failures | Job failures and their causes on the new system |

The parity checks are non-negotiable. If numbers drift, you stop cutting over and fix the drift. A migration that ships wrong numbers fast is worse than no migration.

The cost comparison at the end of the cycle is your actual business case, with real invoices instead of estimates. That's the document you show whoever signs the contracts.

## Step 7: Decommission

The satisfying part, done in order:

1. **Check your contract dates.** If you're on a capacity contract, time the shutdown to the renewal. Prepaid credits you walk away from are real money.
2. **Freeze writes to Snowflake.** Pause the ingestion jobs feeding it. Anything still writing to Snowflake after your consumers left is paying to update tables nobody reads.
3. **Run a final export.** One last `COPY INTO` pass for anything that changed since Step 2. This snapshot is your archive, and it's already in the open format your new system reads.
4. **Export what history you need.** Time Travel versions don't come with you. If compliance needs specific historical states, export them now or keep the account read-only until the retention window lapses.
5. **Cancel per the contract.** Then turn off the extraction tooling, the credits, and the line item.

Keep the final Parquet snapshot in cold storage indefinitely. It costs almost nothing and it's the complete record of your Snowflake era.

## The short version

Inventory what you run. Export to Parquet in your own bucket. Stand up a lakehouse with a real catalog. Port models in dependency order with parity checks. Repoint consumers lowest-stakes first. Run parallel for a billing cycle. Decommission on your contract date, not before.

Teams with straightforward analytics workloads get through this in weeks. The ones who shouldn't attempt it (heavy data sharing, extreme concurrency, dozens of Snowflake-native jobs) can find that out in Step 0, for free.

## FAQ

**How long does a Snowflake migration take?** For a typical analytics workload (BI dashboards, scheduled transformations, ad hoc SQL), plan on a few weeks. The export and lakehouse setup take days. Porting models is the variable part, and the parallel run should cover at least one full billing cycle so you can compare real invoices. Six-month migrations happen when teams skip the inventory step and discover their dependencies one outage at a time.

**Does exporting data from Snowflake cost anything?** You pay normal warehouse compute to run the `COPY INTO` unload. Data transfer is free if the destination bucket is in the same region and cloud as your Snowflake account. Cross-region or cross-cloud unloads incur a per-byte transfer fee, so put the export bucket next to your Snowflake deployment.

**What happens to Time Travel history when we leave Snowflake?** It doesn't come with you. An export captures current table state, not historical versions. Going forward, a lakehouse catalog like DuckLake gives you snapshots and time travel on the new system. If you have a compliance need for old versions, export the specific historical states you need before you cancel, or keep the account read-only until the retention window lapses.

**Can DuckDB really replace a Snowflake warehouse?** For most analytics workloads, yes. A tuned single-node engine handles workloads into the 100 TB range, with sub-second dashboard queries on well-partitioned Parquet. Where it doesn't fit: petabyte-scale distributed joins and thousands of concurrent queries hitting one endpoint. Snowflake's multi-cluster warehouses are genuinely good at massive concurrency, and if that's your shape, keep it.

**What if we depend on Snowflake data sharing?** Secure Data Sharing is the strongest reason to stay. If partners consume your data through shares or Marketplace listings, there's no lakehouse equivalent that's zero-work for them. Some teams migrate internal analytics and keep a minimal Snowflake account serving the shares. If you control both sides, sharing Parquet in object storage works and is cheaper, but it's a real project for the consumers.

---

If you want to see the target state before committing to Step 1, Definite stands up the whole destination: connectors, the DuckLake lakehouse on your object store, BI, semantic layer, and Fi, the AI analyst. It also [deploys into your own cloud](/platform/private-deployment) via a single Helm chart if the data can't live in ours. [Watch the recorded walkthrough](/video).
]]></content:encoded>
            <author>hello@definite.app (Mike Ritchie)</author>
        </item>
        <item>
            <title><![CDATA[Understanding MotherDuck Pricing: Ducklings, Cooldown, and AI Units]]></title>
            <link>https://definite.app/blog/understanding-motherduck-pricing</link>
            <guid>https://definite.app/blog/understanding-motherduck-pricing</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
MotherDuck publishes its prices to the cent and even walks through worked billing examples in its docs. That is ahead of most data vendors on transparency. But published rates and predictable bills are different things. The bill depends on mechanics the pricing page only hints at: how ducklings meter time, what cooldown costs on your workload shape, and what an AI Unit actually buys.

This is a breakdown of how MotherDuck pricing works as of July 2026, with the math checked against their current [pricing page](https://motherduck.com/product/pricing/) and [billing docs](https://motherduck.com/docs/about-motherduck/billing/pricing/). At the end: when the model is a good fit, and how it compares to a flat platform price.

## The short version

- **Three meters:** compute (per duckling instance, mostly billed per second), storage ($0.04/GB/month in US regions), and AI functions (AI Units at $1.00 each).
- **Two plans that matter:** Lite is free with real limits (Pulse compute only, 3 users, 10 GB). Business is $250/month per org plus usage and gates larger instances, read scaling, query history, and the 99.9% SLA.
- **Compute runs $0.60 to $36 per hour** across five duckling sizes in US regions. Each duckling is one machine running one DuckDB process. You scale up, not out.
- **Cooldown is billable.** After your last query, the instance stays warm for 1 to 10 minutes by default and you pay for that time. Fine for steady workloads, expensive for spiky ones.
- **AI Units run about 3.3x OpenAI's list prices** for the models they meter (as of July 2026), capped at 10 units per day by default.
- **Raw hardware markup is about 2.8x to 3.7x** AWS on-demand rates, normal for a managed database. You are paying for the service, not the metal.

## The plans

MotherDuck runs in four AWS regions (us-east-1, us-west-2, Frankfurt, Dublin); European compute rates run about 22% higher. There is a 7-day free trial of Business with no credit card, after which you land on Lite.

| | Lite | Business | Enterprise |
|---|---|---|---|
| Platform fee | $0/mo | $250/mo per org + usage | Custom |
| Compute | 10 CU hours/mo included, Pulse only | Pay-as-you-go, all sizes | Custom |
| Storage | 10 GB included | $0.04/GB/mo | Custom |
| Users | 3 active + 2 service accounts | 10 active + unlimited service accounts | Unlimited |
| Read scaling | No | Yes | Yes |
| Query history | No | Yes | Yes |
| Snapshot retention | Up to 1 day | Up to 90 days | Up to 90 days |
| SLA | None | 99.9% | Custom |

Lite is a genuinely useful free tier, but it caps you at the smallest instance type and 3 users. The moment you want a dedicated instance, more seats, or query history, you are a Business customer, and $250/month is your floor before any usage.

## Compute: the duckling model

Ducklings are MotherDuck's compute instances. Five sizes ([current rates](https://motherduck.com/product/pricing/)):

| Duckling | US price | EU price | Billing | Default cooldown | Startup |
|---|---|---|---|---|---|
| Pulse | $0.60/hr per CU | $0.73/hr | Per query, CU-seconds | 1 second | ~100ms |
| Standard | $2.40/hr | $2.93/hr | Per second, 1-min minimum | 1 minute | ~100ms |
| Jumbo | $4.80/hr | $5.86/hr | Per second, 1-min minimum | 1 minute | ~100ms |
| Mega | $12.00/hr | $14.65/hr | Per second, 1-min minimum | 5 minutes | A few minutes |
| Giga | $36.00/hr | $43.95/hr | Per second, 1-min minimum | 10 minutes | A few minutes |

Two things separate this model from a Snowflake-style warehouse (see our [Snowflake pricing breakdown](/blog/understanding-snowflake-pricing) for that model).

**First, each duckling is a single machine.** DuckDB is a single-node engine, so MotherDuck scales by handing you a bigger box, not a cluster. At their Coalesce 2025 talk they described Giga as ["192 cores and a terabyte and a half of RAM"](https://motherduck.com/videos/ducklake-big-data-small-coalesce-2025/) and Mega as "64 cores and 256 gigs of RAM." Those specs map almost exactly onto AWS instances you can rent yourself:

| Duckling | MotherDuck price | Closest AWS match (inferred) | AWS on-demand | Effective markup |
|---|---|---|---|---|
| Mega (64 cores, 256 GB) | $12.00/hr | [m7i.16xlarge](https://instances.vantage.sh/aws/ec2/m7i.16xlarge) (64 vCPU, 256 GiB) | $3.23/hr | ~3.7x |
| Giga (192 cores, 1.5 TB) | $36.00/hr | [r7i.48xlarge](https://instances.vantage.sh/aws/ec2/r7i.48xlarge) (192 vCPU, 1,536 GiB) | $12.70/hr | ~2.8x |

The instance mapping is our inference from the published specs, not something MotherDuck states. A 3x-ish hardware markup is standard for managed databases (Snowflake's is comparable or higher). MotherDuck is not gouging; you should just know that the convenience layer costs about 2x the metal.

**Second, Pulse bills differently from everything else.** Pulse is elastic, multi-tenant compute metered per query in Compute Unit seconds, with a minimum of 1 CU-second per query. Two 10-second queries at 1 CU each cost 20 CU-seconds, about a third of a cent, so small reads are very cheap. The catch: a CU measures resources consumed, not wall-clock time, so a heavy query can burn multiple CUs at once, and MotherDuck's own docs note that complex queries (spatial joins, regex-heavy work) may do better on the larger fixed sizes. Lite users only get Pulse, so compute-hungry workloads meter accordingly on the free tier.

## Cooldown: the part of the bill that depends on workload shape

This mechanic decides whether MotherDuck is cheap or expensive for you.

When a fixed-size duckling finishes your last query, it does not shut down. It stays warm for the cooldown period so the next query skips the cold start, and you pay full price for that warm time. Defaults are 1 minute on Standard and Jumbo, 5 minutes on Mega, 10 minutes on Giga, all [configurable from 1 minute up to 24 hours](https://motherduck.com/docs/about-motherduck/billing/duckling-sizes/).

MotherDuck's docs give the friendly case: 5 queries of 30 seconds each, run back to back on Standard, bill as 150 seconds of work plus one 60-second cooldown, 210 seconds total. Overhead: 29%, and the warm instance earns its keep by keeping caches hot.

The unfriendly case is spiky traffic. Say a dashboard fires one 10-second query every 5 minutes, 8 hours a day, on a Standard duckling. Every query wakes the instance, runs 10 seconds, then pays 60 seconds of cooldown. That is 96 wakes and about 112 minutes billed per day for 16 minutes of query time: roughly 7x your compute, $4.48 a day instead of $0.64, purely because of arrival pattern.

On Mega and Giga the defaults magnify this. A Mega instance that wakes once an hour for a 2-minute job pays 5 minutes of cooldown each time: 7 minutes billed per 2 minutes of work.

Four levers, all legitimate:

1. **Batch your queries.** Back-to-back work shares one cooldown.
2. **Tune the cooldown down.** The floor is 1 minute on every size. If your nightly batch runs as one block, the default 5 or 10 minutes buys you nothing.
3. **Route small queries to Pulse.** Its 1-second cooldown suits frequent light reads.
4. **Watch the 1-minute minimum.** Every wake bills at least 60 seconds, so many tiny isolated queries on a Standard instance is the worst shape.

## Storage: cheap, with one thing to watch

Storage is $0.04/GB/month in US regions ($0.043 in Europe), billed on your average daily storage. That is about 1.7x the S3 Standard list price of $0.023/GB, a modest margin for a managed layer with versioning and point-in-time restore. Storage is rarely the line item that surprises anyone.

Two details:

- **Retention counts.** Business plan databases keep 7 days of history by default (configurable from 0 to 90 days), and that history bills as storage. Heavy-update tables with long retention can quietly multiply their footprint.
- **Your own buckets are free.** Data queried in your own S3, GCS, or Azure buckets does not count toward MotherDuck storage, and shares are zero-copy. Cold data belongs in your own bucket.

## AI Units: passthrough with a consistent margin

MotherDuck prices its AI features in AI Units at $1.00 each. The FixIt SQL-repair function is free, and text-to-SQL runs 60 calls per unit, which is hard to complain about. The generative and embedding functions are where the math matters. One AI Unit buys:

| Model | Tokens per $1 AI Unit | Effective price /M tokens | OpenAI list /M | Markup |
|---|---|---|---|---|
| GPT-5 input | 240,000 | $4.17 | $1.25 | ~3.3x |
| GPT-5 output | 30,000 | $33.33 | $10.00 | ~3.3x |
| GPT-5-mini input | 1,200,000 | $0.83 | $0.25 | ~3.3x |
| GPT-5-mini output | 150,000 | $6.67 | $2.00 | ~3.3x |
| text-embedding-3-small | 15,000,000 | $0.067 | $0.02 | ~3.3x |

MotherDuck rates from their [pricing docs](https://motherduck.com/docs/about-motherduck/billing/pricing/); OpenAI list prices from OpenAI's model pages for [GPT-5](https://developers.openai.com/api/docs/models/gpt-5), [GPT-5 mini](https://developers.openai.com/api/docs/models/gpt-5-mini), and [text-embedding-3-small](https://developers.openai.com/api/docs/models/text-embedding-3-small), current as of July 2026. The ratio is almost exactly 3.33x across the board, which suggests a deliberate margin policy. One wrinkle: AI Units are denominated in GPT-5-family tokens, and OpenAI now labels GPT-5 a previous-generation model (its current flagship is GPT-5.5), so check current rates before pointing a token-heavy workload at AI functions. A default soft cap of 10 AI Units per day stops runaway spend at $10 until you ask support to raise it. The cap is also a signal: these functions are priced for in-database convenience, not as your primary LLM gateway. If you are embedding millions of rows, calling the model APIs directly costs a third as much at list price.

## What a bill actually looks like

Three illustrative shapes, computed from the list prices above (your workload will differ):

| Shape | Plan | Compute | Storage | AI | Est. total/mo |
|---|---|---|---|---|---|
| Side project, 3 users, 50 GB | Lite | ~5 Pulse CU-hrs beyond free ($3) | 40 GB billable ($1.60) | FixIt only ($0) | **~$5** |
| Mid-market team, 500 GB | Business | ~40 hrs Standard ($96) | $20 | ~5 units ($5) | **~$371** |
| Nightly 4-hr batch on Mega, 10 TB | Business | 120 hrs Mega ($1,440) + ~2.5 hrs cooldown ($30) | $400 | ~$20 | **~$2,140** |

The pattern: the platform fee dominates small Business bills, compute dominates large ones, and the gap between a good and bad bill is mostly cooldown discipline and instance sizing.

## When MotherDuck is a good fit

Honest answer: for a common shape of problem, it is excellent.

- **You want a fast SQL engine in the cloud and nothing else.** You already have ingestion and BI sorted, or do not need them. Managed DuckDB is excellent on the small-to-medium data most companies actually have.
- **You live in the DuckDB ecosystem.** Local DuckDB for development, MotherDuck for sharing and cloud execution. The hybrid execution story is genuinely differentiated.
- **Your workload is steady or batchable.** Per-second billing with tuned cooldowns is efficient when queries arrive in blocks.
- **You value pricing transparency.** Prices published to the cent, worked billing examples in the docs, no capacity contracts, no edition multipliers, and a free tier. Refreshingly legible next to a Snowflake capacity negotiation.

If your friction is with the engine itself (scale, regions, ecosystem), see our guide to [MotherDuck alternatives](/blog/motherduck-alternatives) by category.

## How Definite's model differs

The structural question with MotherDuck is not the rates. It is the unit of purchase. MotherDuck sells you a database. Ingestion from your SaaS tools, dashboards, a semantic layer, and an AI analyst all have to come from somewhere else, each with its own bill and its own integration to maintain. That is the [stack-versus-platform decision](/blog/data-stack-vs-data-platform), and it matters more than any per-hour rate.

[Definite](/pricing) prices the whole platform flat: $250/month for the Standard plan with unlimited users, 500+ connectors, BI, a semantic layer, and Fi (our AI analyst) included. Compute and AI usage bill as credits at $1 each, with 100 included. Same base number as MotherDuck Business, different denominator: one buys a database for 10 users, the other buys the full analytics system for unlimited users.

Definite runs the same engine family MotherDuck does: a lakehouse built on [DuckLake and DuckDB](/blog/duckdb-ducklake-business-case), open Parquet underneath, sub-second dashboards on typical company data. And for teams that want the data to stay home, Definite's [private deployment](/platform/private-deployment) runs the entire platform, lakehouse included, in your own cloud account from a single Helm chart, so the object store holding your data is yours.

If a managed database is the piece you are missing, MotherDuck is a well-built, honestly priced one. If the database is just one of four things you still have to buy, the platform math is worth running first.

## FAQ

**How much does MotherDuck cost per month?** The Lite plan is free: 10 Compute Unit hours of Pulse compute, 10 GB of storage, 3 active users. Business is $250 per org per month plus usage: compute from $0.60 to $36 per hour by instance size, storage at $0.04 per GB per month in US regions. As a worked example, a team running about 40 Standard compute hours a month with 500 GB stored lands around $370; heavy batch work on large instances runs into the thousands.

**What is a duckling in MotherDuck pricing?** A duckling is MotherDuck's compute instance. Five sizes: Pulse ($0.60/hr), Standard ($2.40/hr), Jumbo ($4.80/hr), Mega ($12/hr), and Giga ($36/hr) in US regions. Pulse is elastic and metered per query in Compute Unit seconds; the rest bill wall-clock time per second with a 1-minute minimum. Each duckling is a single machine running one DuckDB process, so you scale up to a bigger duckling, not out to a cluster.

**What is cooldown and do I pay for it?** After your last query finishes, the duckling stays warm so the next query skips the cold start, and you pay full price for that warm time. Defaults: 1 minute on Standard and Jumbo, 5 minutes on Mega, 10 minutes on Giga, configurable from 1 minute to 24 hours. On steady workloads cooldown is negligible. On spiky ones it can be most of the bill.

**Is MotherDuck cheaper than Snowflake?** Often, for the workloads it targets. MotherDuck has no edition multipliers, no capacity contracts, and a free tier, and single-node DuckDB is efficient on the small-to-medium data most teams have. But the models differ more than the rates: Snowflake bills credits that vary by edition and region, MotherDuck bills flat hourly rates per instance size. Compare your workload shape, not the sticker prices.

**What do MotherDuck AI Units cost compared to calling OpenAI directly?** Roughly 3.3x OpenAI's list prices as of July 2026. One AI Unit costs $1.00 and buys 240,000 GPT-5 input tokens ($4.17 per million effective, versus $1.25 list) or 30,000 output tokens ($33.33 versus $10). The same ratio holds for GPT-5-mini and text-embedding-3-small. A normal managed-service margin, but GPT-5 is now a previous-generation OpenAI model, so check current rates before pointing a token-heavy workload at AI functions.

**When does MotherDuck stop making sense?** When the database is no longer the thing you are missing. MotherDuck is a query engine with storage; ingestion, dashboards, a semantic layer, and AI analysis all come from other tools you buy and wire up yourself. Once you are assembling three or four products around it, the coordination cost usually exceeds the MotherDuck bill, and an all-in-one platform is the better unit of purchase.
]]></content:encoded>
            <author>hello@definite.app (Mike Ritchie)</author>
        </item>
        <item>
            <title><![CDATA[What Replaces What: Mapping Your Cloud Data Stack to One Self-Hosted Platform]]></title>
            <link>https://definite.app/blog/what-replaces-what-on-prem-data-stack</link>
            <guid>https://definite.app/blog/what-replaces-what-on-prem-data-stack</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Every team that decides analytics has to run inside their own boundary asks the same question, and it is not philosophical. It is a mapping question: we run Snowflake, Fivetran, dbt, Airflow, and Looker today. If we replace all of that with one platform we host ourselves, what replaces what?

Nobody publishes that map. Vendors publish feature grids. So here it is, layer by layer, with honest notes on what carries over cleanly, what gets rebuilt faster than it was built the first time, and what you should leave alone.

The right-hand column is [Definite](/), a full-stack self-hosted data platform: connectors, a lakehouse (DuckLake + DuckDB), a semantic layer, dashboards, an AI analyst, and data apps. One Helm chart, deployed into your Kubernetes, in your cloud account, your data center, or fully air-gapped. If you searched for an on-prem full-stack analytics platform, this table is the answer to the question underneath the search.

## The map

<table>
  <caption>What replaces what: the cloud data stack, mapped to Definite</caption>
  <thead>
    <tr>
      <th scope="col">Layer</th>
      <th scope="col">You run today</th>
      <th scope="col">In Definite</th>
      <th scope="col">What actually ports</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Storage + query</th>
      <td>Snowflake, BigQuery, Databricks SQL</td>
      <td>Lakehouse: DuckLake tables on your object store, queried by DuckDB</td>
      <td>Analytical SQL, with dialect changes. Stored procedures and Spark jobs do not.</td>
    </tr>
    <tr>
      <th scope="row">Ingestion</th>
      <td>Fivetran, Airbyte</td>
      <td>Built-in connectors + scheduled syncs</td>
      <td>Nothing to port; it was configuration. Re-authenticate and backfill.</td>
    </tr>
    <tr>
      <th scope="row">Transformation</th>
      <td>dbt</td>
      <td>SQL datasets on a schedule</td>
      <td>Models port as SQL. Macros and tests need rework.</td>
    </tr>
    <tr>
      <th scope="row">Orchestration</th>
      <td>Airflow</td>
      <td>Scheduled syncs + Python pipelines</td>
      <td>Simple schedule-and-run DAGs map cleanly. Exotic DAGs need rework.</td>
    </tr>
    <tr>
      <th scope="row">BI</th>
      <td>Looker, Tableau, Power BI</td>
      <td>Definite dashboards</td>
      <td>Dashboards get rebuilt, not imported. The modeling underneath ports.</td>
    </tr>
    <tr>
      <th scope="row">Metrics</th>
      <td>LookML, Cube, dbt metrics</td>
      <td>Definite semantic layer (YAML)</td>
      <td>Dimensions, measures, and joins translate one-to-one.</td>
    </tr>
    <tr>
      <th scope="row">AI on your data</th>
      <td>Custom RAG / agent stack</td>
      <td>Fi, the AI analyst</td>
      <td>Replaces the build. You keep your model endpoint.</td>
    </tr>
    <tr>
      <th scope="row">Internal tools</th>
      <td>Streamlit apps</td>
      <td>Data apps</td>
      <td>Rebuilt on governed data. Heavy custom apps may stay as code.</td>
    </tr>
  </tbody>
</table>

Now the nuance, row by row.

## Storage and query: Snowflake, BigQuery, and Databricks SQL

The warehouse becomes a lakehouse: DuckLake tables on an S3-compatible object store you own, queried by DuckDB. Your data sits in open Parquet files in your own bucket, with the catalog in Postgres. Nothing about the storage layer is opaque or vendor-locked.

Analytical SQL mostly ports. DuckDB speaks standard SQL plus the conveniences you actually use (window functions, QUALIFY, lateral joins). What does not port: Snowflake stored procedures, tasks, and streams; BigQuery scripting; anything written for Spark. Those get re-expressed as SQL datasets and Python pipelines, or they stay where they are.

The other honest line: DuckDB is a single-node engine. A tuned single node with partition pruning covers the overwhelming majority of analytics workloads at sub-second latency, and it handles 100+ TB lakehouses. It does not cover petabyte-wide, shuffle-heavy Spark joins. If that is your daily work, keep Databricks for it.

Worth knowing if you got here by searching for on-prem versions of these tools: [Snowflake cannot run on-premise](/blog/snowflake-on-premise) in any form, and [Databricks always keeps its control plane in its own SaaS](/blog/databricks-on-premise), even when your clusters run in your VPC.

## Ingestion: Fivetran and Airbyte

Managed EL becomes built-in connectors with scheduled syncs. There is no code to port here because there never was code, just configuration. The migration work is re-authenticating sources and running backfills, not rewriting anything.

The honest caveat is coverage. Common sources (Postgres, MySQL, Salesforce, HubSpot, Stripe, Shopify, the major ad platforms) are covered. If you depend on a long-tail SaaS connector, check your exact source list before you commit. Anything missing gets built as a Python pipeline inside the platform, calling the source API directly. That is more work than a checkbox, but the pipeline stays inside your boundary with everything else.

## Transformation: dbt

dbt models are SELECT statements, and they port as SQL datasets: the same SQL, running on a schedule, with dependencies between datasets standing in for the dbt DAG. For most projects this is the smoothest row in the table.

Three things need real rework. Jinja macros get expanded into plain SQL. Incremental materialization logic gets re-expressed. And dbt tests get re-authored (a not-null check is one line of SQL, but someone has to write it). A 40-model project moves in days. A 400-model project with a deep macro library moves in weeks, and you should budget for that honestly.

## Orchestration: Airflow

Most Airflow usage in an analytics stack is a schedule: sync these sources, then run these transforms, then refresh these dashboards. That maps directly to scheduled syncs and Python pipelines with triggers, and it is the part of Airflow nobody enjoys operating anyway.

The part that does not map: deeply customized DAGs. Custom operators, dynamic DAG generation, sensors watching external systems, DAGs that orchestrate work far outside analytics. Definite replaces analytics orchestration, not general-purpose workflow infrastructure. If Airflow does both jobs for you, split them: move the analytics schedule in, leave the rest where it is.

## BI: Looker, Tableau, and Power BI

Dashboards get rebuilt, not imported. Nobody converts a Tableau workbook faithfully, including us, and you should be skeptical of anyone who says otherwise.

Two things make the rebuild far cheaper than the original build. First, the modeling underneath ports (next row), and a dashboard on top of a good semantic layer is minutes of work, not weeks. Second, [Fi](/fi) does most of the rebuilding: describe the dashboard and it assembles the queries and charts from governed metrics.

Credit where due: Tableau's visualization depth is real, and Power BI Pro comes bundled into Microsoft 365 E5, which is hard to argue with on price. What you get in exchange for the rebuild is one system instead of three, sub-second DuckDB-powered dashboards, and BI that lives inside the same boundary as the data.

## Metrics: LookML, Cube, and dbt metrics

Definite's semantic layer is YAML: models, dimensions, measures, joins. If you have LookML or Cube definitions, the concepts map one-to-one and the rewrite is mechanical, closer to transcription than translation. dbt metrics port the same way, as measures.

Mechanical does not mean free. Years of LookML with heavy Liquid templating hide business logic inside the templating layer, and that logic has to be made explicit on the way over. Most teams find the exercise overdue anyway.

This layer matters more than it looks. In Definite the semantic layer is not optional: dashboards and Fi both read from it, so a metric means one thing everywhere, including to the AI.

## AI on your data: the custom RAG stack

Over the last two years a lot of teams built the same internal project: a vector store, schema retrieval, a prompt pipeline, a SQL-writing agent, and a slowly growing eval suite, all so people can ask questions about company data. Fi replaces that build. It reads the semantic layer, writes SQL against the lakehouse, builds dashboards, and shows its work.

Because this whole map is self-hosted, [Fi runs inside your tenant](/blog/private-ai-data-analyst) and calls a model endpoint you control: Amazon Bedrock, Azure OpenAI, Vertex, or self-hosted open weights. Schemas, prompts, and results stay inside your boundary.

The scope caveat: Fi is a data analyst. If your agent stack also handles support triage or document search, that work is not replaced by this row.

## Internal tools: Streamlit

Streamlit apps exist because dashboards stop at charts. Someone needed a filterable table, a small form, a tool for the ops team, so they wrote Python. Those become data apps: small internal apps built on the same governed data as everything else, and Fi can build them from a description.

The caveat: an app with heavy custom components or write paths into external systems may deserve to stay as code you own. The common case (a lookup tool, an internal report, a one-screen workflow) moves.

## Where the map breaks

Three things this platform does not replace, stated plainly:

- **Petabyte-scale Spark.** DuckDB is a single-node engine. Wide, shuffle-heavy joins over petabytes belong on Databricks or your own Spark cluster.
- **Event stream processing.** Kafka and Flink are a different category. Definite ingests continuously and on schedules for analytics; it is not a stream processor.
- **General-purpose orchestration.** If Airflow also runs your ML training and your invoice processing, keep it for those jobs. Move the analytics schedule.

If a vendor tells you their platform replaces everything with no residue, they are describing a slide, not a migration.

## One Helm chart, one boundary

Everything above deploys as a single Helm chart into your Kubernetes: your cloud account, your data center, or fully air-gapped with a self-hosted model and zero required egress. There is no vendor control plane on the other end of a required connection, which is exactly the failure mode that pushes teams toward [a self-hostable stack](/blog/self-hostable-data-stack-private-cloud-ai-data-agent) in the first place.

For the procurement checklist: SOC 2 Type II is complete (trust.definite.app), we sign HIPAA BAAs, and for public sector work Definite deploys into your FedRAMP-authorized environment.

That is what "full-stack self-hosted data platform" means in practice. Not a query engine you assemble a stack around. Not a BI tool pointed at a warehouse someone else operates. Every layer in the table, one deployment, inside your boundary.

## FAQ

**What replaces Snowflake, BigQuery, or Databricks SQL in a self-hosted stack?** A lakehouse: DuckLake tables on an object store you own, queried by DuckDB. Analytical SQL ports with dialect changes. Stored procedures, tasks, and Spark jobs do not port, and petabyte-scale shuffle-heavy Spark work should stay on Spark.

**Do dbt models carry over to Definite?** Mostly yes. dbt models are SELECT statements and port as SQL datasets, with dependencies between datasets standing in for the dbt DAG. Jinja macros get expanded into plain SQL, incremental materialization logic gets re-expressed, and tests get re-authored.

**What happens to our Airflow DAGs?** Schedule-and-run DAGs (sync these sources, run these transforms, refresh these dashboards) map to scheduled syncs and Python pipelines. Deeply customized DAGs with custom operators, dynamic generation, or non-analytics jobs need rework or should stay in Airflow. Definite replaces analytics orchestration, not general-purpose workflow infrastructure.

**Do Looker or Tableau dashboards migrate automatically?** No, and no vendor does this faithfully. Dashboards get rebuilt. The rebuild is fast because the metric definitions port to the semantic layer first, and Fi can assemble dashboards from those governed metrics on request.

**Can the whole platform run air-gapped?** Yes. Definite deploys as a single Helm chart into your Kubernetes, and Fi calls a model endpoint you control, including self-hosted open weights. A fully disconnected deployment with zero required egress is supported.

**What about SOC 2, HIPAA, and FedRAMP?** SOC 2 Type II is complete (see trust.definite.app) and Definite signs HIPAA BAAs. For public sector work, Definite deploys into your FedRAMP-authorized environment rather than claiming its own authorization.

If you want this map drawn on your actual stack, the deployment architecture is on the [private deployment](/platform/private-deployment) page, or [watch the recorded walkthrough](/video).
]]></content:encoded>
            <author>hello@definite.app (Mike Ritchie)</author>
        </item>
        <item>
            <title><![CDATA[SaaS Product Analytics: Connect Feature Usage to Revenue and Retention]]></title>
            <link>https://definite.app/blog/startup-product-analytics</link>
            <guid>https://definite.app/blog/startup-product-analytics</guid>
            <pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Your engagement dashboard looks healthy. DAU is up, feature adoption is at 40%, retention curves are holding. Then the CEO asks the question you can't answer: "Which of these features actually drives revenue?"

You open Amplitude. You can see who used what and how often. But you can't see what they pay, what plan they're on, whether they expanded or churned, or what they told support last week. The engagement data is rich. The line to the P&L doesn't exist.

Roadmap reviews keep stalling on the same gap. "We think this feature matters" is the best anyone can say — because proving it would mean joining product events to billing data that lives in a system your product analytics tool has never seen. So investment goes to features that look popular, while features that actually drive expansion get no signal at all.

The problem isn't your product analytics tool — Amplitude, Mixpanel, PostHog are excellent at what they do. The problem is that usage and revenue live in different systems that have never been joined. This guide is the build order for connecting them: what to decide first, what to set up second, and what you can skip entirely at your size.

One disclosure before we start: Definite is an all-in-one data platform with an AI agent called Fi, and we'll show each step working in Definite as the running example throughout. The framework itself is tool-agnostic — you could execute it with a warehouse and a hired analyst. The argument of this post is that you shouldn't have to.

**The system in brief:**

- Start from the revenue questions your leadership actually asks — which features drive retention, what predicts churn, where the roadmap should invest — not from the usage data you happen to have.
- Decompose a revenue-anchored north star (like NRR or active-account expansion) into a metric tree so every product metric has a reason to exist and a line to the business.
- Write a metric dictionary: each metric defined once, with a formula, the dimensions it must be cut by, a source system, and an owner. "Feature adoption is 40%" is trivia; "feature adoption is 60% for enterprise and 22% for self-serve" is a roadmap decision.
- Map every metric to its source system and solve the cross-system join — this is where product analytics actually breaks, and where AI now handles the heavy lifting.
- Build the dashboard last. Distribute answers where decisions happen — Slack, email, roadmap reviews — not in a BI tool nobody opens.
- Set a review cadence: leading indicators weekly, revenue impact monthly, roadmap evidence quarterly.

Total time with modern tooling: a weekend to stand up. No data engineer, no warehouse project.

## Why your product analytics tool can't answer the question that matters

Before building anything, it helps to understand why Amplitude, Mixpanel, and PostHog — tools you probably use every day — struggle to answer "which features drive revenue." It isn't a product failure. It's structural: product analytics tools are built to track user behavior within your product, not to join that behavior to business outcomes that live in other systems.

The tools know this is a problem. [Mixpanel acquired DoubleLoop](https://mixpanel.com/blog/doubleloop-acquisition) specifically to "drive product-to-revenue outcomes." PostHog built a Stripe connector for in-product revenue joins. Amplitude had a warehouse-native product that could query billing data alongside events (now legacy and unavailable to new customers). Each approach proves the problem is real — and each reveals why it's harder than a feature addition: Mixpanel's revenue analytics requires your billing data to already live in a warehouse and be synced via connectors. PostHog's Stripe join requires manual identity linking between distinct_id and email. Amplitude's best shot at cross-system queries is discontinued. The vendors are retrofitting revenue capabilities, and each retrofit surfaces the same four structural mismatches:

- **Identity.** Your product tool tracks users by an anonymous ID or user_id. Stripe tracks billing customers. Your CRM tracks accounts. These are three different entities with three different ID systems, and nobody created the mapping between them. Until someone resolves "user_id 4782 is part of account Acme, which is Stripe customer cus_N7f2x," usage and revenue can't occupy the same row.
- **Scope.** Product analytics sees events — clicks, pageviews, feature usage, session duration. It doesn't see what users pay, what plan they're on, when they renewed or churned, what they said to support, or what segment they fall into. The business context that makes usage data meaningful lives in Stripe, your CRM, and Intercom.
- **Grain.** Product events are fine-grained (grain just means what one row represents): one user generates hundreds of event rows per session. Revenue is monthly — one row per subscription per month. Feature adoption is a rate over a period. Analyzing "does feature X usage predict renewal?" means aggregating events to the right level — by account, by time window, by segment — and joining them to a revenue outcome at the same grain.
- **Timing.** Product events are real-time. Revenue recognition is monthly. A feature used heavily in March might drive a renewal that shows up in June. The lag between usage signals and revenue outcomes means you need historical joins — not just what users are doing now, but what users who later renewed (or churned) were doing three months before.

None of these are criticisms of the tools. Amplitude, PostHog, and Mixpanel are excellent at their core job: understanding user behavior in your product. The gap is the join to business outcomes — and the vendors' own efforts to close it confirm that a feature addition can't solve what is fundamentally a data-architecture problem.

## Step 1: Start from the revenue questions, not the usage data

The oldest useful idea in measurement — the [Goal-Question-Metric approach](https://www.cs.umd.edu/users/mvz/handouts/gqm.pdf), from NASA-era software engineering research — says never start from available data. Start from the questions someone is actually going to ask, and let those dictate the metrics.

For a product leader at a startup, the questions are blessedly predictable:

| The question you'll face | The decision behind it | The metric that answers it |
| --- | --- | --- |
| "Which features drive retention and expansion?" | Roadmap investment | Feature adoption rate × NRR by segment |
| "What usage patterns predict churn?" | CS and product intervention | Usage-to-churn correlation by cohort |
| "Where should the roadmap invest next?" | Resource allocation | Feature ROI (development cost vs. revenue impact) |
| "Are new features earning their development cost?" | Build vs. cut decisions | Feature adoption × retention lift |
| "Which segments use the product differently — and does it matter?" | Pricing, packaging, GTM | Usage patterns by plan, segment, account tier |

Five questions. If your analytics can answer these five — cut by the segments that matter — you're ahead of nearly every product team at your stage. Everything else is optional until it isn't.

Here's where AI changes the starting point. Instead of guessing which metrics to build, ask these questions directly against your joined data. In Definite, Fi writes the SQL, surfaces the relevant dimensions, and shows which cuts produce signal — so you discover what matters from the data, instead of hypothesizing a metric and hoping it connects.

## Step 2: Decompose into a revenue-anchored metric tree

[DuPont was decomposing return on equity into a tree of drivers](https://en.wikipedia.org/wiki/DuPont_analysis) a century ago. The product version is the same move: pick the number that connects product to the business — for most SaaS startups, that's net revenue retention (NRR) or active-account expansion — and decompose it into the drivers you can act on. The stakes are concrete: [McKinsey's analysis of 100+ B2B SaaS companies](https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/the-net-revenue-retention-advantage-driving-success-in-b2b-tech) found that top-quartile NRR performers trade at a median 24× EV/Revenue, versus 5× for the bottom quartile. Expansion happens inside the product — which makes NRR the metric that connects product decisions to enterprise value.

NRR decomposes into retained revenue plus expansion minus contraction minus churn. Each of those decomposes into product drivers:

- **Retention** ← activation rate, time-to-value, core feature adoption, session frequency
- **Expansion** ← power user depth, advanced feature adoption, usage-based triggers, seat growth
- **Contraction** ← declining engagement, narrowing feature breadth, support escalations
- **Churn** ← activation failure, usage drop-off, feature disengagement, competitive switch signals

Cut each driver by segment (plan, cohort, account size, geography) and you have a complete map from product behavior to business outcome. Every metric in the tree has a reason to exist — if it doesn't connect to revenue, you don't need it yet.

The tree does a second job: it tells you which source systems each branch depends on. Activation rate comes from product events. NRR comes from Stripe. Segment comes from the CRM. The tree makes the cross-system dependency visible before you start building anything.

![Product analytics NRR metric tree: NRR decomposes into Retained, Expansion, Contraction, and Churn branches with product event, Stripe, Intercom, and CRM source labels at each leaf](https://res.cloudinary.com/definite-app/image/upload/v1782877706/blog/startup-product-analytics-metric-tree.png)

With AI tooling, you can scaffold the metric model from this tree directly — describe the tree in plain language and let [Fi](/blog/an-intro-to-ai-analytics) generate the governed definitions for each metric, so formulas are locked before you write a single dashboard.

## Step 3: Write the metric dictionary — definitions with dimensions

This is the artifact most product teams never create, and it's the one that makes everything downstream — including AI — trustworthy. One page. Each metric: a definition, a formula, the dimensions it must be cut by, the system it comes from, and a single owner.

Dimensions are not decoration. "Feature adoption is 40%" is a vanity number; "Feature adoption is 60% for enterprise accounts and 22% for self-serve" is a roadmap decision. Metrics without their segments are trivia.

The starter dictionary for a SaaS product team:

| Metric | Definition | Formula | Cut by | Source | Owner |
| --- | --- | --- | --- | --- | --- |
| Feature adoption rate | % of active accounts using a feature in a period | Users of feature / active users in period | Plan, segment, cohort | Product analytics | PM |
| Activation rate | % of new signups reaching the "aha moment" | Activated users / new signups | Channel, plan, cohort | Product analytics + CRM | Growth PM |
| Time-to-value | Days from signup to first meaningful action | Median days to activation event | Plan, segment | Product analytics | Growth PM |
| DAU/WAU ratio | Stickiness — how often actives return | Daily actives / weekly actives | Segment, plan | Product analytics | PM |
| Retention (7d/30d/90d) | % of cohort still active after N days | Active in period / cohort start | Cohort, plan, segment | Product analytics | PM |
| Feature ROI | Revenue impact per feature | Expansion MRR from feature-active accounts vs. feature-inactive | Feature, segment | Product analytics + Stripe | PM + Finance |
| NRR by segment | Revenue kept + grown from existing accounts | (Start ARR + expansion − contraction − churn) ÷ start ARR | Segment, plan, cohort | Stripe + CRM | Finance + Product |

Steal this table. Change the dimensions to match how your product actually segments. The point isn't these seven metrics — it's that each one is written down once, and every report, dashboard, and AI answer derives from the same definition. When two numbers disagree, the dictionary is what makes the disagreement resolvable.

This isn't just a Definite idea — the industry is converging on it. The [Open Semantic Interchange standard](https://docs.getdbt.com/docs/use-dbt-semantic-layer/dbt-sl), finalized in January 2026 by dbt Labs, Snowflake, and Salesforce, exists precisely because metric drift across teams and tools is a recognized, industry-wide problem.

In Definite, each dictionary row becomes a governed definition in the [semantic layer](/blog/semantic-layer-in-data-warehousing) — a single source of truth that every dashboard, AI answer, and API query reads from, instead of a wiki nobody updates. Fi Memory stores your business context — what "enterprise" means, which features are core vs. experimental, what your activation event is — so every query inherits the same assumptions without re-explaining them.

## Step 4: Map your sources and make them agree

Now the step every guide compresses into "gather your data" — the one that's actually the whole problem.

For each branch of your metric tree, write down which system owns it, what field lets you match records across systems, and where that matching usually breaks:

| Data | System of record | Matched on | Where it breaks |
| --- | --- | --- | --- |
| Feature usage, sessions, events | [Amplitude](/connector/amplitude) / [PostHog](/connector/posthog) / [Mixpanel](/connector/mixpanel) | user_id or anonymous_id — the key has to be *created* | Product user ≠ billing customer; anonymous sessions pre-signup |
| Event stream, identity | [Segment](/connector/segment) | user_id synced across tools | Identity resolution only as good as your Segment setup |
| Subscriptions, MRR, plan | [Stripe](/connector/stripe) | email or external_id | Stripe customer ≠ CRM account; team accounts with multiple billing entities |
| Accounts, segments, owners | CRM (HubSpot / Salesforce / Attio) | domain or account_id | Free-text company names; agencies with shared domains |
| Support tickets, sentiment | [Intercom](/connector/intercom) / Zendesk | email or conversation user | Support user ≠ product user when admins file tickets |
| Feature flags, account config | Product database (Postgres / MySQL) | account_id | App's internal ID ≠ anyone else's ID |

This is the table to keep next to your planning docs.

The traditional fix is a data project: a warehouse, ingestion pipelines, identity resolution logic, transformation jobs. A strong engineer can assemble the tooling in a few weeks; consultant-led builds often take months. But the calendar isn't the real cost — ownership is. Someone has to maintain the pipelines, the identity matching, and the metric models forever, and that's a [$130–170k/year analytics hire](https://www.glassdoor.com/Salaries/analytics-engineer-salary-SRCH_KO0,18.htm) you weren't planning. [Carta data shows](https://carta.com/blog/startup-hiring-plans/) the average seed-stage startup has 5.3 employees and Series A averages 15.6 — a dedicated data person is structurally unlikely at either stage. The product leader is the analyst.

This is the step where AI has genuinely changed the answer. In Definite, Fi analyzes ingested data and discovers join paths — the shared fields (typically emails or account IDs) that let you match a product user to a billing customer to a CRM account. The industry calls this entity resolution, and it used to be a manual data-engineering exercise. Now it's AI-assisted discovery with a verifiable result. You connect [Amplitude](/connector/amplitude), [Stripe](/connector/stripe), and your CRM with pre-built connectors; product databases come in via replication. The joins land as inspectable SQL, so you can audit how user_id 4782 became part of account Acme before a number reaches a roadmap review.

The division of labor matters: **AI resolves the identities and maintains the joins. You decide what the metrics mean.**

## Step 5: Build the dashboard last — distribute answers where decisions happen

With definitions and joins in place, the dashboard is genuinely the easy part. One page per board question from Step 1 is plenty. See what the views look like when built: [Product Analytics Dashboard](/dashboards/product-analytics), [Amplitude Product Analytics](/dashboards/amplitude-product-analytics), [PostHog Product Analytics](/dashboards/posthog-product-analytics). For the cross-system outcome views — usage joined to revenue — see the [Retention](/dashboards/retention) and [Churn](/dashboards/churn) dashboards.

Two upgrades worth making at this stage:

- **Answers where decisions happen.** A weekly feature-adoption digest [in Slack](/blog/conversational-analytics-in-slack) beats a dashboard nobody opens. Alerts when a usage pattern shifts — adoption dropping for enterprise accounts, activation rate falling for a new cohort — beat discovering it during roadmap prep.
- **Ad-hoc questions answered from governed definitions.** When the CEO asks the next question — "what's retention excluding that one enterprise logo?" or "which features do accounts use before they expand?" — you want to ask it in plain English and trust the answer because it's computed from the dictionary, not improvised. That's what [Fi](/blog/an-intro-to-ai-analytics) does in Definite: it writes the SQL against your governed definitions and shows the work.

In Definite, you can ask Fi to build the dashboard from a prompt — "show me feature adoption by segment with retention impact" — and it generates the layout, writes the queries against your Cube definitions, and you edit from there. Schedule autonomous agents to surface weekly product-revenue summaries in Slack, or set alerts when usage-to-revenue correlations shift.

## Step 6: Keep the numbers defensible

Product metrics have a credibility problem. Every team has seen a "north star" metric that went up while revenue went flat — because the metric was never connected to the business. Three habits fix this:

- **One owner per metric.** The dictionary already names them. Disagreements route to the owner instead of dying in a Slack thread.
- **A tiered review cadence.** Weekly: leading indicators — activation rate, feature adoption, stickiness. These move fast and surface problems early. Monthly: lagging indicators — NRR by segment, feature ROI, retention curves. These need a full month of data to be meaningful. Quarterly: roadmap evidence — cumulative patterns that justify investment decisions. Match the cadence to the signal's natural frequency; reviewing NRR weekly is noise.
- **Reconcile against what you've already reported.** When you stand the new system up, run it against prior quarters. Some metrics will shift — usually because the spreadsheet was quietly wrong or because the definition wasn't consistent. That's a footnote in the next roadmap review, not a confession. Doing this before a planning cycle is vastly cheaper than discovering it mid-roadmap.

Automate the plumbing: scheduled pipelines refresh the data, autonomous agents surface anomalies, and Fi Memory carries context between reviews — so the AI remembers what you discussed last month and flags when a pattern you were watching has changed.

The test for every number that enters a roadmap discussion: if someone challenges it, can you trace it to the events and revenue records it came from? With written definitions over joined data, the answer is finally yes.

## AI product analytics: the startup version is a different problem

Search "AI product analytics" and everything you'll find assumes a product analytics team — dedicated analysts running experiments, data scientists building predictive models. Useful, and irrelevant to you. The startup version of the problem is the inverse: there is no analytics team. The product leader is the analyst.

The question isn't "will AI replace our product analysts" — it's **"can AI be the analyst we never hired?"**

The answer is yes, with one condition the enterprise content never spells out: AI is only as defensible as the definitions underneath it. Pointed at ungoverned product events across three disconnected systems, AI confidently produces wrong numbers — it just produces them faster. Pointed at a metric dictionary over joined data, it does the work of the analyst you skipped: the entity resolution, the dimension cuts, the first draft of every roadmap answer. The system in this post is, concretely, how a startup makes AI product analytics trustworthy.

## Doing this with Definite

The honest pitch, briefly. Definite is the system above, packaged. You get [500+ connectors](/connector-db) — [Amplitude](/connector/amplitude), [PostHog](/connector/posthog), [Mixpanel](/connector/mixpanel), [Segment](/connector/segment), [Stripe](/connector/stripe), [Intercom](/connector/intercom), plus product databases via replication — with storage and modeling included. Your metric dictionary becomes governed definitions in a semantic layer. [Fi](/fi) is an AI analyst that answers questions from those definitions with inspectable SQL underneath, discovers join paths across your systems, and builds dashboards from prompts. Setup is connect-and-go; your first cross-system product-revenue numbers arrive the same afternoon.

Pricing is one flat platform fee — $250/month, unlimited users, with AI usage metered past an included allowance ([pricing](/pricing)). Flat matters here because per-seat pricing is how analytics tools quietly become single-player; with one price, the PM, the CEO, and the growth lead are all looking at the same governed numbers.

If you'd rather assemble it yourself: a warehouse, an ingestion tool, a modeling layer, a BI tool, and the time to make them agree. The system in this post works either way. One of them is a weekend.

→ More on the product setup specifically: [Definite for product teams](/for/product).

This post is part of a series on startup analytics by function. The same system — decisions, metric tree, dictionary, sources, build, cadence — applies with different metrics and sources for [finance](/blog/startup-finance-analytics), [marketing](/blog/startup-marketing-analytics), [RevOps](/blog/startup-revops-analytics), [executive dashboards](/blog/startup-executive-dashboards), and [customer success](/blog/startup-customer-success-analytics). If you're using PostHog as your product analytics tool, see also [PostHog as a data warehouse](/blog/posthog-data-warehouse) for how the infrastructure side works.

## FAQ

**Can't I just do this in Amplitude / Mixpanel / PostHog?**
They're excellent at what they do — behavior tracking, funnels, retention curves within your product. The gap is the cross-system join: they can't see your billing data in Stripe, your account segments in the CRM, or your support patterns in Intercom. Definite sits beside your product analytics tool, consuming its events and joining them to the rest of the business. Augmentation, not replacement.

**How do I connect product analytics data to revenue?**
Step 4: entity resolution. Match product user_ids to billing customers and CRM accounts — typically via emails or shared IDs. Once the entities are resolved, you can ask "did accounts that adopted feature X expand at a higher rate than those that didn't?" The join is the mechanism; everything downstream is a query.

**What metrics show which features drive retention?**
Feature adoption rate cut by retention cohort (Step 3). You need the cross-system join (Step 4) to see which features the accounts that renewed were using vs. the accounts that churned. Without the join, you have usage and retention in two different systems with no way to connect them.

**Do I need a data engineer to set this up?**
Not at startup scale. With modern tooling — pre-built connectors, AI-assisted entity resolution, a semantic layer for definitions — the setup is connect-and-go. The analytics-engineer hire is what you need when you want to own and extend the infrastructure; it's a staffing choice, not a maturity milestone.

**How many product events can this handle?**
Millions of events — startup and growth-stage scale is well within range. The bottleneck at startup scale is never volume; it's the identity resolution and metric governance that make those events meaningful.

**What's the difference between product analytics and business analytics?**
Product analytics answers "what users do inside the product." Business analytics answers "what that behavior means for the business." This guide connects them — so "40% feature adoption" becomes something like "40% feature adoption, and accounts that adopt expand at a higher rate than those that don't." The number stops being trivia and starts being a roadmap input.

---

Your product analytics tool will keep getting better at tracking behavior — that's its job. The fix was never a better engagement chart. Define the metrics once, join usage to revenue at the account grain, let AI carry the entity resolution and governance, and make roadmap decisions from numbers you can trace. [Try Definite free](https://www.definite.app/signup) or see how it fits [product teams](/for/product) specifically.
]]></content:encoded>
            <author>hello@definite.app (Definite Team)</author>
        </item>
        <item>
            <title><![CDATA[Metabase Alternatives: 7 Options Worth Considering in 2026]]></title>
            <link>https://definite.app/blog/metabase-alternatives</link>
            <guid>https://definite.app/blog/metabase-alternatives</guid>
            <pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Metabase is usually the right first BI tool. It's free to self-host, setup takes an afternoon, and the query builder is good enough that non-technical people actually use it. We recommend it more often than you'd expect, given that we compete with it.

But teams outgrow it in predictable ways. Four come up over and over:

1. **The connector gap.** Metabase reads databases. It has no SaaS connectors, so seeing Stripe, HubSpot, or Shopify data means buying an ETL tool and a warehouse to land it in.
2. **The stack bill.** The free BI tool sits on a stack that isn't free. A typical self-hosted Metabase deployment runs [$3,200 to $8,700 a month](/blog/metabase-pricing) once you count the warehouse, the ETL tool, and the engineering time.
3. **Maintenance fatigue.** Someone has to own upgrades, backups, and the Java app's memory settings. That someone usually has another job.
4. **The AI ceiling.** [Metabot is real AI](/blog/metabase-ai), but it lives inside the BI layer. It can query and summarize. It can't manage pipelines, edit models, or touch anything below the dashboard.

If one of those is your situation, here are the seven options worth considering, including ours.

*Disclosure: Definite is our product. We've tried to be accurate about the other six, and for some teams below, one of them is the better pick.*

## The quick comparison

| Tool | Scope | Self-hosted option | AI / natural language | Pricing shape (mid-2026) |
|---|---|---|---|---|
| **Definite** | Full stack: connectors, lakehouse, semantic layer, BI, AI | Yes: single Helm chart, full stack including AI | Fi, an AI analyst (cloud and self-hosted) | Free tier; Standard $250/mo plus usage credits |
| **Lightdash** | BI on top of dbt | Yes (open source, BI only) | AI agents on paid plans only | OSS free; Cloud Pro $3,000/mo, unlimited users |
| **Superset / Preset** | BI | Yes (open source, BI only) | None in Superset; Preset Enterprise adds AI agents | OSS free; Preset free to 5 users, then $20/user/mo |
| **Redash** | SQL to dashboard | Yes (open source only) | None | Free, self-hosted only |
| **Sigma** | Spreadsheet UI on your cloud warehouse | No | Ask Sigma, a capable AI analyst | Custom quote, annual contract |
| **Looker Studio** | Reporting on Google data | No | Gemini features, mostly on Pro | Free; Pro $9/user/project/mo |
| **Grafana** | Ops and metrics dashboards | Yes (open source) | Assistants aimed at observability | OSS free; Cloud free tier, paid is usage-based |

## Definite

**Best for:** replacing the whole stack under Metabase, dashboards included.

[Definite](https://www.definite.app/) is the different-in-kind option here. The other six are BI tools: they read from a database you bring. Definite includes the layer they all assume you've built: 500+ connectors, a lakehouse built on DuckDB and DuckLake, a semantic layer, dashboards, and Fi, an AI analyst that can query data, build dashboards, and edit the data models underneath. Connect Stripe or HubSpot and you're querying in minutes. No separate warehouse contract, no ETL contract, and dashboards return in under a second on DuckDB.

It also self-hosts, and the whole stack comes with it. One Helm chart deploys connectors, storage, BI, and Fi into your own Kubernetes, with AI calls routed to a model endpoint you control. More on why that matters in the self-hosting section below.

Where it falls short: it's commercial, not open source. It's younger than Metabase and Superset, with fewer years in market. And if you already have a warehouse and pipelines you like, replacing the whole stack is a bigger decision than swapping dashboard tools; a BI-only pick from this list is the cheaper experiment. The full head-to-head is in [Definite vs Metabase](/blog/definite-vs-metabase).

**Pricing (as of mid-2026):** free tier (2 users, 2 connectors); Standard at [$250/month](/pricing) with usage-based credits; Enterprise custom.

## Lightdash

**Best for:** dbt shops that want metrics defined once.

[Lightdash](https://www.lightdash.com/) reads your dbt project and turns it into an explorable BI layer. Metrics and dimensions live in dbt YAML, version-controlled and reviewed like code, and the dashboards can't drift from them. If your team already lives in dbt, this is the shortest path from model to governed self-serve. It's the closest thing on this list to "Metabase, but the metrics are always right."

Where it falls short: no dbt, no Lightdash. The dependency is total. The jump from Metabase money to Cloud Pro at $3,000 a month is steep, even with unlimited users included. And the AI agents live on the commercial plans; the open-source edition you self-host doesn't include them.

**Pricing (as of mid-2026):** open source free to self-host; Cloud Pro $3,000/month, unlimited users; Enterprise custom.

## Apache Superset (and Preset)

**Best for:** teams with data engineers who want maximum capability at zero license cost.

[Apache Superset](https://superset.apache.org/) is the most capable fully open-source BI tool. Apache 2.0 license with no open-core asterisks, 40+ chart types, and SQL Lab is a genuinely good SQL IDE. Several commercial BI products are quietly Superset underneath. If Metabase feels limiting on visualizations or SQL workflow, Superset is the upgrade.

Where it falls short: it assumes a data team. Production Superset is a Python app plus a metadata database, Redis, and Celery workers, and business users find chart building steeper than Metabase's query builder. There's no native AI analyst in Superset itself. [Preset](https://preset.io/), the managed cloud from Superset's creators, removes the ops burden and adds AI agents on its Enterprise tier, but then you're no longer self-hosting.

**Pricing (as of mid-2026):** Superset is free. Preset has a free tier up to 5 users, then $20/user/month billed annually; Enterprise custom.

## Redash

**Best for:** SQL-first teams that want the smallest possible tool.

[Redash](https://redash.io/) does one loop well: write SQL, get a chart, pin it to a dashboard, schedule the refresh. It's light to run and quick to learn, and for years it was the default answer for scrappy data teams.

Where it falls short: the project is coasting. Databricks acquired the company in 2020, the hosted service shut down, and the open-source project has been community-maintained with slow development since. It works today and will probably work next year, but you're adopting software in maintenance mode. No AI, and no features beyond what's on the tin.

**Pricing (as of mid-2026):** free, self-hosted only.

## Sigma

**Best for:** Excel-native teams working directly on a cloud warehouse.

[Sigma](https://www.sigmacomputing.com/) puts a spreadsheet interface on top of Snowflake, BigQuery, or Databricks. Business users pivot, filter, and write formulas against live warehouse data at billion-row scale without touching SQL, and Sigma is the best product in the category at that specific trick. Ask Sigma, its AI analyst, is real too: it shows every step of its reasoning and lets you edit any of them. If you're leaving Metabase because business users want warehouse-scale self-serve, Sigma is a serious option.

Where it falls short: it's a query layer on a warehouse you pay for separately, so every Sigma click bills compute back to Snowflake. There's no self-hosted option. And pricing is an enterprise sale: nothing public, custom quotes, separate seat tiers for creators and viewers. Teams coming from Metabase Cloud's $100-a-month Starter plan should brace for a very different number.

**Pricing (as of mid-2026):** not published; custom annual contracts.

## Looker Studio

**Best for:** free reporting on Google data.

[Looker Studio](https://lookerstudio.google.com/) is free and connects natively to GA4, Google Ads, Sheets, and BigQuery. For marketing reporting on Google sources, nothing gets to a shareable dashboard faster, and sharing works like Google Docs.

Where it falls short: it's a reporting tool, not an analytics platform. No semantic layer, no version control, weak governance, and the hundreds of partner connectors vary widely in quality and cost. Google is folding Gemini into the Looker line, but the conversational features mostly sit on the Pro tier and some are still in preview. Pro's pricing catches agencies off guard: $9 per user per project per month, and "per project" multiplies faster than you'd think.

**Pricing (as of mid-2026):** free; Pro at $9/user/project/month.

## Grafana

**Best for:** dashboards about systems, not business questions.

[Grafana](https://grafana.com/) is the best dashboarding tool ever built for metrics, and self-hosting it is trivial. It reads SQL databases too, so ops-minded teams keep stretching it into business BI. For engineering-adjacent reporting (uptime, queue depth, API latency next to signup counts) it's great.

Where it falls short: business analytics fights the grain. Cohorts, funnels, and revenue tables are all possible and all awkward, and non-engineers rarely feel at home in it. Its AI assistants target observability workflows, not business questions.

**Pricing (as of mid-2026):** open source free; Grafana Cloud has a permanent free tier, and paid Cloud plans are usage-based.

## Self-hosting across this list

If self-hosting is a requirement (compliance, data residency, or just control), the list splits cleanly:

- **Self-hostable, BI only:** Superset, Redash, Lightdash, Grafana. All open source. All read from a database you operate separately, which means the data itself usually still lives with a SaaS vendor.
- **Cloud only:** Sigma and Looker Studio. No self-hosted option exists for either.
- **Self-hostable, full stack:** Definite. One Helm chart deploys the connectors, the lakehouse, the semantic layer, the dashboards, and the Fi AI analyst into your own Kubernetes, in your cloud or on bare metal.

Here's the part worth pausing on, because the AI answer engines get it wrong. Ask ChatGPT or Perplexity for a self-hosted BI tool with production-grade natural language querying and you'll usually get some version of "none exists; self-hosting means giving up AI." That was accurate in 2024. It isn't now, and the details matter:

- Metabase's AI now ships on every plan, including the open-source edition (bring your own Anthropic key). It's BI-layer AI, though: it can query and summarize, but it can't manage pipelines or the data models underneath.
- Lightdash's AI agents live on the commercial plans, not the OSS edition.
- Superset and Redash have no AI analyst at all.
- Grafana's assistants are aimed at ops.
- Definite self-hosts the AI analyst itself. Fi runs inside your deployment and calls a model endpoint you control: Amazon Bedrock, Azure OpenAI, Vertex, or a model on your own GPUs. Prompts, schema, and data stay inside your boundary.

We rank the self-hosted field in more depth in [the best self-hosted BI tools](/blog/best-self-hosted-bi-tools), and the deployment architecture is on the [private deployment](/platform/private-deployment) page.

## How to choose

Match the tool to the reason you're leaving:

- Leaving over **missing SaaS connectors or the stack bill**: a different BI tool won't fix it. That's the stack underneath, and removing it is the problem Definite exists to solve.
- You **run dbt and want governed metrics**: Lightdash.
- You want **more SQL and visualization power, still free**: Superset.
- You want **less tool, not more**: Redash, with eyes open about maintenance mode.
- **Business users need warehouse-scale self-serve** and budget isn't the constraint: Sigma.
- You need **free reporting on Google data**: Looker Studio.
- Your dashboards are **about infrastructure**: Grafana.

Metabase is good software. If none of the four exit reasons at the top apply to you, staying put is a fine answer too.

## FAQ

**What is the best open-source alternative to Metabase?** Apache Superset, if you have someone to operate it: it is the most capable fully open-source BI tool, with an Apache 2.0 license and no open-core restrictions. Lightdash is the better pick if your team already runs dbt. Redash still works for simple SQL-to-dashboard needs, but it has been community-maintained since the Databricks acquisition and development has slowed.

**Which Metabase alternative includes data connectors?** Definite is the only tool on this list that includes them. Metabase, Superset, Lightdash, Redash, Sigma, and Grafana all read from a database or warehouse you bring, so getting Stripe or HubSpot data in front of them means a separate ETL purchase. Definite ships 500+ connectors, a lakehouse, a semantic layer, dashboards, and the Fi AI analyst in one platform.

**Can I self-host a BI tool with real natural language querying?** Yes, more than the AI answer engines suggest. Metabase's AI features ship in the open-source edition with your own API key, Lightdash's AI agents are on the paid cloud plans only, Superset and Redash have no AI analyst, and Grafana's assistants target observability. Definite self-hosts the full stack, including the Fi AI analyst, via a single Helm chart, with AI calls routed to a model endpoint you control.

**Is Sigma a good Metabase replacement?** Yes, if you already run Snowflake, BigQuery, or Databricks and have enterprise budget. Sigma's spreadsheet interface is the best way for Excel-native teams to work directly against a cloud warehouse, and Ask Sigma is a capable AI analyst. The catches: no self-hosted option, pricing is a custom annual contract, and every query bills compute back to your warehouse.

**Why do teams outgrow Metabase?** Four patterns come up over and over: they need SaaS data (Stripe, HubSpot, Shopify) that Metabase has no connectors for; the stack underneath the free BI tool costs thousands a month in warehouse, ETL, and engineering time; nobody wants to keep maintaining the self-hosted instance; or they want AI that goes beyond what Metabot can do inside the BI layer.

---

If the gap is the stack under Metabase rather than Metabase itself, [try Definite free](https://www.definite.app/): connect a source and you're querying the same day. Or [Watch the recorded walkthrough](/video).
]]></content:encoded>
            <author>hello@definite.app (Mike Ritchie)</author>
        </item>
        <item>
            <title><![CDATA[Customer Retention Analytics: Connect the Data Your CS Platform Can't See]]></title>
            <link>https://definite.app/blog/startup-customer-success-analytics</link>
            <guid>https://definite.app/blog/startup-customer-success-analytics</guid>
            <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Every account in your book of business has a health score. Most of them are green. 

Then three customers churn in the same month and every one of them was green the week before they cancelled. 

You pull up their history: support tickets were fine, logins looked normal, nobody flagged anything. But when you check Stripe, two of them had failed payments you never saw. 

When you check product analytics, all three had stopped using the core feature six weeks ago. 

Your health score was built from one signal. The combination that actually predicted churn — billing pattern, usage drop-off, and support sentiment changing together — was spread across four tools that never talked to each other.

**Customer success analytics fails at the same place startup financial reporting fails:** not at the dashboard, but where your systems are supposed to agree and don't. Your CS platform handles day-to-day ops like tasks, playbooks, health scoring from its own data. But the retention questions that matter most, *"why do accounts actually churn," "which ones are about to," "what our NRR looks like by cohort over time,"* require connecting billing, product usage, support, and CRM data into a single picture your CS platform was never designed to produce. 

**This guide is the build order:** what to decide first, what to connect second, and what you can skip entirely at your size.

One disclosure before we start: Definite is an all-in-one data platform, so we'll show each step working in Definite as the running example. The framework itself is tool-agnostic — you could execute it with a warehouse and a hired analyst. The argument of this post is that you shouldn't have to.

**The framework in brief:**

- Start from the retention decisions your CS team actually makes — which accounts to save, which to expand, what to present at the QBR — not from the data you happen to have.
- Build a health score from cross-system data: billing signals from [Stripe](/connector/stripe), product usage from [PostHog](/connector/posthog), support patterns from [Intercom](/connector/intercom) or [Zendesk](/connector/zendesk-support), and account context from [HubSpot](/connector/hubspot). A health score from a single source is a guess.
- Write a metric dictionary: NRR, logo retention, GRR, and health score defined once — so CS, finance, and the board are all looking at the same number.
- Map each metric to the source that answers it, and fix the places where they disagree. This is where CS analytics actually breaks.
- Build the dashboard last. Distribute alerts where CSMs actually work — Slack, email, your CS platform — not in a BI tool nobody opens.
- Set a review cadence: account-level risk weekly, cohort retention monthly, renewal pipeline quarterly.

Total time with modern tooling: a weekend to stand up. No data engineer, no warehouse project, no six-month implementation.

## Why your CS platform can't show you churn

Before building anything, it helps to understand why your CS platform, whether it's Vitally, Gainsight, ChurnZero, or a homegrown setup, produces health scores that miss churn. It isn't a product failure. It's a structural one: CS platforms are built for day-to-day customer operations, not for cross-system analytical questions. Four mismatches explain why:

- **Scope.** Your CS platform sees support interactions and whatever in-app activity it tracks. But billing signals — payment failures, downgrade requests, declining MRR — live in Stripe. Product usage depth — feature adoption, session duration, engagement trends — lives in PostHog or Amplitude. Your CS platform has a partial picture, and it can't see the pieces it's missing.
- **Scoring methodology.** Most health scores in practice are rules-based — "if ticket count > 3, set to yellow" — and miss compound signals. A customer can be green on support and red on usage simultaneously. Some CS platforms now offer ML-based scoring, but even these are limited to the data the platform can see. The combination across systems is what predicts churn, and [45% of CSM-assigned health ratings contradict actual usage data](https://churnzero.com/blog/four-step-strategy-customer-health-score-program/).
- **Identity.** Stripe knows a `cus`_ ID. Your CRM knows an account name. Intercom knows an email address. Your CS platform knows its own contact record. With no shared identifier across all four, "retention by segment" means a human matching records every month — and getting it wrong more often than they realize.
- **Grain.** An Intercom conversation is not a Stripe subscription is not a PostHog event. Each system's rows represent different things. Combining them without aligning what each row means is how the same quarter produces three different churn numbers.

One CS leader we spoke with put it plainly: he was tackling churn — the highest-priority initiative at the company — and his first problem was that he was blind. Not because the data didn't exist, but because it was spread across systems that couldn't show him the correct way to look at it. His CS platform showed him day-to-day interactions. What he needed was cohort retention over time — logo, ARR gross, ARR net — and no single tool in his stack could produce it.

The practitioner skepticism about this is widespread. A [ChurnZero study of 800 CS leaders](https://churnzero.com/guides/customer-revenue-study-2025/) found that 73% say their current health score doesn't reliably predict churn. Michael Goetz, a CS leader at Drata, put it more bluntly: health scores are horoscopes — vague enough to feel true, specific enough to be useless for actually predicting what happens next. He's not wrong about rules-based scoring from a single source. A health score built from cross-system data is a different instrument entirely.

## Step 1: Start from the retention decisions, not the data

The oldest useful idea in measurement says you never start with available data — you start with the questions someone is actually going to ask. For a CS leader at a startup, those are:

1. **Which accounts are at risk of churning this quarter?** The save-or-lose decision that drives every Monday's priority list.
2. **Which accounts are ready to expand?** The growth signal your renewal pipeline depends on.
3. **What's our NRR, and is it trending up or down?** The number the board asks about. The one you need to calculate the same way every time.
4. **Why did we lose the accounts we lost last quarter?** The post-mortem that makes next quarter different.
5. **What should we present at the next QBR?** The account-level story that keeps the customer engaged — backed by data, not by a CSM's gut feeling about how the relationship is going.

Notice what these questions have in common: none of them can be answered by a single data source. "At-risk accounts" requires billing + usage + support signals. "NRR by cohort" requires billing data matched to CRM segments. "Why did we lose them" requires connecting the cancellation event in Stripe to the support history in Intercom to the usage drop-off in PostHog.

And before any of these questions can be answered reliably, there's a harder question underneath: *what counts as a customer?* One executive at a company building their retention analytics framed it this way — is a churned customer someone who stopped paying for one month, or two months? Is a new customer measured from contract signature or first login? If CS, finance, and the board each answer these differently, every retention number is a disagreement waiting to happen. The metric dictionary in Step 3 solves this, but only if you've decided what you need to measure first.

## Step 2: Build a health score from all four sources

The technique that makes CS analytics work at a startup isn't a better algorithm — it's connecting data from four systems that each see part of the picture. Here's what each source reveals that the others can't:


| Source                                                                                 | Signal type                                                            | What it reveals                                                                                            | Weight  |
| -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------- |
| **Billing** ([Stripe](/connector/stripe), Chargebee)                                  | Payment failures, downgrades, contract end dates, MRR trend            | Revenue risk — the most concrete lagging indicator of churn                                                | Highest |
| **Product usage** ([PostHog](/connector/posthog))                                     | Login frequency, feature depth, session duration, adoption milestones  | Engagement risk — often the strongest *leading* indicator, visible weeks before the customer says anything | High    |
| **Support** ([Intercom](/connector/intercom), [Zendesk](/connector/zendesk-support)) | Ticket volume, sentiment shift, escalation patterns, resolution time   | Satisfaction risk — qualitative signal that's hard to quantify alone                                       | Medium  |
| **CRM** ([HubSpot](/connector/hubspot), Salesforce)                                   | CSM last touch, champion changes, stakeholder departures, renewal date | Relationship risk — context no automated system captures                                                   | Context |


![CS health score composite: four weighted sources — Billing 40%, Product Usage 30%, Support 20%, CRM 10% — converging into a Health Score node with Safe, At Risk, and Critical outputs](https://res.cloudinary.com/definite-app/image/upload/v1782877389/blog/startup-customer-success-analytics-health-score.png)

A customer whose billing is healthy, usage is steady, support tickets are low, and CSM relationship is active is almost certainly safe. A customer whose usage dropped 40% six weeks ago, who just had a payment failure, and whose champion left the company? That's churn forming — and your CS platform, seeing only the support signal (which looks fine), keeps them green.

The CS leader who was building these cohort retention tables found the same thing: his CS platform worked for day-to-day interactions — tasks, playbooks, quick account checks — but for the lagging KPIs that the company and investors actually cared about, he needed a separate analytical layer that could see across all his data sources. It's the "day-to-day vs. lagging KPIs" distinction that most CS analytics guides skip entirely: your CS platform and your analytical layer do different jobs, and trying to make one do both is where the picture breaks.

## Step 3: Write the metric dictionary

Every CS metric needs a single definition that CS, finance, and the board agree on. Without it, the most common failure mode is silent: your NRR number doesn't match the finance team's because you're counting churned customers differently, and nobody notices until a board meeting. The dictionary fixes this.


| Metric                            | Formula                                                            | Cut by                | Source            | Owner             |
| --------------------------------- | ------------------------------------------------------------------ | --------------------- | ----------------- | ----------------- |
| **Logo retention**                | (Customers at start − churned) / customers at start                | Segment, cohort, CSM  | CRM + Billing     | CS lead           |
| **Gross revenue retention (GRR)** | (Starting MRR − contraction − churn) / starting MRR                | Segment, cohort       | Billing           | CS lead           |
| **Net revenue retention (NRR)**   | (Starting MRR − contraction − churn + expansion) / starting MRR    | Segment, cohort, plan | Billing + CRM     | CS lead / Finance |
| **Health score**                  | Composite: billing (40%) + usage (30%) + support (20%) + CRM (10%) | Account, segment      | All four sources  | CS lead           |
| **Time to value**                 | Days from contract start to first activation milestone             | Plan, segment         | Product + Billing | CS lead           |
| **Expansion rate**                | % of accounts with ARR increase in period                          | Segment, plan, CSM    | Billing + CRM     | CS lead           |
| **CSM coverage**                  | Active accounts / CSM headcount                                    | Segment               | CRM               | CS lead           |


The "Cut by" column is what separates a useful metric from a vanity number. NRR as a single company-wide figure is a board slide — and a [10-point NRR improvement translates to 20-30% valuation uplift](https://www.feinternational.com/blog/net-revenue-retention-saas-valuation/), which makes getting this number right directly tied to your exit value. NRR by cohort vintage — showing whether each quarterly cohort retains better or worse than the one before — is the decision tool. NRR by segment shows whether your mid-market customers retain differently from your SMB customers, and whether your pricing tiers align with retention patterns.

The definitional question underneath the dictionary is harder than it looks. "What is a customer?" sounds simple until you realize Stripe has one answer (an entity with an active subscription), your CRM has another (an account with a signed contract), and your CS platform has a third (a contact who's been assigned a CSM). If a customer pauses their subscription for one month, did they churn? If they downgrade from annual to monthly, did they churn? The dictionary is where you write these answers down once — and the [semantic layer](/blog/semantic-layer-in-data-warehousing) is where you enforce them across every dashboard and query.

## Step 4: Map your sources and make them agree

With definitions written, map each metric to the specific data source that can answer it and the join key that connects it to the others:


| Question                       | Source                 | Join key                           | Gotcha                                                                                     |
| ------------------------------ | ---------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------ |
| Revenue churn this month?      | Stripe subscriptions   | `customer_id` → CRM account        | Stripe subscription events vs. invoice events give different churn dates                   |
| Which accounts dropped usage?  | PostHog events         | User email → CRM contact → account | Anonymous sessions inflate usage numbers if not filtered                                   |
| Support sentiment trending?    | Intercom conversations | Contact email → CRM contact        | Conversation volume ≠ severity — one escalation matters more than ten low-priority tickets |
| Renewal pipeline this quarter? | CRM opportunities      | Account ID                         | Only useful if renewal dates are maintained — most CRMs have stale ones                    |
| NRR by cohort?                 | Stripe + CRM           | `customer_id` → account → segment  | Requires segment to be stable — a customer reclassified mid-period breaks the cohort       |


The real work is in the join keys. Stripe's `customer_id` is opaque. PostHog tracks by user email or anonymous ID. Intercom tracks by contact. HubSpot tracks by company. Making "revenue by account" work across these systems means establishing an identity resolution layer — matching records across systems to a single account identity.

For most startups, this is the wall. One founder building analytics for their CS team described the experience: enabling tooling for customer success meant that a non-technical user needed to get insights from Postgres tables. That's the wrong abstraction — the CS team shouldn't need to know what a Postgres table is. The fix is a [semantic layer](/blog/semantic-layer-in-data-warehousing) that renames database columns to business terms ("`stripe_mrr`" becomes "Monthly Recurring Revenue"), resolves join keys automatically, and lets the CS team ask questions in their own vocabulary. The technical mapping between Stripe's `cus_` ID and the CRM's account name happens underneath, invisible to the person asking the question.

## Step 5: Build the dashboard last — distribute alerts where CSMs work

The dashboard is the least important part of this system. Not because it's unnecessary — a [retention dashboard](/dashboards/retention) is genuinely useful for trend analysis and board reporting — but because CSMs don't work in dashboards. They work in Slack, email, their CS platform, and the CRM. If your retention analytics only exist in a BI tool that a CSM opens once a week, you've built a reporting system, not an early warning system.

Distribution is the unlock:


| What                                   | Where                                                                              | Frequency              |
| -------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------- |
| Account moved from green to yellow/red | Slack channel #cs-alerts                                                           | Real-time              |
| Payment failure on an account          | Slack DM to assigned CSM                                                           | Real-time              |
| Weekly book-of-business summary        | Email to each CSM                                                                  | Monday morning         |
| Account-level health score changes     | Pushed to HubSpot/Salesforce                                                       | Daily sync             |
| Cohort retention trends                | [Churn dashboard](/dashboards/churn), [Retention dashboard](/dashboards/retention) | CS lead reviews weekly |
| Board-grade NRR + churn analysis       | [Customer success dashboard](/dashboards/customer-success)                         | Quarterly              |


The dashboard pages — [churn](/dashboards/churn), [retention](/dashboards/retention), and [customer success](/dashboards/customer-success), each with source-specific views — exist for two audiences: the CS lead who reviews trends weekly, and the board who wants a quarterly retention picture. For everyone else — the CSMs doing the actual account work — the value is in the alerts and summaries that show up where they already are.

## Step 6: Weekly review cadence

The system above produces data. Cadence turns data into decisions.


| Cadence       | What                                                                                             | Who                 | Action                                                                                                                                         |
| ------------- | ------------------------------------------------------------------------------------------------ | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **Weekly**    | Account-level health score changes — new at-risk accounts, accounts recovered, expansion signals | CS lead + CSMs      | Prioritize outreach, assign saves, queue expansion conversations                                                                               |
| **Monthly**   | Cohort retention analysis — logo, GRR, NRR by cohort vintage                                     | CS lead             | Identify trends: are newer cohorts retaining better? Is a specific segment churning faster? Adjust onboarding or pricing.                      |
| **Quarterly** | Full retention review — NRR trend, churn reasons (categorized), expansion pipeline, QBR prep     | CS lead + exec team | Board-grade reporting. Churn post-mortem: tag every lost account with a primary reason, look for patterns. Feed the renewal pipeline forecast. |


The weekly review is the working view — it should take 30 minutes, not a morning. The monthly cohort analysis is where the real insight lives: a cohort retention table that shows logo, ARR gross, and ARR net by quarterly cohort, going back at least four quarters. If Q1 2025 cohort retains at 95% after twelve months but Q3 2025 cohort retains at 85% after six months, something changed in the product, the onboarding, or the customer mix — and you can see it before it hits the company-wide NRR number.

The quarterly review is what you bring to the board and what you prepare for QBRs. It answers: "How is retention, and why?" Not with a single NRR number, but with the decomposition underneath it — which segments, which cohorts, which specific accounts drove the change.

## AI retention analytics: the startup version is a different problem

Search "AI churn prediction" and everything you'll find assumes enterprise scale — thousands or millions of accounts, ML models trained on historical patterns, propensity-to-churn scores. That's real and useful if you're a telco with ten million subscribers. But full ML churn prediction requires more data than most early-stage startups have — logistic regression can work on smaller datasets, but gradient-boost models need hundreds of churn events to train reliably. And frankly, at 200 accounts, you know most of them by name.

The startup version of AI retention analytics is simpler and more useful: AI as the analyst who connects your four data sources and surfaces the patterns you'd catch yourself if you had time to look.

That means natural language queries: "Which accounts dropped usage by more than 30% this month and have a renewal in the next 90 days?" — a question that requires joining PostHog usage data to Stripe subscription data to CRM renewal dates. Without AI, that's a data request to engineering. With AI that understands your metric dictionary and source mapping, it's a question you ask on Monday morning.

It means anomaly detection: flagging when billing, usage, and support signals diverge for the same account — payment is current but usage flatlined, or usage is strong but support tickets spiked. These compound patterns are what rules-based health scores miss, and they're exactly what a model pointed at cross-system data catches.

But the condition that enterprise AI content never has to spell out: **AI is only as reliable as the definitions underneath it.** Pointed at four systems that disagree on what a customer is, AI confidently produces wrong numbers faster. Pointed at a metric dictionary over joined data, it does the work of the analyst you never hired. Steps 1–4 of this guide are, concretely, how you make AI retention analytics trustworthy.

## Doing this with Definite

Definite is the system above, packaged. You get [500+ connectors](/connector-db) — [Stripe](/connector/stripe), [Intercom](/connector/intercom), [Zendesk](/connector/zendesk-support), [HubSpot](/connector/hubspot), [PostHog](/connector/posthog), and [every major CS data source](/connector-db) — with storage and modeling included. Your metric dictionary is implemented as governed definitions: NRR, health score, and churn calculated the same way in every dashboard, every query, every alert. [Fi](/fi), the AI analyst, answers CS questions in plain English — from those definitions, with inspectable SQL underneath.

Alerts push to Slack when a health score changes. Weekly summaries go to email. The [churn](/dashboards/churn), [retention](/dashboards/retention), and [customer success](/dashboards/customer-success) dashboards give you the cohort retention views the board asks about. And Definite sits beside your CS platform — your CS tool handles day-to-day playbooks and tasks, Definite handles the analytical layer that connects everything. Pricing is one flat platform fee — $250/month, unlimited users ([pricing](/pricing)).

If you'd rather assemble it yourself: a warehouse, an ingestion tool, a modeling layer, a BI tool, and the time to make them agree. The framework in this guide works either way. One of them is a weekend.

→ More on the CS setup specifically: [Definite for Customer Success teams](/for/customer-success).

## FAQ

**What's the difference between logo retention and net revenue retention?**
Logo retention is the percentage of customers you kept — it treats every customer equally. NRR weights by revenue and includes expansion: you can lose customers and still grow NRR if the remaining ones expand. You need both. Logo shows the breadth of your retention problem; NRR shows the revenue impact. A company with 90% logo retention and 120% NRR is losing small accounts and growing large ones — that's a very different situation from 90% logo and 95% NRR.

**How do I build a health score that actually predicts churn?**
Connect four data sources — billing ([Stripe](/connector/stripe)), product usage ([PostHog](/connector/posthog)), support ([Intercom](/connector/intercom) or [Zendesk](/connector/zendesk-support)), and CRM ([HubSpot](/connector/hubspot)). Weight billing signals heaviest: payment failures and downgrade requests are the strongest churn predictors. Rules-based scores from a single source miss compound signals — a customer can look healthy in your CS platform while their billing and usage tell a different story.

**Do I need a data team for customer retention analytics?**
No. An all-in-one data platform like [Definite](/signup) connects sources and defines metrics without SQL or data engineering. The framework in this guide can be set up in a weekend — connect your data sources, define your metrics once, and start getting answers. The assembled warehouse-and-pipelines approach is what you build when you have a data team that wants to own infrastructure.

**How is this different from what my CS platform already does?**
CS platforms — Vitally, Gainsight, ChurnZero — handle day-to-day ops: playbooks, tasks, in-app health scoring from their own data. They're essential tools. But they see a partial picture: whatever data they ingest natively. An analytical layer connects *all* your data sources for the retention questions your CS platform can't answer: cross-system health scores, cohort retention analysis by vintage, board-grade NRR that matches what finance reports. Think of it as your CS platform for the operational layer, the analytical platform for the strategic layer.

**What metrics should a VP of Customer Success track?**
Start with the dictionary in Step 3: NRR, logo retention, GRR, health score, expansion rate, time to value, and CSM coverage. NRR is what the board cares about. Logo retention is what tells you how many customers you're actually keeping. Health score is what lets you act before churn happens. The dictionary defines each with formulas and the dimensions you should cut them by — by segment, by cohort, by CSM — so the numbers tell you *where* to focus, not just *whether* things are good.

---

If you're looking at the metrics themselves — what to track and how to report to the board — see our [investor reporting guide](/blog/investor-reporting-startup-metrics). For the financial layer of this system, see the [startup finance analytics guide](/blog/startup-finance-analytics). For the revenue pipeline that feeds retention, see the [RevOps analytics guide](/blog/startup-revops-analytics) and the [marketing analytics guide](/blog/startup-marketing-analytics). For the dashboard structure that holds all of it, see the [executive dashboard guide](/blog/startup-executive-dashboards).

The framework is the starting point. **[Start building yours →](/signup)**]]></content:encoded>
            <author>hello@definite.app (Definite Team)</author>
        </item>
        <item>
            <title><![CDATA[Metabase AI: What It Does, Where It Stops, and What the Ceiling Is]]></title>
            <link>https://definite.app/blog/metabase-ai</link>
            <guid>https://definite.app/blog/metabase-ai</guid>
            <pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[
Your team wired an AI agent to Metabase — or turned on Metabot — expecting it to close the gap between "we have dashboards" and "anyone can get answers." It worked, partially. The AI answered questions faster. It wrote SQL you didn't have to debug. It summarized charts in a click. But when someone asked it to fix the broken Stripe integration, update the revenue definition that three teams define differently, or build the pipeline that doesn't exist yet — nothing. The AI got faster at reading what was already there. The architecture underneath didn't change.

That's not a product gap you can patch — it's a structural limitation. Metabase has invested heavily in AI, and the improvements are genuine. But Metabase is a tool that reads databases. Its AI inherits that scope. The question is whether AI on a visualization layer can do what you actually need, or whether the foundation it sits on determines the ceiling.

**The short version:**

- Metabase AI (Metabot + MCP server + Agent API) can query your data, generate SQL, summarize dashboards, and create charts. It has real governance — group-level token limits, conversation logs, permission scoping.
- It cannot manage integrations, govern metric definitions across tools, modify data models, or build pipelines. The AI operates within the BI layer — it reads databases but doesn't own the data foundation underneath.
- The difference between AI on a BI tool and AI on a governed data platform is whether the AI can act on the system it reads, or just observe it faster.

## What Metabase AI Actually Does

Metabase has shipped meaningful AI features. Fair assessment:

**Metabot** is a built-in AI assistant that handles natural language queries, SQL generation, chart and dashboard summarization, and data transform generation in SQL or Python. It integrates with Slack — you can @mention Metabot in a channel to query data without opening the app. It uses [Metabase's own metadata and verified models](https://www.metabase.com/features/metabase-ai) to ground SQL generation in your actual schema, reducing hallucinated column names. You can bring your own Anthropic API key or use Metabase's hosted AI service ($3.75 per million tokens, with a million included).

**The MCP server** (v0.62) exposes Metabase to external AI agents — Claude Desktop, Cursor, ChatGPT, and other MCP-compatible clients. Agents can search for dashboards and questions, query data, execute SQL, create new questions and dashboards, and render interactive charts. It authenticates via OAuth and respects user-level permissions. Metabase also ships an [Agent API](https://www.metabase.com/docs/latest/ai/agent-api) — a headless REST endpoint for building custom data agents on Metabase's metadata — and a CLI for [agent-driven development](https://www.metabase.com/docs/latest/ai/file-based-development) that creates Metabase content as version-controlled YAML (Pro/Enterprise).

**AI governance** (v0.61+) adds per-group token limits (daily, weekly, or monthly reset), conversation logs with full message transcripts, granular controls over which AI features each user group can access, and customizable system prompts. Embedded analytics get tenant-specific token pools. For teams that worry about AI running unsupervised on company data, these controls are real and useful (Pro/Enterprise).

None of this is vaporware. If you're already running Metabase and want AI assistance within that tool, Metabot and the MCP server deliver.

## Where It Stops

The capabilities above share a boundary: they all operate within the Metabase layer. That boundary is where the ceiling shows up.

**It can't modify the foundation.** Metabot writes SQL against your warehouse — but it can't create the integration that feeds data into that warehouse, update a semantic model's metric definition, or fix a broken pipeline. Those aren't Metabase features, and Metabase's AI inherits the same scope. If your Stripe sync breaks at 2 AM, the AI can tell you the revenue chart looks wrong. It can't [fix the pipeline that feeds it](/blog/metabase-integrations).

**It can't govern definitions across tools.** Metabase has a metadata layer it calls a [semantic layer](https://www.metabase.com/features/metabase-ai) — with metrics, measures, and verified models. It governs Metabase queries: five people asking the same question inside Metabase get the same answer. But if "monthly revenue" means one thing in Metabase's models, something slightly different in your dbt definitions, and something else entirely in the spreadsheet your CFO maintains — Metabot faithfully uses Metabase's version. There's no governed layer ensuring that the AI, the dashboards, the API, and every other tool in the stack all resolve to the same number. The inconsistency lives below Metabase's reach.

**It can't act on what it finds.** Metabot can summarize a dashboard and flag that revenue dropped 20% last week. That's useful. What it can't do is investigate whether the drop is a data quality issue (a broken integration), update the metric definition if it's wrong, trigger a pipeline re-sync, or build a new model to isolate the cause. The insight stays in the chat sidebar. Acting on it requires leaving Metabase and going into the stack of tools underneath.

There are also specific limitations worth noting: Metabot [can't generate SQL with parameters](https://www.metabase.com/docs/latest/ai/metabot), can't modify visualization settings like colors or axis labels, only checks the first 100 tables (it will hallucinate tables beyond that), and works best in English with non-deterministic results. The Agent API explicitly [cannot manage data sources, handle pipelines, or administer semantic models](https://www.metabase.com/docs/latest/ai/agent-api).

These aren't complaints about missing features. They're the natural consequence of what Metabase is: a tool that reads databases. Its AI reads databases faster.

## AI-Adjacent vs. AI-Native

The distinction that matters isn't how good the chatbot is — it's what the chatbot operates on.

**AI-adjacent** means a chatbot or agent layered on a BI tool. It can query what the BI tool can see, summarize what the BI tool shows, and create content within the BI tool's scope. Metabot and Metabase's MCP server are competent implementations of this pattern. So are Wren.ai, ThoughtSpot, and the growing field of "AI on your data" tools. The pattern works — until you need the AI to do something the BI tool can't.

**AI-native** means the agent operates on the same governed foundation it builds. It doesn't just query the warehouse — it manages the integrations that feed it, modifies the semantic layer that governs it, builds the dashboards that visualize it, and acts within the same system. The AI isn't sitting on top of the architecture. It's part of it.

One market research company we talked with learned the difference the hard way. They ran a failed engagement with an AI analytics vendor layered on their Metabase + dbt + Redshift + Tableau stack. The vendor promised natural language access to their data. What they got was faster access to ungoverned answers — the AI confidently reproduced every inconsistency in the underlying models. The Head of Data concluded that AI needed to be structural, not bolt-on — not applied after building, but built into how the system works. When they moved to a platform where the AI operated on a governed semantic layer, the results were different: the head of product watched the AI build analytics in real time — the speed and governance were qualitatively different from what the previous vendor delivered. The maintenance that had justified hiring a dedicated Metabase contractor turned out to be a symptom of the architecture, not a permanent need.

A fintech engineering lead ran a parallel evaluation. He'd already eliminated Metabase, Apache Superset, and Redash before his first call with Definite. The differentiators he identified: the AI layer was structural, not cosmetic, and the connector depth meant he wouldn't have to build the data foundation separately. He wasn't looking for a BI tool with a chatbot — he was looking for a foundation that agents could operate on.

The pattern repeats: teams that bolt AI onto Metabase get faster observation. Teams that move to an AI-native foundation get analytics that act.

## What Changes with a Governed Foundation

| | Metabase AI | Definite |
|---|---|---|
| **AI assistant** | Metabot — queries, summarizes, generates SQL | Fi — writes SQL, builds dashboards, configures visualizations |
| **MCP server** | Query, create questions/dashboards, interactive charts | Full platform — integrations, semantic models, pipelines, dashboards, SQL |
| **Semantic layer** | Metabase metadata (governs Metabase queries) | Governed [semantic layer](/blog/semantic-layer-ai-analytics) — single definitions across all tools and outputs |
| **Data foundation** | None — reads your warehouse | Built-in warehouse, [500+ connectors](https://www.definite.app/connector-db), managed pipelines |
| **AI governance** | Token limits, conversation logs, permission scoping | Governance built into the data foundation — semantic definitions, access control, and audit trail across the full platform |
| **Pricing** | [Free–$575/mo](https://www.metabase.com/pricing) + AI tokens + [the stack underneath](/blog/metabase-pricing) ($1,200–$8,700/mo typical) | [$250/mo](https://www.definite.app/pricing), unlimited users |

The structural difference: Fi writes SQL, builds dashboards, and configures visualizations from natural language. Via MCP, agents go further — managing integrations, modifying semantic model definitions, and executing pipelines — all within the governance boundary. When you ask it to investigate a revenue drop, the system can check whether the Stripe integration is syncing, verify the metric definition in the semantic layer, and build a new visualization — without leaving the platform. And because every metric is defined once in the governed semantic layer, five people asking the same question get the same answer every time.

Technical teams get full SQL, Python, and [MCP access](https://www.definite.app/mcp) inside the governance boundary. The MCP server isn't limited to querying — agents can manage integrations, modify Cube YAML model definitions, create and execute dashboards, and manage pipelines. That's the difference between exposing a BI tool to agents and exposing a governed data platform.

The tradeoff is vendor dependency — you're choosing one system instead of assembling your own. For most teams without a data engineering org, that's the point.

For a full comparison, see [Definite vs Metabase](/blog/definite-vs-metabase).

## Frequently Asked Questions

### Does Metabase have AI?

Yes. [Metabot](https://www.metabase.com/features/metabase-ai) handles natural language queries, SQL generation, chart and dashboard summarization, data transform generation, and Slack integration. An MCP server (v0.62) exposes Metabase to external AI agents. A headless Agent API lets developers build custom data agents on Metabase's metadata. AI governance (Pro/Enterprise) includes per-group token limits, conversation logs, and granular permission controls. These are real capabilities — available on all plans, including the free open-source edition with your own Anthropic API key.

### Can an AI agent use my Metabase data?

Yes, via [Metabase's MCP server](https://www.metabase.com/docs/latest/ai/mcp). Agents running in Claude Desktop, Cursor, or other MCP clients can search, query, execute SQL, and create questions and dashboards. They cannot manage integrations, modify semantic models, build pipelines, or handle data ingestion — those fall outside Metabase's scope.

### What is MCP for analytics?

Model Context Protocol is an open standard that lets AI agents interact with tools programmatically. Both Metabase and Definite offer MCP servers. The scope differs: Metabase's exposes BI-layer operations (query, create charts, run SQL). Definite's exposes full platform access — integrations, semantic modeling, pipeline management, dashboards, and governed data queries. MCP is what makes "AI on your data" concrete instead of hypothetical.

### Can ChatGPT analyze my Metabase data?

Metabase's MCP server supports Claude, Cursor, and ChatGPT/Codex — so yes, you can connect an AI agent to your Metabase instance. The agent can query data, create charts, and build dashboards within Metabase's scope. What it can't do is manage the data foundation underneath — integrations, pipelines, semantic models, ingestion. For AI that operates on governed data end-to-end, you need a platform where the AI and the data foundation are the same system.

---

**[Start with the governed foundation →](https://www.definite.app/)** AI that builds your analytics — not just answers questions about them.

- [How Metabase handles data — and what it doesn't →](/blog/metabase-integrations)
- [Metabase pricing: what "free" actually costs →](/blog/metabase-pricing)
- [Metabase alternatives, matched to the gap you're closing →](/blog/metabase-alternatives)
- [Why conversational analytics fails — and what fixes it →](/blog/conversational-analytics)
- [Connectors →](https://www.definite.app/connector-db) · [Pricing →](https://www.definite.app/pricing)
]]></content:encoded>
            <author>hello@definite.app (Definite Team)</author>
        </item>
    </channel>
</rss>