Yang Xu
12/23/2025, 10:02 AMkapa.ai
12/23/2025, 10:02 AMkapa.ai
12/23/2025, 10:02 AMmeta on the source/table, not inside the freshness: block itself. Based on the docs, alert properties (including channel) are read from meta on models/sources/tests, with a defined priority order. [[Alert props](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] For a source table freshness alert, configure it like this: yml version: 2 sources: - name: staging_back_office_jl_es description: PayFit's Back Office JetLang variables data for Spain ingested by PayLoad project. schema: staging_back_office_jl_es database: "{{ env_var('SNOWFLAKE_RAW_DATABASE', 'RAW_PROD') }}" tables: - name: companies_jl_variables description: Back office's companies JL variables for Spain, refreshed each day at 0am UTC. meta: channel: data_ops_slack_channel # <- Elementary Slack channel for alerts freshness: warn_after: period: hour count: 24 - name: employees_jl_variables description: Back office's employees JL variables for Spain, refreshed each day at 0am UTC. meta: channel: data_ops_slack_channel freshness: warn_after: period: hour count: 24 A few important notes from the knowledge sources: - The channel key is part of meta and is how you define a custom Slack channel per resource. [[Alert props](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] - Elementary will still need a default Slack destination configured via the CLI/config (--slack-token + --slack-channel-name or webhook) for alerts to work at all. [[Slack setup](https://docs.elementary-data.com/oss/guides/alerts/send-slack-alerts); [Slack config](https://docs.elementary-data.com/oss/deployment-and-configuration/slack#page-title)] - There are known dbt quirks around meta precedence on sources (project-level vs source/table), so if you also configure meta for sources in dbt_project.yml, be aware that project-level may override table-level in some dbt versions. [[Source meta bug](https://elementary-community.slack.com/archives/C02CTC89LAX/p1680099515160789?thread_ts=1680099515.160789&cid=C02CTC89LAX)] If you share how you currently run Elementary (CLI command + Slack config), I can help you adjust that part as well.Yang Xu
12/23/2025, 10:04 AMYang Xu
12/23/2025, 10:04 AMkapa.ai
12/23/2025, 10:04 AMkapa.ai
12/23/2025, 10:05 AMmeta inheritance, not under config: in the source file. For sources, global meta is usually defined in dbt_project.yml, and then inherited by all matching tables. For example, to send all source-related alerts to the same Slack channel: yml # dbt_project.yml sources: staging_back_office_jl_es: +meta: alerts_config: channel: data_ops_slack_channel Then your source file can stay simple: yml version: 2 sources: - name: staging_back_office_jl_es schema: staging_back_office_jl_es database: "{{ env_var('SNOWFLAKE_RAW_DATABASE', 'RAW_PROD') }}" tables: - name: companies_jl_variables freshness: warn_after: period: hour count: 24 - name: employees_jl_variables freshness: warn_after: period: hour count: 24 Key points from the knowledge sources: - Alert properties like channel are read from meta.alerts_config on the resource (model/source/table/test). [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alerts-distribution)] - You can configure alert settings for sources in dbt_project.yml using sources: ... +meta: alerts_config: .... [[Source alerts config](https://elementary-community.slack.com/archives/C02CTC89LAX/p1680099515160789?thread_ts=1680099515.160789&cid=C02CTC89LAX)] - There is a known dbt-core bug where project-level meta on sources can override table-level meta unexpectedly, so if you also set meta in the source .yml, be aware of that precedence issue. [[dbt meta bug](https://github.com/elementary-data/elementary/issues/2007)] What you can’t do (per the docs and Slack threads) is put meta directly under a config: block at the bottom of the same source file and expect it to apply to all tables; global config for sources is handled via dbt_project.yml, not a config: section inside the source .yml.Yang Xu
12/23/2025, 10:15 AMkapa.ai
12/23/2025, 10:15 AMkapa.ai
12/23/2025, 10:15 AMmeta) 2. Elementary behavior (how it interprets meta for alerts) From the knowledge sources: - Elementary reads alert properties (including owner, subscribers, tags, channel, etc.) from meta on models/sources/tests, with a clear priority order. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] - The examples for models/tests show meta keys like owner, subscribers, description, tags, channel, alert_suppression_interval, slack_group_alerts_by, alert_fields all living side‑by‑side. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files); [Alerts distribution](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alerts-distribution)] - There are known quirks/bugs in dbt around how meta is applied for sources and for tests: - For sources, project‑level meta can override source/table‑level meta in unexpected ways. [[Source meta bug](https://github.com/elementary-data/elementary/issues/2007); [Slack thread](https://elementary-community.slack.com/archives/C02CTC89LAX/p1680099515160789?thread_ts=1680099515.160789&cid=C02CTC89LAX)] - For tests, Jinja in meta under a test is not parsed the same way as under a model, which is why support suggests moving channel config to the model/table level as a workaround. [[Jinja under test meta](https://elementary-community.slack.com/archives/C02CTC89LAX/p1674376762559239?thread_ts=1674376762.559239&cid=C02CTC89LAX)] The knowledge sources do not explicitly say that channel is treated differently from `owner`/`domain` inside meta on a source, nor do they document a restriction that would allow some keys (owner, domain) but not channel. On the contrary, they show channel as just another supported meta key for alerts. [[Alerts distribution](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alerts-distribution)] So, based on the docs and Slack threads: - Elementary intends to support channel in meta the same way as owner, tags, etc. - If `owner`/`domain` work for you in a given meta location but channel does not, that’s likely due to: - dbt’s handling/merging of meta for sources (project vs source vs table), or - how Elementary currently reads meta for source freshness specifically (vs models/tests), which is not fully documented in the provided sources. The knowledge sources do not contain enough detail to pinpoint exactly why channel is not being picked up in your specific placement while other keys are, beyond these known meta/precedence quirks. I can’t confidently say more without going beyond the docs and Slack threads you provided. Practical workaround from the sources Given these limitations, the patterns that are documented to work are: - Put alert‑related meta (including channel) at the model/table level, not nested under the test/freshness block. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] - For sources, prefer configuring shared meta in dbt_project.yml under sources: ... +meta: ..., being aware of the precedence bug. [[Source alerts config](https://elementary-community.slack.com/archives/C02CTC89LAX/p1680099515160789?thread_ts=1680099515.160789&cid=C02CTC89LAX)] If you can share the exact snippet where `owner`/`domain` work but channel doesn’t, that would help map it more directly to one of the documented dbt/Elementary quirks.Yang Xu
12/23/2025, 10:24 AMkapa.ai
12/23/2025, 10:24 AMkapa.ai
12/23/2025, 10:25 AMyml meta: channel: my_channel and: yml meta: some_argument: foo channel: my_channel As far as Elementary is concerned, channel is just one of several supported alert properties that can live directly under meta (alongside owner, subscribers, tags, etc.). [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] What does matter in the docs is: 1. Where meta is attached (model, source, table, test, or project-level in dbt_project.yml) and the precedence rules: - For models/sources: model config block → model properties → dbt_project.yml path config. - For tests: test properties → tests in dbt_project.yml → parent model config. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] 2. How dbt handles meta for sources/tests, which can cause overrides or unparsed Jinja, independent of which keys you put under meta. [[Source meta bug](https://github.com/elementary-data/elementary/issues/2007); [Jinja under test meta](https://elementary-community.slack.com/archives/C02CTC89LAX/p1674376762559239?thread_ts=1674376762.559239&cid=C02CTC89LAX)] The sources do not document any special rule like “`channel` only works if meta has no other arguments” or “`channel` behaves differently from owner when combined under meta.” So, based on the available docs: - Elementary expects channel to work the same way as other alert keys when placed directly under meta. - Any difference you’re seeing is more likely due to where that meta block is attached (and dbt’s precedence/bugs there), not whether channel is alone or alongside other keys under meta.Yang Xu
12/23/2025, 10:27 AMYang Xu
12/23/2025, 10:27 AMkapa.ai
12/23/2025, 10:27 AMkapa.ai
12/23/2025, 10:27 AMargument: key, and they only show meta attached directly to the dbt resource (model/source/test), not nested under another arbitrary key. All documented examples look like: yml models: - name: my_model_name config: meta: channel: data_ops or: yml models: - name: my_model_name meta: channel: data_ops and for tests: yml data_tests: - not_null: config: meta: description: "This is the test description" with channel listed as one of the supported keys directly under meta. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files); [Alerts distribution](https://docs.elementary-data.com/cloud/guides/alerts-configuration#alerts-distribution)] There is no example or explanation of a structure like: yml argument: meta: channel: ... So, based on the docs: - meta: channel: ... should be attached directly to the resource (or under config: for models/tests, or via +meta: in dbt_project.yml). - An extra wrapper key like argument: is not documented and may simply not be read by dbt/Elementary at all. Because argument: is not described anywhere in the provided sources, I can’t say it has any supported effect for Elementary alerts.Yang Xu
12/23/2025, 11:06 AMkapa.ai
12/23/2025, 11:06 AMkapa.ai
12/23/2025, 11:06 AMconfig: blocks on sources: in detail, so I can’t say with full certainty how dbt will treat that exact pattern. However, based on what is documented about how Elementary reads alert configuration from meta, the channel you set under meta at the bottom will apply to all alerts for that source, not just the freshness test. Elementary looks for alert properties (including channel) on the resource’s meta, and the more specific level overrides the less specific one. For models/sources, it prioritizes: 1. Model (or source/table) config block 2. Model (or source/table) properties 3. Path configuration in dbt_project.yml [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] And for tests, it prioritizes: 1. Test properties 2. Tests path config in dbt_project.yml 3. Parent model configuration [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] Because your meta.channel is defined once at the source level: yml sources: - name: staging_zuora ... config: freshness: ... meta: channel: data-bugs Elementary will see channel: data-bugs as the default channel for all alerts under that source (freshness + all elementary.volume_anomalies tests), unless you override channel more specifically on a particular test or table. So in practice, with the config you showed, data-bugs will be used for: - The source freshness alert on staging_zuora - All elementary.volume_anomalies tests defined under its tables If you want a different channel for some tests, you’d need to set meta.channel at the test (or table) level for those specific tests, which will override the source-level setting. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)]Yang Xu
12/23/2025, 11:10 AMkapa.ai
12/23/2025, 11:10 AMkapa.ai
12/23/2025, 11:10 AMconfig: blocks on sources: in this exact shape, so I can’t be 100% certain how dbt will interpret that snippet. However, based on how Elementary reads alert configuration from meta, the meta.channel you set in that config block is **not scoped to a single table**; it’s attached to the source (staging_facebook_ads_gb, staging_facebook_ads_fr, etc.), and will apply to all alerts under that source unless overridden more specifically. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] In your example: yml sources: - name: staging_facebook_ads_gb ... tables: - name: ads_insights ... config: freshness: warn_after: period: hour count: 24 meta: channel: data-bugs That config block is at the source level, not under the tables: entry. So: - The freshness config there is a source-level freshness (for that source). - The meta.channel: data-bugs is a source-level alert config. - Any Elementary alerts for that source (e.g., source freshness, and any tests defined under its tables) will inherit channel: data-bugs, unless you define a more specific meta.channel on a particular table or test, which would override it. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] So, to your question: > will the test be applied only to the table ads_insights or to all tables? Given the position of the config block, it is not scoped only to that single ads_insights table; it is scoped to the whole staging_facebook_ads_gb source. Any additional tables you add under that same source would also inherit that source-level freshness and meta.channel, unless you override them at the table/test level.Yang Xu
12/23/2025, 11:27 AMkapa.ai
12/23/2025, 11:28 AMkapa.ai
12/23/2025, 11:28 AMmeta (e.g. meta.channel or meta.alerts_config.channel), and they do not describe any way to choose a different channel based on whether the outcome is warn vs error for the same test or freshness check. [[Alert properties](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#alert-properties-in-yml-files)] Multiple Slack threads explicitly say that routing warnings and errors to different channels requires separate edr monitor runs with filters, not configuration inside the test itself: - Use selectors like statuses:warn and statuses:error with different --slack-channel-name values. [[Statuses select](https://elementary-community.slack.com/archives/C02CTC89LAX/p1700589524214199?thread_ts=1700589524.214199&cid=C02CTC89LAX); [Severity workaround](https://elementary-community.slack.com/archives/C02CTC89LAX/p1687388986079909?thread_ts=1687388986.079909&cid=C02CTC89LAX)] Example pattern from the sources: bash edr monitor --slack-channel-name warn-channel --select 'statuses:warn' edr monitor --slack-channel-name error-channel --select 'statuses:fail' So, for your staging_jira source freshness: yml sources: - name: staging_jira ... tables: - name: full_refresh_issues ... config: freshness: warn_after: ... error_after: ... meta: channel: data-bugs - You can set one meta.channel (or meta.alerts_config.channel) for that freshness alert. - You cannot configure “warns go to channel A, errors go to channel B” for that same freshness test purely in YAML; the documented way is to split by status in edr monitor runs.Yang Xu
12/23/2025, 11:31 AMedr monitor like this :
edr monitor --slack-channel-name warn-channel --select 'statuses:warn'
edr monitor --slack-channel-name error-channel --select 'statuses:fail'
it will override the channels that i defined in the yml file?kapa.ai
12/23/2025, 11:31 AMkapa.ai
12/23/2025, 11:32 AM--slack-channel-name is the default channel, used only when no custom channel is defined in meta for that alert. [[Send Slack alerts](https://docs.elementary-data.com/oss/guides/alerts/send-slack-alerts#execute-the-cli); [Custom channel explainer](https://elementary-community.slack.com/archives/C02CTC89LAX/p1693810648674049?thread_ts=1693810648.674049&cid=C02CTC89LAX)] - Custom channels defined in YAML (e.g. meta.channel / meta.alerts_config.channel) take precedence over the CLI default. [[Alerts configuration](https://docs.elementary-data.com/oss/guides/alerts/alerts-configuration#custom-channel); [Precedence order](https://elementary-community.slack.com/archives/C02CTC89LAX/p1681400928815089?thread_ts=1681400928.815089&cid=C02CTC89LAX)] So in your scenario: - If a test/freshness has a channel set in YAML, that alert will still go to the YAML‑defined channel, even when you run: bash edr monitor --slack-channel-name warn-channel --select 'statuses:warn' edr monitor --slack-channel-name error-channel --select 'statuses:fail' - Those two edr monitor commands only control alerts that don’t already have a custom channel in their meta. If you want the CLI channels to be used, you’d need to remove the channel from YAML for those tests, or use selectors so that the runs only pick up tests without a custom channel.Yang Xu
12/23/2025, 1:21 PMkapa.ai
12/23/2025, 1:21 PMkapa.ai
12/23/2025, 1:21 PMfreshness block on that table. The table‑level config will take precedence over the source‑level config. [[dbt sources table freshness](https://docs.elementary-data.com/data-tests/dbt/package-models#dbt-sources)] In your case: yml version: 2 sources: - name: staging_payments description: > It contains data related to the new Payments v2 API. database: "{{ env_var('SNOWFLAKE_RAW_DATABASE', 'RAW_PROD') }}" tables: - name: payment description: '{{ doc("src_payments__payment") }}' - name: salary_payment_information description: '{{ doc("src_payments__salary_payment_information") }}' freshness: warn_after: period: hour count: 72 # 72 hours for this table only - name: transaction description: '{{ doc("src_payments__transaction") }}' config: freshness: warn_after: period: hour count: 24 # default 24 hours for other tables meta: channel: data-bugs - payment and transaction will use the source‑level warn_after: 24 hours. - salary_payment_information will use its own warn_after: 72 hours.Yang Xu
12/24/2025, 9:08 AMkapa.ai
12/24/2025, 9:08 AMkapa.ai
12/24/2025, 9:08 AMmeta.channel / alert config, or the default CLI channel).