[{"data":1,"prerenderedAt":3654},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Fdata\u002Fdbt-bigquery-stack-marketing-data-moderne":13},{"i18nKey":4,"paths":5},"data-002-2026-07",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fdbt-bigquery-moderner-marketing-data-stack","\u002Fen\u002Fdata\u002Fdbt-bigquery-modern-marketing-data-stack","\u002Fes\u002Fdata\u002Fdbt-bigquery-modern-pila-datos-marketing","\u002Ffr\u002Fdata\u002Fdbt-bigquery-stack-marketing-data-moderne","\u002Fit\u002Fdata\u002Fdbt-bigquery-modern-stack-marketing-data","\u002Fru\u002Fdata\u002Fdbt-bigquery-modern-marketing-data-stack","\u002Ftr\u002Fdata\u002Fdbt-bigquery-ile-modern-pazarlama-data-stack",{"_path":9,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":3648,"_id":3649,"_source":3650,"_file":3651,"_stem":3652,"_extension":3653},"data",false,"","dbt + BigQuery : La Stack de Data Marketing Moderne","Source mapping, modeling layer, semantic layer, exposures : une architecture à quatre couches qui relie les données marketing au mécanisme de décision.","2026-07-17",[21,22,23,24,25],"dbt","bigquery","data-modeling","semantic-layer","marketing-analytics",9,"Roibase",{"type":29,"children":30,"toc":3640},"root",[31,39,46,98,573,609,636,642,690,1163,1203,1248,1707,1741,1830,1836,1871,2248,2284,2348,2354,2366,2750,2783,2825,2831,2843,3330,3351,3364,3564,3569,3575,3609,3629,3634],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Le rapport Google Analytics 4 vous montre la performance par canal, Klaviyo enregistre le nombre d'e-mails envoyés à chaque prospect, le tableau de bord Meta Ads affiche le CPA — mais ces trois chiffres peuvent-ils figurer dans une même requête SQL ? S'ils ne le peuvent pas, le mécanisme de décision repose sur des hypothèses. La promesse de la stack dbt + BigQuery est unique : en modelant les données marketing à travers quatre couches — de la source à l'exposition — on transforme la question « quel canal, quel client, quelle valeur créée » en un pipeline SQL reproductible. À mesure que l'ère post-cookies s'installe, que l'attribution multi-touch et l'incrementalité deviennent obligatoires, cette architecture cesse d'être optionnelle pour les agences boutiques : elle devient incontournable.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"source-mapping-organiser-les-flux-de-données-brutes-en-groupes-de-tables",[44],{"type":37,"value":45},"Source mapping : organiser les flux de données brutes en groupes de tables",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66,67,73,74,80,82,88,90,96],{"type":37,"value":50},"Dans BigQuery, chaque plateforme crée son propre dataset : ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"ga4_export",{"type":37,"value":59},", ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"facebook_ads",{"type":37,"value":59},{"type":32,"tag":52,"props":68,"children":70},{"className":69},[],[71],{"type":37,"value":72},"klaviyo_events",{"type":37,"value":59},{"type":32,"tag":52,"props":75,"children":77},{"className":76},[],[78],{"type":37,"value":79},"shopify_orders",{"type":37,"value":81},". Leurs schémas bruts sont incompatibles — GA4 retourne du JSON imbriqué, l'API Facebook du CSV plat, les webhooks Klaviyo aucune normalisation. Le ",{"type":32,"tag":83,"props":84,"children":85},"em",{},[86],{"type":37,"value":87},"source mapping",{"type":37,"value":89}," de dbt est la première couche : on écrit un manifeste YAML au-dessus de ce chaos, on enregistre chaque table dans un bloc ",{"type":32,"tag":52,"props":91,"children":93},{"className":92},[],[94],{"type":37,"value":95},"sources",{"type":37,"value":97}," et on déclare les types de données, leur fraîcheur, leur fréquence de chargement.",{"type":32,"tag":99,"props":100,"children":104},"pre",{"className":101,"code":102,"language":103,"meta":16,"style":16},"language-yaml shiki shiki-themes github-dark","# models\u002Fsources\u002Fmarketing_sources.yml\nversion: 2\n\nsources:\n  - name: ga4_export\n    database: roibase-analytics\n    schema: analytics_123456789\n    tables:\n      - name: events_*\n        identifier: 'events_*'\n        meta:\n          contains_pii: true\n        freshness:\n          warn_after: {count: 25, period: hour}\n          error_after: {count: 49, period: hour}\n\n  - name: facebook_ads\n    schema: facebook_raw\n    tables:\n      - name: ads_insights\n        loaded_at_field: date_start\n        freshness:\n          warn_after: {count: 2, period: day}\n","yaml",[105],{"type":32,"tag":52,"props":106,"children":107},{"__ignoreMap":16},[108,120,142,152,165,189,207,225,238,259,277,290,308,321,372,418,426,447,464,476,497,515,527],{"type":32,"tag":109,"props":110,"children":113},"span",{"class":111,"line":112},"line",1,[114],{"type":32,"tag":109,"props":115,"children":117},{"style":116},"--shiki-default:#6A737D",[118],{"type":37,"value":119},"# models\u002Fsources\u002Fmarketing_sources.yml\n",{"type":32,"tag":109,"props":121,"children":123},{"class":111,"line":122},2,[124,130,136],{"type":32,"tag":109,"props":125,"children":127},{"style":126},"--shiki-default:#85E89D",[128],{"type":37,"value":129},"version",{"type":32,"tag":109,"props":131,"children":133},{"style":132},"--shiki-default:#E1E4E8",[134],{"type":37,"value":135},": ",{"type":32,"tag":109,"props":137,"children":139},{"style":138},"--shiki-default:#79B8FF",[140],{"type":37,"value":141},"2\n",{"type":32,"tag":109,"props":143,"children":145},{"class":111,"line":144},3,[146],{"type":32,"tag":109,"props":147,"children":149},{"emptyLinePlaceholder":148},true,[150],{"type":37,"value":151},"\n",{"type":32,"tag":109,"props":153,"children":155},{"class":111,"line":154},4,[156,160],{"type":32,"tag":109,"props":157,"children":158},{"style":126},[159],{"type":37,"value":95},{"type":32,"tag":109,"props":161,"children":162},{"style":132},[163],{"type":37,"value":164},":\n",{"type":32,"tag":109,"props":166,"children":168},{"class":111,"line":167},5,[169,174,179,183],{"type":32,"tag":109,"props":170,"children":171},{"style":132},[172],{"type":37,"value":173},"  - ",{"type":32,"tag":109,"props":175,"children":176},{"style":126},[177],{"type":37,"value":178},"name",{"type":32,"tag":109,"props":180,"children":181},{"style":132},[182],{"type":37,"value":135},{"type":32,"tag":109,"props":184,"children":186},{"style":185},"--shiki-default:#9ECBFF",[187],{"type":37,"value":188},"ga4_export\n",{"type":32,"tag":109,"props":190,"children":192},{"class":111,"line":191},6,[193,198,202],{"type":32,"tag":109,"props":194,"children":195},{"style":126},[196],{"type":37,"value":197},"    database",{"type":32,"tag":109,"props":199,"children":200},{"style":132},[201],{"type":37,"value":135},{"type":32,"tag":109,"props":203,"children":204},{"style":185},[205],{"type":37,"value":206},"roibase-analytics\n",{"type":32,"tag":109,"props":208,"children":210},{"class":111,"line":209},7,[211,216,220],{"type":32,"tag":109,"props":212,"children":213},{"style":126},[214],{"type":37,"value":215},"    schema",{"type":32,"tag":109,"props":217,"children":218},{"style":132},[219],{"type":37,"value":135},{"type":32,"tag":109,"props":221,"children":222},{"style":185},[223],{"type":37,"value":224},"analytics_123456789\n",{"type":32,"tag":109,"props":226,"children":228},{"class":111,"line":227},8,[229,234],{"type":32,"tag":109,"props":230,"children":231},{"style":126},[232],{"type":37,"value":233},"    tables",{"type":32,"tag":109,"props":235,"children":236},{"style":132},[237],{"type":37,"value":164},{"type":32,"tag":109,"props":239,"children":240},{"class":111,"line":26},[241,246,250,254],{"type":32,"tag":109,"props":242,"children":243},{"style":132},[244],{"type":37,"value":245},"      - ",{"type":32,"tag":109,"props":247,"children":248},{"style":126},[249],{"type":37,"value":178},{"type":32,"tag":109,"props":251,"children":252},{"style":132},[253],{"type":37,"value":135},{"type":32,"tag":109,"props":255,"children":256},{"style":185},[257],{"type":37,"value":258},"events_*\n",{"type":32,"tag":109,"props":260,"children":262},{"class":111,"line":261},10,[263,268,272],{"type":32,"tag":109,"props":264,"children":265},{"style":126},[266],{"type":37,"value":267},"        identifier",{"type":32,"tag":109,"props":269,"children":270},{"style":132},[271],{"type":37,"value":135},{"type":32,"tag":109,"props":273,"children":274},{"style":185},[275],{"type":37,"value":276},"'events_*'\n",{"type":32,"tag":109,"props":278,"children":280},{"class":111,"line":279},11,[281,286],{"type":32,"tag":109,"props":282,"children":283},{"style":126},[284],{"type":37,"value":285},"        meta",{"type":32,"tag":109,"props":287,"children":288},{"style":132},[289],{"type":37,"value":164},{"type":32,"tag":109,"props":291,"children":293},{"class":111,"line":292},12,[294,299,303],{"type":32,"tag":109,"props":295,"children":296},{"style":126},[297],{"type":37,"value":298},"          contains_pii",{"type":32,"tag":109,"props":300,"children":301},{"style":132},[302],{"type":37,"value":135},{"type":32,"tag":109,"props":304,"children":305},{"style":138},[306],{"type":37,"value":307},"true\n",{"type":32,"tag":109,"props":309,"children":311},{"class":111,"line":310},13,[312,317],{"type":32,"tag":109,"props":313,"children":314},{"style":126},[315],{"type":37,"value":316},"        freshness",{"type":32,"tag":109,"props":318,"children":319},{"style":132},[320],{"type":37,"value":164},{"type":32,"tag":109,"props":322,"children":324},{"class":111,"line":323},14,[325,330,335,340,344,349,353,358,362,367],{"type":32,"tag":109,"props":326,"children":327},{"style":126},[328],{"type":37,"value":329},"          warn_after",{"type":32,"tag":109,"props":331,"children":332},{"style":132},[333],{"type":37,"value":334},": {",{"type":32,"tag":109,"props":336,"children":337},{"style":126},[338],{"type":37,"value":339},"count",{"type":32,"tag":109,"props":341,"children":342},{"style":132},[343],{"type":37,"value":135},{"type":32,"tag":109,"props":345,"children":346},{"style":138},[347],{"type":37,"value":348},"25",{"type":32,"tag":109,"props":350,"children":351},{"style":132},[352],{"type":37,"value":59},{"type":32,"tag":109,"props":354,"children":355},{"style":126},[356],{"type":37,"value":357},"period",{"type":32,"tag":109,"props":359,"children":360},{"style":132},[361],{"type":37,"value":135},{"type":32,"tag":109,"props":363,"children":364},{"style":185},[365],{"type":37,"value":366},"hour",{"type":32,"tag":109,"props":368,"children":369},{"style":132},[370],{"type":37,"value":371},"}\n",{"type":32,"tag":109,"props":373,"children":375},{"class":111,"line":374},15,[376,381,385,389,393,398,402,406,410,414],{"type":32,"tag":109,"props":377,"children":378},{"style":126},[379],{"type":37,"value":380},"          error_after",{"type":32,"tag":109,"props":382,"children":383},{"style":132},[384],{"type":37,"value":334},{"type":32,"tag":109,"props":386,"children":387},{"style":126},[388],{"type":37,"value":339},{"type":32,"tag":109,"props":390,"children":391},{"style":132},[392],{"type":37,"value":135},{"type":32,"tag":109,"props":394,"children":395},{"style":138},[396],{"type":37,"value":397},"49",{"type":32,"tag":109,"props":399,"children":400},{"style":132},[401],{"type":37,"value":59},{"type":32,"tag":109,"props":403,"children":404},{"style":126},[405],{"type":37,"value":357},{"type":32,"tag":109,"props":407,"children":408},{"style":132},[409],{"type":37,"value":135},{"type":32,"tag":109,"props":411,"children":412},{"style":185},[413],{"type":37,"value":366},{"type":32,"tag":109,"props":415,"children":416},{"style":132},[417],{"type":37,"value":371},{"type":32,"tag":109,"props":419,"children":421},{"class":111,"line":420},16,[422],{"type":32,"tag":109,"props":423,"children":424},{"emptyLinePlaceholder":148},[425],{"type":37,"value":151},{"type":32,"tag":109,"props":427,"children":429},{"class":111,"line":428},17,[430,434,438,442],{"type":32,"tag":109,"props":431,"children":432},{"style":132},[433],{"type":37,"value":173},{"type":32,"tag":109,"props":435,"children":436},{"style":126},[437],{"type":37,"value":178},{"type":32,"tag":109,"props":439,"children":440},{"style":132},[441],{"type":37,"value":135},{"type":32,"tag":109,"props":443,"children":444},{"style":185},[445],{"type":37,"value":446},"facebook_ads\n",{"type":32,"tag":109,"props":448,"children":450},{"class":111,"line":449},18,[451,455,459],{"type":32,"tag":109,"props":452,"children":453},{"style":126},[454],{"type":37,"value":215},{"type":32,"tag":109,"props":456,"children":457},{"style":132},[458],{"type":37,"value":135},{"type":32,"tag":109,"props":460,"children":461},{"style":185},[462],{"type":37,"value":463},"facebook_raw\n",{"type":32,"tag":109,"props":465,"children":467},{"class":111,"line":466},19,[468,472],{"type":32,"tag":109,"props":469,"children":470},{"style":126},[471],{"type":37,"value":233},{"type":32,"tag":109,"props":473,"children":474},{"style":132},[475],{"type":37,"value":164},{"type":32,"tag":109,"props":477,"children":479},{"class":111,"line":478},20,[480,484,488,492],{"type":32,"tag":109,"props":481,"children":482},{"style":132},[483],{"type":37,"value":245},{"type":32,"tag":109,"props":485,"children":486},{"style":126},[487],{"type":37,"value":178},{"type":32,"tag":109,"props":489,"children":490},{"style":132},[491],{"type":37,"value":135},{"type":32,"tag":109,"props":493,"children":494},{"style":185},[495],{"type":37,"value":496},"ads_insights\n",{"type":32,"tag":109,"props":498,"children":500},{"class":111,"line":499},21,[501,506,510],{"type":32,"tag":109,"props":502,"children":503},{"style":126},[504],{"type":37,"value":505},"        loaded_at_field",{"type":32,"tag":109,"props":507,"children":508},{"style":132},[509],{"type":37,"value":135},{"type":32,"tag":109,"props":511,"children":512},{"style":185},[513],{"type":37,"value":514},"date_start\n",{"type":32,"tag":109,"props":516,"children":518},{"class":111,"line":517},22,[519,523],{"type":32,"tag":109,"props":520,"children":521},{"style":126},[522],{"type":37,"value":316},{"type":32,"tag":109,"props":524,"children":525},{"style":132},[526],{"type":37,"value":164},{"type":32,"tag":109,"props":528,"children":530},{"class":111,"line":529},23,[531,535,539,543,547,552,556,560,564,569],{"type":32,"tag":109,"props":532,"children":533},{"style":126},[534],{"type":37,"value":329},{"type":32,"tag":109,"props":536,"children":537},{"style":132},[538],{"type":37,"value":334},{"type":32,"tag":109,"props":540,"children":541},{"style":126},[542],{"type":37,"value":339},{"type":32,"tag":109,"props":544,"children":545},{"style":132},[546],{"type":37,"value":135},{"type":32,"tag":109,"props":548,"children":549},{"style":138},[550],{"type":37,"value":551},"2",{"type":32,"tag":109,"props":553,"children":554},{"style":132},[555],{"type":37,"value":59},{"type":32,"tag":109,"props":557,"children":558},{"style":126},[559],{"type":37,"value":357},{"type":32,"tag":109,"props":561,"children":562},{"style":132},[563],{"type":37,"value":135},{"type":32,"tag":109,"props":565,"children":566},{"style":185},[567],{"type":37,"value":568},"day",{"type":32,"tag":109,"props":570,"children":571},{"style":132},[572],{"type":37,"value":371},{"type":32,"tag":33,"props":574,"children":575},{},[576,578,583,585,591,593,599,601,607],{"type":37,"value":577},"Ce manifeste offre à dbt deux choses : 1) une référence ",{"type":32,"tag":83,"props":579,"children":580},{},[581],{"type":37,"value":582},"type-safe",{"type":37,"value":584}," à la table brute via la macro ",{"type":32,"tag":52,"props":586,"children":588},{"className":587},[],[589],{"type":37,"value":590},"source()",{"type":37,"value":592}," au lieu de ",{"type":32,"tag":52,"props":594,"children":596},{"className":595},[],[597],{"type":37,"value":598},"ref()",{"type":37,"value":600},", 2) la capacité à détecter où s'arrête le pipeline grâce à la commande ",{"type":32,"tag":52,"props":602,"children":604},{"className":603},[],[605],{"type":37,"value":606},"dbt source freshness",{"type":37,"value":608},". Si un événement GA4 n'a pas été mis à jour pendant 49 heures, BigQuery ne s'en plaint pas — dbt, si.",{"type":32,"tag":33,"props":610,"children":611},{},[612,614,618,620,626,628,634],{"type":37,"value":613},"Pendant le ",{"type":32,"tag":83,"props":615,"children":616},{},[617],{"type":37,"value":87},{"type":37,"value":619},", l'annotation PII est obligatoire : au titre du RGPD et de la LCEN, il faut déclarer quelles colonnes contiennent l'identité de l'utilisateur, son e-mail, son IP. Cette information se propage dans la lignée des modèles. Chaque table contenant ",{"type":32,"tag":52,"props":621,"children":623},{"className":622},[],[624],{"type":37,"value":625},"user_pseudo_id",{"type":37,"value":627}," reçoit le tag ",{"type":32,"tag":52,"props":629,"children":631},{"className":630},[],[632],{"type":37,"value":633},"meta.contains_pii: true",{"type":37,"value":635},". On combine ce tag avec les règles de masquage au niveau des champs dans la couche sémantique.",{"type":32,"tag":40,"props":637,"children":639},{"id":638},"modeling-layer-les-phases-staging-intermediate-mart",[640],{"type":37,"value":641},"Modeling layer : les phases staging → intermediate → mart",{"type":32,"tag":33,"props":643,"children":644},{},[645,647,652,654,660,662,668,669,675,676,682,684,688],{"type":37,"value":646},"Les modèles de ",{"type":32,"tag":83,"props":648,"children":649},{},[650],{"type":37,"value":651},"staging",{"type":37,"value":653}," renomment la source brute, convertissent les types, suppriment les colonnes inutiles et offrent un schéma standard en aval. Convertir le tableau ",{"type":32,"tag":52,"props":655,"children":657},{"className":656},[],[658],{"type":37,"value":659},"event_params",{"type":37,"value":661}," de GA4 en colonnes scalaires — ",{"type":32,"tag":52,"props":663,"children":665},{"className":664},[],[666],{"type":37,"value":667},"page_location",{"type":37,"value":59},{"type":32,"tag":52,"props":670,"children":672},{"className":671},[],[673],{"type":37,"value":674},"session_id",{"type":37,"value":59},{"type":32,"tag":52,"props":677,"children":679},{"className":678},[],[680],{"type":37,"value":681},"transaction_id",{"type":37,"value":683}," — c'est le travail du ",{"type":32,"tag":83,"props":685,"children":686},{},[687],{"type":37,"value":651},{"type":37,"value":689}," :",{"type":32,"tag":99,"props":691,"children":695},{"className":692,"code":693,"language":694,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","-- models\u002Fstaging\u002Fga4\u002Fstg_ga4__events.sql\nwith source as (\n    select * from {{ source('ga4_export', 'events_*') }}\n    where _table_suffix between format_date('%Y%m%d', date_sub(current_date(), interval 90 day))\n                             and format_date('%Y%m%d', current_date())\n),\n\nunnested as (\n    select\n        event_date,\n        event_timestamp,\n        user_pseudo_id,\n        (select value.string_value from unnest(event_params) where key = 'page_location') as page_location,\n        (select value.int_value from unnest(event_params) where key = 'ga_session_id') as session_id,\n        ecommerce.transaction_id,\n        ecommerce.purchase_revenue_in_usd\n    from source\n    where event_name in ('page_view', 'purchase')\n)\n\nselect * from unnested\n","sql",[696],{"type":32,"tag":52,"props":697,"children":698},{"__ignoreMap":16},[699,707,731,773,821,842,850,857,873,881,889,897,905,976,1038,1059,1075,1088,1129,1136,1143],{"type":32,"tag":109,"props":700,"children":701},{"class":111,"line":112},[702],{"type":32,"tag":109,"props":703,"children":704},{"style":116},[705],{"type":37,"value":706},"-- models\u002Fstaging\u002Fga4\u002Fstg_ga4__events.sql\n",{"type":32,"tag":109,"props":708,"children":709},{"class":111,"line":122},[710,716,721,726],{"type":32,"tag":109,"props":711,"children":713},{"style":712},"--shiki-default:#F97583",[714],{"type":37,"value":715},"with",{"type":32,"tag":109,"props":717,"children":718},{"style":132},[719],{"type":37,"value":720}," source ",{"type":32,"tag":109,"props":722,"children":723},{"style":712},[724],{"type":37,"value":725},"as",{"type":32,"tag":109,"props":727,"children":728},{"style":132},[729],{"type":37,"value":730}," (\n",{"type":32,"tag":109,"props":732,"children":733},{"class":111,"line":144},[734,739,744,749,754,759,763,768],{"type":32,"tag":109,"props":735,"children":736},{"style":712},[737],{"type":37,"value":738},"    select",{"type":32,"tag":109,"props":740,"children":741},{"style":712},[742],{"type":37,"value":743}," *",{"type":32,"tag":109,"props":745,"children":746},{"style":712},[747],{"type":37,"value":748}," from",{"type":32,"tag":109,"props":750,"children":751},{"style":132},[752],{"type":37,"value":753}," {{ source(",{"type":32,"tag":109,"props":755,"children":756},{"style":185},[757],{"type":37,"value":758},"'ga4_export'",{"type":32,"tag":109,"props":760,"children":761},{"style":132},[762],{"type":37,"value":59},{"type":32,"tag":109,"props":764,"children":765},{"style":185},[766],{"type":37,"value":767},"'events_*'",{"type":32,"tag":109,"props":769,"children":770},{"style":132},[771],{"type":37,"value":772},") }}\n",{"type":32,"tag":109,"props":774,"children":775},{"class":111,"line":154},[776,781,786,791,796,801,806,811,816],{"type":32,"tag":109,"props":777,"children":778},{"style":712},[779],{"type":37,"value":780},"    where",{"type":32,"tag":109,"props":782,"children":783},{"style":132},[784],{"type":37,"value":785}," _table_suffix ",{"type":32,"tag":109,"props":787,"children":788},{"style":712},[789],{"type":37,"value":790},"between",{"type":32,"tag":109,"props":792,"children":793},{"style":132},[794],{"type":37,"value":795}," format_date(",{"type":32,"tag":109,"props":797,"children":798},{"style":185},[799],{"type":37,"value":800},"'%Y%m%d'",{"type":32,"tag":109,"props":802,"children":803},{"style":132},[804],{"type":37,"value":805},", date_sub(current_date(), interval ",{"type":32,"tag":109,"props":807,"children":808},{"style":138},[809],{"type":37,"value":810},"90",{"type":32,"tag":109,"props":812,"children":813},{"style":712},[814],{"type":37,"value":815}," day",{"type":32,"tag":109,"props":817,"children":818},{"style":132},[819],{"type":37,"value":820},"))\n",{"type":32,"tag":109,"props":822,"children":823},{"class":111,"line":167},[824,829,833,837],{"type":32,"tag":109,"props":825,"children":826},{"style":712},[827],{"type":37,"value":828},"                             and",{"type":32,"tag":109,"props":830,"children":831},{"style":132},[832],{"type":37,"value":795},{"type":32,"tag":109,"props":834,"children":835},{"style":185},[836],{"type":37,"value":800},{"type":32,"tag":109,"props":838,"children":839},{"style":132},[840],{"type":37,"value":841},", current_date())\n",{"type":32,"tag":109,"props":843,"children":844},{"class":111,"line":191},[845],{"type":32,"tag":109,"props":846,"children":847},{"style":132},[848],{"type":37,"value":849},"),\n",{"type":32,"tag":109,"props":851,"children":852},{"class":111,"line":209},[853],{"type":32,"tag":109,"props":854,"children":855},{"emptyLinePlaceholder":148},[856],{"type":37,"value":151},{"type":32,"tag":109,"props":858,"children":859},{"class":111,"line":227},[860,865,869],{"type":32,"tag":109,"props":861,"children":862},{"style":132},[863],{"type":37,"value":864},"unnested ",{"type":32,"tag":109,"props":866,"children":867},{"style":712},[868],{"type":37,"value":725},{"type":32,"tag":109,"props":870,"children":871},{"style":132},[872],{"type":37,"value":730},{"type":32,"tag":109,"props":874,"children":875},{"class":111,"line":26},[876],{"type":32,"tag":109,"props":877,"children":878},{"style":712},[879],{"type":37,"value":880},"    select\n",{"type":32,"tag":109,"props":882,"children":883},{"class":111,"line":261},[884],{"type":32,"tag":109,"props":885,"children":886},{"style":132},[887],{"type":37,"value":888},"        event_date,\n",{"type":32,"tag":109,"props":890,"children":891},{"class":111,"line":279},[892],{"type":32,"tag":109,"props":893,"children":894},{"style":132},[895],{"type":37,"value":896},"        event_timestamp,\n",{"type":32,"tag":109,"props":898,"children":899},{"class":111,"line":292},[900],{"type":32,"tag":109,"props":901,"children":902},{"style":132},[903],{"type":37,"value":904},"        user_pseudo_id,\n",{"type":32,"tag":109,"props":906,"children":907},{"class":111,"line":310},[908,913,918,923,928,933,937,942,947,952,957,962,967,971],{"type":32,"tag":109,"props":909,"children":910},{"style":132},[911],{"type":37,"value":912},"        (",{"type":32,"tag":109,"props":914,"children":915},{"style":712},[916],{"type":37,"value":917},"select",{"type":32,"tag":109,"props":919,"children":920},{"style":138},[921],{"type":37,"value":922}," value",{"type":32,"tag":109,"props":924,"children":925},{"style":132},[926],{"type":37,"value":927},".",{"type":32,"tag":109,"props":929,"children":930},{"style":138},[931],{"type":37,"value":932},"string_value",{"type":32,"tag":109,"props":934,"children":935},{"style":712},[936],{"type":37,"value":748},{"type":32,"tag":109,"props":938,"children":939},{"style":132},[940],{"type":37,"value":941}," unnest(event_params) ",{"type":32,"tag":109,"props":943,"children":944},{"style":712},[945],{"type":37,"value":946},"where",{"type":32,"tag":109,"props":948,"children":949},{"style":712},[950],{"type":37,"value":951}," key",{"type":32,"tag":109,"props":953,"children":954},{"style":712},[955],{"type":37,"value":956}," =",{"type":32,"tag":109,"props":958,"children":959},{"style":185},[960],{"type":37,"value":961}," 'page_location'",{"type":32,"tag":109,"props":963,"children":964},{"style":132},[965],{"type":37,"value":966},") ",{"type":32,"tag":109,"props":968,"children":969},{"style":712},[970],{"type":37,"value":725},{"type":32,"tag":109,"props":972,"children":973},{"style":132},[974],{"type":37,"value":975}," page_location,\n",{"type":32,"tag":109,"props":977,"children":978},{"class":111,"line":323},[979,983,987,991,995,1000,1004,1008,1012,1016,1020,1025,1029,1033],{"type":32,"tag":109,"props":980,"children":981},{"style":132},[982],{"type":37,"value":912},{"type":32,"tag":109,"props":984,"children":985},{"style":712},[986],{"type":37,"value":917},{"type":32,"tag":109,"props":988,"children":989},{"style":138},[990],{"type":37,"value":922},{"type":32,"tag":109,"props":992,"children":993},{"style":132},[994],{"type":37,"value":927},{"type":32,"tag":109,"props":996,"children":997},{"style":138},[998],{"type":37,"value":999},"int_value",{"type":32,"tag":109,"props":1001,"children":1002},{"style":712},[1003],{"type":37,"value":748},{"type":32,"tag":109,"props":1005,"children":1006},{"style":132},[1007],{"type":37,"value":941},{"type":32,"tag":109,"props":1009,"children":1010},{"style":712},[1011],{"type":37,"value":946},{"type":32,"tag":109,"props":1013,"children":1014},{"style":712},[1015],{"type":37,"value":951},{"type":32,"tag":109,"props":1017,"children":1018},{"style":712},[1019],{"type":37,"value":956},{"type":32,"tag":109,"props":1021,"children":1022},{"style":185},[1023],{"type":37,"value":1024}," 'ga_session_id'",{"type":32,"tag":109,"props":1026,"children":1027},{"style":132},[1028],{"type":37,"value":966},{"type":32,"tag":109,"props":1030,"children":1031},{"style":712},[1032],{"type":37,"value":725},{"type":32,"tag":109,"props":1034,"children":1035},{"style":132},[1036],{"type":37,"value":1037}," session_id,\n",{"type":32,"tag":109,"props":1039,"children":1040},{"class":111,"line":374},[1041,1046,1050,1054],{"type":32,"tag":109,"props":1042,"children":1043},{"style":138},[1044],{"type":37,"value":1045},"        ecommerce",{"type":32,"tag":109,"props":1047,"children":1048},{"style":132},[1049],{"type":37,"value":927},{"type":32,"tag":109,"props":1051,"children":1052},{"style":138},[1053],{"type":37,"value":681},{"type":32,"tag":109,"props":1055,"children":1056},{"style":132},[1057],{"type":37,"value":1058},",\n",{"type":32,"tag":109,"props":1060,"children":1061},{"class":111,"line":420},[1062,1066,1070],{"type":32,"tag":109,"props":1063,"children":1064},{"style":138},[1065],{"type":37,"value":1045},{"type":32,"tag":109,"props":1067,"children":1068},{"style":132},[1069],{"type":37,"value":927},{"type":32,"tag":109,"props":1071,"children":1072},{"style":138},[1073],{"type":37,"value":1074},"purchase_revenue_in_usd\n",{"type":32,"tag":109,"props":1076,"children":1077},{"class":111,"line":428},[1078,1083],{"type":32,"tag":109,"props":1079,"children":1080},{"style":712},[1081],{"type":37,"value":1082},"    from",{"type":32,"tag":109,"props":1084,"children":1085},{"style":132},[1086],{"type":37,"value":1087}," source\n",{"type":32,"tag":109,"props":1089,"children":1090},{"class":111,"line":449},[1091,1095,1100,1105,1110,1115,1119,1124],{"type":32,"tag":109,"props":1092,"children":1093},{"style":712},[1094],{"type":37,"value":780},{"type":32,"tag":109,"props":1096,"children":1097},{"style":132},[1098],{"type":37,"value":1099}," event_name ",{"type":32,"tag":109,"props":1101,"children":1102},{"style":712},[1103],{"type":37,"value":1104},"in",{"type":32,"tag":109,"props":1106,"children":1107},{"style":132},[1108],{"type":37,"value":1109}," (",{"type":32,"tag":109,"props":1111,"children":1112},{"style":185},[1113],{"type":37,"value":1114},"'page_view'",{"type":32,"tag":109,"props":1116,"children":1117},{"style":132},[1118],{"type":37,"value":59},{"type":32,"tag":109,"props":1120,"children":1121},{"style":185},[1122],{"type":37,"value":1123},"'purchase'",{"type":32,"tag":109,"props":1125,"children":1126},{"style":132},[1127],{"type":37,"value":1128},")\n",{"type":32,"tag":109,"props":1130,"children":1131},{"class":111,"line":466},[1132],{"type":32,"tag":109,"props":1133,"children":1134},{"style":132},[1135],{"type":37,"value":1128},{"type":32,"tag":109,"props":1137,"children":1138},{"class":111,"line":478},[1139],{"type":32,"tag":109,"props":1140,"children":1141},{"emptyLinePlaceholder":148},[1142],{"type":37,"value":151},{"type":32,"tag":109,"props":1144,"children":1145},{"class":111,"line":499},[1146,1150,1154,1158],{"type":32,"tag":109,"props":1147,"children":1148},{"style":712},[1149],{"type":37,"value":917},{"type":32,"tag":109,"props":1151,"children":1152},{"style":712},[1153],{"type":37,"value":743},{"type":32,"tag":109,"props":1155,"children":1156},{"style":712},[1157],{"type":37,"value":748},{"type":32,"tag":109,"props":1159,"children":1160},{"style":132},[1161],{"type":37,"value":1162}," unnested\n",{"type":32,"tag":33,"props":1164,"children":1165},{},[1166,1168,1174,1176,1180,1182,1186,1188,1193,1195,1201],{"type":37,"value":1167},"Ce modèle porte le préfixe ",{"type":32,"tag":52,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":37,"value":1173},"stg_",{"type":37,"value":1175}," — personne en aval ne touche à la source, tous les modèles consomment le ",{"type":32,"tag":83,"props":1177,"children":1178},{},[1179],{"type":37,"value":651},{"type":37,"value":1181},". Les modèles de ",{"type":32,"tag":83,"props":1183,"children":1184},{},[1185],{"type":37,"value":651},{"type":37,"value":1187}," peuvent être ",{"type":32,"tag":83,"props":1189,"children":1190},{},[1191],{"type":37,"value":1192},"incremental",{"type":37,"value":1194}," : chaque jour, seule la nouvelle partition est traitée. La commande ",{"type":32,"tag":52,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":37,"value":1200},"dbt build --select stg_ga4__events",{"type":37,"value":1202}," s'exécute en 30 secondes ; les 90 jours d'historique ne sont jamais retraités.",{"type":32,"tag":33,"props":1204,"children":1205},{},[1206,1208,1213,1215,1219,1221,1227,1228,1234,1235,1241,1243,1247],{"type":37,"value":1207},"Les modèles ",{"type":32,"tag":83,"props":1209,"children":1210},{},[1211],{"type":37,"value":1212},"intermediate",{"type":37,"value":1214}," fusionnent le ",{"type":32,"tag":83,"props":1216,"children":1217},{},[1218],{"type":37,"value":651},{"type":37,"value":1220}," et créent des concepts analytiques : ",{"type":32,"tag":52,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":37,"value":1226},"int_sessions",{"type":37,"value":59},{"type":32,"tag":52,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":37,"value":1233},"int_customer_cohorts",{"type":37,"value":59},{"type":32,"tag":52,"props":1236,"children":1238},{"className":1237},[],[1239],{"type":37,"value":1240},"int_channel_attribution",{"type":37,"value":1242},". Ils abstraient la logique des tables intermédiaires. Par exemple, le calcul d'attribution multi-touch est ",{"type":32,"tag":83,"props":1244,"children":1245},{},[1246],{"type":37,"value":1212},{"type":37,"value":689},{"type":32,"tag":99,"props":1249,"children":1251},{"className":692,"code":1250,"language":694,"meta":16,"style":16},"-- models\u002Fintermediate\u002Fmarketing\u002Fint_channel_attribution.sql\nwith touchpoints as (\n    select\n        user_id,\n        session_start_timestamp,\n        source_medium,\n        row_number() over (partition by user_id order by session_start_timestamp) as touch_position,\n        count(*) over (partition by user_id) as total_touches\n    from {{ ref('stg_sessions') }}\n    where user_id is not null\n),\n\nattributed as (\n    select\n        user_id,\n        source_medium,\n        case\n            when touch_position = 1 then 0.4\n            when touch_position = total_touches then 0.4\n            else 0.2 \u002F (total_touches - 2)\n        end as attribution_weight\n    from touchpoints\n)\n\nselect * from attributed\n",[1252],{"type":32,"tag":52,"props":1253,"children":1254},{"__ignoreMap":16},[1255,1263,1283,1290,1298,1306,1314,1370,1422,1443,1459,1466,1473,1489,1496,1503,1510,1518,1560,1597,1641,1659,1671,1678,1686],{"type":32,"tag":109,"props":1256,"children":1257},{"class":111,"line":112},[1258],{"type":32,"tag":109,"props":1259,"children":1260},{"style":116},[1261],{"type":37,"value":1262},"-- models\u002Fintermediate\u002Fmarketing\u002Fint_channel_attribution.sql\n",{"type":32,"tag":109,"props":1264,"children":1265},{"class":111,"line":122},[1266,1270,1275,1279],{"type":32,"tag":109,"props":1267,"children":1268},{"style":712},[1269],{"type":37,"value":715},{"type":32,"tag":109,"props":1271,"children":1272},{"style":132},[1273],{"type":37,"value":1274}," touchpoints ",{"type":32,"tag":109,"props":1276,"children":1277},{"style":712},[1278],{"type":37,"value":725},{"type":32,"tag":109,"props":1280,"children":1281},{"style":132},[1282],{"type":37,"value":730},{"type":32,"tag":109,"props":1284,"children":1285},{"class":111,"line":144},[1286],{"type":32,"tag":109,"props":1287,"children":1288},{"style":712},[1289],{"type":37,"value":880},{"type":32,"tag":109,"props":1291,"children":1292},{"class":111,"line":154},[1293],{"type":32,"tag":109,"props":1294,"children":1295},{"style":132},[1296],{"type":37,"value":1297},"        user_id,\n",{"type":32,"tag":109,"props":1299,"children":1300},{"class":111,"line":167},[1301],{"type":32,"tag":109,"props":1302,"children":1303},{"style":132},[1304],{"type":37,"value":1305},"        session_start_timestamp,\n",{"type":32,"tag":109,"props":1307,"children":1308},{"class":111,"line":191},[1309],{"type":32,"tag":109,"props":1310,"children":1311},{"style":132},[1312],{"type":37,"value":1313},"        source_medium,\n",{"type":32,"tag":109,"props":1315,"children":1316},{"class":111,"line":209},[1317,1322,1327,1332,1336,1341,1346,1351,1356,1361,1365],{"type":32,"tag":109,"props":1318,"children":1319},{"style":138},[1320],{"type":37,"value":1321},"        row_number",{"type":32,"tag":109,"props":1323,"children":1324},{"style":132},[1325],{"type":37,"value":1326},"() ",{"type":32,"tag":109,"props":1328,"children":1329},{"style":712},[1330],{"type":37,"value":1331},"over",{"type":32,"tag":109,"props":1333,"children":1334},{"style":132},[1335],{"type":37,"value":1109},{"type":32,"tag":109,"props":1337,"children":1338},{"style":712},[1339],{"type":37,"value":1340},"partition",{"type":32,"tag":109,"props":1342,"children":1343},{"style":712},[1344],{"type":37,"value":1345}," by",{"type":32,"tag":109,"props":1347,"children":1348},{"style":132},[1349],{"type":37,"value":1350}," user_id ",{"type":32,"tag":109,"props":1352,"children":1353},{"style":712},[1354],{"type":37,"value":1355},"order by",{"type":32,"tag":109,"props":1357,"children":1358},{"style":132},[1359],{"type":37,"value":1360}," session_start_timestamp) ",{"type":32,"tag":109,"props":1362,"children":1363},{"style":712},[1364],{"type":37,"value":725},{"type":32,"tag":109,"props":1366,"children":1367},{"style":132},[1368],{"type":37,"value":1369}," touch_position,\n",{"type":32,"tag":109,"props":1371,"children":1372},{"class":111,"line":227},[1373,1378,1383,1388,1392,1396,1400,1404,1408,1413,1417],{"type":32,"tag":109,"props":1374,"children":1375},{"style":138},[1376],{"type":37,"value":1377},"        count",{"type":32,"tag":109,"props":1379,"children":1380},{"style":132},[1381],{"type":37,"value":1382},"(",{"type":32,"tag":109,"props":1384,"children":1385},{"style":712},[1386],{"type":37,"value":1387},"*",{"type":32,"tag":109,"props":1389,"children":1390},{"style":132},[1391],{"type":37,"value":966},{"type":32,"tag":109,"props":1393,"children":1394},{"style":712},[1395],{"type":37,"value":1331},{"type":32,"tag":109,"props":1397,"children":1398},{"style":132},[1399],{"type":37,"value":1109},{"type":32,"tag":109,"props":1401,"children":1402},{"style":712},[1403],{"type":37,"value":1340},{"type":32,"tag":109,"props":1405,"children":1406},{"style":712},[1407],{"type":37,"value":1345},{"type":32,"tag":109,"props":1409,"children":1410},{"style":132},[1411],{"type":37,"value":1412}," user_id) ",{"type":32,"tag":109,"props":1414,"children":1415},{"style":712},[1416],{"type":37,"value":725},{"type":32,"tag":109,"props":1418,"children":1419},{"style":132},[1420],{"type":37,"value":1421}," total_touches\n",{"type":32,"tag":109,"props":1423,"children":1424},{"class":111,"line":26},[1425,1429,1434,1439],{"type":32,"tag":109,"props":1426,"children":1427},{"style":712},[1428],{"type":37,"value":1082},{"type":32,"tag":109,"props":1430,"children":1431},{"style":132},[1432],{"type":37,"value":1433}," {{ ref(",{"type":32,"tag":109,"props":1435,"children":1436},{"style":185},[1437],{"type":37,"value":1438},"'stg_sessions'",{"type":32,"tag":109,"props":1440,"children":1441},{"style":132},[1442],{"type":37,"value":772},{"type":32,"tag":109,"props":1444,"children":1445},{"class":111,"line":261},[1446,1450,1454],{"type":32,"tag":109,"props":1447,"children":1448},{"style":712},[1449],{"type":37,"value":780},{"type":32,"tag":109,"props":1451,"children":1452},{"style":132},[1453],{"type":37,"value":1350},{"type":32,"tag":109,"props":1455,"children":1456},{"style":712},[1457],{"type":37,"value":1458},"is not null\n",{"type":32,"tag":109,"props":1460,"children":1461},{"class":111,"line":279},[1462],{"type":32,"tag":109,"props":1463,"children":1464},{"style":132},[1465],{"type":37,"value":849},{"type":32,"tag":109,"props":1467,"children":1468},{"class":111,"line":292},[1469],{"type":32,"tag":109,"props":1470,"children":1471},{"emptyLinePlaceholder":148},[1472],{"type":37,"value":151},{"type":32,"tag":109,"props":1474,"children":1475},{"class":111,"line":310},[1476,1481,1485],{"type":32,"tag":109,"props":1477,"children":1478},{"style":132},[1479],{"type":37,"value":1480},"attributed ",{"type":32,"tag":109,"props":1482,"children":1483},{"style":712},[1484],{"type":37,"value":725},{"type":32,"tag":109,"props":1486,"children":1487},{"style":132},[1488],{"type":37,"value":730},{"type":32,"tag":109,"props":1490,"children":1491},{"class":111,"line":323},[1492],{"type":32,"tag":109,"props":1493,"children":1494},{"style":712},[1495],{"type":37,"value":880},{"type":32,"tag":109,"props":1497,"children":1498},{"class":111,"line":374},[1499],{"type":32,"tag":109,"props":1500,"children":1501},{"style":132},[1502],{"type":37,"value":1297},{"type":32,"tag":109,"props":1504,"children":1505},{"class":111,"line":420},[1506],{"type":32,"tag":109,"props":1507,"children":1508},{"style":132},[1509],{"type":37,"value":1313},{"type":32,"tag":109,"props":1511,"children":1512},{"class":111,"line":428},[1513],{"type":32,"tag":109,"props":1514,"children":1515},{"style":712},[1516],{"type":37,"value":1517},"        case\n",{"type":32,"tag":109,"props":1519,"children":1520},{"class":111,"line":449},[1521,1526,1531,1536,1541,1546,1551,1555],{"type":32,"tag":109,"props":1522,"children":1523},{"style":712},[1524],{"type":37,"value":1525},"            when",{"type":32,"tag":109,"props":1527,"children":1528},{"style":132},[1529],{"type":37,"value":1530}," touch_position ",{"type":32,"tag":109,"props":1532,"children":1533},{"style":712},[1534],{"type":37,"value":1535},"=",{"type":32,"tag":109,"props":1537,"children":1538},{"style":138},[1539],{"type":37,"value":1540}," 1",{"type":32,"tag":109,"props":1542,"children":1543},{"style":712},[1544],{"type":37,"value":1545}," then",{"type":32,"tag":109,"props":1547,"children":1548},{"style":138},[1549],{"type":37,"value":1550}," 0",{"type":32,"tag":109,"props":1552,"children":1553},{"style":132},[1554],{"type":37,"value":927},{"type":32,"tag":109,"props":1556,"children":1557},{"style":138},[1558],{"type":37,"value":1559},"4\n",{"type":32,"tag":109,"props":1561,"children":1562},{"class":111,"line":466},[1563,1567,1571,1575,1580,1585,1589,1593],{"type":32,"tag":109,"props":1564,"children":1565},{"style":712},[1566],{"type":37,"value":1525},{"type":32,"tag":109,"props":1568,"children":1569},{"style":132},[1570],{"type":37,"value":1530},{"type":32,"tag":109,"props":1572,"children":1573},{"style":712},[1574],{"type":37,"value":1535},{"type":32,"tag":109,"props":1576,"children":1577},{"style":132},[1578],{"type":37,"value":1579}," total_touches ",{"type":32,"tag":109,"props":1581,"children":1582},{"style":712},[1583],{"type":37,"value":1584},"then",{"type":32,"tag":109,"props":1586,"children":1587},{"style":138},[1588],{"type":37,"value":1550},{"type":32,"tag":109,"props":1590,"children":1591},{"style":132},[1592],{"type":37,"value":927},{"type":32,"tag":109,"props":1594,"children":1595},{"style":138},[1596],{"type":37,"value":1559},{"type":32,"tag":109,"props":1598,"children":1599},{"class":111,"line":478},[1600,1605,1609,1613,1617,1622,1627,1632,1637],{"type":32,"tag":109,"props":1601,"children":1602},{"style":712},[1603],{"type":37,"value":1604},"            else",{"type":32,"tag":109,"props":1606,"children":1607},{"style":138},[1608],{"type":37,"value":1550},{"type":32,"tag":109,"props":1610,"children":1611},{"style":132},[1612],{"type":37,"value":927},{"type":32,"tag":109,"props":1614,"children":1615},{"style":138},[1616],{"type":37,"value":551},{"type":32,"tag":109,"props":1618,"children":1619},{"style":712},[1620],{"type":37,"value":1621}," \u002F",{"type":32,"tag":109,"props":1623,"children":1624},{"style":132},[1625],{"type":37,"value":1626}," (total_touches ",{"type":32,"tag":109,"props":1628,"children":1629},{"style":712},[1630],{"type":37,"value":1631},"-",{"type":32,"tag":109,"props":1633,"children":1634},{"style":138},[1635],{"type":37,"value":1636}," 2",{"type":32,"tag":109,"props":1638,"children":1639},{"style":132},[1640],{"type":37,"value":1128},{"type":32,"tag":109,"props":1642,"children":1643},{"class":111,"line":499},[1644,1649,1654],{"type":32,"tag":109,"props":1645,"children":1646},{"style":712},[1647],{"type":37,"value":1648},"        end",{"type":32,"tag":109,"props":1650,"children":1651},{"style":712},[1652],{"type":37,"value":1653}," as",{"type":32,"tag":109,"props":1655,"children":1656},{"style":132},[1657],{"type":37,"value":1658}," attribution_weight\n",{"type":32,"tag":109,"props":1660,"children":1661},{"class":111,"line":517},[1662,1666],{"type":32,"tag":109,"props":1663,"children":1664},{"style":712},[1665],{"type":37,"value":1082},{"type":32,"tag":109,"props":1667,"children":1668},{"style":132},[1669],{"type":37,"value":1670}," touchpoints\n",{"type":32,"tag":109,"props":1672,"children":1673},{"class":111,"line":529},[1674],{"type":32,"tag":109,"props":1675,"children":1676},{"style":132},[1677],{"type":37,"value":1128},{"type":32,"tag":109,"props":1679,"children":1681},{"class":111,"line":1680},24,[1682],{"type":32,"tag":109,"props":1683,"children":1684},{"emptyLinePlaceholder":148},[1685],{"type":37,"value":151},{"type":32,"tag":109,"props":1687,"children":1689},{"class":111,"line":1688},25,[1690,1694,1698,1702],{"type":32,"tag":109,"props":1691,"children":1692},{"style":712},[1693],{"type":37,"value":917},{"type":32,"tag":109,"props":1695,"children":1696},{"style":712},[1697],{"type":37,"value":743},{"type":32,"tag":109,"props":1699,"children":1700},{"style":712},[1701],{"type":37,"value":748},{"type":32,"tag":109,"props":1703,"children":1704},{"style":132},[1705],{"type":37,"value":1706}," attributed\n",{"type":32,"tag":33,"props":1708,"children":1709},{},[1710,1712,1716,1718,1724,1726,1732,1734,1740],{"type":37,"value":1711},"Modèle en U — le premier et le dernier contact comptent pour 40 %, les contacts intermédiaires se partagent les 20 % restants. Cette SQL reste dans le modèle ",{"type":32,"tag":83,"props":1713,"children":1714},{},[1715],{"type":37,"value":1212},{"type":37,"value":1717}," ; les data scientists modifient le fichier de modèle, les tableaux de bord de front-end ne sont jamais touchés. Si on veut le rendre paramétrique, on définit ",{"type":32,"tag":52,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":37,"value":1723},"vars.attribution_model: u_shaped",{"type":37,"value":1725}," dans ",{"type":32,"tag":52,"props":1727,"children":1729},{"className":1728},[],[1730],{"type":37,"value":1731},"dbt_project.yml",{"type":37,"value":1733}," et on lit avec ",{"type":32,"tag":52,"props":1735,"children":1737},{"className":1736},[],[1738],{"type":37,"value":1739},"{{ var('attribution_model') }}",{"type":37,"value":927},{"type":32,"tag":33,"props":1742,"children":1743},{},[1744,1745,1750,1752,1758,1759,1764,1766,1772,1773,1778,1780,1786,1787,1793,1794,1800,1802,1806,1808,1813,1815,1821,1822,1828],{"type":37,"value":1207},{"type":32,"tag":83,"props":1746,"children":1747},{},[1748],{"type":37,"value":1749},"mart",{"type":37,"value":1751}," forment la dernière couche : ce que les tableaux de bord, les outils de BI ou les pipelines de machine learning consomment directement. Ils portent les préfixes ",{"type":32,"tag":52,"props":1753,"children":1755},{"className":1754},[],[1756],{"type":37,"value":1757},"fct_",{"type":37,"value":1109},{"type":32,"tag":83,"props":1760,"children":1761},{},[1762],{"type":37,"value":1763},"fact",{"type":37,"value":1765},") ou ",{"type":32,"tag":52,"props":1767,"children":1769},{"className":1768},[],[1770],{"type":37,"value":1771},"dim_",{"type":37,"value":1109},{"type":32,"tag":83,"props":1774,"children":1775},{},[1776],{"type":37,"value":1777},"dimension",{"type":37,"value":1779},"). ",{"type":32,"tag":52,"props":1781,"children":1783},{"className":1782},[],[1784],{"type":37,"value":1785},"fct_orders",{"type":37,"value":59},{"type":32,"tag":52,"props":1788,"children":1790},{"className":1789},[],[1791],{"type":37,"value":1792},"dim_customers",{"type":37,"value":59},{"type":32,"tag":52,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":37,"value":1799},"fct_ad_performance",{"type":37,"value":1801},". Les modèles ",{"type":32,"tag":83,"props":1803,"children":1804},{},[1805],{"type":37,"value":1749},{"type":37,"value":1807}," peuvent être dénormalisés — on paie le coût des jointures dans dbt, pas dans l'outil de BI. Au lieu de « jointure d'order à customer » dans Looker, ",{"type":32,"tag":52,"props":1809,"children":1811},{"className":1810},[],[1812],{"type":37,"value":1785},{"type":37,"value":1814}," contient déjà ",{"type":32,"tag":52,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":37,"value":1820},"customer_lifetime_value",{"type":37,"value":59},{"type":32,"tag":52,"props":1823,"children":1825},{"className":1824},[],[1826],{"type":37,"value":1827},"customer_cohort",{"type":37,"value":1829}," en colonne.",{"type":32,"tag":40,"props":1831,"children":1833},{"id":1832},"semantic-layer-centraliser-les-métriques-et-la-logique-métier",[1834],{"type":37,"value":1835},"Semantic layer : centraliser les métriques et la logique métier",{"type":32,"tag":33,"props":1837,"children":1838},{},[1839,1841,1846,1848,1854,1856,1862,1864,1870],{"type":37,"value":1840},"La ",{"type":32,"tag":83,"props":1842,"children":1843},{},[1844],{"type":37,"value":1845},"semantic layer",{"type":37,"value":1847}," de dbt 1.6+ transforme le SQL en concept de « métrique ». Avant, chaque tableau de bord écrivait sa propre requête ",{"type":32,"tag":52,"props":1849,"children":1851},{"className":1850},[],[1852],{"type":37,"value":1853},"sum(revenue)",{"type":37,"value":1855}," — maintenant, on définit une seule métrique ",{"type":32,"tag":52,"props":1857,"children":1859},{"className":1858},[],[1860],{"type":37,"value":1861},"revenue",{"type":37,"value":1863}," et les tableaux de bord la consomment. La définition des métriques se déclare en YAML dans le répertoire ",{"type":32,"tag":52,"props":1865,"children":1867},{"className":1866},[],[1868],{"type":37,"value":1869},"metrics\u002F",{"type":37,"value":689},{"type":32,"tag":99,"props":1872,"children":1874},{"className":101,"code":1873,"language":103,"meta":16,"style":16},"# models\u002Fmetrics\u002Fmarketing_metrics.yml\nversion: 2\n\nmetrics:\n  - name: total_revenue\n    label: Revenu Total\n    model: ref('fct_orders')\n    calculation_method: sum\n    expression: order_total\n    timestamp: order_date\n    time_grains: [day, week, month, quarter, year]\n    dimensions:\n      - channel\n      - customer_cohort\n      - product_category\n\n  - name: customer_acquisition_cost\n    label: Coût d'Acquisition Client (CAC)\n    calculation_method: derived\n    expression: \"{{ metric('total_ad_spend') }} \u002F {{ metric('new_customers') }}\"\n    timestamp: order_date\n    time_grains: [month, quarter]\n",[1875],{"type":32,"tag":52,"props":1876,"children":1877},{"__ignoreMap":16},[1878,1886,1901,1908,1920,1940,1957,1974,1991,2008,2025,2083,2095,2107,2119,2131,2138,2158,2174,2190,2206,2221],{"type":32,"tag":109,"props":1879,"children":1880},{"class":111,"line":112},[1881],{"type":32,"tag":109,"props":1882,"children":1883},{"style":116},[1884],{"type":37,"value":1885},"# models\u002Fmetrics\u002Fmarketing_metrics.yml\n",{"type":32,"tag":109,"props":1887,"children":1888},{"class":111,"line":122},[1889,1893,1897],{"type":32,"tag":109,"props":1890,"children":1891},{"style":126},[1892],{"type":37,"value":129},{"type":32,"tag":109,"props":1894,"children":1895},{"style":132},[1896],{"type":37,"value":135},{"type":32,"tag":109,"props":1898,"children":1899},{"style":138},[1900],{"type":37,"value":141},{"type":32,"tag":109,"props":1902,"children":1903},{"class":111,"line":144},[1904],{"type":32,"tag":109,"props":1905,"children":1906},{"emptyLinePlaceholder":148},[1907],{"type":37,"value":151},{"type":32,"tag":109,"props":1909,"children":1910},{"class":111,"line":154},[1911,1916],{"type":32,"tag":109,"props":1912,"children":1913},{"style":126},[1914],{"type":37,"value":1915},"metrics",{"type":32,"tag":109,"props":1917,"children":1918},{"style":132},[1919],{"type":37,"value":164},{"type":32,"tag":109,"props":1921,"children":1922},{"class":111,"line":167},[1923,1927,1931,1935],{"type":32,"tag":109,"props":1924,"children":1925},{"style":132},[1926],{"type":37,"value":173},{"type":32,"tag":109,"props":1928,"children":1929},{"style":126},[1930],{"type":37,"value":178},{"type":32,"tag":109,"props":1932,"children":1933},{"style":132},[1934],{"type":37,"value":135},{"type":32,"tag":109,"props":1936,"children":1937},{"style":185},[1938],{"type":37,"value":1939},"total_revenue\n",{"type":32,"tag":109,"props":1941,"children":1942},{"class":111,"line":191},[1943,1948,1952],{"type":32,"tag":109,"props":1944,"children":1945},{"style":126},[1946],{"type":37,"value":1947},"    label",{"type":32,"tag":109,"props":1949,"children":1950},{"style":132},[1951],{"type":37,"value":135},{"type":32,"tag":109,"props":1953,"children":1954},{"style":185},[1955],{"type":37,"value":1956},"Revenu Total\n",{"type":32,"tag":109,"props":1958,"children":1959},{"class":111,"line":209},[1960,1965,1969],{"type":32,"tag":109,"props":1961,"children":1962},{"style":126},[1963],{"type":37,"value":1964},"    model",{"type":32,"tag":109,"props":1966,"children":1967},{"style":132},[1968],{"type":37,"value":135},{"type":32,"tag":109,"props":1970,"children":1971},{"style":185},[1972],{"type":37,"value":1973},"ref('fct_orders')\n",{"type":32,"tag":109,"props":1975,"children":1976},{"class":111,"line":227},[1977,1982,1986],{"type":32,"tag":109,"props":1978,"children":1979},{"style":126},[1980],{"type":37,"value":1981},"    calculation_method",{"type":32,"tag":109,"props":1983,"children":1984},{"style":132},[1985],{"type":37,"value":135},{"type":32,"tag":109,"props":1987,"children":1988},{"style":185},[1989],{"type":37,"value":1990},"sum\n",{"type":32,"tag":109,"props":1992,"children":1993},{"class":111,"line":26},[1994,1999,2003],{"type":32,"tag":109,"props":1995,"children":1996},{"style":126},[1997],{"type":37,"value":1998},"    expression",{"type":32,"tag":109,"props":2000,"children":2001},{"style":132},[2002],{"type":37,"value":135},{"type":32,"tag":109,"props":2004,"children":2005},{"style":185},[2006],{"type":37,"value":2007},"order_total\n",{"type":32,"tag":109,"props":2009,"children":2010},{"class":111,"line":261},[2011,2016,2020],{"type":32,"tag":109,"props":2012,"children":2013},{"style":126},[2014],{"type":37,"value":2015},"    timestamp",{"type":32,"tag":109,"props":2017,"children":2018},{"style":132},[2019],{"type":37,"value":135},{"type":32,"tag":109,"props":2021,"children":2022},{"style":185},[2023],{"type":37,"value":2024},"order_date\n",{"type":32,"tag":109,"props":2026,"children":2027},{"class":111,"line":279},[2028,2033,2038,2042,2046,2051,2055,2060,2064,2069,2073,2078],{"type":32,"tag":109,"props":2029,"children":2030},{"style":126},[2031],{"type":37,"value":2032},"    time_grains",{"type":32,"tag":109,"props":2034,"children":2035},{"style":132},[2036],{"type":37,"value":2037},": [",{"type":32,"tag":109,"props":2039,"children":2040},{"style":185},[2041],{"type":37,"value":568},{"type":32,"tag":109,"props":2043,"children":2044},{"style":132},[2045],{"type":37,"value":59},{"type":32,"tag":109,"props":2047,"children":2048},{"style":185},[2049],{"type":37,"value":2050},"week",{"type":32,"tag":109,"props":2052,"children":2053},{"style":132},[2054],{"type":37,"value":59},{"type":32,"tag":109,"props":2056,"children":2057},{"style":185},[2058],{"type":37,"value":2059},"month",{"type":32,"tag":109,"props":2061,"children":2062},{"style":132},[2063],{"type":37,"value":59},{"type":32,"tag":109,"props":2065,"children":2066},{"style":185},[2067],{"type":37,"value":2068},"quarter",{"type":32,"tag":109,"props":2070,"children":2071},{"style":132},[2072],{"type":37,"value":59},{"type":32,"tag":109,"props":2074,"children":2075},{"style":185},[2076],{"type":37,"value":2077},"year",{"type":32,"tag":109,"props":2079,"children":2080},{"style":132},[2081],{"type":37,"value":2082},"]\n",{"type":32,"tag":109,"props":2084,"children":2085},{"class":111,"line":292},[2086,2091],{"type":32,"tag":109,"props":2087,"children":2088},{"style":126},[2089],{"type":37,"value":2090},"    dimensions",{"type":32,"tag":109,"props":2092,"children":2093},{"style":132},[2094],{"type":37,"value":164},{"type":32,"tag":109,"props":2096,"children":2097},{"class":111,"line":310},[2098,2102],{"type":32,"tag":109,"props":2099,"children":2100},{"style":132},[2101],{"type":37,"value":245},{"type":32,"tag":109,"props":2103,"children":2104},{"style":185},[2105],{"type":37,"value":2106},"channel\n",{"type":32,"tag":109,"props":2108,"children":2109},{"class":111,"line":323},[2110,2114],{"type":32,"tag":109,"props":2111,"children":2112},{"style":132},[2113],{"type":37,"value":245},{"type":32,"tag":109,"props":2115,"children":2116},{"style":185},[2117],{"type":37,"value":2118},"customer_cohort\n",{"type":32,"tag":109,"props":2120,"children":2121},{"class":111,"line":374},[2122,2126],{"type":32,"tag":109,"props":2123,"children":2124},{"style":132},[2125],{"type":37,"value":245},{"type":32,"tag":109,"props":2127,"children":2128},{"style":185},[2129],{"type":37,"value":2130},"product_category\n",{"type":32,"tag":109,"props":2132,"children":2133},{"class":111,"line":420},[2134],{"type":32,"tag":109,"props":2135,"children":2136},{"emptyLinePlaceholder":148},[2137],{"type":37,"value":151},{"type":32,"tag":109,"props":2139,"children":2140},{"class":111,"line":428},[2141,2145,2149,2153],{"type":32,"tag":109,"props":2142,"children":2143},{"style":132},[2144],{"type":37,"value":173},{"type":32,"tag":109,"props":2146,"children":2147},{"style":126},[2148],{"type":37,"value":178},{"type":32,"tag":109,"props":2150,"children":2151},{"style":132},[2152],{"type":37,"value":135},{"type":32,"tag":109,"props":2154,"children":2155},{"style":185},[2156],{"type":37,"value":2157},"customer_acquisition_cost\n",{"type":32,"tag":109,"props":2159,"children":2160},{"class":111,"line":449},[2161,2165,2169],{"type":32,"tag":109,"props":2162,"children":2163},{"style":126},[2164],{"type":37,"value":1947},{"type":32,"tag":109,"props":2166,"children":2167},{"style":132},[2168],{"type":37,"value":135},{"type":32,"tag":109,"props":2170,"children":2171},{"style":185},[2172],{"type":37,"value":2173},"Coût d'Acquisition Client (CAC)\n",{"type":32,"tag":109,"props":2175,"children":2176},{"class":111,"line":466},[2177,2181,2185],{"type":32,"tag":109,"props":2178,"children":2179},{"style":126},[2180],{"type":37,"value":1981},{"type":32,"tag":109,"props":2182,"children":2183},{"style":132},[2184],{"type":37,"value":135},{"type":32,"tag":109,"props":2186,"children":2187},{"style":185},[2188],{"type":37,"value":2189},"derived\n",{"type":32,"tag":109,"props":2191,"children":2192},{"class":111,"line":478},[2193,2197,2201],{"type":32,"tag":109,"props":2194,"children":2195},{"style":126},[2196],{"type":37,"value":1998},{"type":32,"tag":109,"props":2198,"children":2199},{"style":132},[2200],{"type":37,"value":135},{"type":32,"tag":109,"props":2202,"children":2203},{"style":185},[2204],{"type":37,"value":2205},"\"{{ metric('total_ad_spend') }} \u002F {{ metric('new_customers') }}\"\n",{"type":32,"tag":109,"props":2207,"children":2208},{"class":111,"line":499},[2209,2213,2217],{"type":32,"tag":109,"props":2210,"children":2211},{"style":126},[2212],{"type":37,"value":2015},{"type":32,"tag":109,"props":2214,"children":2215},{"style":132},[2216],{"type":37,"value":135},{"type":32,"tag":109,"props":2218,"children":2219},{"style":185},[2220],{"type":37,"value":2024},{"type":32,"tag":109,"props":2222,"children":2223},{"class":111,"line":517},[2224,2228,2232,2236,2240,2244],{"type":32,"tag":109,"props":2225,"children":2226},{"style":126},[2227],{"type":37,"value":2032},{"type":32,"tag":109,"props":2229,"children":2230},{"style":132},[2231],{"type":37,"value":2037},{"type":32,"tag":109,"props":2233,"children":2234},{"style":185},[2235],{"type":37,"value":2059},{"type":32,"tag":109,"props":2237,"children":2238},{"style":132},[2239],{"type":37,"value":59},{"type":32,"tag":109,"props":2241,"children":2242},{"style":185},[2243],{"type":37,"value":2068},{"type":32,"tag":109,"props":2245,"children":2246},{"style":132},[2247],{"type":37,"value":2082},{"type":32,"tag":33,"props":2249,"children":2250},{},[2251,2253,2259,2261,2267,2269,2275,2277,2282],{"type":37,"value":2252},"Avec cette déclaration, une requête Looker du type « Affiche-moi ",{"type":32,"tag":52,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":37,"value":2258},"total_revenue",{"type":37,"value":2260}," par ",{"type":32,"tag":52,"props":2262,"children":2264},{"className":2263},[],[2265],{"type":37,"value":2266},"channel",{"type":37,"value":2268}," pour le dernier trimestre » est résolue automatiquement via l'API dbt Semantic Layer. On n'écrit pas de SQL — on appelle la métrique. ",{"type":32,"tag":52,"props":2270,"children":2272},{"className":2271},[],[2273],{"type":37,"value":2274},"customer_acquisition_cost",{"type":37,"value":2276}," est une métrique ",{"type":32,"tag":83,"props":2278,"children":2279},{},[2280],{"type":37,"value":2281},"derived",{"type":37,"value":2283}," : elle se calcule à partir de deux autres métriques. Quand la formule change, on la modifie un seul endroit, pas sur 12 tableaux de bord.",{"type":32,"tag":33,"props":2285,"children":2286},{},[2287,2288,2292,2294,2303,2305,2310,2312,2318,2320,2324,2326,2332,2334,2340,2342,2346],{"type":37,"value":1840},{"type":32,"tag":83,"props":2289,"children":2290},{},[2291],{"type":37,"value":1845},{"type":37,"value":2293}," impose une deuxième contrainte : elle impose l'architecture de ",{"type":32,"tag":2295,"props":2296,"children":2300},"a",{"href":2297,"rel":2298},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Ffirstparty",[2299],"nofollow",[2301],{"type":37,"value":2302},"données first-party",{"type":37,"value":2304},", car la définition d'une métrique s'appuie sur l'ID client. Si le ",{"type":32,"tag":52,"props":2306,"children":2308},{"className":2307},[],[2309],{"type":37,"value":625},{"type":37,"value":2311}," de GA4 et le ",{"type":32,"tag":52,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":37,"value":2317},"customer_id",{"type":37,"value":2319}," de Shopify représentent la même personne, cette résolution d'identité doit être résolue dans le modèle ",{"type":32,"tag":83,"props":2321,"children":2322},{},[2323],{"type":37,"value":1212},{"type":37,"value":2325},". La table ",{"type":32,"tag":52,"props":2327,"children":2329},{"className":2328},[],[2330],{"type":37,"value":2331},"dim_unified_customers",{"type":37,"value":2333}," fusionne tous les signaux et retourne un ",{"type":32,"tag":52,"props":2335,"children":2337},{"className":2336},[],[2338],{"type":37,"value":2339},"canonical_customer_id",{"type":37,"value":2341},". Cet ID est utilisé comme dimension dans la ",{"type":32,"tag":83,"props":2343,"children":2344},{},[2345],{"type":37,"value":1845},{"type":37,"value":2347},". Sans ID canonique, la métrique CAC est inexacte — le même client est compté deux fois.",{"type":32,"tag":40,"props":2349,"children":2351},{"id":2350},"exposures-les-points-de-consommation-en-aval",[2352],{"type":37,"value":2353},"Exposures : les points de consommation en aval",{"type":32,"tag":33,"props":2355,"children":2356},{},[2357,2359,2364],{"type":37,"value":2358},"Les ",{"type":32,"tag":83,"props":2360,"children":2361},{},[2362],{"type":37,"value":2363},"exposures",{"type":37,"value":2365}," sont le dernier concept de dbt : déclarer quel tableau de bord, quelle tâche Airflow, quel modèle de machine learning consomme ce pipeline dbt. Format YAML :",{"type":32,"tag":99,"props":2367,"children":2369},{"className":101,"code":2368,"language":103,"meta":16,"style":16},"# models\u002Fexposures\u002Fmarketing_exposures.yml\nversion: 2\n\nexposures:\n  - name: executive_marketing_dashboard\n    type: dashboard\n    maturity: high\n    url: https:\u002F\u002Flookerstudio.google.com\u002Freporting\u002Fabc123\n    description: \"Tableau de bord CMO : revenue, CAC, LTV par canal\"\n    depends_on:\n      - ref('fct_orders')\n      - ref('fct_ad_performance')\n      - metric('total_revenue')\n      - metric('customer_acquisition_cost')\n    owner:\n      name: Équipe Ops Marketing\n      email: ops@roibase.com.tr\n\n  - name: klaviyo_segment_sync\n    type: application\n    maturity: medium\n    description: \"Synchronisation segment BigQuery → Klaviyo via Hightouch\"\n    depends_on:\n      - ref('dim_unified_customers')\n    owner:\n      name: CRM Automation\n      email: crm@roibase.com.tr\n",[2370],{"type":32,"tag":52,"props":2371,"children":2372},{"__ignoreMap":16},[2373,2381,2396,2403,2414,2434,2451,2468,2485,2502,2514,2525,2537,2549,2561,2573,2590,2607,2614,2634,2650,2666,2682,2693,2705,2716,2733],{"type":32,"tag":109,"props":2374,"children":2375},{"class":111,"line":112},[2376],{"type":32,"tag":109,"props":2377,"children":2378},{"style":116},[2379],{"type":37,"value":2380},"# models\u002Fexposures\u002Fmarketing_exposures.yml\n",{"type":32,"tag":109,"props":2382,"children":2383},{"class":111,"line":122},[2384,2388,2392],{"type":32,"tag":109,"props":2385,"children":2386},{"style":126},[2387],{"type":37,"value":129},{"type":32,"tag":109,"props":2389,"children":2390},{"style":132},[2391],{"type":37,"value":135},{"type":32,"tag":109,"props":2393,"children":2394},{"style":138},[2395],{"type":37,"value":141},{"type":32,"tag":109,"props":2397,"children":2398},{"class":111,"line":144},[2399],{"type":32,"tag":109,"props":2400,"children":2401},{"emptyLinePlaceholder":148},[2402],{"type":37,"value":151},{"type":32,"tag":109,"props":2404,"children":2405},{"class":111,"line":154},[2406,2410],{"type":32,"tag":109,"props":2407,"children":2408},{"style":126},[2409],{"type":37,"value":2363},{"type":32,"tag":109,"props":2411,"children":2412},{"style":132},[2413],{"type":37,"value":164},{"type":32,"tag":109,"props":2415,"children":2416},{"class":111,"line":167},[2417,2421,2425,2429],{"type":32,"tag":109,"props":2418,"children":2419},{"style":132},[2420],{"type":37,"value":173},{"type":32,"tag":109,"props":2422,"children":2423},{"style":126},[2424],{"type":37,"value":178},{"type":32,"tag":109,"props":2426,"children":2427},{"style":132},[2428],{"type":37,"value":135},{"type":32,"tag":109,"props":2430,"children":2431},{"style":185},[2432],{"type":37,"value":2433},"executive_marketing_dashboard\n",{"type":32,"tag":109,"props":2435,"children":2436},{"class":111,"line":191},[2437,2442,2446],{"type":32,"tag":109,"props":2438,"children":2439},{"style":126},[2440],{"type":37,"value":2441},"    type",{"type":32,"tag":109,"props":2443,"children":2444},{"style":132},[2445],{"type":37,"value":135},{"type":32,"tag":109,"props":2447,"children":2448},{"style":185},[2449],{"type":37,"value":2450},"dashboard\n",{"type":32,"tag":109,"props":2452,"children":2453},{"class":111,"line":209},[2454,2459,2463],{"type":32,"tag":109,"props":2455,"children":2456},{"style":126},[2457],{"type":37,"value":2458},"    maturity",{"type":32,"tag":109,"props":2460,"children":2461},{"style":132},[2462],{"type":37,"value":135},{"type":32,"tag":109,"props":2464,"children":2465},{"style":185},[2466],{"type":37,"value":2467},"high\n",{"type":32,"tag":109,"props":2469,"children":2470},{"class":111,"line":227},[2471,2476,2480],{"type":32,"tag":109,"props":2472,"children":2473},{"style":126},[2474],{"type":37,"value":2475},"    url",{"type":32,"tag":109,"props":2477,"children":2478},{"style":132},[2479],{"type":37,"value":135},{"type":32,"tag":109,"props":2481,"children":2482},{"style":185},[2483],{"type":37,"value":2484},"https:\u002F\u002Flookerstudio.google.com\u002Freporting\u002Fabc123\n",{"type":32,"tag":109,"props":2486,"children":2487},{"class":111,"line":26},[2488,2493,2497],{"type":32,"tag":109,"props":2489,"children":2490},{"style":126},[2491],{"type":37,"value":2492},"    description",{"type":32,"tag":109,"props":2494,"children":2495},{"style":132},[2496],{"type":37,"value":135},{"type":32,"tag":109,"props":2498,"children":2499},{"style":185},[2500],{"type":37,"value":2501},"\"Tableau de bord CMO : revenue, CAC, LTV par canal\"\n",{"type":32,"tag":109,"props":2503,"children":2504},{"class":111,"line":261},[2505,2510],{"type":32,"tag":109,"props":2506,"children":2507},{"style":126},[2508],{"type":37,"value":2509},"    depends_on",{"type":32,"tag":109,"props":2511,"children":2512},{"style":132},[2513],{"type":37,"value":164},{"type":32,"tag":109,"props":2515,"children":2516},{"class":111,"line":279},[2517,2521],{"type":32,"tag":109,"props":2518,"children":2519},{"style":132},[2520],{"type":37,"value":245},{"type":32,"tag":109,"props":2522,"children":2523},{"style":185},[2524],{"type":37,"value":1973},{"type":32,"tag":109,"props":2526,"children":2527},{"class":111,"line":292},[2528,2532],{"type":32,"tag":109,"props":2529,"children":2530},{"style":132},[2531],{"type":37,"value":245},{"type":32,"tag":109,"props":2533,"children":2534},{"style":185},[2535],{"type":37,"value":2536},"ref('fct_ad_performance')\n",{"type":32,"tag":109,"props":2538,"children":2539},{"class":111,"line":310},[2540,2544],{"type":32,"tag":109,"props":2541,"children":2542},{"style":132},[2543],{"type":37,"value":245},{"type":32,"tag":109,"props":2545,"children":2546},{"style":185},[2547],{"type":37,"value":2548},"metric('total_revenue')\n",{"type":32,"tag":109,"props":2550,"children":2551},{"class":111,"line":323},[2552,2556],{"type":32,"tag":109,"props":2553,"children":2554},{"style":132},[2555],{"type":37,"value":245},{"type":32,"tag":109,"props":2557,"children":2558},{"style":185},[2559],{"type":37,"value":2560},"metric('customer_acquisition_cost')\n",{"type":32,"tag":109,"props":2562,"children":2563},{"class":111,"line":374},[2564,2569],{"type":32,"tag":109,"props":2565,"children":2566},{"style":126},[2567],{"type":37,"value":2568},"    owner",{"type":32,"tag":109,"props":2570,"children":2571},{"style":132},[2572],{"type":37,"value":164},{"type":32,"tag":109,"props":2574,"children":2575},{"class":111,"line":420},[2576,2581,2585],{"type":32,"tag":109,"props":2577,"children":2578},{"style":126},[2579],{"type":37,"value":2580},"      name",{"type":32,"tag":109,"props":2582,"children":2583},{"style":132},[2584],{"type":37,"value":135},{"type":32,"tag":109,"props":2586,"children":2587},{"style":185},[2588],{"type":37,"value":2589},"Équipe Ops Marketing\n",{"type":32,"tag":109,"props":2591,"children":2592},{"class":111,"line":428},[2593,2598,2602],{"type":32,"tag":109,"props":2594,"children":2595},{"style":126},[2596],{"type":37,"value":2597},"      email",{"type":32,"tag":109,"props":2599,"children":2600},{"style":132},[2601],{"type":37,"value":135},{"type":32,"tag":109,"props":2603,"children":2604},{"style":185},[2605],{"type":37,"value":2606},"ops@roibase.com.tr\n",{"type":32,"tag":109,"props":2608,"children":2609},{"class":111,"line":449},[2610],{"type":32,"tag":109,"props":2611,"children":2612},{"emptyLinePlaceholder":148},[2613],{"type":37,"value":151},{"type":32,"tag":109,"props":2615,"children":2616},{"class":111,"line":466},[2617,2621,2625,2629],{"type":32,"tag":109,"props":2618,"children":2619},{"style":132},[2620],{"type":37,"value":173},{"type":32,"tag":109,"props":2622,"children":2623},{"style":126},[2624],{"type":37,"value":178},{"type":32,"tag":109,"props":2626,"children":2627},{"style":132},[2628],{"type":37,"value":135},{"type":32,"tag":109,"props":2630,"children":2631},{"style":185},[2632],{"type":37,"value":2633},"klaviyo_segment_sync\n",{"type":32,"tag":109,"props":2635,"children":2636},{"class":111,"line":478},[2637,2641,2645],{"type":32,"tag":109,"props":2638,"children":2639},{"style":126},[2640],{"type":37,"value":2441},{"type":32,"tag":109,"props":2642,"children":2643},{"style":132},[2644],{"type":37,"value":135},{"type":32,"tag":109,"props":2646,"children":2647},{"style":185},[2648],{"type":37,"value":2649},"application\n",{"type":32,"tag":109,"props":2651,"children":2652},{"class":111,"line":499},[2653,2657,2661],{"type":32,"tag":109,"props":2654,"children":2655},{"style":126},[2656],{"type":37,"value":2458},{"type":32,"tag":109,"props":2658,"children":2659},{"style":132},[2660],{"type":37,"value":135},{"type":32,"tag":109,"props":2662,"children":2663},{"style":185},[2664],{"type":37,"value":2665},"medium\n",{"type":32,"tag":109,"props":2667,"children":2668},{"class":111,"line":517},[2669,2673,2677],{"type":32,"tag":109,"props":2670,"children":2671},{"style":126},[2672],{"type":37,"value":2492},{"type":32,"tag":109,"props":2674,"children":2675},{"style":132},[2676],{"type":37,"value":135},{"type":32,"tag":109,"props":2678,"children":2679},{"style":185},[2680],{"type":37,"value":2681},"\"Synchronisation segment BigQuery → Klaviyo via Hightouch\"\n",{"type":32,"tag":109,"props":2683,"children":2684},{"class":111,"line":529},[2685,2689],{"type":32,"tag":109,"props":2686,"children":2687},{"style":126},[2688],{"type":37,"value":2509},{"type":32,"tag":109,"props":2690,"children":2691},{"style":132},[2692],{"type":37,"value":164},{"type":32,"tag":109,"props":2694,"children":2695},{"class":111,"line":1680},[2696,2700],{"type":32,"tag":109,"props":2697,"children":2698},{"style":132},[2699],{"type":37,"value":245},{"type":32,"tag":109,"props":2701,"children":2702},{"style":185},[2703],{"type":37,"value":2704},"ref('dim_unified_customers')\n",{"type":32,"tag":109,"props":2706,"children":2707},{"class":111,"line":1688},[2708,2712],{"type":32,"tag":109,"props":2709,"children":2710},{"style":126},[2711],{"type":37,"value":2568},{"type":32,"tag":109,"props":2713,"children":2714},{"style":132},[2715],{"type":37,"value":164},{"type":32,"tag":109,"props":2717,"children":2719},{"class":111,"line":2718},26,[2720,2724,2728],{"type":32,"tag":109,"props":2721,"children":2722},{"style":126},[2723],{"type":37,"value":2580},{"type":32,"tag":109,"props":2725,"children":2726},{"style":132},[2727],{"type":37,"value":135},{"type":32,"tag":109,"props":2729,"children":2730},{"style":185},[2731],{"type":37,"value":2732},"CRM Automation\n",{"type":32,"tag":109,"props":2734,"children":2736},{"class":111,"line":2735},27,[2737,2741,2745],{"type":32,"tag":109,"props":2738,"children":2739},{"style":126},[2740],{"type":37,"value":2597},{"type":32,"tag":109,"props":2742,"children":2743},{"style":132},[2744],{"type":37,"value":135},{"type":32,"tag":109,"props":2746,"children":2747},{"style":185},[2748],{"type":37,"value":2749},"crm@roibase.com.tr\n",{"type":32,"tag":33,"props":2751,"children":2752},{},[2753,2755,2761,2763,2767,2769,2774,2776,2781],{"type":37,"value":2754},"Ce manifeste signifie que, après avoir exécuté ",{"type":32,"tag":52,"props":2756,"children":2758},{"className":2757},[],[2759],{"type":37,"value":2760},"dbt docs generate",{"type":37,"value":2762},", le DAG visualisé affichera les ",{"type":32,"tag":83,"props":2764,"children":2765},{},[2766],{"type":37,"value":2363},{"type":37,"value":2768}," comme points terminaux. Quand on modifie le modèle ",{"type":32,"tag":52,"props":2770,"children":2772},{"className":2771},[],[2773],{"type":37,"value":1785},{"type":37,"value":2775},", on voit clairement sur le graphe de lignée quel tableau de bord sera impacté. L'",{"type":32,"tag":83,"props":2777,"children":2778},{},[2779],{"type":37,"value":2780},"exposure",{"type":37,"value":2782}," sert aussi de règle d'alerte : on peut envoyer un message Slack du type « executive_marketing_dashboard a un modèle en amont en erreur ».",{"type":32,"tag":33,"props":2784,"children":2785},{},[2786,2788,2793,2795,2799,2801,2807,2809,2815,2817,2823],{"type":37,"value":2787},"Le champ ",{"type":32,"tag":83,"props":2789,"children":2790},{},[2791],{"type":37,"value":2792},"maturity",{"type":37,"value":2794}," de l'",{"type":32,"tag":83,"props":2796,"children":2797},{},[2798],{"type":37,"value":2780},{"type":37,"value":2800}," assure le suivi de la dette technique : une exposition ",{"type":32,"tag":52,"props":2802,"children":2804},{"className":2803},[],[2805],{"type":37,"value":2806},"low",{"type":37,"value":2808}," maturity peut être une analyse temporaire, une exposition ",{"type":32,"tag":52,"props":2810,"children":2812},{"className":2811},[],[2813],{"type":37,"value":2814},"high",{"type":37,"value":2816}," maturity est critique en production. La commande ",{"type":32,"tag":52,"props":2818,"children":2820},{"className":2819},[],[2821],{"type":37,"value":2822},"dbt list --select exposure:executive_marketing_dashboard+",{"type":37,"value":2824}," énumère l'arborescence des dépendances de ce tableau de bord — pendant la dépréciation d'un modèle, on effectue une analyse d'impact.",{"type":32,"tag":40,"props":2826,"children":2828},{"id":2827},"couverture-de-test-et-contrat-de-qualité-des-données",[2829],{"type":37,"value":2830},"Couverture de test et contrat de qualité des données",{"type":32,"tag":33,"props":2832,"children":2833},{},[2834,2836,2842],{"type":37,"value":2835},"La puissance de dbt ne se limite pas à la transformation, mais à la suite de test. Pour chaque modèle, on déclare des tests dans le fichier ",{"type":32,"tag":52,"props":2837,"children":2839},{"className":2838},[],[2840],{"type":37,"value":2841},"schema.yml",{"type":37,"value":689},{"type":32,"tag":99,"props":2844,"children":2846},{"className":101,"code":2845,"language":103,"meta":16,"style":16},"# models\u002Fmarts\u002Fmarketing\u002Ffct_orders.yml\nversion: 2\n\nmodels:\n  - name: fct_orders\n    description: \"Table de faits dénormalisée pour la consommation BI\"\n    columns:\n      - name: order_id\n        description: \"Clé primaire\"\n        tests:\n          - unique\n          - not_null\n\n      - name: customer_id\n        description: \"Clé étrangère vers dim_customers\"\n        tests:\n          - not_null\n          - relationships:\n              to: ref('dim_customers')\n              field: customer_id\n\n      - name: order_total\n        description: \"Total de commande en USD\"\n        tests:\n          - not_null\n          - dbt_utils.expression_is_true:\n              expression: \">= 0\"\n\n      - name: order_date\n        tests:\n          - not_null\n          - dbt_utils.accepted_range:\n              min_value: \"'2020-01-01'\"\n              max_value: \"current_date()\"\n",[2847],{"type":32,"tag":52,"props":2848,"children":2849},{"__ignoreMap":16},[2850,2858,2873,2880,2892,2912,2928,2940,2960,2977,2989,3002,3014,3021,3041,3057,3068,3079,3095,3112,3128,3135,3154,3170,3181,3192,3208,3225,3233,3253,3265,3277,3294,3312],{"type":32,"tag":109,"props":2851,"children":2852},{"class":111,"line":112},[2853],{"type":32,"tag":109,"props":2854,"children":2855},{"style":116},[2856],{"type":37,"value":2857},"# models\u002Fmarts\u002Fmarketing\u002Ffct_orders.yml\n",{"type":32,"tag":109,"props":2859,"children":2860},{"class":111,"line":122},[2861,2865,2869],{"type":32,"tag":109,"props":2862,"children":2863},{"style":126},[2864],{"type":37,"value":129},{"type":32,"tag":109,"props":2866,"children":2867},{"style":132},[2868],{"type":37,"value":135},{"type":32,"tag":109,"props":2870,"children":2871},{"style":138},[2872],{"type":37,"value":141},{"type":32,"tag":109,"props":2874,"children":2875},{"class":111,"line":144},[2876],{"type":32,"tag":109,"props":2877,"children":2878},{"emptyLinePlaceholder":148},[2879],{"type":37,"value":151},{"type":32,"tag":109,"props":2881,"children":2882},{"class":111,"line":154},[2883,2888],{"type":32,"tag":109,"props":2884,"children":2885},{"style":126},[2886],{"type":37,"value":2887},"models",{"type":32,"tag":109,"props":2889,"children":2890},{"style":132},[2891],{"type":37,"value":164},{"type":32,"tag":109,"props":2893,"children":2894},{"class":111,"line":167},[2895,2899,2903,2907],{"type":32,"tag":109,"props":2896,"children":2897},{"style":132},[2898],{"type":37,"value":173},{"type":32,"tag":109,"props":2900,"children":2901},{"style":126},[2902],{"type":37,"value":178},{"type":32,"tag":109,"props":2904,"children":2905},{"style":132},[2906],{"type":37,"value":135},{"type":32,"tag":109,"props":2908,"children":2909},{"style":185},[2910],{"type":37,"value":2911},"fct_orders\n",{"type":32,"tag":109,"props":2913,"children":2914},{"class":111,"line":191},[2915,2919,2923],{"type":32,"tag":109,"props":2916,"children":2917},{"style":126},[2918],{"type":37,"value":2492},{"type":32,"tag":109,"props":2920,"children":2921},{"style":132},[2922],{"type":37,"value":135},{"type":32,"tag":109,"props":2924,"children":2925},{"style":185},[2926],{"type":37,"value":2927},"\"Table de faits dénormalisée pour la consommation BI\"\n",{"type":32,"tag":109,"props":2929,"children":2930},{"class":111,"line":209},[2931,2936],{"type":32,"tag":109,"props":2932,"children":2933},{"style":126},[2934],{"type":37,"value":2935},"    columns",{"type":32,"tag":109,"props":2937,"children":2938},{"style":132},[2939],{"type":37,"value":164},{"type":32,"tag":109,"props":2941,"children":2942},{"class":111,"line":227},[2943,2947,2951,2955],{"type":32,"tag":109,"props":2944,"children":2945},{"style":132},[2946],{"type":37,"value":245},{"type":32,"tag":109,"props":2948,"children":2949},{"style":126},[2950],{"type":37,"value":178},{"type":32,"tag":109,"props":2952,"children":2953},{"style":132},[2954],{"type":37,"value":135},{"type":32,"tag":109,"props":2956,"children":2957},{"style":185},[2958],{"type":37,"value":2959},"order_id\n",{"type":32,"tag":109,"props":2961,"children":2962},{"class":111,"line":26},[2963,2968,2972],{"type":32,"tag":109,"props":2964,"children":2965},{"style":126},[2966],{"type":37,"value":2967},"        description",{"type":32,"tag":109,"props":2969,"children":2970},{"style":132},[2971],{"type":37,"value":135},{"type":32,"tag":109,"props":2973,"children":2974},{"style":185},[2975],{"type":37,"value":2976},"\"Clé primaire\"\n",{"type":32,"tag":109,"props":2978,"children":2979},{"class":111,"line":261},[2980,2985],{"type":32,"tag":109,"props":2981,"children":2982},{"style":126},[2983],{"type":37,"value":2984},"        tests",{"type":32,"tag":109,"props":2986,"children":2987},{"style":132},[2988],{"type":37,"value":164},{"type":32,"tag":109,"props":2990,"children":2991},{"class":111,"line":279},[2992,2997],{"type":32,"tag":109,"props":2993,"children":2994},{"style":132},[2995],{"type":37,"value":2996},"          - ",{"type":32,"tag":109,"props":2998,"children":2999},{"style":185},[3000],{"type":37,"value":3001},"unique\n",{"type":32,"tag":109,"props":3003,"children":3004},{"class":111,"line":292},[3005,3009],{"type":32,"tag":109,"props":3006,"children":3007},{"style":132},[3008],{"type":37,"value":2996},{"type":32,"tag":109,"props":3010,"children":3011},{"style":185},[3012],{"type":37,"value":3013},"not_null\n",{"type":32,"tag":109,"props":3015,"children":3016},{"class":111,"line":310},[3017],{"type":32,"tag":109,"props":3018,"children":3019},{"emptyLinePlaceholder":148},[3020],{"type":37,"value":151},{"type":32,"tag":109,"props":3022,"children":3023},{"class":111,"line":323},[3024,3028,3032,3036],{"type":32,"tag":109,"props":3025,"children":3026},{"style":132},[3027],{"type":37,"value":245},{"type":32,"tag":109,"props":3029,"children":3030},{"style":126},[3031],{"type":37,"value":178},{"type":32,"tag":109,"props":3033,"children":3034},{"style":132},[3035],{"type":37,"value":135},{"type":32,"tag":109,"props":3037,"children":3038},{"style":185},[3039],{"type":37,"value":3040},"customer_id\n",{"type":32,"tag":109,"props":3042,"children":3043},{"class":111,"line":374},[3044,3048,3052],{"type":32,"tag":109,"props":3045,"children":3046},{"style":126},[3047],{"type":37,"value":2967},{"type":32,"tag":109,"props":3049,"children":3050},{"style":132},[3051],{"type":37,"value":135},{"type":32,"tag":109,"props":3053,"children":3054},{"style":185},[3055],{"type":37,"value":3056},"\"Clé étrangère vers dim_customers\"\n",{"type":32,"tag":109,"props":3058,"children":3059},{"class":111,"line":420},[3060,3064],{"type":32,"tag":109,"props":3061,"children":3062},{"style":126},[3063],{"type":37,"value":2984},{"type":32,"tag":109,"props":3065,"children":3066},{"style":132},[3067],{"type":37,"value":164},{"type":32,"tag":109,"props":3069,"children":3070},{"class":111,"line":428},[3071,3075],{"type":32,"tag":109,"props":3072,"children":3073},{"style":132},[3074],{"type":37,"value":2996},{"type":32,"tag":109,"props":3076,"children":3077},{"style":185},[3078],{"type":37,"value":3013},{"type":32,"tag":109,"props":3080,"children":3081},{"class":111,"line":449},[3082,3086,3091],{"type":32,"tag":109,"props":3083,"children":3084},{"style":132},[3085],{"type":37,"value":2996},{"type":32,"tag":109,"props":3087,"children":3088},{"style":126},[3089],{"type":37,"value":3090},"relationships",{"type":32,"tag":109,"props":3092,"children":3093},{"style":132},[3094],{"type":37,"value":164},{"type":32,"tag":109,"props":3096,"children":3097},{"class":111,"line":466},[3098,3103,3107],{"type":32,"tag":109,"props":3099,"children":3100},{"style":126},[3101],{"type":37,"value":3102},"              to",{"type":32,"tag":109,"props":3104,"children":3105},{"style":132},[3106],{"type":37,"value":135},{"type":32,"tag":109,"props":3108,"children":3109},{"style":185},[3110],{"type":37,"value":3111},"ref('dim_customers')\n",{"type":32,"tag":109,"props":3113,"children":3114},{"class":111,"line":478},[3115,3120,3124],{"type":32,"tag":109,"props":3116,"children":3117},{"style":126},[3118],{"type":37,"value":3119},"              field",{"type":32,"tag":109,"props":3121,"children":3122},{"style":132},[3123],{"type":37,"value":135},{"type":32,"tag":109,"props":3125,"children":3126},{"style":185},[3127],{"type":37,"value":3040},{"type":32,"tag":109,"props":3129,"children":3130},{"class":111,"line":499},[3131],{"type":32,"tag":109,"props":3132,"children":3133},{"emptyLinePlaceholder":148},[3134],{"type":37,"value":151},{"type":32,"tag":109,"props":3136,"children":3137},{"class":111,"line":517},[3138,3142,3146,3150],{"type":32,"tag":109,"props":3139,"children":3140},{"style":132},[3141],{"type":37,"value":245},{"type":32,"tag":109,"props":3143,"children":3144},{"style":126},[3145],{"type":37,"value":178},{"type":32,"tag":109,"props":3147,"children":3148},{"style":132},[3149],{"type":37,"value":135},{"type":32,"tag":109,"props":3151,"children":3152},{"style":185},[3153],{"type":37,"value":2007},{"type":32,"tag":109,"props":3155,"children":3156},{"class":111,"line":529},[3157,3161,3165],{"type":32,"tag":109,"props":3158,"children":3159},{"style":126},[3160],{"type":37,"value":2967},{"type":32,"tag":109,"props":3162,"children":3163},{"style":132},[3164],{"type":37,"value":135},{"type":32,"tag":109,"props":3166,"children":3167},{"style":185},[3168],{"type":37,"value":3169},"\"Total de commande en USD\"\n",{"type":32,"tag":109,"props":3171,"children":3172},{"class":111,"line":1680},[3173,3177],{"type":32,"tag":109,"props":3174,"children":3175},{"style":126},[3176],{"type":37,"value":2984},{"type":32,"tag":109,"props":3178,"children":3179},{"style":132},[3180],{"type":37,"value":164},{"type":32,"tag":109,"props":3182,"children":3183},{"class":111,"line":1688},[3184,3188],{"type":32,"tag":109,"props":3185,"children":3186},{"style":132},[3187],{"type":37,"value":2996},{"type":32,"tag":109,"props":3189,"children":3190},{"style":185},[3191],{"type":37,"value":3013},{"type":32,"tag":109,"props":3193,"children":3194},{"class":111,"line":2718},[3195,3199,3204],{"type":32,"tag":109,"props":3196,"children":3197},{"style":132},[3198],{"type":37,"value":2996},{"type":32,"tag":109,"props":3200,"children":3201},{"style":126},[3202],{"type":37,"value":3203},"dbt_utils.expression_is_true",{"type":32,"tag":109,"props":3205,"children":3206},{"style":132},[3207],{"type":37,"value":164},{"type":32,"tag":109,"props":3209,"children":3210},{"class":111,"line":2735},[3211,3216,3220],{"type":32,"tag":109,"props":3212,"children":3213},{"style":126},[3214],{"type":37,"value":3215},"              expression",{"type":32,"tag":109,"props":3217,"children":3218},{"style":132},[3219],{"type":37,"value":135},{"type":32,"tag":109,"props":3221,"children":3222},{"style":185},[3223],{"type":37,"value":3224},"\">= 0\"\n",{"type":32,"tag":109,"props":3226,"children":3228},{"class":111,"line":3227},28,[3229],{"type":32,"tag":109,"props":3230,"children":3231},{"emptyLinePlaceholder":148},[3232],{"type":37,"value":151},{"type":32,"tag":109,"props":3234,"children":3236},{"class":111,"line":3235},29,[3237,3241,3245,3249],{"type":32,"tag":109,"props":3238,"children":3239},{"style":132},[3240],{"type":37,"value":245},{"type":32,"tag":109,"props":3242,"children":3243},{"style":126},[3244],{"type":37,"value":178},{"type":32,"tag":109,"props":3246,"children":3247},{"style":132},[3248],{"type":37,"value":135},{"type":32,"tag":109,"props":3250,"children":3251},{"style":185},[3252],{"type":37,"value":2024},{"type":32,"tag":109,"props":3254,"children":3256},{"class":111,"line":3255},30,[3257,3261],{"type":32,"tag":109,"props":3258,"children":3259},{"style":126},[3260],{"type":37,"value":2984},{"type":32,"tag":109,"props":3262,"children":3263},{"style":132},[3264],{"type":37,"value":164},{"type":32,"tag":109,"props":3266,"children":3268},{"class":111,"line":3267},31,[3269,3273],{"type":32,"tag":109,"props":3270,"children":3271},{"style":132},[3272],{"type":37,"value":2996},{"type":32,"tag":109,"props":3274,"children":3275},{"style":185},[3276],{"type":37,"value":3013},{"type":32,"tag":109,"props":3278,"children":3280},{"class":111,"line":3279},32,[3281,3285,3290],{"type":32,"tag":109,"props":3282,"children":3283},{"style":132},[3284],{"type":37,"value":2996},{"type":32,"tag":109,"props":3286,"children":3287},{"style":126},[3288],{"type":37,"value":3289},"dbt_utils.accepted_range",{"type":32,"tag":109,"props":3291,"children":3292},{"style":132},[3293],{"type":37,"value":164},{"type":32,"tag":109,"props":3295,"children":3297},{"class":111,"line":3296},33,[3298,3303,3307],{"type":32,"tag":109,"props":3299,"children":3300},{"style":126},[3301],{"type":37,"value":3302},"              min_value",{"type":32,"tag":109,"props":3304,"children":3305},{"style":132},[3306],{"type":37,"value":135},{"type":32,"tag":109,"props":3308,"children":3309},{"style":185},[3310],{"type":37,"value":3311},"\"'2020-01-01'\"\n",{"type":32,"tag":109,"props":3313,"children":3315},{"class":111,"line":3314},34,[3316,3321,3325],{"type":32,"tag":109,"props":3317,"children":3318},{"style":126},[3319],{"type":37,"value":3320},"              max_value",{"type":32,"tag":109,"props":3322,"children":3323},{"style":132},[3324],{"type":37,"value":135},{"type":32,"tag":109,"props":3326,"children":3327},{"style":185},[3328],{"type":37,"value":3329},"\"current_date()\"\n",{"type":32,"tag":33,"props":3331,"children":3332},{},[3333,3335,3341,3343,3349],{"type":37,"value":3334},"La commande ",{"type":32,"tag":52,"props":3336,"children":3338},{"className":3337},[],[3339],{"type":37,"value":3340},"dbt test",{"type":37,"value":3342}," exécute ces contrôles. Si une anomalie apparaît — ",{"type":32,"tag":52,"props":3344,"children":3346},{"className":3345},[],[3347],{"type":37,"value":3348},"order_total \u003C 0",{"type":37,"value":3350}," — la construction échoue, une alerte Slack est envoyée. Les consommateurs en aval utilisent ce contrat en confiance — la qualité des données est assurée dans le pipeline, pas dans l'outil de BI.",{"type":32,"tag":33,"props":3352,"children":3353},{},[3354,3356,3362],{"type":37,"value":3355},"Ajouter un test personnalisé est simple : on place un fichier SQL dans le répertoire ",{"type":32,"tag":52,"props":3357,"children":3359},{"className":3358},[],[3360],{"type":37,"value":3361},"tests\u002F",{"type":37,"value":3363},". Exemple : « Chaque client ne doit avoir qu'un seul abonnement actif » :",{"type":32,"tag":99,"props":3365,"children":3367},{"className":692,"code":3366,"language":694,"meta":16,"style":16},"-- tests\u002Fassert_single_active_subscription.sql\nwith duplicate_subscriptions as (\n    select\n        customer_id,\n        count(*) as active_count\n    from {{ ref('fct_subscriptions') }}\n    where status = 'active'\n    group by 1\n    having count(*) > 1\n)\n\nselect * from duplicate_subscriptions\n",[3368],{"type":32,"tag":52,"props":3369,"children":3370},{"__ignoreMap":16},[3371,3379,3399,3406,3414,3442,3462,3483,3496,3530,3537,3544],{"type":32,"tag":109,"props":3372,"children":3373},{"class":111,"line":112},[3374],{"type":32,"tag":109,"props":3375,"children":3376},{"style":116},[3377],{"type":37,"value":3378},"-- tests\u002Fassert_single_active_subscription.sql\n",{"type":32,"tag":109,"props":3380,"children":3381},{"class":111,"line":122},[3382,3386,3391,3395],{"type":32,"tag":109,"props":3383,"children":3384},{"style":712},[3385],{"type":37,"value":715},{"type":32,"tag":109,"props":3387,"children":3388},{"style":132},[3389],{"type":37,"value":3390}," duplicate_subscriptions ",{"type":32,"tag":109,"props":3392,"children":3393},{"style":712},[3394],{"type":37,"value":725},{"type":32,"tag":109,"props":3396,"children":3397},{"style":132},[3398],{"type":37,"value":730},{"type":32,"tag":109,"props":3400,"children":3401},{"class":111,"line":144},[3402],{"type":32,"tag":109,"props":3403,"children":3404},{"style":712},[3405],{"type":37,"value":880},{"type":32,"tag":109,"props":3407,"children":3408},{"class":111,"line":154},[3409],{"type":32,"tag":109,"props":3410,"children":3411},{"style":132},[3412],{"type":37,"value":3413},"        customer_id,\n",{"type":32,"tag":109,"props":3415,"children":3416},{"class":111,"line":167},[3417,3421,3425,3429,3433,3437],{"type":32,"tag":109,"props":3418,"children":3419},{"style":138},[3420],{"type":37,"value":1377},{"type":32,"tag":109,"props":3422,"children":3423},{"style":132},[3424],{"type":37,"value":1382},{"type":32,"tag":109,"props":3426,"children":3427},{"style":712},[3428],{"type":37,"value":1387},{"type":32,"tag":109,"props":3430,"children":3431},{"style":132},[3432],{"type":37,"value":966},{"type":32,"tag":109,"props":3434,"children":3435},{"style":712},[3436],{"type":37,"value":725},{"type":32,"tag":109,"props":3438,"children":3439},{"style":132},[3440],{"type":37,"value":3441}," active_count\n",{"type":32,"tag":109,"props":3443,"children":3444},{"class":111,"line":191},[3445,3449,3453,3458],{"type":32,"tag":109,"props":3446,"children":3447},{"style":712},[3448],{"type":37,"value":1082},{"type":32,"tag":109,"props":3450,"children":3451},{"style":132},[3452],{"type":37,"value":1433},{"type":32,"tag":109,"props":3454,"children":3455},{"style":185},[3456],{"type":37,"value":3457},"'fct_subscriptions'",{"type":32,"tag":109,"props":3459,"children":3460},{"style":132},[3461],{"type":37,"value":772},{"type":32,"tag":109,"props":3463,"children":3464},{"class":111,"line":209},[3465,3469,3474,3478],{"type":32,"tag":109,"props":3466,"children":3467},{"style":712},[3468],{"type":37,"value":780},{"type":32,"tag":109,"props":3470,"children":3471},{"style":712},[3472],{"type":37,"value":3473}," status",{"type":32,"tag":109,"props":3475,"children":3476},{"style":712},[3477],{"type":37,"value":956},{"type":32,"tag":109,"props":3479,"children":3480},{"style":185},[3481],{"type":37,"value":3482}," 'active'\n",{"type":32,"tag":109,"props":3484,"children":3485},{"class":111,"line":227},[3486,3491],{"type":32,"tag":109,"props":3487,"children":3488},{"style":712},[3489],{"type":37,"value":3490},"    group by",{"type":32,"tag":109,"props":3492,"children":3493},{"style":138},[3494],{"type":37,"value":3495}," 1\n",{"type":32,"tag":109,"props":3497,"children":3498},{"class":111,"line":26},[3499,3504,3509,3513,3517,3521,3526],{"type":32,"tag":109,"props":3500,"children":3501},{"style":712},[3502],{"type":37,"value":3503},"    having",{"type":32,"tag":109,"props":3505,"children":3506},{"style":138},[3507],{"type":37,"value":3508}," count",{"type":32,"tag":109,"props":3510,"children":3511},{"style":132},[3512],{"type":37,"value":1382},{"type":32,"tag":109,"props":3514,"children":3515},{"style":712},[3516],{"type":37,"value":1387},{"type":32,"tag":109,"props":3518,"children":3519},{"style":132},[3520],{"type":37,"value":966},{"type":32,"tag":109,"props":3522,"children":3523},{"style":712},[3524],{"type":37,"value":3525},">",{"type":32,"tag":109,"props":3527,"children":3528},{"style":138},[3529],{"type":37,"value":3495},{"type":32,"tag":109,"props":3531,"children":3532},{"class":111,"line":261},[3533],{"type":32,"tag":109,"props":3534,"children":3535},{"style":132},[3536],{"type":37,"value":1128},{"type":32,"tag":109,"props":3538,"children":3539},{"class":111,"line":279},[3540],{"type":32,"tag":109,"props":3541,"children":3542},{"emptyLinePlaceholder":148},[3543],{"type":37,"value":151},{"type":32,"tag":109,"props":3545,"children":3546},{"class":111,"line":292},[3547,3551,3555,3559],{"type":32,"tag":109,"props":3548,"children":3549},{"style":712},[3550],{"type":37,"value":917},{"type":32,"tag":109,"props":3552,"children":3553},{"style":712},[3554],{"type":37,"value":743},{"type":32,"tag":109,"props":3556,"children":3557},{"style":712},[3558],{"type":37,"value":748},{"type":32,"tag":109,"props":3560,"children":3561},{"style":132},[3562],{"type":37,"value":3563}," duplicate_subscriptions\n",{"type":32,"tag":33,"props":3565,"children":3566},{},[3567],{"type":37,"value":3568},"Si cette requête retourne des lignes, le test échoue. Quand la couverture de test dépasse 80 %, le nombre d'incidents liés aux données diminue — métrique Roibase 2023 : au-delà de 85 % de couverture de test, les alertes de tableau de bord erroné baissent de 60 %.",{"type":32,"tag":40,"props":3570,"children":3572},{"id":3571},"orchestration-de-pipeline-et-déploiement-en-production",[3573],{"type":37,"value":3574},"Orchestration de pipeline et déploiement en production",{"type":32,"tag":33,"props":3576,"children":3577},{},[3578,3580,3586,3588,3594,3596,3600,3602,3607],{"type":37,"value":3579},"Si vous utilisez dbt Cloud, on définit un job planifié : chaque jour à 04h00, la commande ",{"type":32,"tag":52,"props":3581,"children":3583},{"className":3582},[],[3584],{"type":37,"value":3585},"dbt build --select +fct_orders",{"type":37,"value":3587}," s'exécute. En auto-hébergé, on ajoute un opérateur ",{"type":32,"tag":52,"props":3589,"children":3591},{"className":3590},[],[3592],{"type":37,"value":3593},"BashOperator",{"type":37,"value":3595}," au DAG Airflow avec la commande dbt. Grâce à la stratégie ",{"type":32,"tag":83,"props":3597,"children":3598},{},[3599],{"type":37,"value":1192},{"type":37,"value":3601}," de dbt, 90 jours de données sont traités en 5 minutes — le ",{"type":32,"tag":83,"props":3603,"children":3604},{},[3605],{"type":37,"value":3606},"full refresh",{"type":37,"value":3608}," devient inutile.",{"type":32,"tag":33,"props":3610,"children":3611},{},[3612,3614,3620,3622,3627],{"type":37,"value":3613},"Le processus CI\u002FCD : une pull request déclenche ",{"type":32,"tag":52,"props":3615,"children":3617},{"className":3616},[],[3618],{"type":37,"value":3619},"dbt build --select state:modified+",{"type":37,"value":3621}," — seuls les modèles modifiés et leurs dépendances en aval sont testés. Après la fusion, le déploiement se fait sur le dataset BigQuery de production. Slim CI de dbt réduit le temps de construction PR sur un projet de 200 modèles à 3 minutes (sinon 40 minutes pour un ",{"type":32,"tag":83,"props":3623,"children":3624},{},[3625],{"type":37,"value":3626},"full build",{"type":37,"value":3628},").",{"type":32,"tag":33,"props":3630,"children":3631},{},[3632],{"type":37,"value":3633},"En production, la sortie",{"type":32,"tag":3635,"props":3636,"children":3637},"style",{},[3638],{"type":37,"value":3639},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":144,"depth":144,"links":3641},[3642,3643,3644,3645,3646,3647],{"id":42,"depth":122,"text":45},{"id":638,"depth":122,"text":641},{"id":1832,"depth":122,"text":1835},{"id":2350,"depth":122,"text":2353},{"id":2827,"depth":122,"text":2830},{"id":3571,"depth":122,"text":3574},"markdown","content:fr:data:dbt-bigquery-stack-marketing-data-moderne.md","content","fr\u002Fdata\u002Fdbt-bigquery-stack-marketing-data-moderne.md","fr\u002Fdata\u002Fdbt-bigquery-stack-marketing-data-moderne","md",1785276286922]