---
title: "dbt marts that read raw sources directly | Metacenta"
description: "A dbt mart or intermediate model that reads a raw source skips staging. Two models can then disagree about one raw column. How to add the missing layer."
url: "https://metacenta.com/rules/downstream-depends-on-source"
updated: "2026-10-14"
tokens: 658
---

Modelling correctness · rule downstream-depends-on-source

# dbt marts that read raw sources directly

A Metacenta review checks this under the rule **Sources are read through staging, not directly by marts**. Everything below applies whether or not you ever commission one.

## What this rule checks

This rule flags intermediate and marts models that read a `source()` directly, with no staging model between. A mart doing this is medium severity; an intermediate model is low. If no model's path places it in a layer, the rule declines.

## Why it matters

The renaming and casting that staging does once has either not happened or is repeated here. Two models can then disagree about the same raw column. A mart is rated higher because stakeholders read it directly.

## How to fix it

**Keep reporting tables off raw data.** Add a staging model over each source, and point the model at it with `ref()`.

Before:

```sql
-- models/marts/fct_orders.sql
select id as order_id, amount / 100.0 as amount
from {{ source('shop', 'orders') }}
```

After:

```sql
-- models/marts/fct_orders.sql
select order_id, amount
from {{ ref('stg_shop__orders') }}
```

## When it is fine to leave

A source already clean at the point of load, with the column names and types you want, gains little from a staging model that only selects it. Say so in the source's description, and stage it when that changes.

## What we need to check it

`manifest.json` alone. Layers come from folder names in each model's path. A project with no sources, or no intermediate or marts models, is not judged here.

## Published rules it corresponds to

**[dbt_project_evaluator](https://dbt-labs.github.io/dbt-project-evaluator/)**, rule `fct_marts_or_intermediate_dependent_on_source`. 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-downstream-depends-on-source&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)
