Quick verdict
Choose Prefect if your work is Python code that does things (calls APIs, moves files, runs jobs) and you want to orchestrate it with minimal restructuring, react to events, and start on a free hosted tier. Choose Dagster if your pipelines exist to produce tables, files and models, and you want lineage, materialisation history and freshness rules per asset to be the centre of the tool. Both can be self-hosted for free; their cloud services are priced on different units (Prefect Cloud by plan and seats, Dagster+ by plan plus credits per materialisation or op).
Prefect, from Prefect Technologies, describes itself as "a workflow orchestration framework for building data pipelines in Python" that lets you "elevate a script into a production workflow". You decorate functions with @flow and @task and get scheduling, retries, caching and event-based automations. The open source package includes a self-hostable server and UI; Prefect Cloud is the hosted control plane. The current release is 3.8.8 (6 October 2026), for Python 3.10 to 3.14.
Dagster, from Dagster Labs, describes itself as "a cloud-native data pipeline orchestrator for the whole development lifecycle, with integrated lineage and observability, a declarative programming model". Its central abstraction is the software-defined asset, a function decorated with @dg.asset that produces a persistent object; ops and jobs cover task-style work. The current release is 1.13.25 (1 October 2026), for Python 3.10 to 3.14. Dagster+ is the hosted platform.
Both are often compared with Apache Airflow; see Apache Airflow vs Prefect and Apache Airflow vs Dagster. None of the three is a connector-based ingestion tool.
Side by side
| Aspect | Prefect | Dagster |
|---|---|---|
| Central abstraction | Flows and tasks: decorated Python functions | Software-defined assets; ops and jobs for task-style work |
| Control flow | Native Python; no DAG declared up front | Asset graph declared through function arguments or deps |
| Licence | Apache-2.0 | Apache-2.0 |
| Time-based scheduling | Cron, interval and RRule schedules on deployments | Cron schedules targeting assets or jobs; AutomationCondition.on_cron per asset |
| Event-driven runs | Automations: triggers on events, state changes, metrics or missing events, with actions such as running a deployment | Sensors, asset sensors, Declarative Automation (for example eager()) and GraphQL triggers |
| Where code runs | Served processes or workers from work pools; push and managed pools in Prefect Cloud | Run launchers and executors you configure; Dagster+ Serverless or Hybrid agents |
| Hosted service | Prefect Cloud, with a free Hobby plan | Dagster+, Serverless or Hybrid, with a 30-day trial |
| Cloud pricing unit | Plan (flat monthly or per user) with included serverless minutes | Plan plus credits (asset materialisations and op executions) |
| Main trade-off | Less built-in notion of the data a flow produces, so lineage is not the centre | Asset-first model is a bigger shift for task-oriented code |
Key differences
Flows and tasks versus software-defined assets
The same small pipeline (read some orders, total them, refresh daily at 06:00 UTC) shows the difference. Prefect describes the work: a flow that calls three tasks in order, like ordinary Python. Dagster describes the outputs: two assets, where order_total depends on raw_orders by taking it as an argument, and a schedule that materialises both. Both examples follow the official documentation and were syntax-checked with Python 3.14.
# Prefect 3
from prefect import flow, task
@task(retries=2)
def extract() -> list[dict]:
return [{"id": 1, "amount": 120.0}, {"id": 2, "amount": 80.0}]
@task
def transform(rows: list[dict]) -> float:
return sum(r["amount"] for r in rows)
@task
def load(total: float) -> None:
print(f"Total order value: {total:.2f}")
@flow(log_prints=True)
def daily_orders():
rows = extract()
total = transform(rows)
load(total)
if __name__ == "__main__":
daily_orders.serve(name="daily-orders", cron="0 6 * * *")# Dagster 1.13 (software-defined assets)
import dagster as dg
@dg.asset
def raw_orders() -> list[dict]:
return [{"id": 1, "amount": 120.0}, {"id": 2, "amount": 80.0}]
@dg.asset
def order_total(raw_orders: list[dict]) -> float:
total = sum(r["amount"] for r in raw_orders)
print(f"Total order value: {total:.2f}")
return total
daily_refresh = dg.ScheduleDefinition(
name="daily_refresh",
cron_schedule="0 6 * * *",
target=[raw_orders, order_total],
)
defs = dg.Definitions(
assets=[raw_orders, order_total],
schedules=[daily_refresh],
)Prefect's documentation stresses that flows are not restricted to predefined DAGs: loops, conditions and dynamic fan-out (for example task.map) are ordinary Python, and a flow can be called like a function in a test. Dagster's model trades some of that freedom for a known graph of assets: I/O managers store and load asset values, each materialisation is recorded, and the UI can show when a table was last refreshed and what depends on it. When an asset writes to a database itself, you declare the dependency with deps=[...] instead of passing data.
Scheduling, events and automation
Prefect attaches schedules to deployments: cron, interval and RRule (for calendar rules such as "the last weekday of each month"), set in code, prefect.yaml, the CLI or the UI. Its automations connect triggers to actions. Triggers include flow run state changes, work pool and deployment status, metric thresholds such as duration or lateness, custom events, and the absence of an expected event; actions include running a deployment, cancelling or suspending runs, pausing schedules, and notifications or webhooks. The documentation lists the dedicated email action and incident declaration as Prefect Cloud only.
Dagster offers schedules (UTC by default, or set execution_timezone), sensors for external changes, asset sensors that react to materialisations, GraphQL triggers, and Declarative Automation, where each asset carries a condition such as dg.AutomationCondition.eager() to update whenever dependencies change or dg.AutomationCondition.on_cron("@hourly"). Declarative Automation requires the default automation condition sensor to be enabled in the UI. The difference in emphasis: Prefect reacts to events about runs and systems; Dagster can also reason about whether each asset is up to date relative to its parents.
UI and observability
Prefect's UI, available on the self-hosted server and in Prefect Cloud, covers flow runs and task runs with their states, deployments and schedules, work pools and automations. Prefect Cloud adds workspaces, user management, and RBAC, SSO and audit logs on paid plans, plus AI-generated log summaries in automation templates.
Dagster's UI centres on the asset lineage graph and each asset's materialisation history, with runs, schedules and sensors alongside; locally it starts with dg dev on port 3000. Dagster+ adds Insights for platform trends and cost, alerts to Slack, PagerDuty and email for failures and SLA violations, an asset catalog with advanced search and column lineage, RBAC with audit logs, and branch deployments.
Deployment: self-hosting, Prefect Cloud and Dagster+
Self-hosted Prefect runs with prefect server start, the prefecthq/prefect Docker image or a Helm chart; the docs say PostgreSQL 14.9 or higher is required for multi-server deployments. Process, Docker and Kubernetes work pools run on a self-hosted server through workers. Prefect Cloud hosts the API, database and UI and adds push work pools (AWS ECS, Google Cloud Run, Azure Container Instances, Modal) that need no worker, plus Prefect Managed pools.
Self-hosted Dagster runs a webserver, one daemon (schedules, sensors and run queuing) and code location servers, with SQLite storage by default and PostgreSQL for production; the docs cover Kubernetes, Docker Compose, AWS and Google Cloud. Dagster+ offers Serverless, where your code runs in Dagster's environment, and Hybrid, where Dagster+ runs the control plane and you run the execution layer. Prefect's hybrid work pools follow a similar split: the control plane is hosted, and a worker in your infrastructure runs the flows.
Pricing and licensing
Both open source projects are free under the Apache-2.0 licence and can be self-hosted at the cost of your own infrastructure.
Prefect Cloud is priced by plan. As listed on prefect.io/pricing in October 2026: Hobby is free (2 users, 1 workspace, up to 5 deployments, 500 minutes per month of Prefect Serverless, 7 days of run retention); Starter is USD 100 per month, billed monthly, for 3 users and up to 20 deployments; Team is priced per user per month; Enterprise is custom and billed annually.
Dagster+ is priced by plan plus credits, defined on its pricing page as "the sum of asset materializations and ops executed". As listed on dagster.io/pricing in October 2026: Solo is USD 10 per month (1 user, 1 deployment) with credits at USD 0.040 each; Starter is USD 100 per month (up to 3 users) with credits at USD 0.035; Pro is priced on request. Serverless compute is billed per minute on top, and Solo and Starter have a 30-day trial.
The units differ: Prefect Cloud's cost follows plan, seats and serverless minutes, while Dagster+ also grows with the number of materialisations and op executions. We do not estimate bills; model your own run volumes against each pricing page.
Pricing checked on the vendors' official pages on 7 October 2026. Prices change; confirm before buying.
Where each one leads
Prefect strengths
- Orchestrates ordinary Python with native loops, conditions and dynamic fan-out
- Automations react to events, state changes, metric thresholds and missing events
- Free Prefect Cloud Hobby plan for getting started without hosting a server
- Push work pools in Prefect Cloud run flows on ECS, Cloud Run, Azure Container Instances or Modal without a worker
- flow.serve runs a scheduled deployment from a single process
Dagster strengths
- Software-defined assets put lineage and materialisation history at the centre
- Declarative Automation sets freshness rules per asset
- dbt models appear as individual assets through the documented dbt integration
- Dagster+ Hybrid keeps execution in your own infrastructure
- Local UI with dg dev for materialising and inspecting assets during development
Limitations
Prefect limitations
- No built-in model of the tables or files a flow produces, so data lineage is not its focus
- Push and managed work pools, RBAC, SSO and audit logs are Prefect Cloud features
- Prefect Cloud plans cap deployments, users and run retention; check limits as usage grows
- Managed hosting means Prefect Cloud; there is no cloud-provider managed Prefect
Dagster limitations
- Asset-first design is a bigger change for teams with task-style Python scripts
- Dagster+ credits grow with materialisations and op executions
- Insights, column lineage in the catalog, RBAC and branch deployments are Dagster+ features
- Declarative Automation needs its sensor enabled before conditions take effect
- No free hosted plan: Dagster+ offers a 30-day trial, then paid plans
When to choose each
Choose Prefect if
- You have existing Python scripts and want them scheduled, retried and monitored with little restructuring
- Workflows branch, loop or fan out dynamically at run time
- You need event-driven automations, including alerts when an expected run does not happen
- You want to start on a free hosted tier
Choose Dagster if
- Your platform is a set of tables, files and models whose freshness and lineage matter
- You use dbt and want its models in the same lineage graph as Python assets
- You want automation rules per asset rather than per pipeline
- You want column lineage and a searchable asset catalog (Dagster+)
When neither is right
- You want a managed orchestrator from AWS or Google Cloud, or an Airflow-based estate already exists: look at Apache Airflow; see Apache Airflow vs Prefect and Apache Airflow vs Dagster.
- You mainly need to copy data from SaaS applications and databases into a warehouse: a connector-based ingestion tool may be enough on its own; see Apache Airflow vs Airbyte, Apache Airflow vs Fivetran and the best ETL tools guide.
- Your transformations are a few SQL statements in one database: the database's own scheduler may be simpler; ETL vs ELT and ETL vs data pipeline explain where each step usually lives.
Final recommendation
Both are modern, Apache-2.0 licensed Python orchestrators with a hosted option, and the deciding question is what you want the tool to know about. Prefect knows about your code and its runs: it is the lighter step from a working script to a scheduled, observable workflow, with strong event-driven automations and a free hosted tier. Dagster knows about your data assets: it suits analytics platforms where lineage, freshness and the relationship between tables (including dbt models) matter more than the individual steps. For mostly operational, script-shaped work, start with Prefect; for an asset-centric analytics platform, start with Dagster.
Frequently asked questions
Are Prefect and Dagster open source?
Yes. Both are published under the Apache-2.0 licence and can be self-hosted. Their hosted services, Prefect Cloud and Dagster+, are commercial and add features such as RBAC and audit logs.
Which has a free cloud tier?
Prefect Cloud has a free Hobby plan (2 users, 1 workspace, up to 5 deployments, 500 serverless minutes per month, as listed in October 2026). Dagster+ offers a 30-day free trial on its Solo and Starter plans rather than a permanent free tier.
Can Prefect track data assets like Dagster?
Prefect's core model is flows and tasks, and its documentation centres on runs, states, events and automations rather than on persistent data assets. If per-asset lineage and freshness are central requirements, Dagster is designed around them.
Can Dagster run task-style workflows?
Yes. Dagster has ops and jobs for work that does not produce an asset, and schedules and sensors can target jobs. Note that on Dagster+, op executions count as credits in the same way as asset materialisations.
Do I still need an ingestion tool with Prefect or Dagster?
Often, yes. Orchestrators schedule and monitor code; they do not ship maintained connectors for SaaS sources the way ingestion tools do. Many teams use an ingestion tool to load raw data and an orchestrator to run transformations around it. See Apache Airflow vs Airbyte for how the two fit together.
Sources
- Prefect documentation: Quickstart
- Prefect documentation: Flows
- Prefect documentation: Schedules
- Prefect documentation: Automations
- Prefect documentation: Work pools
- Prefect documentation: Self-hosted server
- Prefect Cloud pricing
- prefect on PyPI
- Dagster documentation: Quickstart
- Dagster documentation: Asset dependencies
- Dagster documentation: Schedules
- Dagster documentation: Declarative Automation
- Dagster documentation: dbt integration
- Dagster documentation: OSS deployment architecture
- Dagster+ documentation
- Dagster+ pricing
- Dagster releases (GitHub)
Checked October 2026.
How we research comparisons: our editorial method.