---
title: "dbt staging models that read marts | Metacenta"
description: "A dbt staging model that reads an intermediate or mart model sends data backwards through the project. Why it happens, and how to fix the edge."
url: "https://metacenta.com/rules/staging-depends-on-downstream"
updated: "2026-10-14"
tokens: 658
---

Modelling correctness · rule staging-depends-on-downstream

# dbt staging models that read marts

A Metacenta review checks this under the rule **Staging models do not read transformed models**. Everything below applies whether or not you ever commission one.

## What this rule checks

This rule flags staging models that read a model from the intermediate or marts layer. We place models in layers by the folders in their path. If no model's path places it in a layer, the rule declines.

## Why it matters

Data flows backwards through the project, so the DAG no longer matches the layering the folders claim. A reader who trusts the folders will get the build order wrong.

## How to fix it

**Keep the first cleaning step off transformed data.** Move the model into the layer its dependencies put it in, or break the backwards edge so it reads only its source.

Before:

```sql
-- models/staging/shop/stg_shop__refunds.sql
select r.*, o.customer_id
from {{ source('shop', 'refunds') }} as r
join {{ ref('fct_orders') }} as o using (order_id)
```

After:

```sql
-- models/marts/fct_refunds.sql
select r.*, o.customer_id
from {{ ref('stg_shop__refunds') }} as r
join {{ ref('fct_orders') }} as o using (order_id)
```

## When it is fine to leave

Rarely. It's usually a model in the wrong folder, and moving it's the fix. The one fair case is a short window while a file is mid-move to its correct directory.

## What we need to check it

`manifest.json` alone. Layers come from folder names in each model's path, so a model filed in the wrong folder is judged by where it sits.

## Published rules it corresponds to

**[dbt_project_evaluator](https://dbt-labs.github.io/dbt-project-evaluator/)**, rule `fct_staging_dependent_on_marts_or_intermediate`. Ours checks the same condition and threshold.

This means our check corresponds to their rule. It does not mean the publisher reviewed or endorses it.

[Ask about a review](https://metacenta.com/enquire?src=rule-staging-depends-on-downstream&via=md)

## Related pages

- [dbt incremental models: how unique_key works](https://metacenta.com/rules/incremental-without-unique-key)
- [dbt public models with no enforced contract](https://metacenta.com/rules/public-model-without-contract)
- [dbt sources declared twice for one table](https://metacenta.com/rules/duplicate-source)
- [dbt staging models: how to set up the staging layer](https://metacenta.com/rules/staging-depends-on-staging)
- [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)
