Business-friendly semantic layer sitting between the raw data warehouse and the user-facing analytics tool -- exposing entities in plain language (Customers, Orders, Products, Campaigns, Support Tickets) rather than technical table names (dim_customer, fct_orders, stg_hubspot_contacts). Built on dbt Semantic Layer (MetricFlow) for warehouses that support it (BigQuery, Snowflake, Redshift, DuckDB), or as a Metabase-native data model (Metabase's Table Metadata configuration with field display names, types, and relationships), or as a Power BI semantic model (PBIX model with DAX measures and relationships defined). Metric pre-calculation: Total Revenue, Monthly Recurring Revenue, Customer Lifetime Value, Average Order Value, Net Promoter Score, and all department-specific metrics defined as named measures with their exact formula documented -- users click "Total Revenue" and get the correct number, not a raw column that requires them to know to exclude refunds, apply the correct currency conversion, and handle the multi-line order case correctly. Join path enforcement: in Metabase, table relationships are defined with cardinality (many-to-one from orders to customers) and the tool restricts joins to valid relationship paths; in Power BI, the data model relationship diagram controls which tables can be cross-filtered; users cannot accidentally fan-out a join and multiply rows. Field documentation: every field has a description ("Revenue: net of refunds, includes all product lines, converted to GBP at the daily exchange rate at the transaction date"), a type (metric, dimension, date, identifier), and a sensitivity classification (PII fields visually marked and access-restricted). Model tested with dbt tests (not_null, unique, relationships) run before the model is promoted to the production schema that the analytics tool connects to.