---
title: "Airflow DAG owner: how to set it and what it does | Metacenta"
description: "An Airflow DAG owner is a label set on its tasks, usually through default_args. How to set it, why it often says airflow, and how to link it to a team."
url: "https://metacenta.com/rules/dag-unowned"
updated: "2026-10-14"
tokens: 936
---

Orchestration & reliability · rule dag-unowned

# Airflow DAG owner: how to set it and what it does

An Airflow DAG owner is the `owner` value on its tasks, usually set once through `default_args`. Airflow shows it in the DAGs list so people can see who runs the job.

A Metacenta review checks this under the rule **Every scheduled job names an owner**. Everything below applies whether or not you ever commission one.

## How to set the owner

Put `owner` in `default_args` to apply it to every task. A task can override it with its own `owner`.

```python
with DAG(
    "daily_orders",
    schedule="@daily",
    start_date=datetime(2026, 1, 1),
    default_args={"owner": "finance-data"},
):
    load = BashOperator(task_id="load", bash_command="echo load")
    report = BashOperator(task_id="report", bash_command="echo report", owner="reporting")
```

## Why a DAG's owner says airflow

Tasks with no owner take `default_owner` from the `[operators]` config, and its default value is `airflow`. So a DAG that nobody assigned still shows an owner, which is why that value counts as no owner in this rule.

## How to link an owner to a team

`owner_links` makes the owner a clickable link in the DAGs view. Each key must match an owner, and each value is an HTTP or `mailto:` link.

```python
with DAG(
    "daily_orders",
    default_args={"owner": "finance-data"},
    owner_links={"finance-data": "mailto:finance-data@example.com"},
):
    ...
```

See [Airflow's owner links docs](https://airflow.apache.org/docs/apache-airflow/stable/howto/add-owner-links.html) for more.

## An owner doesn't send alerts

Setting `owner` tells people whose DAG it is, but it doesn't notify anyone when the DAG fails. Failure alerts need their own setup, which we cover in [Airflow DAGs with no failure alert](https://metacenta.com/rules/dag-no-failure-alert).

## What this rule checks

This rule flags each Airflow DAG, Dagster job or Prefect flow file that declares no owner. An owner of `airflow`, `admin`, `default`, `todo` or a similar placeholder counts as none, because Airflow's own scaffolding writes `owner="airflow"`.

## Why it matters

An unowned job is fine until it breaks. Then somebody has to decide whose problem it is, during the incident rather than before it, which is the expensive time to find out.

## How to fix it

**Name an owner on every scheduled job.** Set `default_args.owner` to a team or a rota, not one person who can be on holiday. For Dagster, set `owners` on the asset or job.

Before:

```python
default_args = {
    "owner": "airflow",
}
```

After:

```python
default_args = {
    "owner": "finance-data",
}
```

## When it is fine to leave

Ownership tracked outside the DAG file, in a service catalogue or a CODEOWNERS entry, is ownership in practice. Tell us where it lives, and the finding comes out of your report.

## What we need to check it

The DAG files you name to us one at a time. We never search a repository for them. We read the owner only when it is written as a literal; a value imported from a shared module reads as no owner.

[Ask about a review](https://metacenta.com/enquire?src=rule-dag-unowned&via=md)

## Related pages

- [Airflow DAGs with no retries](https://metacenta.com/rules/dag-no-retries)
- [Airflow DAGs with no failure alert](https://metacenta.com/rules/dag-no-failure-alert)
- [Airflow catchup: what it does and how to control it](https://metacenta.com/rules/dag-catchup-unbounded)
- [Passwords and API keys hardcoded in DAG files](https://metacenta.com/rules/dag-credential-literal)
- [A sample review, as a client reads it](https://metacenta.com/sample)
- [All published rules](https://metacenta.com/rules)
- [How a review is assessed](https://metacenta.com/standard)
