[{"data":1,"prerenderedAt":3162},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fit\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack":13},{"i18nKey":4,"paths":5},"data-002-2026-06",{"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-marketing-data-stack","\u002Ffr\u002Fdata\u002Fdbt-bigquery-modern-marketing-data-stack","\u002Fit\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack","\u002Fru\u002Fdata\u002Fdbt-bigquery-sovremenniy-marketing-data-stack","\u002Ftr\u002Fdata\u002Fdbt-bigquery-ile-modern-pazarlama-data-stack",{"_path":10,"_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":3156,"_id":3157,"_source":3158,"_file":3159,"_stem":3160,"_extension":3161},"data",false,"","dbt + BigQuery con il Modern Marketing Data Stack","Dal source mapping al semantic layer: come trasformate i dati di marketing in meccanismi decisionali? L'architettura di modeling dbt, le definizioni di exposure e la pipeline di produzione.","2026-06-14",[21,22,23,24,25],"dbt","bigquery","data-modeling","semantic-layer","marketing-analytics",9,"Roibase",{"type":29,"children":30,"toc":3146},"root",[31,39,46,84,350,379,424,430,443,726,739,1068,1127,1133,1145,1508,1513,1545,1551,1571,1775,1795,1808,1915,1920,1926,1939,2216,2229,2242,2504,2525,2531,2536,2789,2794,2807,2981,2986,2992,2997,3002,3007,3110,3115,3121,3140],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","I team di marketing nel 2026 non lottano con i dati, ma prendono decisioni con i dati. GA4, Meta Ads, Google Ads, CRM, CDP, server-side GTM — tutti scaricano in tabelle separate. Il team fa merge manuale in spreadsheet, i numeri cambiano ogni settimana, nessuno si fida. Questo caos scompare con il modern data stack: BigQuery come fonte, il layer di trasformazione dbt, il semantic layer come albero degli indicatori. Versionizzate il codice nel repository, ogni modifica viene testata, le metriche provengono da un'unica source of truth. Questo articolo mostra come la combinazione dbt + BigQuery trasforma la pipeline di marketing in production-grade.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"source-mapping-standardizzare-i-percorsi-dei-dati-grezzi",[44],{"type":37,"value":45},"Source mapping: standardizzare i percorsi dei dati grezzi",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66,68,74,76,82],{"type":37,"value":50},"Il primo compito di dbt è il source mapping — normalizzare i dati grezzi da sistemi diversi nello stesso schema. In BigQuery la tabella ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"analytics_123456.events_*",{"type":37,"value":59}," arriva da GA4, ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"facebook_ads.ads_insights",{"type":37,"value":67}," dall'API Meta, ",{"type":32,"tag":52,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"crm.transactions",{"type":37,"value":75}," da Shopify. Ognuno ha formati timestamp diversi, identificatori utente diversi, colonne currency diverse. Nel file ",{"type":32,"tag":52,"props":77,"children":79},{"className":78},[],[80],{"type":37,"value":81},"sources.yml",{"type":37,"value":83}," di dbt definite le tabelle grezze:",{"type":32,"tag":85,"props":86,"children":90},"pre",{"className":87,"code":88,"language":89,"meta":16,"style":16},"language-yaml shiki shiki-themes github-dark","version: 2\nsources:\n  - name: ga4\n    database: analytics_123456\n    tables:\n      - name: events_\n        identifier: \"events_*\"\n        loaded_at_field: event_timestamp\n  - name: meta_ads\n    database: facebook_ads\n    schema: public\n    tables:\n      - name: ads_insights\n        loaded_at_field: date_start\n","yaml",[91],{"type":32,"tag":52,"props":92,"children":93},{"__ignoreMap":16},[94,118,132,156,174,187,209,227,245,265,282,300,312,333],{"type":32,"tag":95,"props":96,"children":99},"span",{"class":97,"line":98},"line",1,[100,106,112],{"type":32,"tag":95,"props":101,"children":103},{"style":102},"--shiki-default:#85E89D",[104],{"type":37,"value":105},"version",{"type":32,"tag":95,"props":107,"children":109},{"style":108},"--shiki-default:#E1E4E8",[110],{"type":37,"value":111},": ",{"type":32,"tag":95,"props":113,"children":115},{"style":114},"--shiki-default:#79B8FF",[116],{"type":37,"value":117},"2\n",{"type":32,"tag":95,"props":119,"children":121},{"class":97,"line":120},2,[122,127],{"type":32,"tag":95,"props":123,"children":124},{"style":102},[125],{"type":37,"value":126},"sources",{"type":32,"tag":95,"props":128,"children":129},{"style":108},[130],{"type":37,"value":131},":\n",{"type":32,"tag":95,"props":133,"children":135},{"class":97,"line":134},3,[136,141,146,150],{"type":32,"tag":95,"props":137,"children":138},{"style":108},[139],{"type":37,"value":140},"  - ",{"type":32,"tag":95,"props":142,"children":143},{"style":102},[144],{"type":37,"value":145},"name",{"type":32,"tag":95,"props":147,"children":148},{"style":108},[149],{"type":37,"value":111},{"type":32,"tag":95,"props":151,"children":153},{"style":152},"--shiki-default:#9ECBFF",[154],{"type":37,"value":155},"ga4\n",{"type":32,"tag":95,"props":157,"children":159},{"class":97,"line":158},4,[160,165,169],{"type":32,"tag":95,"props":161,"children":162},{"style":102},[163],{"type":37,"value":164},"    database",{"type":32,"tag":95,"props":166,"children":167},{"style":108},[168],{"type":37,"value":111},{"type":32,"tag":95,"props":170,"children":171},{"style":152},[172],{"type":37,"value":173},"analytics_123456\n",{"type":32,"tag":95,"props":175,"children":177},{"class":97,"line":176},5,[178,183],{"type":32,"tag":95,"props":179,"children":180},{"style":102},[181],{"type":37,"value":182},"    tables",{"type":32,"tag":95,"props":184,"children":185},{"style":108},[186],{"type":37,"value":131},{"type":32,"tag":95,"props":188,"children":190},{"class":97,"line":189},6,[191,196,200,204],{"type":32,"tag":95,"props":192,"children":193},{"style":108},[194],{"type":37,"value":195},"      - ",{"type":32,"tag":95,"props":197,"children":198},{"style":102},[199],{"type":37,"value":145},{"type":32,"tag":95,"props":201,"children":202},{"style":108},[203],{"type":37,"value":111},{"type":32,"tag":95,"props":205,"children":206},{"style":152},[207],{"type":37,"value":208},"events_\n",{"type":32,"tag":95,"props":210,"children":212},{"class":97,"line":211},7,[213,218,222],{"type":32,"tag":95,"props":214,"children":215},{"style":102},[216],{"type":37,"value":217},"        identifier",{"type":32,"tag":95,"props":219,"children":220},{"style":108},[221],{"type":37,"value":111},{"type":32,"tag":95,"props":223,"children":224},{"style":152},[225],{"type":37,"value":226},"\"events_*\"\n",{"type":32,"tag":95,"props":228,"children":230},{"class":97,"line":229},8,[231,236,240],{"type":32,"tag":95,"props":232,"children":233},{"style":102},[234],{"type":37,"value":235},"        loaded_at_field",{"type":32,"tag":95,"props":237,"children":238},{"style":108},[239],{"type":37,"value":111},{"type":32,"tag":95,"props":241,"children":242},{"style":152},[243],{"type":37,"value":244},"event_timestamp\n",{"type":32,"tag":95,"props":246,"children":247},{"class":97,"line":26},[248,252,256,260],{"type":32,"tag":95,"props":249,"children":250},{"style":108},[251],{"type":37,"value":140},{"type":32,"tag":95,"props":253,"children":254},{"style":102},[255],{"type":37,"value":145},{"type":32,"tag":95,"props":257,"children":258},{"style":108},[259],{"type":37,"value":111},{"type":32,"tag":95,"props":261,"children":262},{"style":152},[263],{"type":37,"value":264},"meta_ads\n",{"type":32,"tag":95,"props":266,"children":268},{"class":97,"line":267},10,[269,273,277],{"type":32,"tag":95,"props":270,"children":271},{"style":102},[272],{"type":37,"value":164},{"type":32,"tag":95,"props":274,"children":275},{"style":108},[276],{"type":37,"value":111},{"type":32,"tag":95,"props":278,"children":279},{"style":152},[280],{"type":37,"value":281},"facebook_ads\n",{"type":32,"tag":95,"props":283,"children":285},{"class":97,"line":284},11,[286,291,295],{"type":32,"tag":95,"props":287,"children":288},{"style":102},[289],{"type":37,"value":290},"    schema",{"type":32,"tag":95,"props":292,"children":293},{"style":108},[294],{"type":37,"value":111},{"type":32,"tag":95,"props":296,"children":297},{"style":152},[298],{"type":37,"value":299},"public\n",{"type":32,"tag":95,"props":301,"children":303},{"class":97,"line":302},12,[304,308],{"type":32,"tag":95,"props":305,"children":306},{"style":102},[307],{"type":37,"value":182},{"type":32,"tag":95,"props":309,"children":310},{"style":108},[311],{"type":37,"value":131},{"type":32,"tag":95,"props":313,"children":315},{"class":97,"line":314},13,[316,320,324,328],{"type":32,"tag":95,"props":317,"children":318},{"style":108},[319],{"type":37,"value":195},{"type":32,"tag":95,"props":321,"children":322},{"style":102},[323],{"type":37,"value":145},{"type":32,"tag":95,"props":325,"children":326},{"style":108},[327],{"type":37,"value":111},{"type":32,"tag":95,"props":329,"children":330},{"style":152},[331],{"type":37,"value":332},"ads_insights\n",{"type":32,"tag":95,"props":334,"children":336},{"class":97,"line":335},14,[337,341,345],{"type":32,"tag":95,"props":338,"children":339},{"style":102},[340],{"type":37,"value":235},{"type":32,"tag":95,"props":342,"children":343},{"style":108},[344],{"type":37,"value":111},{"type":32,"tag":95,"props":346,"children":347},{"style":152},[348],{"type":37,"value":349},"date_start\n",{"type":32,"tag":33,"props":351,"children":352},{},[353,355,361,363,369,371,377],{"type":37,"value":354},"Questa definizione dice a dbt \"queste sono fonti upstream, non le tocco ma ne testo la freschezza\". Il comando ",{"type":32,"tag":52,"props":356,"children":358},{"className":357},[],[359],{"type":37,"value":360},"dbt source freshness",{"type":37,"value":362}," controlla quando sono arrivati gli ultimi dati — se l'API Meta ritarda, genera un avviso. Senza source mapping ogni modello scrive direttamente ",{"type":32,"tag":52,"props":364,"children":366},{"className":365},[],[367],{"type":37,"value":368},"SELECT * FROM analytics_123456.events_20260614",{"type":37,"value":370},", e se il nome della tabella cambia, 40 modelli si rompono. Con il mapping il riferimento diventa ",{"type":32,"tag":52,"props":372,"children":374},{"className":373},[],[375],{"type":37,"value":376},"{{ source('ga4', 'events_') }}",{"type":37,"value":378},", il cambiamento si propaga da un solo punto.",{"type":32,"tag":33,"props":380,"children":381},{},[382,384,390,392,398,400,406,408,414,416,422],{"type":37,"value":383},"Il ",{"type":32,"tag":52,"props":385,"children":387},{"className":386},[],[388],{"type":37,"value":389},"event_timestamp",{"type":37,"value":391}," di GA4 è in microsecondi Unix, il ",{"type":32,"tag":52,"props":393,"children":395},{"className":394},[],[396],{"type":37,"value":397},"date_start",{"type":37,"value":399}," di Meta è una stringa ISO, il ",{"type":32,"tag":52,"props":401,"children":403},{"className":402},[],[404],{"type":37,"value":405},"created_at",{"type":37,"value":407}," del CRM è datetime UTC — formati diversi. Nel source mapping estraete una colonna timestamp standard: ",{"type":32,"tag":52,"props":409,"children":411},{"className":410},[],[412],{"type":37,"value":413},"TIMESTAMP_MICROS(event_timestamp) AS event_time",{"type":37,"value":415}," per GA4, ",{"type":32,"tag":52,"props":417,"children":419},{"className":418},[],[420],{"type":37,"value":421},"PARSE_TIMESTAMP('%Y-%m-%d', date_start) AS event_time",{"type":37,"value":423}," per Meta. Questa normalizzazione fornisce input pulito ai modelli downstream.",{"type":32,"tag":40,"props":425,"children":427},{"id":426},"modeling-layer-staging-intermediate-mart",[428],{"type":37,"value":429},"Modeling layer: staging, intermediate, mart",{"type":32,"tag":33,"props":431,"children":432},{},[433,435,441],{"type":37,"value":434},"La potenza di dbt risiede nel modeling in strati — staging, intermediate, mart. I modelli staging estraggono dai source in rapporto 1:1, facendo solo rename e type casting. ",{"type":32,"tag":52,"props":436,"children":438},{"className":437},[],[439],{"type":37,"value":440},"stg_ga4_events.sql",{"type":37,"value":442},":",{"type":32,"tag":85,"props":444,"children":448},{"className":445,"code":446,"language":447,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","SELECT\n  TIMESTAMP_MICROS(event_timestamp) AS event_time,\n  user_pseudo_id AS anonymous_id,\n  event_name,\n  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'session_id') AS session_id,\n  geo.country,\n  device.category AS device_category\nFROM {{ source('ga4', 'events_') }}\nWHERE _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","sql",[449],{"type":32,"tag":52,"props":450,"children":451},{"__ignoreMap":16},[452,461,479,496,504,576,598,625,658,705],{"type":32,"tag":95,"props":453,"children":454},{"class":97,"line":98},[455],{"type":32,"tag":95,"props":456,"children":458},{"style":457},"--shiki-default:#F97583",[459],{"type":37,"value":460},"SELECT\n",{"type":32,"tag":95,"props":462,"children":463},{"class":97,"line":120},[464,469,474],{"type":32,"tag":95,"props":465,"children":466},{"style":108},[467],{"type":37,"value":468},"  TIMESTAMP_MICROS(event_timestamp) ",{"type":32,"tag":95,"props":470,"children":471},{"style":457},[472],{"type":37,"value":473},"AS",{"type":32,"tag":95,"props":475,"children":476},{"style":108},[477],{"type":37,"value":478}," event_time,\n",{"type":32,"tag":95,"props":480,"children":481},{"class":97,"line":134},[482,487,491],{"type":32,"tag":95,"props":483,"children":484},{"style":108},[485],{"type":37,"value":486},"  user_pseudo_id ",{"type":32,"tag":95,"props":488,"children":489},{"style":457},[490],{"type":37,"value":473},{"type":32,"tag":95,"props":492,"children":493},{"style":108},[494],{"type":37,"value":495}," anonymous_id,\n",{"type":32,"tag":95,"props":497,"children":498},{"class":97,"line":158},[499],{"type":32,"tag":95,"props":500,"children":501},{"style":108},[502],{"type":37,"value":503},"  event_name,\n",{"type":32,"tag":95,"props":505,"children":506},{"class":97,"line":176},[507,512,517,522,527,532,537,542,547,552,557,562,567,571],{"type":32,"tag":95,"props":508,"children":509},{"style":108},[510],{"type":37,"value":511},"  (",{"type":32,"tag":95,"props":513,"children":514},{"style":457},[515],{"type":37,"value":516},"SELECT",{"type":32,"tag":95,"props":518,"children":519},{"style":114},[520],{"type":37,"value":521}," value",{"type":32,"tag":95,"props":523,"children":524},{"style":108},[525],{"type":37,"value":526},".",{"type":32,"tag":95,"props":528,"children":529},{"style":114},[530],{"type":37,"value":531},"string_value",{"type":32,"tag":95,"props":533,"children":534},{"style":457},[535],{"type":37,"value":536}," FROM",{"type":32,"tag":95,"props":538,"children":539},{"style":108},[540],{"type":37,"value":541}," UNNEST(event_params) ",{"type":32,"tag":95,"props":543,"children":544},{"style":457},[545],{"type":37,"value":546},"WHERE",{"type":32,"tag":95,"props":548,"children":549},{"style":457},[550],{"type":37,"value":551}," key",{"type":32,"tag":95,"props":553,"children":554},{"style":457},[555],{"type":37,"value":556}," =",{"type":32,"tag":95,"props":558,"children":559},{"style":152},[560],{"type":37,"value":561}," 'session_id'",{"type":32,"tag":95,"props":563,"children":564},{"style":108},[565],{"type":37,"value":566},") ",{"type":32,"tag":95,"props":568,"children":569},{"style":457},[570],{"type":37,"value":473},{"type":32,"tag":95,"props":572,"children":573},{"style":108},[574],{"type":37,"value":575}," session_id,\n",{"type":32,"tag":95,"props":577,"children":578},{"class":97,"line":189},[579,584,588,593],{"type":32,"tag":95,"props":580,"children":581},{"style":114},[582],{"type":37,"value":583},"  geo",{"type":32,"tag":95,"props":585,"children":586},{"style":108},[587],{"type":37,"value":526},{"type":32,"tag":95,"props":589,"children":590},{"style":114},[591],{"type":37,"value":592},"country",{"type":32,"tag":95,"props":594,"children":595},{"style":108},[596],{"type":37,"value":597},",\n",{"type":32,"tag":95,"props":599,"children":600},{"class":97,"line":211},[601,606,610,615,620],{"type":32,"tag":95,"props":602,"children":603},{"style":114},[604],{"type":37,"value":605},"  device",{"type":32,"tag":95,"props":607,"children":608},{"style":108},[609],{"type":37,"value":526},{"type":32,"tag":95,"props":611,"children":612},{"style":114},[613],{"type":37,"value":614},"category",{"type":32,"tag":95,"props":616,"children":617},{"style":457},[618],{"type":37,"value":619}," AS",{"type":32,"tag":95,"props":621,"children":622},{"style":108},[623],{"type":37,"value":624}," device_category\n",{"type":32,"tag":95,"props":626,"children":627},{"class":97,"line":229},[628,633,638,643,648,653],{"type":32,"tag":95,"props":629,"children":630},{"style":457},[631],{"type":37,"value":632},"FROM",{"type":32,"tag":95,"props":634,"children":635},{"style":108},[636],{"type":37,"value":637}," {{ source(",{"type":32,"tag":95,"props":639,"children":640},{"style":152},[641],{"type":37,"value":642},"'ga4'",{"type":32,"tag":95,"props":644,"children":645},{"style":108},[646],{"type":37,"value":647},", ",{"type":32,"tag":95,"props":649,"children":650},{"style":152},[651],{"type":37,"value":652},"'events_'",{"type":32,"tag":95,"props":654,"children":655},{"style":108},[656],{"type":37,"value":657},") }}\n",{"type":32,"tag":95,"props":659,"children":660},{"class":97,"line":26},[661,665,670,675,680,685,690,695,700],{"type":32,"tag":95,"props":662,"children":663},{"style":457},[664],{"type":37,"value":546},{"type":32,"tag":95,"props":666,"children":667},{"style":108},[668],{"type":37,"value":669}," _TABLE_SUFFIX ",{"type":32,"tag":95,"props":671,"children":672},{"style":457},[673],{"type":37,"value":674},"BETWEEN",{"type":32,"tag":95,"props":676,"children":677},{"style":108},[678],{"type":37,"value":679}," FORMAT_DATE(",{"type":32,"tag":95,"props":681,"children":682},{"style":152},[683],{"type":37,"value":684},"'%Y%m%d'",{"type":32,"tag":95,"props":686,"children":687},{"style":108},[688],{"type":37,"value":689},", DATE_SUB(CURRENT_DATE(), INTERVAL ",{"type":32,"tag":95,"props":691,"children":692},{"style":114},[693],{"type":37,"value":694},"90",{"type":32,"tag":95,"props":696,"children":697},{"style":457},[698],{"type":37,"value":699}," DAY",{"type":32,"tag":95,"props":701,"children":702},{"style":108},[703],{"type":37,"value":704},"))\n",{"type":32,"tag":95,"props":706,"children":707},{"class":97,"line":267},[708,713,717,721],{"type":32,"tag":95,"props":709,"children":710},{"style":457},[711],{"type":37,"value":712},"  AND",{"type":32,"tag":95,"props":714,"children":715},{"style":108},[716],{"type":37,"value":679},{"type":32,"tag":95,"props":718,"children":719},{"style":152},[720],{"type":37,"value":684},{"type":32,"tag":95,"props":722,"children":723},{"style":108},[724],{"type":37,"value":725},", CURRENT_DATE())\n",{"type":32,"tag":33,"props":727,"children":728},{},[729,731,737],{"type":37,"value":730},"Lo staging fornisce dati puliti ma senza logica di business. I modelli intermediate aggiungono la logica di business: sessionization, attribution, funnel steps. ",{"type":32,"tag":52,"props":732,"children":734},{"className":733},[],[735],{"type":37,"value":736},"int_sessions.sql",{"type":37,"value":738}," aggrega gli eventi GA4 a livello di sessione:",{"type":32,"tag":85,"props":740,"children":742},{"className":445,"code":741,"language":447,"meta":16,"style":16},"WITH session_events AS (\n  SELECT\n    session_id,\n    MIN(event_time) AS session_start,\n    MAX(event_time) AS session_end,\n    COUNT(DISTINCT CASE WHEN event_name = 'page_view' THEN event_time END) AS pageviews,\n    MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS converted\n  FROM {{ ref('stg_ga4_events') }}\n  GROUP BY session_id\n)\nSELECT\n  *,\n  TIMESTAMP_DIFF(session_end, session_start, SECOND) AS duration_seconds\nFROM session_events\n",[743],{"type":32,"tag":52,"props":744,"children":745},{"__ignoreMap":16},[746,768,776,784,806,827,898,968,990,1003,1011,1018,1030,1056],{"type":32,"tag":95,"props":747,"children":748},{"class":97,"line":98},[749,754,759,763],{"type":32,"tag":95,"props":750,"children":751},{"style":457},[752],{"type":37,"value":753},"WITH",{"type":32,"tag":95,"props":755,"children":756},{"style":108},[757],{"type":37,"value":758}," session_events ",{"type":32,"tag":95,"props":760,"children":761},{"style":457},[762],{"type":37,"value":473},{"type":32,"tag":95,"props":764,"children":765},{"style":108},[766],{"type":37,"value":767}," (\n",{"type":32,"tag":95,"props":769,"children":770},{"class":97,"line":120},[771],{"type":32,"tag":95,"props":772,"children":773},{"style":457},[774],{"type":37,"value":775},"  SELECT\n",{"type":32,"tag":95,"props":777,"children":778},{"class":97,"line":134},[779],{"type":32,"tag":95,"props":780,"children":781},{"style":108},[782],{"type":37,"value":783},"    session_id,\n",{"type":32,"tag":95,"props":785,"children":786},{"class":97,"line":158},[787,792,797,801],{"type":32,"tag":95,"props":788,"children":789},{"style":114},[790],{"type":37,"value":791},"    MIN",{"type":32,"tag":95,"props":793,"children":794},{"style":108},[795],{"type":37,"value":796},"(event_time) ",{"type":32,"tag":95,"props":798,"children":799},{"style":457},[800],{"type":37,"value":473},{"type":32,"tag":95,"props":802,"children":803},{"style":108},[804],{"type":37,"value":805}," session_start,\n",{"type":32,"tag":95,"props":807,"children":808},{"class":97,"line":176},[809,814,818,822],{"type":32,"tag":95,"props":810,"children":811},{"style":114},[812],{"type":37,"value":813},"    MAX",{"type":32,"tag":95,"props":815,"children":816},{"style":108},[817],{"type":37,"value":796},{"type":32,"tag":95,"props":819,"children":820},{"style":457},[821],{"type":37,"value":473},{"type":32,"tag":95,"props":823,"children":824},{"style":108},[825],{"type":37,"value":826}," session_end,\n",{"type":32,"tag":95,"props":828,"children":829},{"class":97,"line":189},[830,835,840,845,850,855,860,865,870,875,880,885,889,893],{"type":32,"tag":95,"props":831,"children":832},{"style":114},[833],{"type":37,"value":834},"    COUNT",{"type":32,"tag":95,"props":836,"children":837},{"style":108},[838],{"type":37,"value":839},"(",{"type":32,"tag":95,"props":841,"children":842},{"style":457},[843],{"type":37,"value":844},"DISTINCT",{"type":32,"tag":95,"props":846,"children":847},{"style":457},[848],{"type":37,"value":849}," CASE",{"type":32,"tag":95,"props":851,"children":852},{"style":457},[853],{"type":37,"value":854}," WHEN",{"type":32,"tag":95,"props":856,"children":857},{"style":108},[858],{"type":37,"value":859}," event_name ",{"type":32,"tag":95,"props":861,"children":862},{"style":457},[863],{"type":37,"value":864},"=",{"type":32,"tag":95,"props":866,"children":867},{"style":152},[868],{"type":37,"value":869}," 'page_view'",{"type":32,"tag":95,"props":871,"children":872},{"style":457},[873],{"type":37,"value":874}," THEN",{"type":32,"tag":95,"props":876,"children":877},{"style":108},[878],{"type":37,"value":879}," event_time ",{"type":32,"tag":95,"props":881,"children":882},{"style":457},[883],{"type":37,"value":884},"END",{"type":32,"tag":95,"props":886,"children":887},{"style":108},[888],{"type":37,"value":566},{"type":32,"tag":95,"props":890,"children":891},{"style":457},[892],{"type":37,"value":473},{"type":32,"tag":95,"props":894,"children":895},{"style":108},[896],{"type":37,"value":897}," pageviews,\n",{"type":32,"tag":95,"props":899,"children":900},{"class":97,"line":211},[901,905,909,914,918,922,926,931,935,940,945,950,955,959,963],{"type":32,"tag":95,"props":902,"children":903},{"style":114},[904],{"type":37,"value":813},{"type":32,"tag":95,"props":906,"children":907},{"style":108},[908],{"type":37,"value":839},{"type":32,"tag":95,"props":910,"children":911},{"style":457},[912],{"type":37,"value":913},"CASE",{"type":32,"tag":95,"props":915,"children":916},{"style":457},[917],{"type":37,"value":854},{"type":32,"tag":95,"props":919,"children":920},{"style":108},[921],{"type":37,"value":859},{"type":32,"tag":95,"props":923,"children":924},{"style":457},[925],{"type":37,"value":864},{"type":32,"tag":95,"props":927,"children":928},{"style":152},[929],{"type":37,"value":930}," 'purchase'",{"type":32,"tag":95,"props":932,"children":933},{"style":457},[934],{"type":37,"value":874},{"type":32,"tag":95,"props":936,"children":937},{"style":114},[938],{"type":37,"value":939}," 1",{"type":32,"tag":95,"props":941,"children":942},{"style":457},[943],{"type":37,"value":944}," ELSE",{"type":32,"tag":95,"props":946,"children":947},{"style":114},[948],{"type":37,"value":949}," 0",{"type":32,"tag":95,"props":951,"children":952},{"style":457},[953],{"type":37,"value":954}," END",{"type":32,"tag":95,"props":956,"children":957},{"style":108},[958],{"type":37,"value":566},{"type":32,"tag":95,"props":960,"children":961},{"style":457},[962],{"type":37,"value":473},{"type":32,"tag":95,"props":964,"children":965},{"style":108},[966],{"type":37,"value":967}," converted\n",{"type":32,"tag":95,"props":969,"children":970},{"class":97,"line":229},[971,976,981,986],{"type":32,"tag":95,"props":972,"children":973},{"style":457},[974],{"type":37,"value":975},"  FROM",{"type":32,"tag":95,"props":977,"children":978},{"style":108},[979],{"type":37,"value":980}," {{ ref(",{"type":32,"tag":95,"props":982,"children":983},{"style":152},[984],{"type":37,"value":985},"'stg_ga4_events'",{"type":32,"tag":95,"props":987,"children":988},{"style":108},[989],{"type":37,"value":657},{"type":32,"tag":95,"props":991,"children":992},{"class":97,"line":26},[993,998],{"type":32,"tag":95,"props":994,"children":995},{"style":457},[996],{"type":37,"value":997},"  GROUP BY",{"type":32,"tag":95,"props":999,"children":1000},{"style":108},[1001],{"type":37,"value":1002}," session_id\n",{"type":32,"tag":95,"props":1004,"children":1005},{"class":97,"line":267},[1006],{"type":32,"tag":95,"props":1007,"children":1008},{"style":108},[1009],{"type":37,"value":1010},")\n",{"type":32,"tag":95,"props":1012,"children":1013},{"class":97,"line":284},[1014],{"type":32,"tag":95,"props":1015,"children":1016},{"style":457},[1017],{"type":37,"value":460},{"type":32,"tag":95,"props":1019,"children":1020},{"class":97,"line":302},[1021,1026],{"type":32,"tag":95,"props":1022,"children":1023},{"style":457},[1024],{"type":37,"value":1025},"  *",{"type":32,"tag":95,"props":1027,"children":1028},{"style":108},[1029],{"type":37,"value":597},{"type":32,"tag":95,"props":1031,"children":1032},{"class":97,"line":314},[1033,1038,1043,1047,1051],{"type":32,"tag":95,"props":1034,"children":1035},{"style":108},[1036],{"type":37,"value":1037},"  TIMESTAMP_DIFF(session_end, session_start, ",{"type":32,"tag":95,"props":1039,"children":1040},{"style":457},[1041],{"type":37,"value":1042},"SECOND",{"type":32,"tag":95,"props":1044,"children":1045},{"style":108},[1046],{"type":37,"value":566},{"type":32,"tag":95,"props":1048,"children":1049},{"style":457},[1050],{"type":37,"value":473},{"type":32,"tag":95,"props":1052,"children":1053},{"style":108},[1054],{"type":37,"value":1055}," duration_seconds\n",{"type":32,"tag":95,"props":1057,"children":1058},{"class":97,"line":335},[1059,1063],{"type":32,"tag":95,"props":1060,"children":1061},{"style":457},[1062],{"type":37,"value":632},{"type":32,"tag":95,"props":1064,"children":1065},{"style":108},[1066],{"type":37,"value":1067}," session_events\n",{"type":32,"tag":33,"props":1069,"children":1070},{},[1071,1073,1079,1081,1087,1088,1094,1095,1101,1103,1109,1111,1117,1119,1125],{"type":37,"value":1072},"I modelli mart sono il layer di consumo finale — il tool BI, Looker, i dashboard interni guardano qui. ",{"type":32,"tag":52,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":37,"value":1078},"fct_marketing_performance.sql",{"type":37,"value":1080}," unisce tutti i canali, calcola spend + revenue + ROAS. Ogni modello mart si concentra su una singola entità di business: ",{"type":32,"tag":52,"props":1082,"children":1084},{"className":1083},[],[1085],{"type":37,"value":1086},"dim_customers",{"type":37,"value":647},{"type":32,"tag":52,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":37,"value":1093},"fct_orders",{"type":37,"value":647},{"type":32,"tag":52,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":37,"value":1100},"fct_sessions",{"type":37,"value":1102},". La convenzione di naming è critica — ",{"type":32,"tag":52,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":37,"value":1108},"dim_",{"type":37,"value":1110}," per le dimensioni (cliente, prodotto), ",{"type":32,"tag":52,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":37,"value":1116},"fct_",{"type":37,"value":1118}," per i fatti (transazione, evento), ",{"type":32,"tag":52,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":37,"value":1124},"rpt_",{"type":37,"value":1126}," per gli aggregati di report.",{"type":32,"tag":40,"props":1128,"children":1130},{"id":1129},"semantic-layer-le-definizioni-kpi-come-codice",[1131],{"type":37,"value":1132},"Semantic layer: le definizioni KPI come codice",{"type":32,"tag":33,"props":1134,"children":1135},{},[1136,1138,1144],{"type":37,"value":1137},"Il semantic layer porta le definizioni delle metriche dentro dbt — \"cos'è il revenue\", \"come si calcola il CAC\" non sono più in uno spreadsheet ma in YAML. Con dbt v1.6+ costruite l'albero degli indicatori nel file ",{"type":32,"tag":52,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":37,"value":1143},"metrics.yml",{"type":37,"value":442},{"type":32,"tag":85,"props":1146,"children":1148},{"className":87,"code":1147,"language":89,"meta":16,"style":16},"version: 2\nmetrics:\n  - name: revenue\n    label: Revenue\n    model: ref('fct_orders')\n    calculation_method: sum\n    expression: order_amount\n    timestamp: order_date\n    time_grains: [day, week, month, quarter]\n    dimensions:\n      - channel\n      - country\n      - device_category\n\n  - name: cac\n    label: Customer Acquisition Cost\n    calculation_method: derived\n    expression: \"{{ metric('ad_spend') }} \u002F {{ metric('new_customers') }}\"\n    timestamp: acquisition_date\n    time_grains: [month, quarter]\n",[1149],{"type":32,"tag":52,"props":1150,"children":1151},{"__ignoreMap":16},[1152,1167,1179,1199,1216,1233,1250,1267,1284,1334,1346,1358,1370,1382,1391,1412,1429,1446,1463,1480],{"type":32,"tag":95,"props":1153,"children":1154},{"class":97,"line":98},[1155,1159,1163],{"type":32,"tag":95,"props":1156,"children":1157},{"style":102},[1158],{"type":37,"value":105},{"type":32,"tag":95,"props":1160,"children":1161},{"style":108},[1162],{"type":37,"value":111},{"type":32,"tag":95,"props":1164,"children":1165},{"style":114},[1166],{"type":37,"value":117},{"type":32,"tag":95,"props":1168,"children":1169},{"class":97,"line":120},[1170,1175],{"type":32,"tag":95,"props":1171,"children":1172},{"style":102},[1173],{"type":37,"value":1174},"metrics",{"type":32,"tag":95,"props":1176,"children":1177},{"style":108},[1178],{"type":37,"value":131},{"type":32,"tag":95,"props":1180,"children":1181},{"class":97,"line":134},[1182,1186,1190,1194],{"type":32,"tag":95,"props":1183,"children":1184},{"style":108},[1185],{"type":37,"value":140},{"type":32,"tag":95,"props":1187,"children":1188},{"style":102},[1189],{"type":37,"value":145},{"type":32,"tag":95,"props":1191,"children":1192},{"style":108},[1193],{"type":37,"value":111},{"type":32,"tag":95,"props":1195,"children":1196},{"style":152},[1197],{"type":37,"value":1198},"revenue\n",{"type":32,"tag":95,"props":1200,"children":1201},{"class":97,"line":158},[1202,1207,1211],{"type":32,"tag":95,"props":1203,"children":1204},{"style":102},[1205],{"type":37,"value":1206},"    label",{"type":32,"tag":95,"props":1208,"children":1209},{"style":108},[1210],{"type":37,"value":111},{"type":32,"tag":95,"props":1212,"children":1213},{"style":152},[1214],{"type":37,"value":1215},"Revenue\n",{"type":32,"tag":95,"props":1217,"children":1218},{"class":97,"line":176},[1219,1224,1228],{"type":32,"tag":95,"props":1220,"children":1221},{"style":102},[1222],{"type":37,"value":1223},"    model",{"type":32,"tag":95,"props":1225,"children":1226},{"style":108},[1227],{"type":37,"value":111},{"type":32,"tag":95,"props":1229,"children":1230},{"style":152},[1231],{"type":37,"value":1232},"ref('fct_orders')\n",{"type":32,"tag":95,"props":1234,"children":1235},{"class":97,"line":189},[1236,1241,1245],{"type":32,"tag":95,"props":1237,"children":1238},{"style":102},[1239],{"type":37,"value":1240},"    calculation_method",{"type":32,"tag":95,"props":1242,"children":1243},{"style":108},[1244],{"type":37,"value":111},{"type":32,"tag":95,"props":1246,"children":1247},{"style":152},[1248],{"type":37,"value":1249},"sum\n",{"type":32,"tag":95,"props":1251,"children":1252},{"class":97,"line":211},[1253,1258,1262],{"type":32,"tag":95,"props":1254,"children":1255},{"style":102},[1256],{"type":37,"value":1257},"    expression",{"type":32,"tag":95,"props":1259,"children":1260},{"style":108},[1261],{"type":37,"value":111},{"type":32,"tag":95,"props":1263,"children":1264},{"style":152},[1265],{"type":37,"value":1266},"order_amount\n",{"type":32,"tag":95,"props":1268,"children":1269},{"class":97,"line":229},[1270,1275,1279],{"type":32,"tag":95,"props":1271,"children":1272},{"style":102},[1273],{"type":37,"value":1274},"    timestamp",{"type":32,"tag":95,"props":1276,"children":1277},{"style":108},[1278],{"type":37,"value":111},{"type":32,"tag":95,"props":1280,"children":1281},{"style":152},[1282],{"type":37,"value":1283},"order_date\n",{"type":32,"tag":95,"props":1285,"children":1286},{"class":97,"line":26},[1287,1292,1297,1302,1306,1311,1315,1320,1324,1329],{"type":32,"tag":95,"props":1288,"children":1289},{"style":102},[1290],{"type":37,"value":1291},"    time_grains",{"type":32,"tag":95,"props":1293,"children":1294},{"style":108},[1295],{"type":37,"value":1296},": [",{"type":32,"tag":95,"props":1298,"children":1299},{"style":152},[1300],{"type":37,"value":1301},"day",{"type":32,"tag":95,"props":1303,"children":1304},{"style":108},[1305],{"type":37,"value":647},{"type":32,"tag":95,"props":1307,"children":1308},{"style":152},[1309],{"type":37,"value":1310},"week",{"type":32,"tag":95,"props":1312,"children":1313},{"style":108},[1314],{"type":37,"value":647},{"type":32,"tag":95,"props":1316,"children":1317},{"style":152},[1318],{"type":37,"value":1319},"month",{"type":32,"tag":95,"props":1321,"children":1322},{"style":108},[1323],{"type":37,"value":647},{"type":32,"tag":95,"props":1325,"children":1326},{"style":152},[1327],{"type":37,"value":1328},"quarter",{"type":32,"tag":95,"props":1330,"children":1331},{"style":108},[1332],{"type":37,"value":1333},"]\n",{"type":32,"tag":95,"props":1335,"children":1336},{"class":97,"line":267},[1337,1342],{"type":32,"tag":95,"props":1338,"children":1339},{"style":102},[1340],{"type":37,"value":1341},"    dimensions",{"type":32,"tag":95,"props":1343,"children":1344},{"style":108},[1345],{"type":37,"value":131},{"type":32,"tag":95,"props":1347,"children":1348},{"class":97,"line":284},[1349,1353],{"type":32,"tag":95,"props":1350,"children":1351},{"style":108},[1352],{"type":37,"value":195},{"type":32,"tag":95,"props":1354,"children":1355},{"style":152},[1356],{"type":37,"value":1357},"channel\n",{"type":32,"tag":95,"props":1359,"children":1360},{"class":97,"line":302},[1361,1365],{"type":32,"tag":95,"props":1362,"children":1363},{"style":108},[1364],{"type":37,"value":195},{"type":32,"tag":95,"props":1366,"children":1367},{"style":152},[1368],{"type":37,"value":1369},"country\n",{"type":32,"tag":95,"props":1371,"children":1372},{"class":97,"line":314},[1373,1377],{"type":32,"tag":95,"props":1374,"children":1375},{"style":108},[1376],{"type":37,"value":195},{"type":32,"tag":95,"props":1378,"children":1379},{"style":152},[1380],{"type":37,"value":1381},"device_category\n",{"type":32,"tag":95,"props":1383,"children":1384},{"class":97,"line":335},[1385],{"type":32,"tag":95,"props":1386,"children":1388},{"emptyLinePlaceholder":1387},true,[1389],{"type":37,"value":1390},"\n",{"type":32,"tag":95,"props":1392,"children":1394},{"class":97,"line":1393},15,[1395,1399,1403,1407],{"type":32,"tag":95,"props":1396,"children":1397},{"style":108},[1398],{"type":37,"value":140},{"type":32,"tag":95,"props":1400,"children":1401},{"style":102},[1402],{"type":37,"value":145},{"type":32,"tag":95,"props":1404,"children":1405},{"style":108},[1406],{"type":37,"value":111},{"type":32,"tag":95,"props":1408,"children":1409},{"style":152},[1410],{"type":37,"value":1411},"cac\n",{"type":32,"tag":95,"props":1413,"children":1415},{"class":97,"line":1414},16,[1416,1420,1424],{"type":32,"tag":95,"props":1417,"children":1418},{"style":102},[1419],{"type":37,"value":1206},{"type":32,"tag":95,"props":1421,"children":1422},{"style":108},[1423],{"type":37,"value":111},{"type":32,"tag":95,"props":1425,"children":1426},{"style":152},[1427],{"type":37,"value":1428},"Customer Acquisition Cost\n",{"type":32,"tag":95,"props":1430,"children":1432},{"class":97,"line":1431},17,[1433,1437,1441],{"type":32,"tag":95,"props":1434,"children":1435},{"style":102},[1436],{"type":37,"value":1240},{"type":32,"tag":95,"props":1438,"children":1439},{"style":108},[1440],{"type":37,"value":111},{"type":32,"tag":95,"props":1442,"children":1443},{"style":152},[1444],{"type":37,"value":1445},"derived\n",{"type":32,"tag":95,"props":1447,"children":1449},{"class":97,"line":1448},18,[1450,1454,1458],{"type":32,"tag":95,"props":1451,"children":1452},{"style":102},[1453],{"type":37,"value":1257},{"type":32,"tag":95,"props":1455,"children":1456},{"style":108},[1457],{"type":37,"value":111},{"type":32,"tag":95,"props":1459,"children":1460},{"style":152},[1461],{"type":37,"value":1462},"\"{{ metric('ad_spend') }} \u002F {{ metric('new_customers') }}\"\n",{"type":32,"tag":95,"props":1464,"children":1466},{"class":97,"line":1465},19,[1467,1471,1475],{"type":32,"tag":95,"props":1468,"children":1469},{"style":102},[1470],{"type":37,"value":1274},{"type":32,"tag":95,"props":1472,"children":1473},{"style":108},[1474],{"type":37,"value":111},{"type":32,"tag":95,"props":1476,"children":1477},{"style":152},[1478],{"type":37,"value":1479},"acquisition_date\n",{"type":32,"tag":95,"props":1481,"children":1483},{"class":97,"line":1482},20,[1484,1488,1492,1496,1500,1504],{"type":32,"tag":95,"props":1485,"children":1486},{"style":102},[1487],{"type":37,"value":1291},{"type":32,"tag":95,"props":1489,"children":1490},{"style":108},[1491],{"type":37,"value":1296},{"type":32,"tag":95,"props":1493,"children":1494},{"style":152},[1495],{"type":37,"value":1319},{"type":32,"tag":95,"props":1497,"children":1498},{"style":108},[1499],{"type":37,"value":647},{"type":32,"tag":95,"props":1501,"children":1502},{"style":152},[1503],{"type":37,"value":1328},{"type":32,"tag":95,"props":1505,"children":1506},{"style":108},[1507],{"type":37,"value":1333},{"type":32,"tag":33,"props":1509,"children":1510},{},[1511],{"type":37,"value":1512},"Con il semantic layer il tool BI non calcola il CAC, lo fa dbt. Quando Looker chiede \"dammi il CAC\", dbt restituisce SQL compilato che join la tabella spend e quella dei nuovi clienti e divide. La definizione è codice, quindi ha cronologia git — \"chi ha cambiato il calcolo del CAC e perché\" è tracciato. La formula nel foglio di calcolo non scompare, ha il version control.",{"type":32,"tag":33,"props":1514,"children":1515},{},[1516,1518,1527,1529,1535,1537,1543],{"type":37,"value":1517},"Nei progetti Roibase il semantic layer rientra nell'ambito di ",{"type":32,"tag":1519,"props":1520,"children":1524},"a",{"href":1521,"rel":1522},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fverianalizi",[1523],"nofollow",[1525],{"type":37,"value":1526},"analisi dati e ingegneria delle insights",{"type":37,"value":1528}," — non solo la definizione della metrica ma anche il mapping dell'albero KPI, la gerarchia delle dimensioni, la standardizzazione dei grain. Esempio: la metrica \"revenue\" è la somma di ",{"type":32,"tag":52,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":37,"value":1534},"fct_orders.order_amount",{"type":37,"value":1536},", ma \"recognized_revenue\" è la stessa tabella filtrata per ",{"type":32,"tag":52,"props":1538,"children":1540},{"className":1539},[],[1541],{"type":37,"value":1542},"recognized_at",{"type":37,"value":1544}," timestamp (per il modello di subscription SaaS). Una sola tabella, due metriche, logica di business diversa.",{"type":32,"tag":40,"props":1546,"children":1548},{"id":1547},"exposures-rendere-visibili-le-dipendenze-downstream",[1549],{"type":37,"value":1550},"Exposures: rendere visibili le dipendenze downstream",{"type":32,"tag":33,"props":1552,"children":1553},{},[1554,1556,1562,1564,1570],{"type":37,"value":1555},"L'exposure di dbt risponde alla domanda \"chi usa questo modello\". Se il dashboard Looker guarda la tabella ",{"type":32,"tag":52,"props":1557,"children":1559},{"className":1558},[],[1560],{"type":37,"value":1561},"fct_marketing_performance",{"type":37,"value":1563},", lo definite in ",{"type":32,"tag":52,"props":1565,"children":1567},{"className":1566},[],[1568],{"type":37,"value":1569},"exposures.yml",{"type":37,"value":442},{"type":32,"tag":85,"props":1572,"children":1574},{"className":87,"code":1573,"language":89,"meta":16,"style":16},"version: 2\nexposures:\n  - name: marketing_dashboard\n    type: dashboard\n    maturity: high\n    owner:\n      name: Growth Team\n      email: growth@company.com\n    depends_on:\n      - ref('fct_marketing_performance')\n      - ref('dim_customers')\n    description: \"Dashboard di marketing per i dirigenti — refresh giornaliero, finestra mobile di 90 giorni\"\n    url: https:\u002F\u002Flooker.company.com\u002Fdashboards\u002F123\n",[1575],{"type":32,"tag":52,"props":1576,"children":1577},{"__ignoreMap":16},[1578,1593,1605,1625,1642,1659,1671,1688,1705,1717,1729,1741,1758],{"type":32,"tag":95,"props":1579,"children":1580},{"class":97,"line":98},[1581,1585,1589],{"type":32,"tag":95,"props":1582,"children":1583},{"style":102},[1584],{"type":37,"value":105},{"type":32,"tag":95,"props":1586,"children":1587},{"style":108},[1588],{"type":37,"value":111},{"type":32,"tag":95,"props":1590,"children":1591},{"style":114},[1592],{"type":37,"value":117},{"type":32,"tag":95,"props":1594,"children":1595},{"class":97,"line":120},[1596,1601],{"type":32,"tag":95,"props":1597,"children":1598},{"style":102},[1599],{"type":37,"value":1600},"exposures",{"type":32,"tag":95,"props":1602,"children":1603},{"style":108},[1604],{"type":37,"value":131},{"type":32,"tag":95,"props":1606,"children":1607},{"class":97,"line":134},[1608,1612,1616,1620],{"type":32,"tag":95,"props":1609,"children":1610},{"style":108},[1611],{"type":37,"value":140},{"type":32,"tag":95,"props":1613,"children":1614},{"style":102},[1615],{"type":37,"value":145},{"type":32,"tag":95,"props":1617,"children":1618},{"style":108},[1619],{"type":37,"value":111},{"type":32,"tag":95,"props":1621,"children":1622},{"style":152},[1623],{"type":37,"value":1624},"marketing_dashboard\n",{"type":32,"tag":95,"props":1626,"children":1627},{"class":97,"line":158},[1628,1633,1637],{"type":32,"tag":95,"props":1629,"children":1630},{"style":102},[1631],{"type":37,"value":1632},"    type",{"type":32,"tag":95,"props":1634,"children":1635},{"style":108},[1636],{"type":37,"value":111},{"type":32,"tag":95,"props":1638,"children":1639},{"style":152},[1640],{"type":37,"value":1641},"dashboard\n",{"type":32,"tag":95,"props":1643,"children":1644},{"class":97,"line":176},[1645,1650,1654],{"type":32,"tag":95,"props":1646,"children":1647},{"style":102},[1648],{"type":37,"value":1649},"    maturity",{"type":32,"tag":95,"props":1651,"children":1652},{"style":108},[1653],{"type":37,"value":111},{"type":32,"tag":95,"props":1655,"children":1656},{"style":152},[1657],{"type":37,"value":1658},"high\n",{"type":32,"tag":95,"props":1660,"children":1661},{"class":97,"line":189},[1662,1667],{"type":32,"tag":95,"props":1663,"children":1664},{"style":102},[1665],{"type":37,"value":1666},"    owner",{"type":32,"tag":95,"props":1668,"children":1669},{"style":108},[1670],{"type":37,"value":131},{"type":32,"tag":95,"props":1672,"children":1673},{"class":97,"line":211},[1674,1679,1683],{"type":32,"tag":95,"props":1675,"children":1676},{"style":102},[1677],{"type":37,"value":1678},"      name",{"type":32,"tag":95,"props":1680,"children":1681},{"style":108},[1682],{"type":37,"value":111},{"type":32,"tag":95,"props":1684,"children":1685},{"style":152},[1686],{"type":37,"value":1687},"Growth Team\n",{"type":32,"tag":95,"props":1689,"children":1690},{"class":97,"line":229},[1691,1696,1700],{"type":32,"tag":95,"props":1692,"children":1693},{"style":102},[1694],{"type":37,"value":1695},"      email",{"type":32,"tag":95,"props":1697,"children":1698},{"style":108},[1699],{"type":37,"value":111},{"type":32,"tag":95,"props":1701,"children":1702},{"style":152},[1703],{"type":37,"value":1704},"growth@company.com\n",{"type":32,"tag":95,"props":1706,"children":1707},{"class":97,"line":26},[1708,1713],{"type":32,"tag":95,"props":1709,"children":1710},{"style":102},[1711],{"type":37,"value":1712},"    depends_on",{"type":32,"tag":95,"props":1714,"children":1715},{"style":108},[1716],{"type":37,"value":131},{"type":32,"tag":95,"props":1718,"children":1719},{"class":97,"line":267},[1720,1724],{"type":32,"tag":95,"props":1721,"children":1722},{"style":108},[1723],{"type":37,"value":195},{"type":32,"tag":95,"props":1725,"children":1726},{"style":152},[1727],{"type":37,"value":1728},"ref('fct_marketing_performance')\n",{"type":32,"tag":95,"props":1730,"children":1731},{"class":97,"line":284},[1732,1736],{"type":32,"tag":95,"props":1733,"children":1734},{"style":108},[1735],{"type":37,"value":195},{"type":32,"tag":95,"props":1737,"children":1738},{"style":152},[1739],{"type":37,"value":1740},"ref('dim_customers')\n",{"type":32,"tag":95,"props":1742,"children":1743},{"class":97,"line":302},[1744,1749,1753],{"type":32,"tag":95,"props":1745,"children":1746},{"style":102},[1747],{"type":37,"value":1748},"    description",{"type":32,"tag":95,"props":1750,"children":1751},{"style":108},[1752],{"type":37,"value":111},{"type":32,"tag":95,"props":1754,"children":1755},{"style":152},[1756],{"type":37,"value":1757},"\"Dashboard di marketing per i dirigenti — refresh giornaliero, finestra mobile di 90 giorni\"\n",{"type":32,"tag":95,"props":1759,"children":1760},{"class":97,"line":314},[1761,1766,1770],{"type":32,"tag":95,"props":1762,"children":1763},{"style":102},[1764],{"type":37,"value":1765},"    url",{"type":32,"tag":95,"props":1767,"children":1768},{"style":108},[1769],{"type":37,"value":111},{"type":32,"tag":95,"props":1771,"children":1772},{"style":152},[1773],{"type":37,"value":1774},"https:\u002F\u002Flooker.company.com\u002Fdashboards\u002F123\n",{"type":32,"tag":33,"props":1776,"children":1777},{},[1778,1780,1785,1787,1793],{"type":37,"value":1779},"Senza la definizione di exposure, quando modificate ",{"type":32,"tag":52,"props":1781,"children":1783},{"className":1782},[],[1784],{"type":37,"value":1561},{"type":37,"value":1786}," non sapete quale dashboard si è rotto. Looker mostra metrica zero, passate 2 ore a debuggare. Con exposure il comando ",{"type":32,"tag":52,"props":1788,"children":1790},{"className":1789},[],[1791],{"type":37,"value":1792},"dbt compile --select +exposure:marketing_dashboard",{"type":37,"value":1794}," mostra tutti i modelli upstream, fate l'analisi di impatto prima di cambiare.",{"type":32,"tag":33,"props":1796,"children":1797},{},[1798,1800,1806],{"type":37,"value":1799},"L'exposure non è solo per i tool BI — anche per reverse ETL (Hightouch, Census). Se sincronizzate la tabella ",{"type":32,"tag":52,"props":1801,"children":1803},{"className":1802},[],[1804],{"type":37,"value":1805},"customers",{"type":37,"value":1807}," in Meta CAPI:",{"type":32,"tag":85,"props":1809,"children":1811},{"className":87,"code":1810,"language":89,"meta":16,"style":16},"exposures:\n  - name: meta_capi_sync\n    type: application\n    maturity: high\n    depends_on:\n      - ref('dim_customers')\n    description: \"Meta Conversion API — eventi cliente incrementali, delay di 5 minuti\"\n",[1812],{"type":32,"tag":52,"props":1813,"children":1814},{"__ignoreMap":16},[1815,1826,1846,1862,1877,1888,1899],{"type":32,"tag":95,"props":1816,"children":1817},{"class":97,"line":98},[1818,1822],{"type":32,"tag":95,"props":1819,"children":1820},{"style":102},[1821],{"type":37,"value":1600},{"type":32,"tag":95,"props":1823,"children":1824},{"style":108},[1825],{"type":37,"value":131},{"type":32,"tag":95,"props":1827,"children":1828},{"class":97,"line":120},[1829,1833,1837,1841],{"type":32,"tag":95,"props":1830,"children":1831},{"style":108},[1832],{"type":37,"value":140},{"type":32,"tag":95,"props":1834,"children":1835},{"style":102},[1836],{"type":37,"value":145},{"type":32,"tag":95,"props":1838,"children":1839},{"style":108},[1840],{"type":37,"value":111},{"type":32,"tag":95,"props":1842,"children":1843},{"style":152},[1844],{"type":37,"value":1845},"meta_capi_sync\n",{"type":32,"tag":95,"props":1847,"children":1848},{"class":97,"line":134},[1849,1853,1857],{"type":32,"tag":95,"props":1850,"children":1851},{"style":102},[1852],{"type":37,"value":1632},{"type":32,"tag":95,"props":1854,"children":1855},{"style":108},[1856],{"type":37,"value":111},{"type":32,"tag":95,"props":1858,"children":1859},{"style":152},[1860],{"type":37,"value":1861},"application\n",{"type":32,"tag":95,"props":1863,"children":1864},{"class":97,"line":158},[1865,1869,1873],{"type":32,"tag":95,"props":1866,"children":1867},{"style":102},[1868],{"type":37,"value":1649},{"type":32,"tag":95,"props":1870,"children":1871},{"style":108},[1872],{"type":37,"value":111},{"type":32,"tag":95,"props":1874,"children":1875},{"style":152},[1876],{"type":37,"value":1658},{"type":32,"tag":95,"props":1878,"children":1879},{"class":97,"line":176},[1880,1884],{"type":32,"tag":95,"props":1881,"children":1882},{"style":102},[1883],{"type":37,"value":1712},{"type":32,"tag":95,"props":1885,"children":1886},{"style":108},[1887],{"type":37,"value":131},{"type":32,"tag":95,"props":1889,"children":1890},{"class":97,"line":189},[1891,1895],{"type":32,"tag":95,"props":1892,"children":1893},{"style":108},[1894],{"type":37,"value":195},{"type":32,"tag":95,"props":1896,"children":1897},{"style":152},[1898],{"type":37,"value":1740},{"type":32,"tag":95,"props":1900,"children":1901},{"class":97,"line":211},[1902,1906,1910],{"type":32,"tag":95,"props":1903,"children":1904},{"style":102},[1905],{"type":37,"value":1748},{"type":32,"tag":95,"props":1907,"children":1908},{"style":108},[1909],{"type":37,"value":111},{"type":32,"tag":95,"props":1911,"children":1912},{"style":152},[1913],{"type":37,"value":1914},"\"Meta Conversion API — eventi cliente incrementali, delay di 5 minuti\"\n",{"type":32,"tag":33,"props":1916,"children":1917},{},[1918],{"type":37,"value":1919},"Questa definizione avverte \"se modifichi dim_customers, lo schema dell'evento verso Meta si rompe\". In production: aggiornamento modello → errore di sincronizzazione CAPI → perdita di dati di attribution — questo avviso precoce previene la catena.",{"type":32,"tag":40,"props":1921,"children":1923},{"id":1922},"production-pipeline-incremental-builds-e-copertura-di-test",[1924],{"type":37,"value":1925},"Production pipeline: incremental builds e copertura di test",{"type":32,"tag":33,"props":1927,"children":1928},{},[1929,1931,1937],{"type":37,"value":1930},"dbt in production non esegue full refresh ogni giorno — usa i modelli incrementali. ",{"type":32,"tag":52,"props":1932,"children":1934},{"className":1933},[],[1935],{"type":37,"value":1936},"fct_orders.sql",{"type":37,"value":1938}," rielabora solo gli ultimi 3 giorni:",{"type":32,"tag":85,"props":1940,"children":1942},{"className":445,"code":1941,"language":447,"meta":16,"style":16},"{{ config(\n    materialized='incremental',\n    unique_key='order_id',\n    partition_by={'field': 'order_date', 'data_type': 'date'},\n    cluster_by=['customer_id', 'channel']\n) }}\n\nSELECT\n  order_id,\n  customer_id,\n  order_date,\n  order_amount,\n  channel\nFROM {{ ref('stg_shopify_orders') }}\n\n{% if is_incremental() %}\nWHERE order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY)\n{% endif %}\n",[1943],{"type":32,"tag":52,"props":1944,"children":1945},{"__ignoreMap":16},[1946,1954,1975,1996,2050,2067,2074,2081,2088,2096,2104,2112,2120,2128,2148,2155,2173,2208],{"type":32,"tag":95,"props":1947,"children":1948},{"class":97,"line":98},[1949],{"type":32,"tag":95,"props":1950,"children":1951},{"style":108},[1952],{"type":37,"value":1953},"{{ config(\n",{"type":32,"tag":95,"props":1955,"children":1956},{"class":97,"line":120},[1957,1962,1966,1971],{"type":32,"tag":95,"props":1958,"children":1959},{"style":108},[1960],{"type":37,"value":1961},"    materialized",{"type":32,"tag":95,"props":1963,"children":1964},{"style":457},[1965],{"type":37,"value":864},{"type":32,"tag":95,"props":1967,"children":1968},{"style":152},[1969],{"type":37,"value":1970},"'incremental'",{"type":32,"tag":95,"props":1972,"children":1973},{"style":108},[1974],{"type":37,"value":597},{"type":32,"tag":95,"props":1976,"children":1977},{"class":97,"line":134},[1978,1983,1987,1992],{"type":32,"tag":95,"props":1979,"children":1980},{"style":108},[1981],{"type":37,"value":1982},"    unique_key",{"type":32,"tag":95,"props":1984,"children":1985},{"style":457},[1986],{"type":37,"value":864},{"type":32,"tag":95,"props":1988,"children":1989},{"style":152},[1990],{"type":37,"value":1991},"'order_id'",{"type":32,"tag":95,"props":1993,"children":1994},{"style":108},[1995],{"type":37,"value":597},{"type":32,"tag":95,"props":1997,"children":1998},{"class":97,"line":158},[1999,2004,2008,2013,2018,2022,2027,2031,2036,2040,2045],{"type":32,"tag":95,"props":2000,"children":2001},{"style":108},[2002],{"type":37,"value":2003},"    partition_by",{"type":32,"tag":95,"props":2005,"children":2006},{"style":457},[2007],{"type":37,"value":864},{"type":32,"tag":95,"props":2009,"children":2010},{"style":108},[2011],{"type":37,"value":2012},"{",{"type":32,"tag":95,"props":2014,"children":2015},{"style":152},[2016],{"type":37,"value":2017},"'field'",{"type":32,"tag":95,"props":2019,"children":2020},{"style":108},[2021],{"type":37,"value":111},{"type":32,"tag":95,"props":2023,"children":2024},{"style":152},[2025],{"type":37,"value":2026},"'order_date'",{"type":32,"tag":95,"props":2028,"children":2029},{"style":108},[2030],{"type":37,"value":647},{"type":32,"tag":95,"props":2032,"children":2033},{"style":152},[2034],{"type":37,"value":2035},"'data_type'",{"type":32,"tag":95,"props":2037,"children":2038},{"style":108},[2039],{"type":37,"value":111},{"type":32,"tag":95,"props":2041,"children":2042},{"style":152},[2043],{"type":37,"value":2044},"'date'",{"type":32,"tag":95,"props":2046,"children":2047},{"style":108},[2048],{"type":37,"value":2049},"},\n",{"type":32,"tag":95,"props":2051,"children":2052},{"class":97,"line":176},[2053,2058,2062],{"type":32,"tag":95,"props":2054,"children":2055},{"style":108},[2056],{"type":37,"value":2057},"    cluster_by",{"type":32,"tag":95,"props":2059,"children":2060},{"style":457},[2061],{"type":37,"value":864},{"type":32,"tag":95,"props":2063,"children":2064},{"style":108},[2065],{"type":37,"value":2066},"['customer_id', 'channel']\n",{"type":32,"tag":95,"props":2068,"children":2069},{"class":97,"line":189},[2070],{"type":32,"tag":95,"props":2071,"children":2072},{"style":108},[2073],{"type":37,"value":657},{"type":32,"tag":95,"props":2075,"children":2076},{"class":97,"line":211},[2077],{"type":32,"tag":95,"props":2078,"children":2079},{"emptyLinePlaceholder":1387},[2080],{"type":37,"value":1390},{"type":32,"tag":95,"props":2082,"children":2083},{"class":97,"line":229},[2084],{"type":32,"tag":95,"props":2085,"children":2086},{"style":457},[2087],{"type":37,"value":460},{"type":32,"tag":95,"props":2089,"children":2090},{"class":97,"line":26},[2091],{"type":32,"tag":95,"props":2092,"children":2093},{"style":108},[2094],{"type":37,"value":2095},"  order_id,\n",{"type":32,"tag":95,"props":2097,"children":2098},{"class":97,"line":267},[2099],{"type":32,"tag":95,"props":2100,"children":2101},{"style":108},[2102],{"type":37,"value":2103},"  customer_id,\n",{"type":32,"tag":95,"props":2105,"children":2106},{"class":97,"line":284},[2107],{"type":32,"tag":95,"props":2108,"children":2109},{"style":108},[2110],{"type":37,"value":2111},"  order_date,\n",{"type":32,"tag":95,"props":2113,"children":2114},{"class":97,"line":302},[2115],{"type":32,"tag":95,"props":2116,"children":2117},{"style":108},[2118],{"type":37,"value":2119},"  order_amount,\n",{"type":32,"tag":95,"props":2121,"children":2122},{"class":97,"line":314},[2123],{"type":32,"tag":95,"props":2124,"children":2125},{"style":108},[2126],{"type":37,"value":2127},"  channel\n",{"type":32,"tag":95,"props":2129,"children":2130},{"class":97,"line":335},[2131,2135,2139,2144],{"type":32,"tag":95,"props":2132,"children":2133},{"style":457},[2134],{"type":37,"value":632},{"type":32,"tag":95,"props":2136,"children":2137},{"style":108},[2138],{"type":37,"value":980},{"type":32,"tag":95,"props":2140,"children":2141},{"style":152},[2142],{"type":37,"value":2143},"'stg_shopify_orders'",{"type":32,"tag":95,"props":2145,"children":2146},{"style":108},[2147],{"type":37,"value":657},{"type":32,"tag":95,"props":2149,"children":2150},{"class":97,"line":1393},[2151],{"type":32,"tag":95,"props":2152,"children":2153},{"emptyLinePlaceholder":1387},[2154],{"type":37,"value":1390},{"type":32,"tag":95,"props":2156,"children":2157},{"class":97,"line":1414},[2158,2163,2168],{"type":32,"tag":95,"props":2159,"children":2160},{"style":108},[2161],{"type":37,"value":2162},"{% ",{"type":32,"tag":95,"props":2164,"children":2165},{"style":457},[2166],{"type":37,"value":2167},"if",{"type":32,"tag":95,"props":2169,"children":2170},{"style":108},[2171],{"type":37,"value":2172}," is_incremental() %}\n",{"type":32,"tag":95,"props":2174,"children":2175},{"class":97,"line":1431},[2176,2180,2185,2190,2195,2200,2204],{"type":32,"tag":95,"props":2177,"children":2178},{"style":457},[2179],{"type":37,"value":546},{"type":32,"tag":95,"props":2181,"children":2182},{"style":108},[2183],{"type":37,"value":2184}," order_date ",{"type":32,"tag":95,"props":2186,"children":2187},{"style":457},[2188],{"type":37,"value":2189},">=",{"type":32,"tag":95,"props":2191,"children":2192},{"style":108},[2193],{"type":37,"value":2194}," DATE_SUB(CURRENT_DATE(), INTERVAL ",{"type":32,"tag":95,"props":2196,"children":2197},{"style":114},[2198],{"type":37,"value":2199},"3",{"type":32,"tag":95,"props":2201,"children":2202},{"style":457},[2203],{"type":37,"value":699},{"type":32,"tag":95,"props":2205,"children":2206},{"style":108},[2207],{"type":37,"value":1010},{"type":32,"tag":95,"props":2209,"children":2210},{"class":97,"line":1448},[2211],{"type":32,"tag":95,"props":2212,"children":2213},{"style":108},[2214],{"type":37,"value":2215},"{% endif %}\n",{"type":32,"tag":33,"props":2217,"children":2218},{},[2219,2221,2227],{"type":37,"value":2220},"La build incrementale riduce i costi di BigQuery del 90% — al posto di scansionare 2TB della tabella, ne scansionate 50GB. Partizione + clustering migliora le performance delle query: una query ",{"type":32,"tag":52,"props":2222,"children":2224},{"className":2223},[],[2225],{"type":37,"value":2226},"WHERE customer_id = 'X'",{"type":37,"value":2228}," colpisce solo il cluster rilevante, niente full scan.",{"type":32,"tag":33,"props":2230,"children":2231},{},[2232,2234,2240],{"type":37,"value":2233},"La copertura di test è critica. In ",{"type":32,"tag":52,"props":2235,"children":2237},{"className":2236},[],[2238],{"type":37,"value":2239},"schema.yml",{"type":37,"value":2241}," di dbt scrivete test per ogni modello:",{"type":32,"tag":85,"props":2243,"children":2245},{"className":87,"code":2244,"language":89,"meta":16,"style":16},"models:\n  - name: fct_orders\n    columns:\n      - name: order_id\n        tests:\n          - unique\n          - not_null\n      - name: order_amount\n        tests:\n          - not_null\n          - dbt_utils.expression_is_true:\n              expression: \">= 0\"\n      - name: order_date\n        tests:\n          - dbt_utils.recency:\n              datepart: day\n              interval: 7\n",[2246],{"type":32,"tag":52,"props":2247,"children":2248},{"__ignoreMap":16},[2249,2261,2281,2293,2313,2325,2338,2350,2369,2380,2391,2407,2424,2443,2454,2470,2487],{"type":32,"tag":95,"props":2250,"children":2251},{"class":97,"line":98},[2252,2257],{"type":32,"tag":95,"props":2253,"children":2254},{"style":102},[2255],{"type":37,"value":2256},"models",{"type":32,"tag":95,"props":2258,"children":2259},{"style":108},[2260],{"type":37,"value":131},{"type":32,"tag":95,"props":2262,"children":2263},{"class":97,"line":120},[2264,2268,2272,2276],{"type":32,"tag":95,"props":2265,"children":2266},{"style":108},[2267],{"type":37,"value":140},{"type":32,"tag":95,"props":2269,"children":2270},{"style":102},[2271],{"type":37,"value":145},{"type":32,"tag":95,"props":2273,"children":2274},{"style":108},[2275],{"type":37,"value":111},{"type":32,"tag":95,"props":2277,"children":2278},{"style":152},[2279],{"type":37,"value":2280},"fct_orders\n",{"type":32,"tag":95,"props":2282,"children":2283},{"class":97,"line":134},[2284,2289],{"type":32,"tag":95,"props":2285,"children":2286},{"style":102},[2287],{"type":37,"value":2288},"    columns",{"type":32,"tag":95,"props":2290,"children":2291},{"style":108},[2292],{"type":37,"value":131},{"type":32,"tag":95,"props":2294,"children":2295},{"class":97,"line":158},[2296,2300,2304,2308],{"type":32,"tag":95,"props":2297,"children":2298},{"style":108},[2299],{"type":37,"value":195},{"type":32,"tag":95,"props":2301,"children":2302},{"style":102},[2303],{"type":37,"value":145},{"type":32,"tag":95,"props":2305,"children":2306},{"style":108},[2307],{"type":37,"value":111},{"type":32,"tag":95,"props":2309,"children":2310},{"style":152},[2311],{"type":37,"value":2312},"order_id\n",{"type":32,"tag":95,"props":2314,"children":2315},{"class":97,"line":176},[2316,2321],{"type":32,"tag":95,"props":2317,"children":2318},{"style":102},[2319],{"type":37,"value":2320},"        tests",{"type":32,"tag":95,"props":2322,"children":2323},{"style":108},[2324],{"type":37,"value":131},{"type":32,"tag":95,"props":2326,"children":2327},{"class":97,"line":189},[2328,2333],{"type":32,"tag":95,"props":2329,"children":2330},{"style":108},[2331],{"type":37,"value":2332},"          - ",{"type":32,"tag":95,"props":2334,"children":2335},{"style":152},[2336],{"type":37,"value":2337},"unique\n",{"type":32,"tag":95,"props":2339,"children":2340},{"class":97,"line":211},[2341,2345],{"type":32,"tag":95,"props":2342,"children":2343},{"style":108},[2344],{"type":37,"value":2332},{"type":32,"tag":95,"props":2346,"children":2347},{"style":152},[2348],{"type":37,"value":2349},"not_null\n",{"type":32,"tag":95,"props":2351,"children":2352},{"class":97,"line":229},[2353,2357,2361,2365],{"type":32,"tag":95,"props":2354,"children":2355},{"style":108},[2356],{"type":37,"value":195},{"type":32,"tag":95,"props":2358,"children":2359},{"style":102},[2360],{"type":37,"value":145},{"type":32,"tag":95,"props":2362,"children":2363},{"style":108},[2364],{"type":37,"value":111},{"type":32,"tag":95,"props":2366,"children":2367},{"style":152},[2368],{"type":37,"value":1266},{"type":32,"tag":95,"props":2370,"children":2371},{"class":97,"line":26},[2372,2376],{"type":32,"tag":95,"props":2373,"children":2374},{"style":102},[2375],{"type":37,"value":2320},{"type":32,"tag":95,"props":2377,"children":2378},{"style":108},[2379],{"type":37,"value":131},{"type":32,"tag":95,"props":2381,"children":2382},{"class":97,"line":267},[2383,2387],{"type":32,"tag":95,"props":2384,"children":2385},{"style":108},[2386],{"type":37,"value":2332},{"type":32,"tag":95,"props":2388,"children":2389},{"style":152},[2390],{"type":37,"value":2349},{"type":32,"tag":95,"props":2392,"children":2393},{"class":97,"line":284},[2394,2398,2403],{"type":32,"tag":95,"props":2395,"children":2396},{"style":108},[2397],{"type":37,"value":2332},{"type":32,"tag":95,"props":2399,"children":2400},{"style":102},[2401],{"type":37,"value":2402},"dbt_utils.expression_is_true",{"type":32,"tag":95,"props":2404,"children":2405},{"style":108},[2406],{"type":37,"value":131},{"type":32,"tag":95,"props":2408,"children":2409},{"class":97,"line":302},[2410,2415,2419],{"type":32,"tag":95,"props":2411,"children":2412},{"style":102},[2413],{"type":37,"value":2414},"              expression",{"type":32,"tag":95,"props":2416,"children":2417},{"style":108},[2418],{"type":37,"value":111},{"type":32,"tag":95,"props":2420,"children":2421},{"style":152},[2422],{"type":37,"value":2423},"\">= 0\"\n",{"type":32,"tag":95,"props":2425,"children":2426},{"class":97,"line":314},[2427,2431,2435,2439],{"type":32,"tag":95,"props":2428,"children":2429},{"style":108},[2430],{"type":37,"value":195},{"type":32,"tag":95,"props":2432,"children":2433},{"style":102},[2434],{"type":37,"value":145},{"type":32,"tag":95,"props":2436,"children":2437},{"style":108},[2438],{"type":37,"value":111},{"type":32,"tag":95,"props":2440,"children":2441},{"style":152},[2442],{"type":37,"value":1283},{"type":32,"tag":95,"props":2444,"children":2445},{"class":97,"line":335},[2446,2450],{"type":32,"tag":95,"props":2447,"children":2448},{"style":102},[2449],{"type":37,"value":2320},{"type":32,"tag":95,"props":2451,"children":2452},{"style":108},[2453],{"type":37,"value":131},{"type":32,"tag":95,"props":2455,"children":2456},{"class":97,"line":1393},[2457,2461,2466],{"type":32,"tag":95,"props":2458,"children":2459},{"style":108},[2460],{"type":37,"value":2332},{"type":32,"tag":95,"props":2462,"children":2463},{"style":102},[2464],{"type":37,"value":2465},"dbt_utils.recency",{"type":32,"tag":95,"props":2467,"children":2468},{"style":108},[2469],{"type":37,"value":131},{"type":32,"tag":95,"props":2471,"children":2472},{"class":97,"line":1414},[2473,2478,2482],{"type":32,"tag":95,"props":2474,"children":2475},{"style":102},[2476],{"type":37,"value":2477},"              datepart",{"type":32,"tag":95,"props":2479,"children":2480},{"style":108},[2481],{"type":37,"value":111},{"type":32,"tag":95,"props":2483,"children":2484},{"style":152},[2485],{"type":37,"value":2486},"day\n",{"type":32,"tag":95,"props":2488,"children":2489},{"class":97,"line":1431},[2490,2495,2499],{"type":32,"tag":95,"props":2491,"children":2492},{"style":102},[2493],{"type":37,"value":2494},"              interval",{"type":32,"tag":95,"props":2496,"children":2497},{"style":108},[2498],{"type":37,"value":111},{"type":32,"tag":95,"props":2500,"children":2501},{"style":114},[2502],{"type":37,"value":2503},"7\n",{"type":32,"tag":33,"props":2505,"children":2506},{},[2507,2509,2515,2517,2523],{"type":37,"value":2508},"Il comando ",{"type":32,"tag":52,"props":2510,"children":2512},{"className":2511},[],[2513],{"type":37,"value":2514},"dbt test",{"type":37,"value":2516}," afferma queste condizioni in BigQuery — se order_amount diventa negativo, la build fallisce. In production ogni commit è testato da una pipeline CI\u002FCD: ",{"type":32,"tag":52,"props":2518,"children":2520},{"className":2519},[],[2521],{"type":37,"value":2522},"dbt run --select state:modified+ → dbt test --select state:modified+",{"type":37,"value":2524},". Esegue il modello modificato + le dipendenze downstream e li testa, se non ci sono problemi il merge è consentito.",{"type":32,"tag":40,"props":2526,"children":2528},{"id":2527},"orchestration-airflow-prefect-dbt-cloud",[2529],{"type":37,"value":2530},"Orchestration: Airflow, Prefect, dbt Cloud",{"type":32,"tag":33,"props":2532,"children":2533},{},[2534],{"type":37,"value":2535},"dbt non è un orchestrator autonomo — è schedulato con Airflow o Prefect. Esempio di DAG Airflow:",{"type":32,"tag":85,"props":2537,"children":2541},{"className":2538,"code":2539,"language":2540,"meta":16,"style":16},"language-python shiki shiki-themes github-dark","from airflow.providers.google.cloud.operators.bigquery import BigQueryInsertJobOperator\nfrom airflow.operators.bash import BashOperator\n\ndbt_run = BashOperator(\n    task_id='dbt_run',\n    bash_command='cd \u002Fopt\u002Fdbt && dbt run --profiles-dir .',\n    dag=dag\n)\n\ndbt_test = BashOperator(\n    task_id='dbt_test',\n    bash_command='cd \u002Fopt\u002Fdbt && dbt test',\n    dag=dag\n)\n\ndbt_run >> dbt_test\n","python",[2542],{"type":32,"tag":52,"props":2543,"children":2544},{"__ignoreMap":16},[2545,2568,2589,2596,2613,2635,2656,2673,2680,2687,2703,2723,2743,2758,2765,2772],{"type":32,"tag":95,"props":2546,"children":2547},{"class":97,"line":98},[2548,2553,2558,2563],{"type":32,"tag":95,"props":2549,"children":2550},{"style":457},[2551],{"type":37,"value":2552},"from",{"type":32,"tag":95,"props":2554,"children":2555},{"style":108},[2556],{"type":37,"value":2557}," airflow.providers.google.cloud.operators.bigquery ",{"type":32,"tag":95,"props":2559,"children":2560},{"style":457},[2561],{"type":37,"value":2562},"import",{"type":32,"tag":95,"props":2564,"children":2565},{"style":108},[2566],{"type":37,"value":2567}," BigQueryInsertJobOperator\n",{"type":32,"tag":95,"props":2569,"children":2570},{"class":97,"line":120},[2571,2575,2580,2584],{"type":32,"tag":95,"props":2572,"children":2573},{"style":457},[2574],{"type":37,"value":2552},{"type":32,"tag":95,"props":2576,"children":2577},{"style":108},[2578],{"type":37,"value":2579}," airflow.operators.bash ",{"type":32,"tag":95,"props":2581,"children":2582},{"style":457},[2583],{"type":37,"value":2562},{"type":32,"tag":95,"props":2585,"children":2586},{"style":108},[2587],{"type":37,"value":2588}," BashOperator\n",{"type":32,"tag":95,"props":2590,"children":2591},{"class":97,"line":134},[2592],{"type":32,"tag":95,"props":2593,"children":2594},{"emptyLinePlaceholder":1387},[2595],{"type":37,"value":1390},{"type":32,"tag":95,"props":2597,"children":2598},{"class":97,"line":158},[2599,2604,2608],{"type":32,"tag":95,"props":2600,"children":2601},{"style":108},[2602],{"type":37,"value":2603},"dbt_run ",{"type":32,"tag":95,"props":2605,"children":2606},{"style":457},[2607],{"type":37,"value":864},{"type":32,"tag":95,"props":2609,"children":2610},{"style":108},[2611],{"type":37,"value":2612}," BashOperator(\n",{"type":32,"tag":95,"props":2614,"children":2615},{"class":97,"line":176},[2616,2622,2626,2631],{"type":32,"tag":95,"props":2617,"children":2619},{"style":2618},"--shiki-default:#FFAB70",[2620],{"type":37,"value":2621},"    task_id",{"type":32,"tag":95,"props":2623,"children":2624},{"style":457},[2625],{"type":37,"value":864},{"type":32,"tag":95,"props":2627,"children":2628},{"style":152},[2629],{"type":37,"value":2630},"'dbt_run'",{"type":32,"tag":95,"props":2632,"children":2633},{"style":108},[2634],{"type":37,"value":597},{"type":32,"tag":95,"props":2636,"children":2637},{"class":97,"line":189},[2638,2643,2647,2652],{"type":32,"tag":95,"props":2639,"children":2640},{"style":2618},[2641],{"type":37,"value":2642},"    bash_command",{"type":32,"tag":95,"props":2644,"children":2645},{"style":457},[2646],{"type":37,"value":864},{"type":32,"tag":95,"props":2648,"children":2649},{"style":152},[2650],{"type":37,"value":2651},"'cd \u002Fopt\u002Fdbt && dbt run --profiles-dir .'",{"type":32,"tag":95,"props":2653,"children":2654},{"style":108},[2655],{"type":37,"value":597},{"type":32,"tag":95,"props":2657,"children":2658},{"class":97,"line":211},[2659,2664,2668],{"type":32,"tag":95,"props":2660,"children":2661},{"style":2618},[2662],{"type":37,"value":2663},"    dag",{"type":32,"tag":95,"props":2665,"children":2666},{"style":457},[2667],{"type":37,"value":864},{"type":32,"tag":95,"props":2669,"children":2670},{"style":108},[2671],{"type":37,"value":2672},"dag\n",{"type":32,"tag":95,"props":2674,"children":2675},{"class":97,"line":229},[2676],{"type":32,"tag":95,"props":2677,"children":2678},{"style":108},[2679],{"type":37,"value":1010},{"type":32,"tag":95,"props":2681,"children":2682},{"class":97,"line":26},[2683],{"type":32,"tag":95,"props":2684,"children":2685},{"emptyLinePlaceholder":1387},[2686],{"type":37,"value":1390},{"type":32,"tag":95,"props":2688,"children":2689},{"class":97,"line":267},[2690,2695,2699],{"type":32,"tag":95,"props":2691,"children":2692},{"style":108},[2693],{"type":37,"value":2694},"dbt_test ",{"type":32,"tag":95,"props":2696,"children":2697},{"style":457},[2698],{"type":37,"value":864},{"type":32,"tag":95,"props":2700,"children":2701},{"style":108},[2702],{"type":37,"value":2612},{"type":32,"tag":95,"props":2704,"children":2705},{"class":97,"line":284},[2706,2710,2714,2719],{"type":32,"tag":95,"props":2707,"children":2708},{"style":2618},[2709],{"type":37,"value":2621},{"type":32,"tag":95,"props":2711,"children":2712},{"style":457},[2713],{"type":37,"value":864},{"type":32,"tag":95,"props":2715,"children":2716},{"style":152},[2717],{"type":37,"value":2718},"'dbt_test'",{"type":32,"tag":95,"props":2720,"children":2721},{"style":108},[2722],{"type":37,"value":597},{"type":32,"tag":95,"props":2724,"children":2725},{"class":97,"line":302},[2726,2730,2734,2739],{"type":32,"tag":95,"props":2727,"children":2728},{"style":2618},[2729],{"type":37,"value":2642},{"type":32,"tag":95,"props":2731,"children":2732},{"style":457},[2733],{"type":37,"value":864},{"type":32,"tag":95,"props":2735,"children":2736},{"style":152},[2737],{"type":37,"value":2738},"'cd \u002Fopt\u002Fdbt && dbt test'",{"type":32,"tag":95,"props":2740,"children":2741},{"style":108},[2742],{"type":37,"value":597},{"type":32,"tag":95,"props":2744,"children":2745},{"class":97,"line":314},[2746,2750,2754],{"type":32,"tag":95,"props":2747,"children":2748},{"style":2618},[2749],{"type":37,"value":2663},{"type":32,"tag":95,"props":2751,"children":2752},{"style":457},[2753],{"type":37,"value":864},{"type":32,"tag":95,"props":2755,"children":2756},{"style":108},[2757],{"type":37,"value":2672},{"type":32,"tag":95,"props":2759,"children":2760},{"class":97,"line":335},[2761],{"type":32,"tag":95,"props":2762,"children":2763},{"style":108},[2764],{"type":37,"value":1010},{"type":32,"tag":95,"props":2766,"children":2767},{"class":97,"line":1393},[2768],{"type":32,"tag":95,"props":2769,"children":2770},{"emptyLinePlaceholder":1387},[2771],{"type":37,"value":1390},{"type":32,"tag":95,"props":2773,"children":2774},{"class":97,"line":1414},[2775,2779,2784],{"type":32,"tag":95,"props":2776,"children":2777},{"style":108},[2778],{"type":37,"value":2603},{"type":32,"tag":95,"props":2780,"children":2781},{"style":457},[2782],{"type":37,"value":2783},">>",{"type":32,"tag":95,"props":2785,"children":2786},{"style":108},[2787],{"type":37,"value":2788}," dbt_test\n",{"type":32,"tag":33,"props":2790,"children":2791},{},[2792],{"type":37,"value":2793},"dbt Cloud è l'alternativa — orchestrazione gestita, Web IDE, avvisi Slack. Ma molte enterprise preferiscono Airflow perché ci sono altri task oltre a dbt: pull API upstream, reverse ETL downstream, snapshot di tabelle.",{"type":32,"tag":33,"props":2795,"children":2796},{},[2797,2799,2805],{"type":37,"value":2798},"La strategia di schedule è legata alla freschezza dei dati. GA4 ha un delay di 24 ore (processing_date ≠ event_date), l'API Meta Ads Insights non è real-time. I modelli staging sono attivati dalla freschezza della fonte — quando GA4 ha una nuova partition, ",{"type":32,"tag":52,"props":2800,"children":2802},{"className":2801},[],[2803],{"type":37,"value":2804},"stg_ga4_events",{"type":37,"value":2806}," si refresh, e la catena intermediate → mart si propaga. Un operatore sensor di Airflow controlla il suffisso della tabella di BigQuery:",{"type":32,"tag":85,"props":2808,"children":2810},{"className":2538,"code":2809,"language":2540,"meta":16,"style":16},"wait_for_ga4 = BigQueryTableExistenceSensor(\n    task_id='wait_for_ga4_partition',\n    project_id='analytics_123456',\n    dataset_id='events_',\n    table_id=f\"events_{yesterday.strftime('%Y%m%d')}\",\n    poke_interval=300\n)\n",[2811],{"type":32,"tag":52,"props":2812,"children":2813},{"__ignoreMap":16},[2814,2831,2851,2872,2892,2957,2974],{"type":32,"tag":95,"props":2815,"children":2816},{"class":97,"line":98},[2817,2822,2826],{"type":32,"tag":95,"props":2818,"children":2819},{"style":108},[2820],{"type":37,"value":2821},"wait_for_ga4 ",{"type":32,"tag":95,"props":2823,"children":2824},{"style":457},[2825],{"type":37,"value":864},{"type":32,"tag":95,"props":2827,"children":2828},{"style":108},[2829],{"type":37,"value":2830}," BigQueryTableExistenceSensor(\n",{"type":32,"tag":95,"props":2832,"children":2833},{"class":97,"line":120},[2834,2838,2842,2847],{"type":32,"tag":95,"props":2835,"children":2836},{"style":2618},[2837],{"type":37,"value":2621},{"type":32,"tag":95,"props":2839,"children":2840},{"style":457},[2841],{"type":37,"value":864},{"type":32,"tag":95,"props":2843,"children":2844},{"style":152},[2845],{"type":37,"value":2846},"'wait_for_ga4_partition'",{"type":32,"tag":95,"props":2848,"children":2849},{"style":108},[2850],{"type":37,"value":597},{"type":32,"tag":95,"props":2852,"children":2853},{"class":97,"line":134},[2854,2859,2863,2868],{"type":32,"tag":95,"props":2855,"children":2856},{"style":2618},[2857],{"type":37,"value":2858},"    project_id",{"type":32,"tag":95,"props":2860,"children":2861},{"style":457},[2862],{"type":37,"value":864},{"type":32,"tag":95,"props":2864,"children":2865},{"style":152},[2866],{"type":37,"value":2867},"'analytics_123456'",{"type":32,"tag":95,"props":2869,"children":2870},{"style":108},[2871],{"type":37,"value":597},{"type":32,"tag":95,"props":2873,"children":2874},{"class":97,"line":158},[2875,2880,2884,2888],{"type":32,"tag":95,"props":2876,"children":2877},{"style":2618},[2878],{"type":37,"value":2879},"    dataset_id",{"type":32,"tag":95,"props":2881,"children":2882},{"style":457},[2883],{"type":37,"value":864},{"type":32,"tag":95,"props":2885,"children":2886},{"style":152},[2887],{"type":37,"value":652},{"type":32,"tag":95,"props":2889,"children":2890},{"style":108},[2891],{"type":37,"value":597},{"type":32,"tag":95,"props":2893,"children":2894},{"class":97,"line":176},[2895,2900,2904,2909,2914,2918,2923,2928,2933,2938,2943,2948,2953],{"type":32,"tag":95,"props":2896,"children":2897},{"style":2618},[2898],{"type":37,"value":2899},"    table_id",{"type":32,"tag":95,"props":2901,"children":2902},{"style":457},[2903],{"type":37,"value":864},{"type":32,"tag":95,"props":2905,"children":2906},{"style":457},[2907],{"type":37,"value":2908},"f",{"type":32,"tag":95,"props":2910,"children":2911},{"style":152},[2912],{"type":37,"value":2913},"\"events_",{"type":32,"tag":95,"props":2915,"children":2916},{"style":114},[2917],{"type":37,"value":2012},{"type":32,"tag":95,"props":2919,"children":2920},{"style":108},[2921],{"type":37,"value":2922},"yesterday.strftime(",{"type":32,"tag":95,"props":2924,"children":2925},{"style":152},[2926],{"type":37,"value":2927},"'%Y%m",{"type":32,"tag":95,"props":2929,"children":2930},{"style":114},[2931],{"type":37,"value":2932},"%d",{"type":32,"tag":95,"props":2934,"children":2935},{"style":152},[2936],{"type":37,"value":2937},"'",{"type":32,"tag":95,"props":2939,"children":2940},{"style":108},[2941],{"type":37,"value":2942},")",{"type":32,"tag":95,"props":2944,"children":2945},{"style":114},[2946],{"type":37,"value":2947},"}",{"type":32,"tag":95,"props":2949,"children":2950},{"style":152},[2951],{"type":37,"value":2952},"\"",{"type":32,"tag":95,"props":2954,"children":2955},{"style":108},[2956],{"type":37,"value":597},{"type":32,"tag":95,"props":2958,"children":2959},{"class":97,"line":189},[2960,2965,2969],{"type":32,"tag":95,"props":2961,"children":2962},{"style":2618},[2963],{"type":37,"value":2964},"    poke_interval",{"type":32,"tag":95,"props":2966,"children":2967},{"style":457},[2968],{"type":37,"value":864},{"type":32,"tag":95,"props":2970,"children":2971},{"style":114},[2972],{"type":37,"value":2973},"300\n",{"type":32,"tag":95,"props":2975,"children":2976},{"class":97,"line":211},[2977],{"type":32,"tag":95,"props":2978,"children":2979},{"style":108},[2980],{"type":37,"value":1010},{"type":32,"tag":33,"props":2982,"children":2983},{},[2984],{"type":37,"value":2985},"Quando la partition è pronta, la catena dbt inizia. Questo pattern risolve il problema dei dati che arrivano in ritardo — il ritardo dell'API non blocca la pipeline, la mette in pausa.",{"type":32,"tag":40,"props":2987,"children":2989},{"id":2988},"tradeoffs-cosa-dbt-non-risolve",[2990],{"type":37,"value":2991},"Tradeoffs: cosa dbt non risolve",{"type":32,"tag":33,"props":2993,"children":2994},{},[2995],{"type":37,"value":2996},"dbt è un transformation engine, non un data loader. Chi carica i dati in BigQuery? Fivetran, Airbyte, uno script Python personalizzato. dbt assume nel source mapping che i dati grezzi siano già lì. Pattern ELT: Extract-Load-Transform. Diverso da ETL perché il transform è dentro il warehouse. dbt è questo strato T, EL è un toolchain separato.",{"type":32,"tag":33,"props":2998,"children":2999},{},[3000],{"type":37,"value":3001},"dbt non supporta streaming real-time. Kafka → BigQuery streaming insert → la catena di modelli incrementali dbt produce un delay di minuti. Se avete bisogno di latenza sub-secondo (rilevamento frodi, pricing dinamico), dbt non è sufficiente — servono processori di stream come Flink, Spark Structured Streaming, Materialize.",{"type":32,"tag":33,"props":3003,"children":3004},{},[3005],{"type":37,"value":3006},"Il supporto di dbt per i modelli Python (v1.3+) è limitato. Potete fare manipolazione di dataframe Pandas ma non addestrate modelli ML pesanti in dbt. Pattern comune: feature engineering in dbt, addestramento del modello in Vertex AI, inferenza in BigQuery ML. Il modello Python di dbt assomiglia a questo:",{"type":32,"tag":85,"props":3008,"children":3010},{"className":2538,"code":3009,"language":2540,"meta":16,"style":16},"def model(dbt, session):\n    df = dbt.ref('stg_orders').to_pandas()\n    df['log_amount'] = np.log1p(df['order_amount'])\n    return df\n",[3011],{"type":32,"tag":52,"props":3012,"children":3013},{"__ignoreMap":16},[3014,3033,3060,3097],{"type":32,"tag":95,"props":3015,"children":3016},{"class":97,"line":98},[3017,3022,3028],{"type":32,"tag":95,"props":3018,"children":3019},{"style":457},[3020],{"type":37,"value":3021},"def",{"type":32,"tag":95,"props":3023,"children":3025},{"style":3024},"--shiki-default:#B392F0",[3026],{"type":37,"value":3027}," model",{"type":32,"tag":95,"props":3029,"children":3030},{"style":108},[3031],{"type":37,"value":3032},"(dbt, session):\n",{"type":32,"tag":95,"props":3034,"children":3035},{"class":97,"line":120},[3036,3041,3045,3050,3055],{"type":32,"tag":95,"props":3037,"children":3038},{"style":108},[3039],{"type":37,"value":3040},"    df ",{"type":32,"tag":95,"props":3042,"children":3043},{"style":457},[3044],{"type":37,"value":864},{"type":32,"tag":95,"props":3046,"children":3047},{"style":108},[3048],{"type":37,"value":3049}," dbt.ref(",{"type":32,"tag":95,"props":3051,"children":3052},{"style":152},[3053],{"type":37,"value":3054},"'stg_orders'",{"type":32,"tag":95,"props":3056,"children":3057},{"style":108},[3058],{"type":37,"value":3059},").to_pandas()\n",{"type":32,"tag":95,"props":3061,"children":3062},{"class":97,"line":134},[3063,3068,3073,3078,3082,3087,3092],{"type":32,"tag":95,"props":3064,"children":3065},{"style":108},[3066],{"type":37,"value":3067},"    df[",{"type":32,"tag":95,"props":3069,"children":3070},{"style":152},[3071],{"type":37,"value":3072},"'log_amount'",{"type":32,"tag":95,"props":3074,"children":3075},{"style":108},[3076],{"type":37,"value":3077},"] ",{"type":32,"tag":95,"props":3079,"children":3080},{"style":457},[3081],{"type":37,"value":864},{"type":32,"tag":95,"props":3083,"children":3084},{"style":108},[3085],{"type":37,"value":3086}," np.log1p(df[",{"type":32,"tag":95,"props":3088,"children":3089},{"style":152},[3090],{"type":37,"value":3091},"'order_amount'",{"type":32,"tag":95,"props":3093,"children":3094},{"style":108},[3095],{"type":37,"value":3096},"])\n",{"type":32,"tag":95,"props":3098,"children":3099},{"class":97,"line":158},[3100,3105],{"type":32,"tag":95,"props":3101,"children":3102},{"style":457},[3103],{"type":37,"value":3104},"    return",{"type":32,"tag":95,"props":3106,"children":3107},{"style":108},[3108],{"type":37,"value":3109}," df\n",{"type":32,"tag":33,"props":3111,"children":3112},{},[3113],{"type":37,"value":3114},"Ma è solo feature generation — non adattate scikit-learn. BigQuery è compute costoso, il runtime Python ha overhead elevato. Le trasformazioni complesse sono più veloci in SQL.",{"type":32,"tag":40,"props":3116,"children":3118},{"id":3117},"cosa-fare-adesso",[3119],{"type":37,"value":3120},"Cosa fare adesso",{"type":32,"tag":33,"props":3122,"children":3123},{},[3124,3126,3131,3133,3138],{"type":37,"value":3125},"Se i vostri dati di marketing sono ancora in spreadsheet con merge manuale, il primo passo è stabilire il flusso di dati grezzi verso BigQuery. Export GA4, connettore API per Meta\u002FGoogle Ads (Fivetran\u002FSupermetrics), webhook CRM → BigQuery streaming insert. Con i dati grezzi pronti, aprite il repository dbt: modelli staging per il source mapping, modelli intermediate per sessionization\u002Fattribution, modelli mart per i KPI finali. Le prime 2 settimane bastano per la tabella ",{"type":32,"tag":52,"props":3127,"children":3129},{"className":3128},[],[3130],{"type":37,"value":1100},{"type":37,"value":3132}," e ",{"type":32,"tag":52,"props":3134,"children":3136},{"className":3135},[],[3137],{"type":37,"value":1093},{"type":37,"value":3139}," — i dashboard guardano qui, le metriche si stabilizzano. Il semantic layer arriva nella settimana 3, il mapping di exposure nella settimana 4. Dopo 6 settimane la pipeline di produzione gira git-controlled",{"type":32,"tag":3141,"props":3142,"children":3143},"style",{},[3144],{"type":37,"value":3145},"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":134,"depth":134,"links":3147},[3148,3149,3150,3151,3152,3153,3154,3155],{"id":42,"depth":120,"text":45},{"id":426,"depth":120,"text":429},{"id":1129,"depth":120,"text":1132},{"id":1547,"depth":120,"text":1550},{"id":1922,"depth":120,"text":1925},{"id":2527,"depth":120,"text":2530},{"id":2988,"depth":120,"text":2991},{"id":3117,"depth":120,"text":3120},"markdown","content:it:data:dbt-bigquery-modern-pazarlama-data-stack.md","content","it\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack.md","it\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack","md",1782050754684]