[{"data":1,"prerenderedAt":3070},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack":10},{"i18nKey":4,"paths":5},"data-002-2026-06",{"es":6,"fr":7,"it":8,"ru":9},"\u002Fes\u002Fdata\u002Fdbt-bigquery-modern-stack-marketing-data","\u002Ffr\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack","\u002Fit\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack","\u002Fru\u002Fdata\u002Fdbt-bigquery-sovremenniy-marketing-data-stack",{"_path":7,"_dir":11,"_draft":12,"_partial":12,"_locale":13,"title":14,"description":15,"publishedAt":16,"modifiedAt":16,"category":11,"i18nKey":4,"tags":17,"readingTime":23,"author":24,"body":25,"_type":3064,"_id":3065,"_source":3066,"_file":3067,"_stem":3068,"_extension":3069},"data",false,"","dbt + BigQuery avec une Modern Marketing Data Stack","Source mapping, modeling layer, semantic layer, exposures : une architecture production-ready qui transforme les données marketing en mécanisme décisionnel.","2026-06-30",[18,19,20,21,22],"dbt","bigquery","data-modeling","semantic-layer","marketing-analytics",8,"Roibase",{"type":26,"children":27,"toc":3051},"root",[28,36,43,65,463,505,554,561,582,961,990,996,1023,1033,1217,1227,1445,1455,1689,1718,1724,1729,2002,2026,2032,2045,2426,2443,2448,2506,2519,2525,2538,2915,2936,2942,2947,3019,3024,3030,3035,3040,3045],{"type":29,"tag":30,"props":31,"children":32},"element","p",{},[33],{"type":34,"value":35},"text","Les équipes marketing produisent toujours des rapports à partir de pivot Excel, les data teams réécrivent du SQL pour chaque nouvelle question, les KPI divergent entre départements. En 2026, tolérer ce scénario est une erreur d'ingénierie. La modern marketing data stack fonctionne en trois couches : intégration brute des sources, couche de transformation, couche sémantique. dbt + BigQuery livre ces trois couches en production-grade — version control, test coverage, lineage tracking inclus.",{"type":29,"tag":37,"props":38,"children":40},"h2",{"id":39},"source-mapping-transférer-les-données-brutes-vers-une-zone-sécurisée",[41],{"type":34,"value":42},"Source Mapping : Transférer les Données Brutes vers une Zone Sécurisée",{"type":29,"tag":30,"props":44,"children":45},{},[46,48,55,57,63],{"type":34,"value":47},"Extraire les données marketing dans BigQuery semble simple : des outils ETL comme Fivetran, Stitch, Airbyte injectent GA4, Meta Ads, Google Ads directement dans le schéma ",{"type":29,"tag":49,"props":50,"children":52},"code",{"className":51},[],[53],{"type":34,"value":54},"raw_",{"type":34,"value":56},". Mais six mois plus tard, quand le schéma brut change, les modèles en aval se cassent. Les ",{"type":29,"tag":58,"props":59,"children":60},"strong",{},[61],{"type":34,"value":62},"définitions de sources",{"type":34,"value":64}," de dbt contrôlent ce risque.",{"type":29,"tag":66,"props":67,"children":71},"pre",{"className":68,"code":69,"language":70,"meta":13,"style":13},"language-yaml shiki shiki-themes github-dark","# models\u002Fsources.yml\nversion: 2\n\nsources:\n  - name: ga4\n    database: analytics_prod\n    schema: raw_ga4\n    tables:\n      - name: events_*\n        freshness:\n          warn_after: {count: 6, period: hour}\n          error_after: {count: 12, period: hour}\n        loaded_at_field: event_timestamp\n        columns:\n          - name: event_name\n            tests:\n              - not_null\n          - name: user_pseudo_id\n            tests:\n              - not_null\n","yaml",[72],{"type":29,"tag":49,"props":73,"children":74},{"__ignoreMap":13},[75,87,109,119,133,157,175,193,205,227,240,292,338,356,369,391,404,418,439,451],{"type":29,"tag":76,"props":77,"children":80},"span",{"class":78,"line":79},"line",1,[81],{"type":29,"tag":76,"props":82,"children":84},{"style":83},"--shiki-default:#6A737D",[85],{"type":34,"value":86},"# models\u002Fsources.yml\n",{"type":29,"tag":76,"props":88,"children":90},{"class":78,"line":89},2,[91,97,103],{"type":29,"tag":76,"props":92,"children":94},{"style":93},"--shiki-default:#85E89D",[95],{"type":34,"value":96},"version",{"type":29,"tag":76,"props":98,"children":100},{"style":99},"--shiki-default:#E1E4E8",[101],{"type":34,"value":102},": ",{"type":29,"tag":76,"props":104,"children":106},{"style":105},"--shiki-default:#79B8FF",[107],{"type":34,"value":108},"2\n",{"type":29,"tag":76,"props":110,"children":112},{"class":78,"line":111},3,[113],{"type":29,"tag":76,"props":114,"children":116},{"emptyLinePlaceholder":115},true,[117],{"type":34,"value":118},"\n",{"type":29,"tag":76,"props":120,"children":122},{"class":78,"line":121},4,[123,128],{"type":29,"tag":76,"props":124,"children":125},{"style":93},[126],{"type":34,"value":127},"sources",{"type":29,"tag":76,"props":129,"children":130},{"style":99},[131],{"type":34,"value":132},":\n",{"type":29,"tag":76,"props":134,"children":136},{"class":78,"line":135},5,[137,142,147,151],{"type":29,"tag":76,"props":138,"children":139},{"style":99},[140],{"type":34,"value":141},"  - ",{"type":29,"tag":76,"props":143,"children":144},{"style":93},[145],{"type":34,"value":146},"name",{"type":29,"tag":76,"props":148,"children":149},{"style":99},[150],{"type":34,"value":102},{"type":29,"tag":76,"props":152,"children":154},{"style":153},"--shiki-default:#9ECBFF",[155],{"type":34,"value":156},"ga4\n",{"type":29,"tag":76,"props":158,"children":160},{"class":78,"line":159},6,[161,166,170],{"type":29,"tag":76,"props":162,"children":163},{"style":93},[164],{"type":34,"value":165},"    database",{"type":29,"tag":76,"props":167,"children":168},{"style":99},[169],{"type":34,"value":102},{"type":29,"tag":76,"props":171,"children":172},{"style":153},[173],{"type":34,"value":174},"analytics_prod\n",{"type":29,"tag":76,"props":176,"children":178},{"class":78,"line":177},7,[179,184,188],{"type":29,"tag":76,"props":180,"children":181},{"style":93},[182],{"type":34,"value":183},"    schema",{"type":29,"tag":76,"props":185,"children":186},{"style":99},[187],{"type":34,"value":102},{"type":29,"tag":76,"props":189,"children":190},{"style":153},[191],{"type":34,"value":192},"raw_ga4\n",{"type":29,"tag":76,"props":194,"children":195},{"class":78,"line":23},[196,201],{"type":29,"tag":76,"props":197,"children":198},{"style":93},[199],{"type":34,"value":200},"    tables",{"type":29,"tag":76,"props":202,"children":203},{"style":99},[204],{"type":34,"value":132},{"type":29,"tag":76,"props":206,"children":208},{"class":78,"line":207},9,[209,214,218,222],{"type":29,"tag":76,"props":210,"children":211},{"style":99},[212],{"type":34,"value":213},"      - ",{"type":29,"tag":76,"props":215,"children":216},{"style":93},[217],{"type":34,"value":146},{"type":29,"tag":76,"props":219,"children":220},{"style":99},[221],{"type":34,"value":102},{"type":29,"tag":76,"props":223,"children":224},{"style":153},[225],{"type":34,"value":226},"events_*\n",{"type":29,"tag":76,"props":228,"children":230},{"class":78,"line":229},10,[231,236],{"type":29,"tag":76,"props":232,"children":233},{"style":93},[234],{"type":34,"value":235},"        freshness",{"type":29,"tag":76,"props":237,"children":238},{"style":99},[239],{"type":34,"value":132},{"type":29,"tag":76,"props":241,"children":243},{"class":78,"line":242},11,[244,249,254,259,263,268,273,278,282,287],{"type":29,"tag":76,"props":245,"children":246},{"style":93},[247],{"type":34,"value":248},"          warn_after",{"type":29,"tag":76,"props":250,"children":251},{"style":99},[252],{"type":34,"value":253},": {",{"type":29,"tag":76,"props":255,"children":256},{"style":93},[257],{"type":34,"value":258},"count",{"type":29,"tag":76,"props":260,"children":261},{"style":99},[262],{"type":34,"value":102},{"type":29,"tag":76,"props":264,"children":265},{"style":105},[266],{"type":34,"value":267},"6",{"type":29,"tag":76,"props":269,"children":270},{"style":99},[271],{"type":34,"value":272},", ",{"type":29,"tag":76,"props":274,"children":275},{"style":93},[276],{"type":34,"value":277},"period",{"type":29,"tag":76,"props":279,"children":280},{"style":99},[281],{"type":34,"value":102},{"type":29,"tag":76,"props":283,"children":284},{"style":153},[285],{"type":34,"value":286},"hour",{"type":29,"tag":76,"props":288,"children":289},{"style":99},[290],{"type":34,"value":291},"}\n",{"type":29,"tag":76,"props":293,"children":295},{"class":78,"line":294},12,[296,301,305,309,313,318,322,326,330,334],{"type":29,"tag":76,"props":297,"children":298},{"style":93},[299],{"type":34,"value":300},"          error_after",{"type":29,"tag":76,"props":302,"children":303},{"style":99},[304],{"type":34,"value":253},{"type":29,"tag":76,"props":306,"children":307},{"style":93},[308],{"type":34,"value":258},{"type":29,"tag":76,"props":310,"children":311},{"style":99},[312],{"type":34,"value":102},{"type":29,"tag":76,"props":314,"children":315},{"style":105},[316],{"type":34,"value":317},"12",{"type":29,"tag":76,"props":319,"children":320},{"style":99},[321],{"type":34,"value":272},{"type":29,"tag":76,"props":323,"children":324},{"style":93},[325],{"type":34,"value":277},{"type":29,"tag":76,"props":327,"children":328},{"style":99},[329],{"type":34,"value":102},{"type":29,"tag":76,"props":331,"children":332},{"style":153},[333],{"type":34,"value":286},{"type":29,"tag":76,"props":335,"children":336},{"style":99},[337],{"type":34,"value":291},{"type":29,"tag":76,"props":339,"children":341},{"class":78,"line":340},13,[342,347,351],{"type":29,"tag":76,"props":343,"children":344},{"style":93},[345],{"type":34,"value":346},"        loaded_at_field",{"type":29,"tag":76,"props":348,"children":349},{"style":99},[350],{"type":34,"value":102},{"type":29,"tag":76,"props":352,"children":353},{"style":153},[354],{"type":34,"value":355},"event_timestamp\n",{"type":29,"tag":76,"props":357,"children":359},{"class":78,"line":358},14,[360,365],{"type":29,"tag":76,"props":361,"children":362},{"style":93},[363],{"type":34,"value":364},"        columns",{"type":29,"tag":76,"props":366,"children":367},{"style":99},[368],{"type":34,"value":132},{"type":29,"tag":76,"props":370,"children":372},{"class":78,"line":371},15,[373,378,382,386],{"type":29,"tag":76,"props":374,"children":375},{"style":99},[376],{"type":34,"value":377},"          - ",{"type":29,"tag":76,"props":379,"children":380},{"style":93},[381],{"type":34,"value":146},{"type":29,"tag":76,"props":383,"children":384},{"style":99},[385],{"type":34,"value":102},{"type":29,"tag":76,"props":387,"children":388},{"style":153},[389],{"type":34,"value":390},"event_name\n",{"type":29,"tag":76,"props":392,"children":394},{"class":78,"line":393},16,[395,400],{"type":29,"tag":76,"props":396,"children":397},{"style":93},[398],{"type":34,"value":399},"            tests",{"type":29,"tag":76,"props":401,"children":402},{"style":99},[403],{"type":34,"value":132},{"type":29,"tag":76,"props":405,"children":407},{"class":78,"line":406},17,[408,413],{"type":29,"tag":76,"props":409,"children":410},{"style":99},[411],{"type":34,"value":412},"              - ",{"type":29,"tag":76,"props":414,"children":415},{"style":153},[416],{"type":34,"value":417},"not_null\n",{"type":29,"tag":76,"props":419,"children":421},{"class":78,"line":420},18,[422,426,430,434],{"type":29,"tag":76,"props":423,"children":424},{"style":99},[425],{"type":34,"value":377},{"type":29,"tag":76,"props":427,"children":428},{"style":93},[429],{"type":34,"value":146},{"type":29,"tag":76,"props":431,"children":432},{"style":99},[433],{"type":34,"value":102},{"type":29,"tag":76,"props":435,"children":436},{"style":153},[437],{"type":34,"value":438},"user_pseudo_id\n",{"type":29,"tag":76,"props":440,"children":442},{"class":78,"line":441},19,[443,447],{"type":29,"tag":76,"props":444,"children":445},{"style":93},[446],{"type":34,"value":399},{"type":29,"tag":76,"props":448,"children":449},{"style":99},[450],{"type":34,"value":132},{"type":29,"tag":76,"props":452,"children":454},{"class":78,"line":453},20,[455,459],{"type":29,"tag":76,"props":456,"children":457},{"style":99},[458],{"type":34,"value":412},{"type":29,"tag":76,"props":460,"children":461},{"style":153},[462],{"type":34,"value":417},{"type":29,"tag":30,"props":464,"children":465},{},[466,468,473,475,481,483,488,490,495,497,503],{"type":34,"value":467},"Une définition de source remplit trois fonctions : ",{"type":29,"tag":58,"props":469,"children":470},{},[471],{"type":34,"value":472},"(1)",{"type":34,"value":474}," alerte sur les changements en aval (la métrique ",{"type":29,"tag":49,"props":476,"children":478},{"className":477},[],[479],{"type":34,"value":480},"freshness",{"type":34,"value":482}," pousse sur Slack), ",{"type":29,"tag":58,"props":484,"children":485},{},[486],{"type":34,"value":487},"(2)",{"type":34,"value":489}," contrat de schéma (la liste des colonnes devient documentation), ",{"type":29,"tag":58,"props":491,"children":492},{},[493],{"type":34,"value":494},"(3)",{"type":34,"value":496}," tracking de lineage (dbt docs montre quels modèles dépendent de GA4). Quand Fivetran change de schéma, ",{"type":29,"tag":49,"props":498,"children":500},{"className":499},[],[501],{"type":34,"value":502},"dbt compile",{"type":34,"value":504}," échoue — la production n'explose pas.",{"type":29,"tag":30,"props":506,"children":507},{},[508,510,516,517,523,524,530,531,537,538,544,546,552],{"type":34,"value":509},"À ce stade du source mapping, étiquez les signaux d'identité : ",{"type":29,"tag":49,"props":511,"children":513},{"className":512},[],[514],{"type":34,"value":515},"user_id",{"type":34,"value":272},{"type":29,"tag":49,"props":518,"children":520},{"className":519},[],[521],{"type":34,"value":522},"client_id",{"type":34,"value":272},{"type":29,"tag":49,"props":525,"children":527},{"className":526},[],[528],{"type":34,"value":529},"fbclid",{"type":34,"value":272},{"type":29,"tag":49,"props":532,"children":534},{"className":533},[],[535],{"type":34,"value":536},"gclid",{"type":34,"value":272},{"type":29,"tag":49,"props":539,"children":541},{"className":540},[],[542],{"type":34,"value":543},"email_sha256",{"type":34,"value":545},". Dans la couche de modeling à venir, vous fusionnerez ces signaux en un seul ",{"type":29,"tag":49,"props":547,"children":549},{"className":548},[],[550],{"type":34,"value":551},"customer_id",{"type":34,"value":553},". Perdre les signaux dans la table brute rend l'aval impossible.",{"type":29,"tag":555,"props":556,"children":558},"h3",{"id":557},"stratégie-de-partitionnement",[559],{"type":34,"value":560},"Stratégie de Partitionnement",{"type":29,"tag":30,"props":562,"children":563},{},[564,566,572,574,580],{"type":34,"value":565},"GA4 utilise des tables wildcard quotidiennes (",{"type":29,"tag":49,"props":567,"children":569},{"className":568},[],[570],{"type":34,"value":571},"events_20260630",{"type":34,"value":573},"). Dans dbt, définissez une source wildcard et filtrez avec ",{"type":29,"tag":49,"props":575,"children":577},{"className":576},[],[578],{"type":34,"value":579},"_TABLE_SUFFIX",{"type":34,"value":581}," :",{"type":29,"tag":66,"props":583,"children":587},{"className":584,"code":585,"language":586,"meta":13,"style":13},"language-sql shiki shiki-themes github-dark","-- models\u002Fstaging\u002Fstg_ga4_events.sql\n{{\n  config(\n    materialized='incremental',\n    partition_by={'field': 'event_date', 'data_type': 'date'},\n    cluster_by=['event_name', 'user_pseudo_id']\n  )\n}}\n\nselect\n  parse_date('%Y%m%d', _table_suffix) as event_date,\n  event_timestamp,\n  event_name,\n  user_pseudo_id,\n  ...\nfrom {{ source('ga4', 'events_*') }}\nwhere _table_suffix >= format_date('%Y%m%d', date_sub(current_date(), interval 3 day))\n{% if is_incremental() %}\n  and parse_date('%Y%m%d', _table_suffix) > (select max(event_date) from {{ this }})\n{% endif %}\n","sql",[588],{"type":29,"tag":49,"props":589,"children":590},{"__ignoreMap":13},[591,599,607,615,639,693,710,718,726,733,741,769,777,785,793,801,833,880,898,953],{"type":29,"tag":76,"props":592,"children":593},{"class":78,"line":79},[594],{"type":29,"tag":76,"props":595,"children":596},{"style":83},[597],{"type":34,"value":598},"-- models\u002Fstaging\u002Fstg_ga4_events.sql\n",{"type":29,"tag":76,"props":600,"children":601},{"class":78,"line":89},[602],{"type":29,"tag":76,"props":603,"children":604},{"style":99},[605],{"type":34,"value":606},"{{\n",{"type":29,"tag":76,"props":608,"children":609},{"class":78,"line":111},[610],{"type":29,"tag":76,"props":611,"children":612},{"style":99},[613],{"type":34,"value":614},"  config(\n",{"type":29,"tag":76,"props":616,"children":617},{"class":78,"line":121},[618,623,629,634],{"type":29,"tag":76,"props":619,"children":620},{"style":99},[621],{"type":34,"value":622},"    materialized",{"type":29,"tag":76,"props":624,"children":626},{"style":625},"--shiki-default:#F97583",[627],{"type":34,"value":628},"=",{"type":29,"tag":76,"props":630,"children":631},{"style":153},[632],{"type":34,"value":633},"'incremental'",{"type":29,"tag":76,"props":635,"children":636},{"style":99},[637],{"type":34,"value":638},",\n",{"type":29,"tag":76,"props":640,"children":641},{"class":78,"line":135},[642,647,651,656,661,665,670,674,679,683,688],{"type":29,"tag":76,"props":643,"children":644},{"style":99},[645],{"type":34,"value":646},"    partition_by",{"type":29,"tag":76,"props":648,"children":649},{"style":625},[650],{"type":34,"value":628},{"type":29,"tag":76,"props":652,"children":653},{"style":99},[654],{"type":34,"value":655},"{",{"type":29,"tag":76,"props":657,"children":658},{"style":153},[659],{"type":34,"value":660},"'field'",{"type":29,"tag":76,"props":662,"children":663},{"style":99},[664],{"type":34,"value":102},{"type":29,"tag":76,"props":666,"children":667},{"style":153},[668],{"type":34,"value":669},"'event_date'",{"type":29,"tag":76,"props":671,"children":672},{"style":99},[673],{"type":34,"value":272},{"type":29,"tag":76,"props":675,"children":676},{"style":153},[677],{"type":34,"value":678},"'data_type'",{"type":29,"tag":76,"props":680,"children":681},{"style":99},[682],{"type":34,"value":102},{"type":29,"tag":76,"props":684,"children":685},{"style":153},[686],{"type":34,"value":687},"'date'",{"type":29,"tag":76,"props":689,"children":690},{"style":99},[691],{"type":34,"value":692},"},\n",{"type":29,"tag":76,"props":694,"children":695},{"class":78,"line":159},[696,701,705],{"type":29,"tag":76,"props":697,"children":698},{"style":99},[699],{"type":34,"value":700},"    cluster_by",{"type":29,"tag":76,"props":702,"children":703},{"style":625},[704],{"type":34,"value":628},{"type":29,"tag":76,"props":706,"children":707},{"style":99},[708],{"type":34,"value":709},"['event_name', 'user_pseudo_id']\n",{"type":29,"tag":76,"props":711,"children":712},{"class":78,"line":177},[713],{"type":29,"tag":76,"props":714,"children":715},{"style":99},[716],{"type":34,"value":717},"  )\n",{"type":29,"tag":76,"props":719,"children":720},{"class":78,"line":23},[721],{"type":29,"tag":76,"props":722,"children":723},{"style":99},[724],{"type":34,"value":725},"}}\n",{"type":29,"tag":76,"props":727,"children":728},{"class":78,"line":207},[729],{"type":29,"tag":76,"props":730,"children":731},{"emptyLinePlaceholder":115},[732],{"type":34,"value":118},{"type":29,"tag":76,"props":734,"children":735},{"class":78,"line":229},[736],{"type":29,"tag":76,"props":737,"children":738},{"style":625},[739],{"type":34,"value":740},"select\n",{"type":29,"tag":76,"props":742,"children":743},{"class":78,"line":242},[744,749,754,759,764],{"type":29,"tag":76,"props":745,"children":746},{"style":99},[747],{"type":34,"value":748},"  parse_date(",{"type":29,"tag":76,"props":750,"children":751},{"style":153},[752],{"type":34,"value":753},"'%Y%m%d'",{"type":29,"tag":76,"props":755,"children":756},{"style":99},[757],{"type":34,"value":758},", _table_suffix) ",{"type":29,"tag":76,"props":760,"children":761},{"style":625},[762],{"type":34,"value":763},"as",{"type":29,"tag":76,"props":765,"children":766},{"style":99},[767],{"type":34,"value":768}," event_date,\n",{"type":29,"tag":76,"props":770,"children":771},{"class":78,"line":294},[772],{"type":29,"tag":76,"props":773,"children":774},{"style":99},[775],{"type":34,"value":776},"  event_timestamp,\n",{"type":29,"tag":76,"props":778,"children":779},{"class":78,"line":340},[780],{"type":29,"tag":76,"props":781,"children":782},{"style":99},[783],{"type":34,"value":784},"  event_name,\n",{"type":29,"tag":76,"props":786,"children":787},{"class":78,"line":358},[788],{"type":29,"tag":76,"props":789,"children":790},{"style":99},[791],{"type":34,"value":792},"  user_pseudo_id,\n",{"type":29,"tag":76,"props":794,"children":795},{"class":78,"line":371},[796],{"type":29,"tag":76,"props":797,"children":798},{"style":99},[799],{"type":34,"value":800},"  ...\n",{"type":29,"tag":76,"props":802,"children":803},{"class":78,"line":393},[804,809,814,819,823,828],{"type":29,"tag":76,"props":805,"children":806},{"style":625},[807],{"type":34,"value":808},"from",{"type":29,"tag":76,"props":810,"children":811},{"style":99},[812],{"type":34,"value":813}," {{ source(",{"type":29,"tag":76,"props":815,"children":816},{"style":153},[817],{"type":34,"value":818},"'ga4'",{"type":29,"tag":76,"props":820,"children":821},{"style":99},[822],{"type":34,"value":272},{"type":29,"tag":76,"props":824,"children":825},{"style":153},[826],{"type":34,"value":827},"'events_*'",{"type":29,"tag":76,"props":829,"children":830},{"style":99},[831],{"type":34,"value":832},") }}\n",{"type":29,"tag":76,"props":834,"children":835},{"class":78,"line":406},[836,841,846,851,856,860,865,870,875],{"type":29,"tag":76,"props":837,"children":838},{"style":625},[839],{"type":34,"value":840},"where",{"type":29,"tag":76,"props":842,"children":843},{"style":99},[844],{"type":34,"value":845}," _table_suffix ",{"type":29,"tag":76,"props":847,"children":848},{"style":625},[849],{"type":34,"value":850},">=",{"type":29,"tag":76,"props":852,"children":853},{"style":99},[854],{"type":34,"value":855}," format_date(",{"type":29,"tag":76,"props":857,"children":858},{"style":153},[859],{"type":34,"value":753},{"type":29,"tag":76,"props":861,"children":862},{"style":99},[863],{"type":34,"value":864},", date_sub(current_date(), interval ",{"type":29,"tag":76,"props":866,"children":867},{"style":105},[868],{"type":34,"value":869},"3",{"type":29,"tag":76,"props":871,"children":872},{"style":625},[873],{"type":34,"value":874}," day",{"type":29,"tag":76,"props":876,"children":877},{"style":99},[878],{"type":34,"value":879},"))\n",{"type":29,"tag":76,"props":881,"children":882},{"class":78,"line":420},[883,888,893],{"type":29,"tag":76,"props":884,"children":885},{"style":99},[886],{"type":34,"value":887},"{% ",{"type":29,"tag":76,"props":889,"children":890},{"style":625},[891],{"type":34,"value":892},"if",{"type":29,"tag":76,"props":894,"children":895},{"style":99},[896],{"type":34,"value":897}," is_incremental() %}\n",{"type":29,"tag":76,"props":899,"children":900},{"class":78,"line":441},[901,906,911,915,919,924,929,934,939,944,948],{"type":29,"tag":76,"props":902,"children":903},{"style":625},[904],{"type":34,"value":905},"  and",{"type":29,"tag":76,"props":907,"children":908},{"style":99},[909],{"type":34,"value":910}," parse_date(",{"type":29,"tag":76,"props":912,"children":913},{"style":153},[914],{"type":34,"value":753},{"type":29,"tag":76,"props":916,"children":917},{"style":99},[918],{"type":34,"value":758},{"type":29,"tag":76,"props":920,"children":921},{"style":625},[922],{"type":34,"value":923},">",{"type":29,"tag":76,"props":925,"children":926},{"style":99},[927],{"type":34,"value":928}," (",{"type":29,"tag":76,"props":930,"children":931},{"style":625},[932],{"type":34,"value":933},"select",{"type":29,"tag":76,"props":935,"children":936},{"style":105},[937],{"type":34,"value":938}," max",{"type":29,"tag":76,"props":940,"children":941},{"style":99},[942],{"type":34,"value":943},"(event_date) ",{"type":29,"tag":76,"props":945,"children":946},{"style":625},[947],{"type":34,"value":808},{"type":29,"tag":76,"props":949,"children":950},{"style":99},[951],{"type":34,"value":952}," {{ this }})\n",{"type":29,"tag":76,"props":954,"children":955},{"class":78,"line":453},[956],{"type":29,"tag":76,"props":957,"children":958},{"style":99},[959],{"type":34,"value":960},"{% endif %}\n",{"type":29,"tag":30,"props":962,"children":963},{},[964,966,972,974,980,982,988],{"type":34,"value":965},"Cette config écrit ",{"type":29,"tag":49,"props":967,"children":969},{"className":968},[],[970],{"type":34,"value":971},"stg_ga4_events",{"type":34,"value":973}," avec partitionnement quotidien dans BigQuery, le clustering par ",{"type":29,"tag":49,"props":975,"children":977},{"className":976},[],[978],{"type":34,"value":979},"event_name",{"type":34,"value":981}," + ",{"type":29,"tag":49,"props":983,"children":985},{"className":984},[],[986],{"type":34,"value":987},"user_pseudo_id",{"type":34,"value":989}," réduit les coûts de requête. La matérialisation incrémentale ramène un scan de 90 jours d'history à 3 jours — réduction de coûts de 30×.",{"type":29,"tag":37,"props":991,"children":993},{"id":992},"couche-de-modélisation-codifiez-la-logique-métier",[994],{"type":34,"value":995},"Couche de Modélisation : Codifiez la Logique Métier",{"type":29,"tag":30,"props":997,"children":998},{},[999,1001,1007,1008,1014,1015,1021],{"type":34,"value":1000},"La couche staging nettoie les données brutes, la couche intermediate construit la logique de jointure, la couche mart répond aux questions métier. dbt segmente ces trois couches par structure de dossier : ",{"type":29,"tag":49,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":34,"value":1006},"staging\u002F",{"type":34,"value":272},{"type":29,"tag":49,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":34,"value":1013},"intermediate\u002F",{"type":34,"value":272},{"type":29,"tag":49,"props":1016,"children":1018},{"className":1017},[],[1019],{"type":34,"value":1020},"marts\u002F",{"type":34,"value":1022},".",{"type":29,"tag":30,"props":1024,"children":1025},{},[1026,1031],{"type":29,"tag":58,"props":1027,"children":1028},{},[1029],{"type":34,"value":1030},"Exemple de staging",{"type":34,"value":1032}," — Standardisez les colonnes Meta Ads :",{"type":29,"tag":66,"props":1034,"children":1036},{"className":584,"code":1035,"language":586,"meta":13,"style":13},"-- models\u002Fstaging\u002Fstg_meta_ads.sql\nselect\n  date_start as report_date,\n  campaign_id,\n  campaign_name,\n  spend as cost_usd,\n  impressions,\n  clicks,\n  actions.value as conversions -- extraction du JSON imbriqué\nfrom {{ source('meta_ads', 'ads_insights') }}\nwhere date_start >= date_sub(current_date(), interval 90 day)\n",[1037],{"type":29,"tag":49,"props":1038,"children":1039},{"__ignoreMap":13},[1040,1048,1055,1072,1080,1088,1105,1113,1121,1153,1182],{"type":29,"tag":76,"props":1041,"children":1042},{"class":78,"line":79},[1043],{"type":29,"tag":76,"props":1044,"children":1045},{"style":83},[1046],{"type":34,"value":1047},"-- models\u002Fstaging\u002Fstg_meta_ads.sql\n",{"type":29,"tag":76,"props":1049,"children":1050},{"class":78,"line":89},[1051],{"type":29,"tag":76,"props":1052,"children":1053},{"style":625},[1054],{"type":34,"value":740},{"type":29,"tag":76,"props":1056,"children":1057},{"class":78,"line":111},[1058,1063,1067],{"type":29,"tag":76,"props":1059,"children":1060},{"style":99},[1061],{"type":34,"value":1062},"  date_start ",{"type":29,"tag":76,"props":1064,"children":1065},{"style":625},[1066],{"type":34,"value":763},{"type":29,"tag":76,"props":1068,"children":1069},{"style":99},[1070],{"type":34,"value":1071}," report_date,\n",{"type":29,"tag":76,"props":1073,"children":1074},{"class":78,"line":121},[1075],{"type":29,"tag":76,"props":1076,"children":1077},{"style":99},[1078],{"type":34,"value":1079},"  campaign_id,\n",{"type":29,"tag":76,"props":1081,"children":1082},{"class":78,"line":135},[1083],{"type":29,"tag":76,"props":1084,"children":1085},{"style":99},[1086],{"type":34,"value":1087},"  campaign_name,\n",{"type":29,"tag":76,"props":1089,"children":1090},{"class":78,"line":159},[1091,1096,1100],{"type":29,"tag":76,"props":1092,"children":1093},{"style":99},[1094],{"type":34,"value":1095},"  spend ",{"type":29,"tag":76,"props":1097,"children":1098},{"style":625},[1099],{"type":34,"value":763},{"type":29,"tag":76,"props":1101,"children":1102},{"style":99},[1103],{"type":34,"value":1104}," cost_usd,\n",{"type":29,"tag":76,"props":1106,"children":1107},{"class":78,"line":177},[1108],{"type":29,"tag":76,"props":1109,"children":1110},{"style":99},[1111],{"type":34,"value":1112},"  impressions,\n",{"type":29,"tag":76,"props":1114,"children":1115},{"class":78,"line":23},[1116],{"type":29,"tag":76,"props":1117,"children":1118},{"style":99},[1119],{"type":34,"value":1120},"  clicks,\n",{"type":29,"tag":76,"props":1122,"children":1123},{"class":78,"line":207},[1124,1129,1133,1138,1143,1148],{"type":29,"tag":76,"props":1125,"children":1126},{"style":105},[1127],{"type":34,"value":1128},"  actions",{"type":29,"tag":76,"props":1130,"children":1131},{"style":99},[1132],{"type":34,"value":1022},{"type":29,"tag":76,"props":1134,"children":1135},{"style":105},[1136],{"type":34,"value":1137},"value",{"type":29,"tag":76,"props":1139,"children":1140},{"style":625},[1141],{"type":34,"value":1142}," as",{"type":29,"tag":76,"props":1144,"children":1145},{"style":99},[1146],{"type":34,"value":1147}," conversions ",{"type":29,"tag":76,"props":1149,"children":1150},{"style":83},[1151],{"type":34,"value":1152},"-- extraction du JSON imbriqué\n",{"type":29,"tag":76,"props":1154,"children":1155},{"class":78,"line":229},[1156,1160,1164,1169,1173,1178],{"type":29,"tag":76,"props":1157,"children":1158},{"style":625},[1159],{"type":34,"value":808},{"type":29,"tag":76,"props":1161,"children":1162},{"style":99},[1163],{"type":34,"value":813},{"type":29,"tag":76,"props":1165,"children":1166},{"style":153},[1167],{"type":34,"value":1168},"'meta_ads'",{"type":29,"tag":76,"props":1170,"children":1171},{"style":99},[1172],{"type":34,"value":272},{"type":29,"tag":76,"props":1174,"children":1175},{"style":153},[1176],{"type":34,"value":1177},"'ads_insights'",{"type":29,"tag":76,"props":1179,"children":1180},{"style":99},[1181],{"type":34,"value":832},{"type":29,"tag":76,"props":1183,"children":1184},{"class":78,"line":242},[1185,1189,1194,1198,1203,1208,1212],{"type":29,"tag":76,"props":1186,"children":1187},{"style":625},[1188],{"type":34,"value":840},{"type":29,"tag":76,"props":1190,"children":1191},{"style":99},[1192],{"type":34,"value":1193}," date_start ",{"type":29,"tag":76,"props":1195,"children":1196},{"style":625},[1197],{"type":34,"value":850},{"type":29,"tag":76,"props":1199,"children":1200},{"style":99},[1201],{"type":34,"value":1202}," date_sub(current_date(), interval ",{"type":29,"tag":76,"props":1204,"children":1205},{"style":105},[1206],{"type":34,"value":1207},"90",{"type":29,"tag":76,"props":1209,"children":1210},{"style":625},[1211],{"type":34,"value":874},{"type":29,"tag":76,"props":1213,"children":1214},{"style":99},[1215],{"type":34,"value":1216},")\n",{"type":29,"tag":30,"props":1218,"children":1219},{},[1220,1225],{"type":29,"tag":58,"props":1221,"children":1222},{},[1223],{"type":34,"value":1224},"Exemple d'intermediate",{"type":34,"value":1226}," — Unifiez toutes les sources de paid media :",{"type":29,"tag":66,"props":1228,"children":1230},{"className":584,"code":1229,"language":586,"meta":13,"style":13},"-- models\u002Fintermediate\u002Fint_paid_media_unified.sql\nwith meta as (\n  select report_date, campaign_id, 'meta' as source, cost_usd, impressions, clicks, conversions\n  from {{ ref('stg_meta_ads') }}\n),\ngoogle as (\n  select report_date, campaign_id, 'google' as source, cost_usd, impressions, clicks, conversions\n  from {{ ref('stg_google_ads') }}\n)\n\nselect * from meta\nunion all\nselect * from google\n",[1231],{"type":29,"tag":49,"props":1232,"children":1233},{"__ignoreMap":13},[1234,1242,1264,1291,1313,1321,1337,1361,1381,1388,1395,1417,1425],{"type":29,"tag":76,"props":1235,"children":1236},{"class":78,"line":79},[1237],{"type":29,"tag":76,"props":1238,"children":1239},{"style":83},[1240],{"type":34,"value":1241},"-- models\u002Fintermediate\u002Fint_paid_media_unified.sql\n",{"type":29,"tag":76,"props":1243,"children":1244},{"class":78,"line":89},[1245,1250,1255,1259],{"type":29,"tag":76,"props":1246,"children":1247},{"style":625},[1248],{"type":34,"value":1249},"with",{"type":29,"tag":76,"props":1251,"children":1252},{"style":99},[1253],{"type":34,"value":1254}," meta ",{"type":29,"tag":76,"props":1256,"children":1257},{"style":625},[1258],{"type":34,"value":763},{"type":29,"tag":76,"props":1260,"children":1261},{"style":99},[1262],{"type":34,"value":1263}," (\n",{"type":29,"tag":76,"props":1265,"children":1266},{"class":78,"line":111},[1267,1272,1277,1282,1286],{"type":29,"tag":76,"props":1268,"children":1269},{"style":625},[1270],{"type":34,"value":1271},"  select",{"type":29,"tag":76,"props":1273,"children":1274},{"style":99},[1275],{"type":34,"value":1276}," report_date, campaign_id, ",{"type":29,"tag":76,"props":1278,"children":1279},{"style":153},[1280],{"type":34,"value":1281},"'meta'",{"type":29,"tag":76,"props":1283,"children":1284},{"style":625},[1285],{"type":34,"value":1142},{"type":29,"tag":76,"props":1287,"children":1288},{"style":99},[1289],{"type":34,"value":1290}," source, cost_usd, impressions, clicks, conversions\n",{"type":29,"tag":76,"props":1292,"children":1293},{"class":78,"line":121},[1294,1299,1304,1309],{"type":29,"tag":76,"props":1295,"children":1296},{"style":625},[1297],{"type":34,"value":1298},"  from",{"type":29,"tag":76,"props":1300,"children":1301},{"style":99},[1302],{"type":34,"value":1303}," {{ ref(",{"type":29,"tag":76,"props":1305,"children":1306},{"style":153},[1307],{"type":34,"value":1308},"'stg_meta_ads'",{"type":29,"tag":76,"props":1310,"children":1311},{"style":99},[1312],{"type":34,"value":832},{"type":29,"tag":76,"props":1314,"children":1315},{"class":78,"line":135},[1316],{"type":29,"tag":76,"props":1317,"children":1318},{"style":99},[1319],{"type":34,"value":1320},"),\n",{"type":29,"tag":76,"props":1322,"children":1323},{"class":78,"line":159},[1324,1329,1333],{"type":29,"tag":76,"props":1325,"children":1326},{"style":99},[1327],{"type":34,"value":1328},"google ",{"type":29,"tag":76,"props":1330,"children":1331},{"style":625},[1332],{"type":34,"value":763},{"type":29,"tag":76,"props":1334,"children":1335},{"style":99},[1336],{"type":34,"value":1263},{"type":29,"tag":76,"props":1338,"children":1339},{"class":78,"line":177},[1340,1344,1348,1353,1357],{"type":29,"tag":76,"props":1341,"children":1342},{"style":625},[1343],{"type":34,"value":1271},{"type":29,"tag":76,"props":1345,"children":1346},{"style":99},[1347],{"type":34,"value":1276},{"type":29,"tag":76,"props":1349,"children":1350},{"style":153},[1351],{"type":34,"value":1352},"'google'",{"type":29,"tag":76,"props":1354,"children":1355},{"style":625},[1356],{"type":34,"value":1142},{"type":29,"tag":76,"props":1358,"children":1359},{"style":99},[1360],{"type":34,"value":1290},{"type":29,"tag":76,"props":1362,"children":1363},{"class":78,"line":23},[1364,1368,1372,1377],{"type":29,"tag":76,"props":1365,"children":1366},{"style":625},[1367],{"type":34,"value":1298},{"type":29,"tag":76,"props":1369,"children":1370},{"style":99},[1371],{"type":34,"value":1303},{"type":29,"tag":76,"props":1373,"children":1374},{"style":153},[1375],{"type":34,"value":1376},"'stg_google_ads'",{"type":29,"tag":76,"props":1378,"children":1379},{"style":99},[1380],{"type":34,"value":832},{"type":29,"tag":76,"props":1382,"children":1383},{"class":78,"line":207},[1384],{"type":29,"tag":76,"props":1385,"children":1386},{"style":99},[1387],{"type":34,"value":1216},{"type":29,"tag":76,"props":1389,"children":1390},{"class":78,"line":229},[1391],{"type":29,"tag":76,"props":1392,"children":1393},{"emptyLinePlaceholder":115},[1394],{"type":34,"value":118},{"type":29,"tag":76,"props":1396,"children":1397},{"class":78,"line":242},[1398,1402,1407,1412],{"type":29,"tag":76,"props":1399,"children":1400},{"style":625},[1401],{"type":34,"value":933},{"type":29,"tag":76,"props":1403,"children":1404},{"style":625},[1405],{"type":34,"value":1406}," *",{"type":29,"tag":76,"props":1408,"children":1409},{"style":625},[1410],{"type":34,"value":1411}," from",{"type":29,"tag":76,"props":1413,"children":1414},{"style":99},[1415],{"type":34,"value":1416}," meta\n",{"type":29,"tag":76,"props":1418,"children":1419},{"class":78,"line":294},[1420],{"type":29,"tag":76,"props":1421,"children":1422},{"style":625},[1423],{"type":34,"value":1424},"union all\n",{"type":29,"tag":76,"props":1426,"children":1427},{"class":78,"line":340},[1428,1432,1436,1440],{"type":29,"tag":76,"props":1429,"children":1430},{"style":625},[1431],{"type":34,"value":933},{"type":29,"tag":76,"props":1433,"children":1434},{"style":625},[1435],{"type":34,"value":1406},{"type":29,"tag":76,"props":1437,"children":1438},{"style":625},[1439],{"type":34,"value":1411},{"type":29,"tag":76,"props":1441,"children":1442},{"style":99},[1443],{"type":34,"value":1444}," google\n",{"type":29,"tag":30,"props":1446,"children":1447},{},[1448,1453],{"type":29,"tag":58,"props":1449,"children":1450},{},[1451],{"type":34,"value":1452},"Exemple de mart",{"type":34,"value":1454}," — Dashboard de performance quotidienne :",{"type":29,"tag":66,"props":1456,"children":1458},{"className":584,"code":1457,"language":586,"meta":13,"style":13},"-- models\u002Fmarts\u002Ffct_daily_performance.sql\nselect\n  report_date,\n  source,\n  sum(cost_usd) as total_cost,\n  sum(impressions) as total_impressions,\n  sum(clicks) as total_clicks,\n  sum(conversions) as total_conversions,\n  safe_divide(sum(clicks), sum(impressions)) as ctr,\n  safe_divide(sum(cost_usd), sum(conversions)) as cpa\nfrom {{ ref('int_paid_media_unified') }}\ngroup by 1, 2\n",[1459],{"type":29,"tag":49,"props":1460,"children":1461},{"__ignoreMap":13},[1462,1470,1477,1485,1493,1515,1536,1557,1578,1614,1648,1668],{"type":29,"tag":76,"props":1463,"children":1464},{"class":78,"line":79},[1465],{"type":29,"tag":76,"props":1466,"children":1467},{"style":83},[1468],{"type":34,"value":1469},"-- models\u002Fmarts\u002Ffct_daily_performance.sql\n",{"type":29,"tag":76,"props":1471,"children":1472},{"class":78,"line":89},[1473],{"type":29,"tag":76,"props":1474,"children":1475},{"style":625},[1476],{"type":34,"value":740},{"type":29,"tag":76,"props":1478,"children":1479},{"class":78,"line":111},[1480],{"type":29,"tag":76,"props":1481,"children":1482},{"style":99},[1483],{"type":34,"value":1484},"  report_date,\n",{"type":29,"tag":76,"props":1486,"children":1487},{"class":78,"line":121},[1488],{"type":29,"tag":76,"props":1489,"children":1490},{"style":99},[1491],{"type":34,"value":1492},"  source,\n",{"type":29,"tag":76,"props":1494,"children":1495},{"class":78,"line":135},[1496,1501,1506,1510],{"type":29,"tag":76,"props":1497,"children":1498},{"style":105},[1499],{"type":34,"value":1500},"  sum",{"type":29,"tag":76,"props":1502,"children":1503},{"style":99},[1504],{"type":34,"value":1505},"(cost_usd) ",{"type":29,"tag":76,"props":1507,"children":1508},{"style":625},[1509],{"type":34,"value":763},{"type":29,"tag":76,"props":1511,"children":1512},{"style":99},[1513],{"type":34,"value":1514}," total_cost,\n",{"type":29,"tag":76,"props":1516,"children":1517},{"class":78,"line":159},[1518,1522,1527,1531],{"type":29,"tag":76,"props":1519,"children":1520},{"style":105},[1521],{"type":34,"value":1500},{"type":29,"tag":76,"props":1523,"children":1524},{"style":99},[1525],{"type":34,"value":1526},"(impressions) ",{"type":29,"tag":76,"props":1528,"children":1529},{"style":625},[1530],{"type":34,"value":763},{"type":29,"tag":76,"props":1532,"children":1533},{"style":99},[1534],{"type":34,"value":1535}," total_impressions,\n",{"type":29,"tag":76,"props":1537,"children":1538},{"class":78,"line":177},[1539,1543,1548,1552],{"type":29,"tag":76,"props":1540,"children":1541},{"style":105},[1542],{"type":34,"value":1500},{"type":29,"tag":76,"props":1544,"children":1545},{"style":99},[1546],{"type":34,"value":1547},"(clicks) ",{"type":29,"tag":76,"props":1549,"children":1550},{"style":625},[1551],{"type":34,"value":763},{"type":29,"tag":76,"props":1553,"children":1554},{"style":99},[1555],{"type":34,"value":1556}," total_clicks,\n",{"type":29,"tag":76,"props":1558,"children":1559},{"class":78,"line":23},[1560,1564,1569,1573],{"type":29,"tag":76,"props":1561,"children":1562},{"style":105},[1563],{"type":34,"value":1500},{"type":29,"tag":76,"props":1565,"children":1566},{"style":99},[1567],{"type":34,"value":1568},"(conversions) ",{"type":29,"tag":76,"props":1570,"children":1571},{"style":625},[1572],{"type":34,"value":763},{"type":29,"tag":76,"props":1574,"children":1575},{"style":99},[1576],{"type":34,"value":1577}," total_conversions,\n",{"type":29,"tag":76,"props":1579,"children":1580},{"class":78,"line":207},[1581,1586,1591,1596,1600,1605,1609],{"type":29,"tag":76,"props":1582,"children":1583},{"style":99},[1584],{"type":34,"value":1585},"  safe_divide(",{"type":29,"tag":76,"props":1587,"children":1588},{"style":105},[1589],{"type":34,"value":1590},"sum",{"type":29,"tag":76,"props":1592,"children":1593},{"style":99},[1594],{"type":34,"value":1595},"(clicks), ",{"type":29,"tag":76,"props":1597,"children":1598},{"style":105},[1599],{"type":34,"value":1590},{"type":29,"tag":76,"props":1601,"children":1602},{"style":99},[1603],{"type":34,"value":1604},"(impressions)) ",{"type":29,"tag":76,"props":1606,"children":1607},{"style":625},[1608],{"type":34,"value":763},{"type":29,"tag":76,"props":1610,"children":1611},{"style":99},[1612],{"type":34,"value":1613}," ctr,\n",{"type":29,"tag":76,"props":1615,"children":1616},{"class":78,"line":229},[1617,1621,1625,1630,1634,1639,1643],{"type":29,"tag":76,"props":1618,"children":1619},{"style":99},[1620],{"type":34,"value":1585},{"type":29,"tag":76,"props":1622,"children":1623},{"style":105},[1624],{"type":34,"value":1590},{"type":29,"tag":76,"props":1626,"children":1627},{"style":99},[1628],{"type":34,"value":1629},"(cost_usd), ",{"type":29,"tag":76,"props":1631,"children":1632},{"style":105},[1633],{"type":34,"value":1590},{"type":29,"tag":76,"props":1635,"children":1636},{"style":99},[1637],{"type":34,"value":1638},"(conversions)) ",{"type":29,"tag":76,"props":1640,"children":1641},{"style":625},[1642],{"type":34,"value":763},{"type":29,"tag":76,"props":1644,"children":1645},{"style":99},[1646],{"type":34,"value":1647}," cpa\n",{"type":29,"tag":76,"props":1649,"children":1650},{"class":78,"line":242},[1651,1655,1659,1664],{"type":29,"tag":76,"props":1652,"children":1653},{"style":625},[1654],{"type":34,"value":808},{"type":29,"tag":76,"props":1656,"children":1657},{"style":99},[1658],{"type":34,"value":1303},{"type":29,"tag":76,"props":1660,"children":1661},{"style":153},[1662],{"type":34,"value":1663},"'int_paid_media_unified'",{"type":29,"tag":76,"props":1665,"children":1666},{"style":99},[1667],{"type":34,"value":832},{"type":29,"tag":76,"props":1669,"children":1670},{"class":78,"line":294},[1671,1676,1681,1685],{"type":29,"tag":76,"props":1672,"children":1673},{"style":625},[1674],{"type":34,"value":1675},"group by",{"type":29,"tag":76,"props":1677,"children":1678},{"style":105},[1679],{"type":34,"value":1680}," 1",{"type":29,"tag":76,"props":1682,"children":1683},{"style":99},[1684],{"type":34,"value":272},{"type":29,"tag":76,"props":1686,"children":1687},{"style":105},[1688],{"type":34,"value":108},{"type":29,"tag":30,"props":1690,"children":1691},{},[1692,1694,1700,1702,1708,1710,1716],{"type":34,"value":1693},"La fonction ",{"type":29,"tag":49,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":34,"value":1699},"ref()",{"type":34,"value":1701}," construit le graphe de dépendances de dbt. La commande ",{"type":29,"tag":49,"props":1703,"children":1705},{"className":1704},[],[1706],{"type":34,"value":1707},"dbt run",{"type":34,"value":1709}," exécute les modèles dans l'ordre des dépendances. Si ",{"type":29,"tag":49,"props":1711,"children":1713},{"className":1712},[],[1714],{"type":34,"value":1715},"int_paid_media_unified",{"type":34,"value":1717}," change, toutes les tables mart en aval se reconstruisent automatiquement.",{"type":29,"tag":555,"props":1719,"children":1721},{"id":1720},"couverture-de-tests",[1722],{"type":34,"value":1723},"Couverture de Tests",{"type":29,"tag":30,"props":1725,"children":1726},{},[1727],{"type":34,"value":1728},"En production, un rapport KPI erroné signifie une erreur de six chiffres en e-commerce. Les tests génériques de dbt ajoutent un contrat à chaque modèle :",{"type":29,"tag":66,"props":1730,"children":1732},{"className":68,"code":1731,"language":70,"meta":13,"style":13},"# models\u002Fmarts\u002Fschema.yml\nversion: 2\n\nmodels:\n  - name: fct_daily_performance\n    columns:\n      - name: report_date\n        tests:\n          - not_null\n          - unique\n      - name: total_cost\n        tests:\n          - not_null\n          - dbt_utils.expression_is_true:\n              expression: \">= 0\"\n      - name: cpa\n        tests:\n          - dbt_utils.expression_is_true:\n              expression: \"is null or cpa >= 0\"\n",[1733],{"type":29,"tag":49,"props":1734,"children":1735},{"__ignoreMap":13},[1736,1744,1759,1766,1778,1798,1810,1830,1842,1853,1865,1885,1896,1907,1923,1940,1960,1971,1986],{"type":29,"tag":76,"props":1737,"children":1738},{"class":78,"line":79},[1739],{"type":29,"tag":76,"props":1740,"children":1741},{"style":83},[1742],{"type":34,"value":1743},"# models\u002Fmarts\u002Fschema.yml\n",{"type":29,"tag":76,"props":1745,"children":1746},{"class":78,"line":89},[1747,1751,1755],{"type":29,"tag":76,"props":1748,"children":1749},{"style":93},[1750],{"type":34,"value":96},{"type":29,"tag":76,"props":1752,"children":1753},{"style":99},[1754],{"type":34,"value":102},{"type":29,"tag":76,"props":1756,"children":1757},{"style":105},[1758],{"type":34,"value":108},{"type":29,"tag":76,"props":1760,"children":1761},{"class":78,"line":111},[1762],{"type":29,"tag":76,"props":1763,"children":1764},{"emptyLinePlaceholder":115},[1765],{"type":34,"value":118},{"type":29,"tag":76,"props":1767,"children":1768},{"class":78,"line":121},[1769,1774],{"type":29,"tag":76,"props":1770,"children":1771},{"style":93},[1772],{"type":34,"value":1773},"models",{"type":29,"tag":76,"props":1775,"children":1776},{"style":99},[1777],{"type":34,"value":132},{"type":29,"tag":76,"props":1779,"children":1780},{"class":78,"line":135},[1781,1785,1789,1793],{"type":29,"tag":76,"props":1782,"children":1783},{"style":99},[1784],{"type":34,"value":141},{"type":29,"tag":76,"props":1786,"children":1787},{"style":93},[1788],{"type":34,"value":146},{"type":29,"tag":76,"props":1790,"children":1791},{"style":99},[1792],{"type":34,"value":102},{"type":29,"tag":76,"props":1794,"children":1795},{"style":153},[1796],{"type":34,"value":1797},"fct_daily_performance\n",{"type":29,"tag":76,"props":1799,"children":1800},{"class":78,"line":159},[1801,1806],{"type":29,"tag":76,"props":1802,"children":1803},{"style":93},[1804],{"type":34,"value":1805},"    columns",{"type":29,"tag":76,"props":1807,"children":1808},{"style":99},[1809],{"type":34,"value":132},{"type":29,"tag":76,"props":1811,"children":1812},{"class":78,"line":177},[1813,1817,1821,1825],{"type":29,"tag":76,"props":1814,"children":1815},{"style":99},[1816],{"type":34,"value":213},{"type":29,"tag":76,"props":1818,"children":1819},{"style":93},[1820],{"type":34,"value":146},{"type":29,"tag":76,"props":1822,"children":1823},{"style":99},[1824],{"type":34,"value":102},{"type":29,"tag":76,"props":1826,"children":1827},{"style":153},[1828],{"type":34,"value":1829},"report_date\n",{"type":29,"tag":76,"props":1831,"children":1832},{"class":78,"line":23},[1833,1838],{"type":29,"tag":76,"props":1834,"children":1835},{"style":93},[1836],{"type":34,"value":1837},"        tests",{"type":29,"tag":76,"props":1839,"children":1840},{"style":99},[1841],{"type":34,"value":132},{"type":29,"tag":76,"props":1843,"children":1844},{"class":78,"line":207},[1845,1849],{"type":29,"tag":76,"props":1846,"children":1847},{"style":99},[1848],{"type":34,"value":377},{"type":29,"tag":76,"props":1850,"children":1851},{"style":153},[1852],{"type":34,"value":417},{"type":29,"tag":76,"props":1854,"children":1855},{"class":78,"line":229},[1856,1860],{"type":29,"tag":76,"props":1857,"children":1858},{"style":99},[1859],{"type":34,"value":377},{"type":29,"tag":76,"props":1861,"children":1862},{"style":153},[1863],{"type":34,"value":1864},"unique\n",{"type":29,"tag":76,"props":1866,"children":1867},{"class":78,"line":242},[1868,1872,1876,1880],{"type":29,"tag":76,"props":1869,"children":1870},{"style":99},[1871],{"type":34,"value":213},{"type":29,"tag":76,"props":1873,"children":1874},{"style":93},[1875],{"type":34,"value":146},{"type":29,"tag":76,"props":1877,"children":1878},{"style":99},[1879],{"type":34,"value":102},{"type":29,"tag":76,"props":1881,"children":1882},{"style":153},[1883],{"type":34,"value":1884},"total_cost\n",{"type":29,"tag":76,"props":1886,"children":1887},{"class":78,"line":294},[1888,1892],{"type":29,"tag":76,"props":1889,"children":1890},{"style":93},[1891],{"type":34,"value":1837},{"type":29,"tag":76,"props":1893,"children":1894},{"style":99},[1895],{"type":34,"value":132},{"type":29,"tag":76,"props":1897,"children":1898},{"class":78,"line":340},[1899,1903],{"type":29,"tag":76,"props":1900,"children":1901},{"style":99},[1902],{"type":34,"value":377},{"type":29,"tag":76,"props":1904,"children":1905},{"style":153},[1906],{"type":34,"value":417},{"type":29,"tag":76,"props":1908,"children":1909},{"class":78,"line":358},[1910,1914,1919],{"type":29,"tag":76,"props":1911,"children":1912},{"style":99},[1913],{"type":34,"value":377},{"type":29,"tag":76,"props":1915,"children":1916},{"style":93},[1917],{"type":34,"value":1918},"dbt_utils.expression_is_true",{"type":29,"tag":76,"props":1920,"children":1921},{"style":99},[1922],{"type":34,"value":132},{"type":29,"tag":76,"props":1924,"children":1925},{"class":78,"line":371},[1926,1931,1935],{"type":29,"tag":76,"props":1927,"children":1928},{"style":93},[1929],{"type":34,"value":1930},"              expression",{"type":29,"tag":76,"props":1932,"children":1933},{"style":99},[1934],{"type":34,"value":102},{"type":29,"tag":76,"props":1936,"children":1937},{"style":153},[1938],{"type":34,"value":1939},"\">= 0\"\n",{"type":29,"tag":76,"props":1941,"children":1942},{"class":78,"line":393},[1943,1947,1951,1955],{"type":29,"tag":76,"props":1944,"children":1945},{"style":99},[1946],{"type":34,"value":213},{"type":29,"tag":76,"props":1948,"children":1949},{"style":93},[1950],{"type":34,"value":146},{"type":29,"tag":76,"props":1952,"children":1953},{"style":99},[1954],{"type":34,"value":102},{"type":29,"tag":76,"props":1956,"children":1957},{"style":153},[1958],{"type":34,"value":1959},"cpa\n",{"type":29,"tag":76,"props":1961,"children":1962},{"class":78,"line":406},[1963,1967],{"type":29,"tag":76,"props":1964,"children":1965},{"style":93},[1966],{"type":34,"value":1837},{"type":29,"tag":76,"props":1968,"children":1969},{"style":99},[1970],{"type":34,"value":132},{"type":29,"tag":76,"props":1972,"children":1973},{"class":78,"line":420},[1974,1978,1982],{"type":29,"tag":76,"props":1975,"children":1976},{"style":99},[1977],{"type":34,"value":377},{"type":29,"tag":76,"props":1979,"children":1980},{"style":93},[1981],{"type":34,"value":1918},{"type":29,"tag":76,"props":1983,"children":1984},{"style":99},[1985],{"type":34,"value":132},{"type":29,"tag":76,"props":1987,"children":1988},{"class":78,"line":441},[1989,1993,1997],{"type":29,"tag":76,"props":1990,"children":1991},{"style":93},[1992],{"type":34,"value":1930},{"type":29,"tag":76,"props":1994,"children":1995},{"style":99},[1996],{"type":34,"value":102},{"type":29,"tag":76,"props":1998,"children":1999},{"style":153},[2000],{"type":34,"value":2001},"\"is null or cpa >= 0\"\n",{"type":29,"tag":30,"props":2003,"children":2004},{},[2005,2007,2013,2015,2024],{"type":34,"value":2006},"La commande ",{"type":29,"tag":49,"props":2008,"children":2010},{"className":2009},[],[2011],{"type":34,"value":2012},"dbt test",{"type":34,"value":2014}," valide ces contrats. Dans le pipeline CI\u002FCD, un test échoué bloque la fusion — aucune donnée erronée n'atteint la production. Dans les travaux de Roibase sur ",{"type":29,"tag":2016,"props":2017,"children":2021},"a",{"href":2018,"rel":2019},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Ffirstparty",[2020],"nofollow",[2022],{"type":34,"value":2023},"First-Party Data & Architecture de Mesure",{"type":34,"value":2025},", nous ciblons 85 % de couverture de tests (nombre de lignes × champs critiques).",{"type":29,"tag":37,"props":2027,"children":2029},{"id":2028},"couche-sémantique-définissez-une-métrique-une-seule-fois",[2030],{"type":34,"value":2031},"Couche Sémantique : Définissez une Métrique, une Seule Fois",{"type":29,"tag":30,"props":2033,"children":2034},{},[2035,2037,2043],{"type":34,"value":2036},"Fin 2025, dbt Labs a intégré \"MetricFlow\", la couche sémantique, dans dbt Cloud. Quand l'équipe marketing demande \"taux de conversion\", la data team ne devrait pas réécrire du SQL — la définition de métrique devrait être unique. Le fichier ",{"type":29,"tag":49,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":34,"value":2042},"metrics.yml",{"type":34,"value":2044}," de dbt offre cette abstraction :",{"type":29,"tag":66,"props":2046,"children":2048},{"className":68,"code":2047,"language":70,"meta":13,"style":13},"# models\u002Fmetrics.yml\nversion: 2\n\nmetrics:\n  - name: conversion_rate\n    label: Conversion Rate\n    model: ref('fct_daily_performance')\n    calculation_method: derived\n    expression: \"safe_divide(total_conversions, total_clicks)\"\n    timestamp: report_date\n    time_grains: [day, week, month]\n    dimensions:\n      - source\n\n  - name: cpa\n    label: Cost Per Acquisition\n    model: ref('fct_daily_performance')\n    calculation_method: derived\n    expression: \"safe_divide(total_cost, total_conversions)\"\n    timestamp: report_date\n    time_grains: [day, week, month]\n    dimensions:\n      - source\n",[2049],{"type":29,"tag":49,"props":2050,"children":2051},{"__ignoreMap":13},[2052,2060,2075,2082,2094,2114,2131,2148,2165,2182,2198,2239,2251,2263,2270,2289,2305,2320,2335,2351,2366,2402,2414],{"type":29,"tag":76,"props":2053,"children":2054},{"class":78,"line":79},[2055],{"type":29,"tag":76,"props":2056,"children":2057},{"style":83},[2058],{"type":34,"value":2059},"# models\u002Fmetrics.yml\n",{"type":29,"tag":76,"props":2061,"children":2062},{"class":78,"line":89},[2063,2067,2071],{"type":29,"tag":76,"props":2064,"children":2065},{"style":93},[2066],{"type":34,"value":96},{"type":29,"tag":76,"props":2068,"children":2069},{"style":99},[2070],{"type":34,"value":102},{"type":29,"tag":76,"props":2072,"children":2073},{"style":105},[2074],{"type":34,"value":108},{"type":29,"tag":76,"props":2076,"children":2077},{"class":78,"line":111},[2078],{"type":29,"tag":76,"props":2079,"children":2080},{"emptyLinePlaceholder":115},[2081],{"type":34,"value":118},{"type":29,"tag":76,"props":2083,"children":2084},{"class":78,"line":121},[2085,2090],{"type":29,"tag":76,"props":2086,"children":2087},{"style":93},[2088],{"type":34,"value":2089},"metrics",{"type":29,"tag":76,"props":2091,"children":2092},{"style":99},[2093],{"type":34,"value":132},{"type":29,"tag":76,"props":2095,"children":2096},{"class":78,"line":135},[2097,2101,2105,2109],{"type":29,"tag":76,"props":2098,"children":2099},{"style":99},[2100],{"type":34,"value":141},{"type":29,"tag":76,"props":2102,"children":2103},{"style":93},[2104],{"type":34,"value":146},{"type":29,"tag":76,"props":2106,"children":2107},{"style":99},[2108],{"type":34,"value":102},{"type":29,"tag":76,"props":2110,"children":2111},{"style":153},[2112],{"type":34,"value":2113},"conversion_rate\n",{"type":29,"tag":76,"props":2115,"children":2116},{"class":78,"line":159},[2117,2122,2126],{"type":29,"tag":76,"props":2118,"children":2119},{"style":93},[2120],{"type":34,"value":2121},"    label",{"type":29,"tag":76,"props":2123,"children":2124},{"style":99},[2125],{"type":34,"value":102},{"type":29,"tag":76,"props":2127,"children":2128},{"style":153},[2129],{"type":34,"value":2130},"Conversion Rate\n",{"type":29,"tag":76,"props":2132,"children":2133},{"class":78,"line":177},[2134,2139,2143],{"type":29,"tag":76,"props":2135,"children":2136},{"style":93},[2137],{"type":34,"value":2138},"    model",{"type":29,"tag":76,"props":2140,"children":2141},{"style":99},[2142],{"type":34,"value":102},{"type":29,"tag":76,"props":2144,"children":2145},{"style":153},[2146],{"type":34,"value":2147},"ref('fct_daily_performance')\n",{"type":29,"tag":76,"props":2149,"children":2150},{"class":78,"line":23},[2151,2156,2160],{"type":29,"tag":76,"props":2152,"children":2153},{"style":93},[2154],{"type":34,"value":2155},"    calculation_method",{"type":29,"tag":76,"props":2157,"children":2158},{"style":99},[2159],{"type":34,"value":102},{"type":29,"tag":76,"props":2161,"children":2162},{"style":153},[2163],{"type":34,"value":2164},"derived\n",{"type":29,"tag":76,"props":2166,"children":2167},{"class":78,"line":207},[2168,2173,2177],{"type":29,"tag":76,"props":2169,"children":2170},{"style":93},[2171],{"type":34,"value":2172},"    expression",{"type":29,"tag":76,"props":2174,"children":2175},{"style":99},[2176],{"type":34,"value":102},{"type":29,"tag":76,"props":2178,"children":2179},{"style":153},[2180],{"type":34,"value":2181},"\"safe_divide(total_conversions, total_clicks)\"\n",{"type":29,"tag":76,"props":2183,"children":2184},{"class":78,"line":229},[2185,2190,2194],{"type":29,"tag":76,"props":2186,"children":2187},{"style":93},[2188],{"type":34,"value":2189},"    timestamp",{"type":29,"tag":76,"props":2191,"children":2192},{"style":99},[2193],{"type":34,"value":102},{"type":29,"tag":76,"props":2195,"children":2196},{"style":153},[2197],{"type":34,"value":1829},{"type":29,"tag":76,"props":2199,"children":2200},{"class":78,"line":242},[2201,2206,2211,2216,2220,2225,2229,2234],{"type":29,"tag":76,"props":2202,"children":2203},{"style":93},[2204],{"type":34,"value":2205},"    time_grains",{"type":29,"tag":76,"props":2207,"children":2208},{"style":99},[2209],{"type":34,"value":2210},": [",{"type":29,"tag":76,"props":2212,"children":2213},{"style":153},[2214],{"type":34,"value":2215},"day",{"type":29,"tag":76,"props":2217,"children":2218},{"style":99},[2219],{"type":34,"value":272},{"type":29,"tag":76,"props":2221,"children":2222},{"style":153},[2223],{"type":34,"value":2224},"week",{"type":29,"tag":76,"props":2226,"children":2227},{"style":99},[2228],{"type":34,"value":272},{"type":29,"tag":76,"props":2230,"children":2231},{"style":153},[2232],{"type":34,"value":2233},"month",{"type":29,"tag":76,"props":2235,"children":2236},{"style":99},[2237],{"type":34,"value":2238},"]\n",{"type":29,"tag":76,"props":2240,"children":2241},{"class":78,"line":294},[2242,2247],{"type":29,"tag":76,"props":2243,"children":2244},{"style":93},[2245],{"type":34,"value":2246},"    dimensions",{"type":29,"tag":76,"props":2248,"children":2249},{"style":99},[2250],{"type":34,"value":132},{"type":29,"tag":76,"props":2252,"children":2253},{"class":78,"line":340},[2254,2258],{"type":29,"tag":76,"props":2255,"children":2256},{"style":99},[2257],{"type":34,"value":213},{"type":29,"tag":76,"props":2259,"children":2260},{"style":153},[2261],{"type":34,"value":2262},"source\n",{"type":29,"tag":76,"props":2264,"children":2265},{"class":78,"line":358},[2266],{"type":29,"tag":76,"props":2267,"children":2268},{"emptyLinePlaceholder":115},[2269],{"type":34,"value":118},{"type":29,"tag":76,"props":2271,"children":2272},{"class":78,"line":371},[2273,2277,2281,2285],{"type":29,"tag":76,"props":2274,"children":2275},{"style":99},[2276],{"type":34,"value":141},{"type":29,"tag":76,"props":2278,"children":2279},{"style":93},[2280],{"type":34,"value":146},{"type":29,"tag":76,"props":2282,"children":2283},{"style":99},[2284],{"type":34,"value":102},{"type":29,"tag":76,"props":2286,"children":2287},{"style":153},[2288],{"type":34,"value":1959},{"type":29,"tag":76,"props":2290,"children":2291},{"class":78,"line":393},[2292,2296,2300],{"type":29,"tag":76,"props":2293,"children":2294},{"style":93},[2295],{"type":34,"value":2121},{"type":29,"tag":76,"props":2297,"children":2298},{"style":99},[2299],{"type":34,"value":102},{"type":29,"tag":76,"props":2301,"children":2302},{"style":153},[2303],{"type":34,"value":2304},"Cost Per Acquisition\n",{"type":29,"tag":76,"props":2306,"children":2307},{"class":78,"line":406},[2308,2312,2316],{"type":29,"tag":76,"props":2309,"children":2310},{"style":93},[2311],{"type":34,"value":2138},{"type":29,"tag":76,"props":2313,"children":2314},{"style":99},[2315],{"type":34,"value":102},{"type":29,"tag":76,"props":2317,"children":2318},{"style":153},[2319],{"type":34,"value":2147},{"type":29,"tag":76,"props":2321,"children":2322},{"class":78,"line":420},[2323,2327,2331],{"type":29,"tag":76,"props":2324,"children":2325},{"style":93},[2326],{"type":34,"value":2155},{"type":29,"tag":76,"props":2328,"children":2329},{"style":99},[2330],{"type":34,"value":102},{"type":29,"tag":76,"props":2332,"children":2333},{"style":153},[2334],{"type":34,"value":2164},{"type":29,"tag":76,"props":2336,"children":2337},{"class":78,"line":441},[2338,2342,2346],{"type":29,"tag":76,"props":2339,"children":2340},{"style":93},[2341],{"type":34,"value":2172},{"type":29,"tag":76,"props":2343,"children":2344},{"style":99},[2345],{"type":34,"value":102},{"type":29,"tag":76,"props":2347,"children":2348},{"style":153},[2349],{"type":34,"value":2350},"\"safe_divide(total_cost, total_conversions)\"\n",{"type":29,"tag":76,"props":2352,"children":2353},{"class":78,"line":453},[2354,2358,2362],{"type":29,"tag":76,"props":2355,"children":2356},{"style":93},[2357],{"type":34,"value":2189},{"type":29,"tag":76,"props":2359,"children":2360},{"style":99},[2361],{"type":34,"value":102},{"type":29,"tag":76,"props":2363,"children":2364},{"style":153},[2365],{"type":34,"value":1829},{"type":29,"tag":76,"props":2367,"children":2369},{"class":78,"line":2368},21,[2370,2374,2378,2382,2386,2390,2394,2398],{"type":29,"tag":76,"props":2371,"children":2372},{"style":93},[2373],{"type":34,"value":2205},{"type":29,"tag":76,"props":2375,"children":2376},{"style":99},[2377],{"type":34,"value":2210},{"type":29,"tag":76,"props":2379,"children":2380},{"style":153},[2381],{"type":34,"value":2215},{"type":29,"tag":76,"props":2383,"children":2384},{"style":99},[2385],{"type":34,"value":272},{"type":29,"tag":76,"props":2387,"children":2388},{"style":153},[2389],{"type":34,"value":2224},{"type":29,"tag":76,"props":2391,"children":2392},{"style":99},[2393],{"type":34,"value":272},{"type":29,"tag":76,"props":2395,"children":2396},{"style":153},[2397],{"type":34,"value":2233},{"type":29,"tag":76,"props":2399,"children":2400},{"style":99},[2401],{"type":34,"value":2238},{"type":29,"tag":76,"props":2403,"children":2405},{"class":78,"line":2404},22,[2406,2410],{"type":29,"tag":76,"props":2407,"children":2408},{"style":93},[2409],{"type":34,"value":2246},{"type":29,"tag":76,"props":2411,"children":2412},{"style":99},[2413],{"type":34,"value":132},{"type":29,"tag":76,"props":2415,"children":2417},{"class":78,"line":2416},23,[2418,2422],{"type":29,"tag":76,"props":2419,"children":2420},{"style":99},[2421],{"type":34,"value":213},{"type":29,"tag":76,"props":2423,"children":2424},{"style":153},[2425],{"type":34,"value":2262},{"type":29,"tag":30,"props":2427,"children":2428},{},[2429,2431,2435,2437,2441],{"type":34,"value":2430},"La couche sémantique remplit deux fonctions : ",{"type":29,"tag":58,"props":2432,"children":2433},{},[2434],{"type":34,"value":472},{"type":34,"value":2436}," quand une métrique est sélectionnée dans un BI tool, le SQL se génère automatiquement (intégration Looker, Tableau, Power BI), ",{"type":29,"tag":58,"props":2438,"children":2439},{},[2440],{"type":34,"value":487},{"type":34,"value":2442}," quand la métrique change, tous les dashboard restent cohérents. Si vous décidez \"le CPA doit inclure les frais d'expédition\", une seule ligne change — 40 dashboard se mettent à jour en une seule opération.",{"type":29,"tag":30,"props":2444,"children":2445},{},[2446],{"type":34,"value":2447},"MetricFlow est en beta (juin 2026), mais utilisable en production. Alternative : écrivez des fonctions de métrique personnalisées en macros dbt :",{"type":29,"tag":66,"props":2449,"children":2451},{"className":584,"code":2450,"language":586,"meta":13,"style":13},"-- macros\u002Fcalculate_cpa.sql\n{% macro calculate_cpa(cost_column, conversion_column) %}\n  safe_divide({{ cost_column }}, nullif({{ conversion_column }}, 0))\n{% endmacro %}\n",[2452],{"type":29,"tag":49,"props":2453,"children":2454},{"__ignoreMap":13},[2455,2463,2471,2498],{"type":29,"tag":76,"props":2456,"children":2457},{"class":78,"line":79},[2458],{"type":29,"tag":76,"props":2459,"children":2460},{"style":83},[2461],{"type":34,"value":2462},"-- macros\u002Fcalculate_cpa.sql\n",{"type":29,"tag":76,"props":2464,"children":2465},{"class":78,"line":89},[2466],{"type":29,"tag":76,"props":2467,"children":2468},{"style":99},[2469],{"type":34,"value":2470},"{% macro calculate_cpa(cost_column, conversion_column) %}\n",{"type":29,"tag":76,"props":2472,"children":2473},{"class":78,"line":111},[2474,2479,2484,2489,2494],{"type":29,"tag":76,"props":2475,"children":2476},{"style":99},[2477],{"type":34,"value":2478},"  safe_divide({{ cost_column }}, ",{"type":29,"tag":76,"props":2480,"children":2481},{"style":105},[2482],{"type":34,"value":2483},"nullif",{"type":29,"tag":76,"props":2485,"children":2486},{"style":99},[2487],{"type":34,"value":2488},"({{ conversion_column }}, ",{"type":29,"tag":76,"props":2490,"children":2491},{"style":105},[2492],{"type":34,"value":2493},"0",{"type":29,"tag":76,"props":2495,"children":2496},{"style":99},[2497],{"type":34,"value":879},{"type":29,"tag":76,"props":2499,"children":2500},{"class":78,"line":121},[2501],{"type":29,"tag":76,"props":2502,"children":2503},{"style":99},[2504],{"type":34,"value":2505},"{% endmacro %}\n",{"type":29,"tag":30,"props":2507,"children":2508},{},[2509,2511,2517],{"type":34,"value":2510},"Dans tous les modèles mart, appelez ",{"type":29,"tag":49,"props":2512,"children":2514},{"className":2513},[],[2515],{"type":34,"value":2516},"{{ calculate_cpa('total_cost', 'total_conversions') }}",{"type":34,"value":2518}," — les changements de métrique se propagent depuis un seul endroit.",{"type":29,"tag":37,"props":2520,"children":2522},{"id":2521},"exposures-liez-un-modèle-à-un-dashboard-bi",[2523],{"type":34,"value":2524},"Exposures : Liez un Modèle à un Dashboard BI",{"type":29,"tag":30,"props":2526,"children":2527},{},[2528,2530,2536],{"type":34,"value":2529},"Le fichier ",{"type":29,"tag":49,"props":2531,"children":2533},{"className":2532},[],[2534],{"type":34,"value":2535},"exposures.yml",{"type":34,"value":2537}," de dbt enregistre quel modèle est utilisé dans quel dashboard. Ce suivi est opérationnel — vous savez quels dashboard tester quand un modèle change :",{"type":29,"tag":66,"props":2539,"children":2541},{"className":68,"code":2540,"language":70,"meta":13,"style":13},"# models\u002Fexposures.yml\nversion: 2\n\nexposures:\n  - name: executive_performance_dashboard\n    type: dashboard\n    maturity: high\n    url: https:\u002F\u002Flookerstudio.google.com\u002Freporting\u002Fabc123\n    description: \"Daily paid media performance for C-level\"\n    depends_on:\n      - ref('fct_daily_performance')\n      - ref('fct_campaign_performance')\n    owner:\n      name: Growth Team\n      email: growth@company.com\n\n  - name: weekly_marketing_review\n    type: analysis\n    maturity: medium\n    url: https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002Fxyz789\n    description: \"Weekly deep-dive into channel mix\"\n    depends_on:\n      - ref('fct_daily_performance')\n    owner:\n      name: Marketing Ops\n      email: mops@company.com\n",[2542],{"type":29,"tag":49,"props":2543,"children":2544},{"__ignoreMap":13},[2545,2553,2568,2575,2587,2607,2624,2641,2658,2675,2687,2698,2710,2722,2739,2756,2763,2783,2799,2815,2831,2847,2858,2869,2881,2898],{"type":29,"tag":76,"props":2546,"children":2547},{"class":78,"line":79},[2548],{"type":29,"tag":76,"props":2549,"children":2550},{"style":83},[2551],{"type":34,"value":2552},"# models\u002Fexposures.yml\n",{"type":29,"tag":76,"props":2554,"children":2555},{"class":78,"line":89},[2556,2560,2564],{"type":29,"tag":76,"props":2557,"children":2558},{"style":93},[2559],{"type":34,"value":96},{"type":29,"tag":76,"props":2561,"children":2562},{"style":99},[2563],{"type":34,"value":102},{"type":29,"tag":76,"props":2565,"children":2566},{"style":105},[2567],{"type":34,"value":108},{"type":29,"tag":76,"props":2569,"children":2570},{"class":78,"line":111},[2571],{"type":29,"tag":76,"props":2572,"children":2573},{"emptyLinePlaceholder":115},[2574],{"type":34,"value":118},{"type":29,"tag":76,"props":2576,"children":2577},{"class":78,"line":121},[2578,2583],{"type":29,"tag":76,"props":2579,"children":2580},{"style":93},[2581],{"type":34,"value":2582},"exposures",{"type":29,"tag":76,"props":2584,"children":2585},{"style":99},[2586],{"type":34,"value":132},{"type":29,"tag":76,"props":2588,"children":2589},{"class":78,"line":135},[2590,2594,2598,2602],{"type":29,"tag":76,"props":2591,"children":2592},{"style":99},[2593],{"type":34,"value":141},{"type":29,"tag":76,"props":2595,"children":2596},{"style":93},[2597],{"type":34,"value":146},{"type":29,"tag":76,"props":2599,"children":2600},{"style":99},[2601],{"type":34,"value":102},{"type":29,"tag":76,"props":2603,"children":2604},{"style":153},[2605],{"type":34,"value":2606},"executive_performance_dashboard\n",{"type":29,"tag":76,"props":2608,"children":2609},{"class":78,"line":159},[2610,2615,2619],{"type":29,"tag":76,"props":2611,"children":2612},{"style":93},[2613],{"type":34,"value":2614},"    type",{"type":29,"tag":76,"props":2616,"children":2617},{"style":99},[2618],{"type":34,"value":102},{"type":29,"tag":76,"props":2620,"children":2621},{"style":153},[2622],{"type":34,"value":2623},"dashboard\n",{"type":29,"tag":76,"props":2625,"children":2626},{"class":78,"line":177},[2627,2632,2636],{"type":29,"tag":76,"props":2628,"children":2629},{"style":93},[2630],{"type":34,"value":2631},"    maturity",{"type":29,"tag":76,"props":2633,"children":2634},{"style":99},[2635],{"type":34,"value":102},{"type":29,"tag":76,"props":2637,"children":2638},{"style":153},[2639],{"type":34,"value":2640},"high\n",{"type":29,"tag":76,"props":2642,"children":2643},{"class":78,"line":23},[2644,2649,2653],{"type":29,"tag":76,"props":2645,"children":2646},{"style":93},[2647],{"type":34,"value":2648},"    url",{"type":29,"tag":76,"props":2650,"children":2651},{"style":99},[2652],{"type":34,"value":102},{"type":29,"tag":76,"props":2654,"children":2655},{"style":153},[2656],{"type":34,"value":2657},"https:\u002F\u002Flookerstudio.google.com\u002Freporting\u002Fabc123\n",{"type":29,"tag":76,"props":2659,"children":2660},{"class":78,"line":207},[2661,2666,2670],{"type":29,"tag":76,"props":2662,"children":2663},{"style":93},[2664],{"type":34,"value":2665},"    description",{"type":29,"tag":76,"props":2667,"children":2668},{"style":99},[2669],{"type":34,"value":102},{"type":29,"tag":76,"props":2671,"children":2672},{"style":153},[2673],{"type":34,"value":2674},"\"Daily paid media performance for C-level\"\n",{"type":29,"tag":76,"props":2676,"children":2677},{"class":78,"line":229},[2678,2683],{"type":29,"tag":76,"props":2679,"children":2680},{"style":93},[2681],{"type":34,"value":2682},"    depends_on",{"type":29,"tag":76,"props":2684,"children":2685},{"style":99},[2686],{"type":34,"value":132},{"type":29,"tag":76,"props":2688,"children":2689},{"class":78,"line":242},[2690,2694],{"type":29,"tag":76,"props":2691,"children":2692},{"style":99},[2693],{"type":34,"value":213},{"type":29,"tag":76,"props":2695,"children":2696},{"style":153},[2697],{"type":34,"value":2147},{"type":29,"tag":76,"props":2699,"children":2700},{"class":78,"line":294},[2701,2705],{"type":29,"tag":76,"props":2702,"children":2703},{"style":99},[2704],{"type":34,"value":213},{"type":29,"tag":76,"props":2706,"children":2707},{"style":153},[2708],{"type":34,"value":2709},"ref('fct_campaign_performance')\n",{"type":29,"tag":76,"props":2711,"children":2712},{"class":78,"line":340},[2713,2718],{"type":29,"tag":76,"props":2714,"children":2715},{"style":93},[2716],{"type":34,"value":2717},"    owner",{"type":29,"tag":76,"props":2719,"children":2720},{"style":99},[2721],{"type":34,"value":132},{"type":29,"tag":76,"props":2723,"children":2724},{"class":78,"line":358},[2725,2730,2734],{"type":29,"tag":76,"props":2726,"children":2727},{"style":93},[2728],{"type":34,"value":2729},"      name",{"type":29,"tag":76,"props":2731,"children":2732},{"style":99},[2733],{"type":34,"value":102},{"type":29,"tag":76,"props":2735,"children":2736},{"style":153},[2737],{"type":34,"value":2738},"Growth Team\n",{"type":29,"tag":76,"props":2740,"children":2741},{"class":78,"line":371},[2742,2747,2751],{"type":29,"tag":76,"props":2743,"children":2744},{"style":93},[2745],{"type":34,"value":2746},"      email",{"type":29,"tag":76,"props":2748,"children":2749},{"style":99},[2750],{"type":34,"value":102},{"type":29,"tag":76,"props":2752,"children":2753},{"style":153},[2754],{"type":34,"value":2755},"growth@company.com\n",{"type":29,"tag":76,"props":2757,"children":2758},{"class":78,"line":393},[2759],{"type":29,"tag":76,"props":2760,"children":2761},{"emptyLinePlaceholder":115},[2762],{"type":34,"value":118},{"type":29,"tag":76,"props":2764,"children":2765},{"class":78,"line":406},[2766,2770,2774,2778],{"type":29,"tag":76,"props":2767,"children":2768},{"style":99},[2769],{"type":34,"value":141},{"type":29,"tag":76,"props":2771,"children":2772},{"style":93},[2773],{"type":34,"value":146},{"type":29,"tag":76,"props":2775,"children":2776},{"style":99},[2777],{"type":34,"value":102},{"type":29,"tag":76,"props":2779,"children":2780},{"style":153},[2781],{"type":34,"value":2782},"weekly_marketing_review\n",{"type":29,"tag":76,"props":2784,"children":2785},{"class":78,"line":420},[2786,2790,2794],{"type":29,"tag":76,"props":2787,"children":2788},{"style":93},[2789],{"type":34,"value":2614},{"type":29,"tag":76,"props":2791,"children":2792},{"style":99},[2793],{"type":34,"value":102},{"type":29,"tag":76,"props":2795,"children":2796},{"style":153},[2797],{"type":34,"value":2798},"analysis\n",{"type":29,"tag":76,"props":2800,"children":2801},{"class":78,"line":441},[2802,2806,2810],{"type":29,"tag":76,"props":2803,"children":2804},{"style":93},[2805],{"type":34,"value":2631},{"type":29,"tag":76,"props":2807,"children":2808},{"style":99},[2809],{"type":34,"value":102},{"type":29,"tag":76,"props":2811,"children":2812},{"style":153},[2813],{"type":34,"value":2814},"medium\n",{"type":29,"tag":76,"props":2816,"children":2817},{"class":78,"line":453},[2818,2822,2826],{"type":29,"tag":76,"props":2819,"children":2820},{"style":93},[2821],{"type":34,"value":2648},{"type":29,"tag":76,"props":2823,"children":2824},{"style":99},[2825],{"type":34,"value":102},{"type":29,"tag":76,"props":2827,"children":2828},{"style":153},[2829],{"type":34,"value":2830},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002Fxyz789\n",{"type":29,"tag":76,"props":2832,"children":2833},{"class":78,"line":2368},[2834,2838,2842],{"type":29,"tag":76,"props":2835,"children":2836},{"style":93},[2837],{"type":34,"value":2665},{"type":29,"tag":76,"props":2839,"children":2840},{"style":99},[2841],{"type":34,"value":102},{"type":29,"tag":76,"props":2843,"children":2844},{"style":153},[2845],{"type":34,"value":2846},"\"Weekly deep-dive into channel mix\"\n",{"type":29,"tag":76,"props":2848,"children":2849},{"class":78,"line":2404},[2850,2854],{"type":29,"tag":76,"props":2851,"children":2852},{"style":93},[2853],{"type":34,"value":2682},{"type":29,"tag":76,"props":2855,"children":2856},{"style":99},[2857],{"type":34,"value":132},{"type":29,"tag":76,"props":2859,"children":2860},{"class":78,"line":2416},[2861,2865],{"type":29,"tag":76,"props":2862,"children":2863},{"style":99},[2864],{"type":34,"value":213},{"type":29,"tag":76,"props":2866,"children":2867},{"style":153},[2868],{"type":34,"value":2147},{"type":29,"tag":76,"props":2870,"children":2872},{"class":78,"line":2871},24,[2873,2877],{"type":29,"tag":76,"props":2874,"children":2875},{"style":93},[2876],{"type":34,"value":2717},{"type":29,"tag":76,"props":2878,"children":2879},{"style":99},[2880],{"type":34,"value":132},{"type":29,"tag":76,"props":2882,"children":2884},{"class":78,"line":2883},25,[2885,2889,2893],{"type":29,"tag":76,"props":2886,"children":2887},{"style":93},[2888],{"type":34,"value":2729},{"type":29,"tag":76,"props":2890,"children":2891},{"style":99},[2892],{"type":34,"value":102},{"type":29,"tag":76,"props":2894,"children":2895},{"style":153},[2896],{"type":34,"value":2897},"Marketing Ops\n",{"type":29,"tag":76,"props":2899,"children":2901},{"class":78,"line":2900},26,[2902,2906,2910],{"type":29,"tag":76,"props":2903,"children":2904},{"style":93},[2905],{"type":34,"value":2746},{"type":29,"tag":76,"props":2907,"children":2908},{"style":99},[2909],{"type":34,"value":102},{"type":29,"tag":76,"props":2911,"children":2912},{"style":153},[2913],{"type":34,"value":2914},"mops@company.com\n",{"type":29,"tag":30,"props":2916,"children":2917},{},[2918,2920,2926,2928,2934],{"type":34,"value":2919},"Le lineage d'exposure est visible dans le graphique : après ",{"type":29,"tag":49,"props":2921,"children":2923},{"className":2922},[],[2924],{"type":34,"value":2925},"dbt docs generate",{"type":34,"value":2927},", cliquez sur le nœud ",{"type":29,"tag":49,"props":2929,"children":2931},{"className":2930},[],[2932],{"type":34,"value":2933},"fct_daily_performance",{"type":34,"value":2935}," dans l'interface web pour voir quels dashboard en dépendent. Avant un changement décisif dans un modèle, vous pouvez avertir les propriétaires d'exposure automatiquement (webhook Slack).",{"type":29,"tag":555,"props":2937,"children":2939},{"id":2938},"pattern-de-déploiement-en-production",[2940],{"type":34,"value":2941},"Pattern de Déploiement en Production",{"type":29,"tag":30,"props":2943,"children":2944},{},[2945],{"type":34,"value":2946},"Les jobs dbt Cloud en production s'exécutent dans cet ordre :",{"type":29,"tag":2948,"props":2949,"children":2950},"ol",{},[2951,2970,2987,3003],{"type":29,"tag":2952,"props":2953,"children":2954},"li",{},[2955,2960,2962,2968],{"type":29,"tag":58,"props":2956,"children":2957},{},[2958],{"type":34,"value":2959},"Source freshness check",{"type":34,"value":2961}," — ",{"type":29,"tag":49,"props":2963,"children":2965},{"className":2964},[],[2966],{"type":34,"value":2967},"dbt source freshness",{"type":34,"value":2969}," (échoue si les données amont sont retardées)",{"type":29,"tag":2952,"props":2971,"children":2972},{},[2973,2978,2979,2985],{"type":29,"tag":58,"props":2974,"children":2975},{},[2976],{"type":34,"value":2977},"Model run",{"type":34,"value":2961},{"type":29,"tag":49,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":34,"value":2984},"dbt run --select tag:daily",{"type":34,"value":2986}," (les modèles quotidiens se construisent à 07:00)",{"type":29,"tag":2952,"props":2988,"children":2989},{},[2990,2995,2996,3001],{"type":29,"tag":58,"props":2991,"children":2992},{},[2993],{"type":34,"value":2994},"Test execution",{"type":34,"value":2961},{"type":29,"tag":49,"props":2997,"children":2999},{"className":2998},[],[3000],{"type":34,"value":2012},{"type":34,"value":3002}," (l'infraction de contrat déclenche un rollback)",{"type":29,"tag":2952,"props":3004,"children":3005},{},[3006,3011,3012,3017],{"type":29,"tag":58,"props":3007,"children":3008},{},[3009],{"type":34,"value":3010},"Documentation update",{"type":34,"value":2961},{"type":29,"tag":49,"props":3013,"children":3015},{"className":3014},[],[3016],{"type":34,"value":2925},{"type":34,"value":3018}," (le graphique de lineage se met à jour)",{"type":29,"tag":30,"props":3020,"children":3021},{},[3022],{"type":34,"value":3023},"Utiliser dbt à la place des requêtes planifiées BigQuery offre : version control (chaque déploiement est un commit git), rollback capability (un modèle erroné revient à la version antérieure en 5 minutes), alerte Slack (test échoué + avertissement freshness).",{"type":29,"tag":37,"props":3025,"children":3027},{"id":3026},"tradeoff-elt-ou-reverse-etl",[3028],{"type":34,"value":3029},"Tradeoff : ELT ou Reverse ETL",{"type":29,"tag":30,"props":3031,"children":3032},{},[3033],{"type":34,"value":3034},"La stack dbt + BigQuery suit le pattern ELT (extract-load-transform) — les données brutes sont d'abord chargées dans le warehouse, la transformation se fait dans BigQuery. Alternative : reverse ETL (Hightouch, Census) — les données du warehouse sont poussées vers les outils SaaS. Les deux se complètent : dbt nettoie le warehouse, reverse ETL envoie des segments à Braze\u002FIterable.",{"type":29,"tag":30,"props":3036,"children":3037},{},[3038],{"type":34,"value":3039},"Tradeoff : coût du calcul BigQuery. 1 To de scan = 5 $ — si un modèle mart complexe s'exécute 10 fois par jour, cela coûte 50 $\u002Fjour = 1500 $\u002Fmois. Optimisation : matérialisation incrémentale + élagage de partition + clustering. Chez Roibase, le coût mensuel de BigQuery cible 0,02 $ par utilisateur actif mensuel — 1M MAU = 20 K$\u002Fan (acceptable).",{"type":29,"tag":30,"props":3041,"children":3042},{},[3043],{"type":34,"value":3044},"La stack marketing data n'est pas un projet unique — c'est une architecture évolutive. Après avoir posé la base dbt + BigQuery, vous ajouterez les couches MMM (marketing mix modeling), test d'incrémentalité, identity resolution. Construire correctement cette base prend 6-8 semaines mais offre 18 mois de gains — chaque nouvelle question KPI obtient une réponse en 2 heures au lieu de 2 jours, le nettoyage manuel des données disparaît, un changement de modèle d'attribution prend 1 heure au lieu de 1 jour. Bien construire la stack transforme les données marketing en mécanisme décisionnel.",{"type":29,"tag":3046,"props":3047,"children":3048},"style",{},[3049],{"type":34,"value":3050},"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":13,"searchDepth":111,"depth":111,"links":3052},[3053,3056,3059,3060,3063],{"id":39,"depth":89,"text":42,"children":3054},[3055],{"id":557,"depth":111,"text":560},{"id":992,"depth":89,"text":995,"children":3057},[3058],{"id":1720,"depth":111,"text":1723},{"id":2028,"depth":89,"text":2031},{"id":2521,"depth":89,"text":2524,"children":3061},[3062],{"id":2938,"depth":111,"text":2941},{"id":3026,"depth":89,"text":3029},"markdown","content:fr:data:dbt-bigquery-modern-pazarlama-data-stack.md","content","fr\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack.md","fr\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack","md",1785103541806]