## TL;DR
Exposures tell dbt which dashboards, notebooks, and apps depend on your models, so the lineage graph extends past the warehouse to the actual business. Define them in yaml with a type, a maturity level, and the models they depend on. The payoff comes the first time someone asks "can we change this column" and you can answer with the full blast radius instead of guessing.

```text
dbt exposures: documenting downstream use
```

## Use this when
- stakeholders ask what breaks if a model changes
- you want lineage from dbt models into BI dashboards
- you are onboarding analysts who need to know what feeds what

## Not for this skill when
- nothing downstream of dbt exists yet, exposures document real consumers
- you need column-level lineage, exposures are model-level by design
- you are documenting the models themselves, use schema yaml for that

## Steps

1. Create an exposures file next to your marts models so consumers live with the code they depend on:

```shell
touch models/marts/exposures.yml
```

Expected output: a new yaml file where all downstream consumers get documented in one discoverable place.

2. Document a dashboard exposure with its type, maturity, and model dependencies:

```yaml
exposures:
  - name: executive_revenue_dashboard
    type: dashboard
    maturity: high
    url: https://bi.example.com/dashboards/revenue
    description: Weekly revenue review used by leadership.
    depends_on:
      - ref('fct_orders')
      - ref('dim_customers')
    owner:
      name: analytics_team
```

Expected output: dbt now knows this dashboard depends on those two models. The docs site renders it in the lineage graph automatically.

3. Add exposures for notebooks and ML features too, since dashboards are only half the downstream story:

```yaml
  - name: churn_model_features
    type: ml
    maturity: medium
    depends_on:
      - ref('fct_orders')
    owner:
      name: data_science_team
```

Expected output: the ML pipeline shows up as a consumer in lineage. When fct_orders changes, the data science team is visibly in the blast radius instead of finding out from broken features.

4. Verify the exposures compile and appear in the generated docs:

```shell
dbt parse && dbt docs generate
```

Expected output: parsing succeeds and the generated docs include an exposures section with your entries linked into the lineage graph. Serve the docs and click through to confirm.

5. Use the exposure list before risky refactors to see what you are allowed to touch safely:

```shell
dbt ls --select +exposure:executive_revenue_dashboard --output name
```

Expected output: every model upstream of that dashboard. Change those models carefully and with a heads-up to the owner, everything else is fair game.

## Variant phrasings

### dbt exposures yaml example
Steps 2 and 3 are the canonical shape. Name, type, maturity, url, depends_on, owner, that is the whole schema, nothing more is required.

### documenting bi dashboards in dbt
One exposure per dashboard, maturity set honestly. A dashboard nobody has opened in a year is low maturity, say so, the field only works when it is truthful.

### dbt lineage beyond the warehouse
Exposures are how the DAG keeps going after the last model. Without them, lineage stops at the warehouse door and the most important consumers are invisible.

## Why it happens
dbt knows your models but is blind to everything downstream: the BI tool, the notebook, the reverse ETL sync. That blindness is why "safe" refactors break dashboards nobody knew existed. Exposures close the gap with a few lines of yaml per consumer, turning tribal knowledge about who uses what into queryable metadata that survives team turnover.

## Edge cases
- Stale urls: dashboards get rebuilt and urls rot. Review exposures quarterly or they slowly become fiction.
- Maturity is a judgment call. Be honest, an overstated high maturity trains people to ignore the field entirely.
- Exposures do not affect runs. They are documentation only and never change what dbt builds.
- One exposure per consumer, not per chart. A dashboard with twenty charts is one exposure.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_Mefh24IV7MaVyehqz7Is_g
