[{"data":1,"prerenderedAt":3480},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Fdata\u002Fdbt-bigquery-modern-pila-datos-marketing":13},{"i18nKey":4,"paths":5},"data-002-2026-07",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fdbt-bigquery-moderner-marketing-data-stack","\u002Fen\u002Fdata\u002Fdbt-bigquery-modern-marketing-data-stack","\u002Fes\u002Fdata\u002Fdbt-bigquery-modern-pila-datos-marketing","\u002Ffr\u002Fdata\u002Fdbt-bigquery-stack-marketing-data-moderne","\u002Fit\u002Fdata\u002Fdbt-bigquery-modern-stack-marketing-data","\u002Fru\u002Fdata\u002Fdbt-bigquery-modern-marketing-data-stack","\u002Ftr\u002Fdata\u002Fdbt-bigquery-ile-modern-pazarlama-data-stack",{"_path":8,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":20,"i18nKey":4,"tags":21,"readingTime":27,"author":28,"body":29,"_type":3474,"_id":3475,"_source":3476,"_file":3477,"_stem":3478,"_extension":3479},"data",false,"","dbt + BigQuery: La pila de datos moderna para marketing","Source mapping, modeling layer, semantic layer, exposures: una arquitectura de cuatro capas que conecta los datos de marketing con tu mecanismo de decisión.","2026-07-17","verianalizi",[22,23,24,25,26],"dbt","bigquery","data-modeling","semantic-layer","marketing-analytics",8,"Roibase",{"type":30,"children":31,"toc":3466},"root",[32,40,47,91,566,595,616,622,657,1130,1151,1178,1637,1657,1722,1728,1757,2134,2163,2210,2216,2221,2606,2626,2655,2661,2673,3160,3181,3194,3394,3399,3405,3426,3439,3451,3455,3460],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37],{"type":38,"value":39},"text","Un reporte de Google Analytics 4 muestra cómo rinde cada canal, Klaviyo registra cuántos emails envió a quién, el dashboard de Meta Ads muestra el CPA — pero ¿pueden esas tres métricas estar lado a lado en la misma consulta SQL? Si no pueden, tu mecanismo de decisión se basa en conjeturas. La promesa de la pila dbt + BigQuery es una sola: modelar los datos de marketing en cuatro capas — desde la source hasta la exposure — convirtiendo la pregunta \"qué canal, a qué cliente, generó cuánto valor\" en un pipeline SQL reproducible. A medida que la era post-cookie, la atribución multi-touch y la incrementalidad se vuelven obligatorias, esta arquitectura ya no es opcional para una agencia boutique: es imprescindible.",{"type":33,"tag":41,"props":42,"children":44},"h2",{"id":43},"source-mapping-organizar-los-conjuntos-de-datos-en-grupos-de-tablas",[45],{"type":38,"value":46},"Source mapping: organizar los conjuntos de datos en grupos de tablas",{"type":33,"tag":34,"props":48,"children":49},{},[50,52,59,61,67,68,74,75,81,83,89],{"type":38,"value":51},"En BigQuery, cada plataforma crea su propio dataset: ",{"type":33,"tag":53,"props":54,"children":56},"code",{"className":55},[],[57],{"type":38,"value":58},"ga4_export",{"type":38,"value":60},", ",{"type":33,"tag":53,"props":62,"children":64},{"className":63},[],[65],{"type":38,"value":66},"facebook_ads",{"type":38,"value":60},{"type":33,"tag":53,"props":69,"children":71},{"className":70},[],[72],{"type":38,"value":73},"klaviyo_events",{"type":38,"value":60},{"type":33,"tag":53,"props":76,"children":78},{"className":77},[],[79],{"type":38,"value":80},"shopify_orders",{"type":38,"value":82},". Sus esquemas crudos son incompatibles entre sí — GA4 devuelve JSON anidado, Facebook API entrega CSV plano, Klaviyo webhook no aplica normalización. El source mapping es la primera capa: escribir un manifiesto YAML sobre este caos, registrando cada tabla en un bloque ",{"type":33,"tag":53,"props":84,"children":86},{"className":85},[],[87],{"type":38,"value":88},"sources",{"type":38,"value":90}," e indicando sus tipos de dato, si están frescos o desactualizados, y con qué frecuencia se cargan.",{"type":33,"tag":92,"props":93,"children":97},"pre",{"className":94,"code":95,"language":96,"meta":16,"style":16},"language-yaml shiki shiki-themes github-dark","# models\u002Fsources\u002Fmarketing_sources.yml\nversion: 2\n\nsources:\n  - name: ga4_export\n    database: roibase-analytics\n    schema: analytics_123456789\n    tables:\n      - name: events_*\n        identifier: 'events_*'\n        meta:\n          contains_pii: true\n        freshness:\n          warn_after: {count: 25, period: hour}\n          error_after: {count: 49, period: hour}\n\n  - name: facebook_ads\n    schema: facebook_raw\n    tables:\n      - name: ads_insights\n        loaded_at_field: date_start\n        freshness:\n          warn_after: {count: 2, period: day}\n","yaml",[98],{"type":33,"tag":53,"props":99,"children":100},{"__ignoreMap":16},[101,113,135,145,158,182,200,218,230,252,270,283,301,314,365,411,419,440,457,469,490,508,520],{"type":33,"tag":102,"props":103,"children":106},"span",{"class":104,"line":105},"line",1,[107],{"type":33,"tag":102,"props":108,"children":110},{"style":109},"--shiki-default:#6A737D",[111],{"type":38,"value":112},"# models\u002Fsources\u002Fmarketing_sources.yml\n",{"type":33,"tag":102,"props":114,"children":116},{"class":104,"line":115},2,[117,123,129],{"type":33,"tag":102,"props":118,"children":120},{"style":119},"--shiki-default:#85E89D",[121],{"type":38,"value":122},"version",{"type":33,"tag":102,"props":124,"children":126},{"style":125},"--shiki-default:#E1E4E8",[127],{"type":38,"value":128},": ",{"type":33,"tag":102,"props":130,"children":132},{"style":131},"--shiki-default:#79B8FF",[133],{"type":38,"value":134},"2\n",{"type":33,"tag":102,"props":136,"children":138},{"class":104,"line":137},3,[139],{"type":33,"tag":102,"props":140,"children":142},{"emptyLinePlaceholder":141},true,[143],{"type":38,"value":144},"\n",{"type":33,"tag":102,"props":146,"children":148},{"class":104,"line":147},4,[149,153],{"type":33,"tag":102,"props":150,"children":151},{"style":119},[152],{"type":38,"value":88},{"type":33,"tag":102,"props":154,"children":155},{"style":125},[156],{"type":38,"value":157},":\n",{"type":33,"tag":102,"props":159,"children":161},{"class":104,"line":160},5,[162,167,172,176],{"type":33,"tag":102,"props":163,"children":164},{"style":125},[165],{"type":38,"value":166},"  - ",{"type":33,"tag":102,"props":168,"children":169},{"style":119},[170],{"type":38,"value":171},"name",{"type":33,"tag":102,"props":173,"children":174},{"style":125},[175],{"type":38,"value":128},{"type":33,"tag":102,"props":177,"children":179},{"style":178},"--shiki-default:#9ECBFF",[180],{"type":38,"value":181},"ga4_export\n",{"type":33,"tag":102,"props":183,"children":185},{"class":104,"line":184},6,[186,191,195],{"type":33,"tag":102,"props":187,"children":188},{"style":119},[189],{"type":38,"value":190},"    database",{"type":33,"tag":102,"props":192,"children":193},{"style":125},[194],{"type":38,"value":128},{"type":33,"tag":102,"props":196,"children":197},{"style":178},[198],{"type":38,"value":199},"roibase-analytics\n",{"type":33,"tag":102,"props":201,"children":203},{"class":104,"line":202},7,[204,209,213],{"type":33,"tag":102,"props":205,"children":206},{"style":119},[207],{"type":38,"value":208},"    schema",{"type":33,"tag":102,"props":210,"children":211},{"style":125},[212],{"type":38,"value":128},{"type":33,"tag":102,"props":214,"children":215},{"style":178},[216],{"type":38,"value":217},"analytics_123456789\n",{"type":33,"tag":102,"props":219,"children":220},{"class":104,"line":27},[221,226],{"type":33,"tag":102,"props":222,"children":223},{"style":119},[224],{"type":38,"value":225},"    tables",{"type":33,"tag":102,"props":227,"children":228},{"style":125},[229],{"type":38,"value":157},{"type":33,"tag":102,"props":231,"children":233},{"class":104,"line":232},9,[234,239,243,247],{"type":33,"tag":102,"props":235,"children":236},{"style":125},[237],{"type":38,"value":238},"      - ",{"type":33,"tag":102,"props":240,"children":241},{"style":119},[242],{"type":38,"value":171},{"type":33,"tag":102,"props":244,"children":245},{"style":125},[246],{"type":38,"value":128},{"type":33,"tag":102,"props":248,"children":249},{"style":178},[250],{"type":38,"value":251},"events_*\n",{"type":33,"tag":102,"props":253,"children":255},{"class":104,"line":254},10,[256,261,265],{"type":33,"tag":102,"props":257,"children":258},{"style":119},[259],{"type":38,"value":260},"        identifier",{"type":33,"tag":102,"props":262,"children":263},{"style":125},[264],{"type":38,"value":128},{"type":33,"tag":102,"props":266,"children":267},{"style":178},[268],{"type":38,"value":269},"'events_*'\n",{"type":33,"tag":102,"props":271,"children":273},{"class":104,"line":272},11,[274,279],{"type":33,"tag":102,"props":275,"children":276},{"style":119},[277],{"type":38,"value":278},"        meta",{"type":33,"tag":102,"props":280,"children":281},{"style":125},[282],{"type":38,"value":157},{"type":33,"tag":102,"props":284,"children":286},{"class":104,"line":285},12,[287,292,296],{"type":33,"tag":102,"props":288,"children":289},{"style":119},[290],{"type":38,"value":291},"          contains_pii",{"type":33,"tag":102,"props":293,"children":294},{"style":125},[295],{"type":38,"value":128},{"type":33,"tag":102,"props":297,"children":298},{"style":131},[299],{"type":38,"value":300},"true\n",{"type":33,"tag":102,"props":302,"children":304},{"class":104,"line":303},13,[305,310],{"type":33,"tag":102,"props":306,"children":307},{"style":119},[308],{"type":38,"value":309},"        freshness",{"type":33,"tag":102,"props":311,"children":312},{"style":125},[313],{"type":38,"value":157},{"type":33,"tag":102,"props":315,"children":317},{"class":104,"line":316},14,[318,323,328,333,337,342,346,351,355,360],{"type":33,"tag":102,"props":319,"children":320},{"style":119},[321],{"type":38,"value":322},"          warn_after",{"type":33,"tag":102,"props":324,"children":325},{"style":125},[326],{"type":38,"value":327},": {",{"type":33,"tag":102,"props":329,"children":330},{"style":119},[331],{"type":38,"value":332},"count",{"type":33,"tag":102,"props":334,"children":335},{"style":125},[336],{"type":38,"value":128},{"type":33,"tag":102,"props":338,"children":339},{"style":131},[340],{"type":38,"value":341},"25",{"type":33,"tag":102,"props":343,"children":344},{"style":125},[345],{"type":38,"value":60},{"type":33,"tag":102,"props":347,"children":348},{"style":119},[349],{"type":38,"value":350},"period",{"type":33,"tag":102,"props":352,"children":353},{"style":125},[354],{"type":38,"value":128},{"type":33,"tag":102,"props":356,"children":357},{"style":178},[358],{"type":38,"value":359},"hour",{"type":33,"tag":102,"props":361,"children":362},{"style":125},[363],{"type":38,"value":364},"}\n",{"type":33,"tag":102,"props":366,"children":368},{"class":104,"line":367},15,[369,374,378,382,386,391,395,399,403,407],{"type":33,"tag":102,"props":370,"children":371},{"style":119},[372],{"type":38,"value":373},"          error_after",{"type":33,"tag":102,"props":375,"children":376},{"style":125},[377],{"type":38,"value":327},{"type":33,"tag":102,"props":379,"children":380},{"style":119},[381],{"type":38,"value":332},{"type":33,"tag":102,"props":383,"children":384},{"style":125},[385],{"type":38,"value":128},{"type":33,"tag":102,"props":387,"children":388},{"style":131},[389],{"type":38,"value":390},"49",{"type":33,"tag":102,"props":392,"children":393},{"style":125},[394],{"type":38,"value":60},{"type":33,"tag":102,"props":396,"children":397},{"style":119},[398],{"type":38,"value":350},{"type":33,"tag":102,"props":400,"children":401},{"style":125},[402],{"type":38,"value":128},{"type":33,"tag":102,"props":404,"children":405},{"style":178},[406],{"type":38,"value":359},{"type":33,"tag":102,"props":408,"children":409},{"style":125},[410],{"type":38,"value":364},{"type":33,"tag":102,"props":412,"children":414},{"class":104,"line":413},16,[415],{"type":33,"tag":102,"props":416,"children":417},{"emptyLinePlaceholder":141},[418],{"type":38,"value":144},{"type":33,"tag":102,"props":420,"children":422},{"class":104,"line":421},17,[423,427,431,435],{"type":33,"tag":102,"props":424,"children":425},{"style":125},[426],{"type":38,"value":166},{"type":33,"tag":102,"props":428,"children":429},{"style":119},[430],{"type":38,"value":171},{"type":33,"tag":102,"props":432,"children":433},{"style":125},[434],{"type":38,"value":128},{"type":33,"tag":102,"props":436,"children":437},{"style":178},[438],{"type":38,"value":439},"facebook_ads\n",{"type":33,"tag":102,"props":441,"children":443},{"class":104,"line":442},18,[444,448,452],{"type":33,"tag":102,"props":445,"children":446},{"style":119},[447],{"type":38,"value":208},{"type":33,"tag":102,"props":449,"children":450},{"style":125},[451],{"type":38,"value":128},{"type":33,"tag":102,"props":453,"children":454},{"style":178},[455],{"type":38,"value":456},"facebook_raw\n",{"type":33,"tag":102,"props":458,"children":460},{"class":104,"line":459},19,[461,465],{"type":33,"tag":102,"props":462,"children":463},{"style":119},[464],{"type":38,"value":225},{"type":33,"tag":102,"props":466,"children":467},{"style":125},[468],{"type":38,"value":157},{"type":33,"tag":102,"props":470,"children":472},{"class":104,"line":471},20,[473,477,481,485],{"type":33,"tag":102,"props":474,"children":475},{"style":125},[476],{"type":38,"value":238},{"type":33,"tag":102,"props":478,"children":479},{"style":119},[480],{"type":38,"value":171},{"type":33,"tag":102,"props":482,"children":483},{"style":125},[484],{"type":38,"value":128},{"type":33,"tag":102,"props":486,"children":487},{"style":178},[488],{"type":38,"value":489},"ads_insights\n",{"type":33,"tag":102,"props":491,"children":493},{"class":104,"line":492},21,[494,499,503],{"type":33,"tag":102,"props":495,"children":496},{"style":119},[497],{"type":38,"value":498},"        loaded_at_field",{"type":33,"tag":102,"props":500,"children":501},{"style":125},[502],{"type":38,"value":128},{"type":33,"tag":102,"props":504,"children":505},{"style":178},[506],{"type":38,"value":507},"date_start\n",{"type":33,"tag":102,"props":509,"children":511},{"class":104,"line":510},22,[512,516],{"type":33,"tag":102,"props":513,"children":514},{"style":119},[515],{"type":38,"value":309},{"type":33,"tag":102,"props":517,"children":518},{"style":125},[519],{"type":38,"value":157},{"type":33,"tag":102,"props":521,"children":523},{"class":104,"line":522},23,[524,528,532,536,540,545,549,553,557,562],{"type":33,"tag":102,"props":525,"children":526},{"style":119},[527],{"type":38,"value":322},{"type":33,"tag":102,"props":529,"children":530},{"style":125},[531],{"type":38,"value":327},{"type":33,"tag":102,"props":533,"children":534},{"style":119},[535],{"type":38,"value":332},{"type":33,"tag":102,"props":537,"children":538},{"style":125},[539],{"type":38,"value":128},{"type":33,"tag":102,"props":541,"children":542},{"style":131},[543],{"type":38,"value":544},"2",{"type":33,"tag":102,"props":546,"children":547},{"style":125},[548],{"type":38,"value":60},{"type":33,"tag":102,"props":550,"children":551},{"style":119},[552],{"type":38,"value":350},{"type":33,"tag":102,"props":554,"children":555},{"style":125},[556],{"type":38,"value":128},{"type":33,"tag":102,"props":558,"children":559},{"style":178},[560],{"type":38,"value":561},"day",{"type":33,"tag":102,"props":563,"children":564},{"style":125},[565],{"type":38,"value":364},{"type":33,"tag":34,"props":567,"children":568},{},[569,571,577,579,585,587,593],{"type":38,"value":570},"Este manifiesto proporciona a dbt dos cosas: 1) referencias type-safe a tablas crudas usando la macro ",{"type":33,"tag":53,"props":572,"children":574},{"className":573},[],[575],{"type":38,"value":576},"source()",{"type":38,"value":578}," en lugar de ",{"type":33,"tag":53,"props":580,"children":582},{"className":581},[],[583],{"type":38,"value":584},"ref()",{"type":38,"value":586},", 2) la capacidad de detectar dónde se detiene el pipeline con el comando ",{"type":33,"tag":53,"props":588,"children":590},{"className":589},[],[591],{"type":38,"value":592},"dbt source freshness",{"type":38,"value":594},". Si un evento de GA4 no se ha actualizado en 49 horas, BigQuery no te avisa — dbt sí.",{"type":33,"tag":34,"props":596,"children":597},{},[598,600,606,608,614],{"type":38,"value":599},"Durante el source mapping, la anotación de PII es obligatoria: bajo el alcance de KVKK y GDPR, la información sobre qué columna contiene un ID de usuario, email o IP se transporta en el lineage del modelo hacia downstream. Cada tabla que contenga ",{"type":33,"tag":53,"props":601,"children":603},{"className":602},[],[604],{"type":38,"value":605},"user_pseudo_id",{"type":38,"value":607}," recibe el tag ",{"type":33,"tag":53,"props":609,"children":611},{"className":610},[],[612],{"type":38,"value":613},"meta.contains_pii: true",{"type":38,"value":615},". Este tag se combina con reglas de enmascaramiento a nivel de field en la semantic layer.",{"type":33,"tag":41,"props":617,"children":619},{"id":618},"modeling-layer-fases-staging-intermediate-mart",[620],{"type":38,"value":621},"Modeling layer: fases staging → intermediate → mart",{"type":33,"tag":34,"props":623,"children":624},{},[625,627,633,635,641,642,648,649,655],{"type":38,"value":626},"Los modelos staging renombran la source cruda, transforman tipos de dato y descartan columnas innecesarias, proporcionando un esquema estándar a downstream. El trabajo de staging es desempaquetar el array ",{"type":33,"tag":53,"props":628,"children":630},{"className":629},[],[631],{"type":38,"value":632},"event_params",{"type":38,"value":634}," de GA4 y convertir campos como ",{"type":33,"tag":53,"props":636,"children":638},{"className":637},[],[639],{"type":38,"value":640},"page_location",{"type":38,"value":60},{"type":33,"tag":53,"props":643,"children":645},{"className":644},[],[646],{"type":38,"value":647},"session_id",{"type":38,"value":60},{"type":33,"tag":53,"props":650,"children":652},{"className":651},[],[653],{"type":38,"value":654},"transaction_id",{"type":38,"value":656}," de estructuras anidadas a columnas escalares:",{"type":33,"tag":92,"props":658,"children":662},{"className":659,"code":660,"language":661,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","-- models\u002Fstaging\u002Fga4\u002Fstg_ga4__events.sql\nwith source as (\n    select * from {{ source('ga4_export', 'events_*') }}\n    where _table_suffix between format_date('%Y%m%d', date_sub(current_date(), interval 90 day))\n                             and format_date('%Y%m%d', current_date())\n),\n\nunnested as (\n    select\n        event_date,\n        event_timestamp,\n        user_pseudo_id,\n        (select value.string_value from unnest(event_params) where key = 'page_location') as page_location,\n        (select value.int_value from unnest(event_params) where key = 'ga_session_id') as session_id,\n        ecommerce.transaction_id,\n        ecommerce.purchase_revenue_in_usd\n    from source\n    where event_name in ('page_view', 'purchase')\n)\n\nselect * from unnested\n","sql",[663],{"type":33,"tag":53,"props":664,"children":665},{"__ignoreMap":16},[666,674,698,740,788,809,817,824,840,848,856,864,872,943,1005,1026,1042,1055,1096,1103,1110],{"type":33,"tag":102,"props":667,"children":668},{"class":104,"line":105},[669],{"type":33,"tag":102,"props":670,"children":671},{"style":109},[672],{"type":38,"value":673},"-- models\u002Fstaging\u002Fga4\u002Fstg_ga4__events.sql\n",{"type":33,"tag":102,"props":675,"children":676},{"class":104,"line":115},[677,683,688,693],{"type":33,"tag":102,"props":678,"children":680},{"style":679},"--shiki-default:#F97583",[681],{"type":38,"value":682},"with",{"type":33,"tag":102,"props":684,"children":685},{"style":125},[686],{"type":38,"value":687}," source ",{"type":33,"tag":102,"props":689,"children":690},{"style":679},[691],{"type":38,"value":692},"as",{"type":33,"tag":102,"props":694,"children":695},{"style":125},[696],{"type":38,"value":697}," (\n",{"type":33,"tag":102,"props":699,"children":700},{"class":104,"line":137},[701,706,711,716,721,726,730,735],{"type":33,"tag":102,"props":702,"children":703},{"style":679},[704],{"type":38,"value":705},"    select",{"type":33,"tag":102,"props":707,"children":708},{"style":679},[709],{"type":38,"value":710}," *",{"type":33,"tag":102,"props":712,"children":713},{"style":679},[714],{"type":38,"value":715}," from",{"type":33,"tag":102,"props":717,"children":718},{"style":125},[719],{"type":38,"value":720}," {{ source(",{"type":33,"tag":102,"props":722,"children":723},{"style":178},[724],{"type":38,"value":725},"'ga4_export'",{"type":33,"tag":102,"props":727,"children":728},{"style":125},[729],{"type":38,"value":60},{"type":33,"tag":102,"props":731,"children":732},{"style":178},[733],{"type":38,"value":734},"'events_*'",{"type":33,"tag":102,"props":736,"children":737},{"style":125},[738],{"type":38,"value":739},") }}\n",{"type":33,"tag":102,"props":741,"children":742},{"class":104,"line":147},[743,748,753,758,763,768,773,778,783],{"type":33,"tag":102,"props":744,"children":745},{"style":679},[746],{"type":38,"value":747},"    where",{"type":33,"tag":102,"props":749,"children":750},{"style":125},[751],{"type":38,"value":752}," _table_suffix ",{"type":33,"tag":102,"props":754,"children":755},{"style":679},[756],{"type":38,"value":757},"between",{"type":33,"tag":102,"props":759,"children":760},{"style":125},[761],{"type":38,"value":762}," format_date(",{"type":33,"tag":102,"props":764,"children":765},{"style":178},[766],{"type":38,"value":767},"'%Y%m%d'",{"type":33,"tag":102,"props":769,"children":770},{"style":125},[771],{"type":38,"value":772},", date_sub(current_date(), interval ",{"type":33,"tag":102,"props":774,"children":775},{"style":131},[776],{"type":38,"value":777},"90",{"type":33,"tag":102,"props":779,"children":780},{"style":679},[781],{"type":38,"value":782}," day",{"type":33,"tag":102,"props":784,"children":785},{"style":125},[786],{"type":38,"value":787},"))\n",{"type":33,"tag":102,"props":789,"children":790},{"class":104,"line":160},[791,796,800,804],{"type":33,"tag":102,"props":792,"children":793},{"style":679},[794],{"type":38,"value":795},"                             and",{"type":33,"tag":102,"props":797,"children":798},{"style":125},[799],{"type":38,"value":762},{"type":33,"tag":102,"props":801,"children":802},{"style":178},[803],{"type":38,"value":767},{"type":33,"tag":102,"props":805,"children":806},{"style":125},[807],{"type":38,"value":808},", current_date())\n",{"type":33,"tag":102,"props":810,"children":811},{"class":104,"line":184},[812],{"type":33,"tag":102,"props":813,"children":814},{"style":125},[815],{"type":38,"value":816},"),\n",{"type":33,"tag":102,"props":818,"children":819},{"class":104,"line":202},[820],{"type":33,"tag":102,"props":821,"children":822},{"emptyLinePlaceholder":141},[823],{"type":38,"value":144},{"type":33,"tag":102,"props":825,"children":826},{"class":104,"line":27},[827,832,836],{"type":33,"tag":102,"props":828,"children":829},{"style":125},[830],{"type":38,"value":831},"unnested ",{"type":33,"tag":102,"props":833,"children":834},{"style":679},[835],{"type":38,"value":692},{"type":33,"tag":102,"props":837,"children":838},{"style":125},[839],{"type":38,"value":697},{"type":33,"tag":102,"props":841,"children":842},{"class":104,"line":232},[843],{"type":33,"tag":102,"props":844,"children":845},{"style":679},[846],{"type":38,"value":847},"    select\n",{"type":33,"tag":102,"props":849,"children":850},{"class":104,"line":254},[851],{"type":33,"tag":102,"props":852,"children":853},{"style":125},[854],{"type":38,"value":855},"        event_date,\n",{"type":33,"tag":102,"props":857,"children":858},{"class":104,"line":272},[859],{"type":33,"tag":102,"props":860,"children":861},{"style":125},[862],{"type":38,"value":863},"        event_timestamp,\n",{"type":33,"tag":102,"props":865,"children":866},{"class":104,"line":285},[867],{"type":33,"tag":102,"props":868,"children":869},{"style":125},[870],{"type":38,"value":871},"        user_pseudo_id,\n",{"type":33,"tag":102,"props":873,"children":874},{"class":104,"line":303},[875,880,885,890,895,900,904,909,914,919,924,929,934,938],{"type":33,"tag":102,"props":876,"children":877},{"style":125},[878],{"type":38,"value":879},"        (",{"type":33,"tag":102,"props":881,"children":882},{"style":679},[883],{"type":38,"value":884},"select",{"type":33,"tag":102,"props":886,"children":887},{"style":131},[888],{"type":38,"value":889}," value",{"type":33,"tag":102,"props":891,"children":892},{"style":125},[893],{"type":38,"value":894},".",{"type":33,"tag":102,"props":896,"children":897},{"style":131},[898],{"type":38,"value":899},"string_value",{"type":33,"tag":102,"props":901,"children":902},{"style":679},[903],{"type":38,"value":715},{"type":33,"tag":102,"props":905,"children":906},{"style":125},[907],{"type":38,"value":908}," unnest(event_params) ",{"type":33,"tag":102,"props":910,"children":911},{"style":679},[912],{"type":38,"value":913},"where",{"type":33,"tag":102,"props":915,"children":916},{"style":679},[917],{"type":38,"value":918}," key",{"type":33,"tag":102,"props":920,"children":921},{"style":679},[922],{"type":38,"value":923}," =",{"type":33,"tag":102,"props":925,"children":926},{"style":178},[927],{"type":38,"value":928}," 'page_location'",{"type":33,"tag":102,"props":930,"children":931},{"style":125},[932],{"type":38,"value":933},") ",{"type":33,"tag":102,"props":935,"children":936},{"style":679},[937],{"type":38,"value":692},{"type":33,"tag":102,"props":939,"children":940},{"style":125},[941],{"type":38,"value":942}," page_location,\n",{"type":33,"tag":102,"props":944,"children":945},{"class":104,"line":316},[946,950,954,958,962,967,971,975,979,983,987,992,996,1000],{"type":33,"tag":102,"props":947,"children":948},{"style":125},[949],{"type":38,"value":879},{"type":33,"tag":102,"props":951,"children":952},{"style":679},[953],{"type":38,"value":884},{"type":33,"tag":102,"props":955,"children":956},{"style":131},[957],{"type":38,"value":889},{"type":33,"tag":102,"props":959,"children":960},{"style":125},[961],{"type":38,"value":894},{"type":33,"tag":102,"props":963,"children":964},{"style":131},[965],{"type":38,"value":966},"int_value",{"type":33,"tag":102,"props":968,"children":969},{"style":679},[970],{"type":38,"value":715},{"type":33,"tag":102,"props":972,"children":973},{"style":125},[974],{"type":38,"value":908},{"type":33,"tag":102,"props":976,"children":977},{"style":679},[978],{"type":38,"value":913},{"type":33,"tag":102,"props":980,"children":981},{"style":679},[982],{"type":38,"value":918},{"type":33,"tag":102,"props":984,"children":985},{"style":679},[986],{"type":38,"value":923},{"type":33,"tag":102,"props":988,"children":989},{"style":178},[990],{"type":38,"value":991}," 'ga_session_id'",{"type":33,"tag":102,"props":993,"children":994},{"style":125},[995],{"type":38,"value":933},{"type":33,"tag":102,"props":997,"children":998},{"style":679},[999],{"type":38,"value":692},{"type":33,"tag":102,"props":1001,"children":1002},{"style":125},[1003],{"type":38,"value":1004}," session_id,\n",{"type":33,"tag":102,"props":1006,"children":1007},{"class":104,"line":367},[1008,1013,1017,1021],{"type":33,"tag":102,"props":1009,"children":1010},{"style":131},[1011],{"type":38,"value":1012},"        ecommerce",{"type":33,"tag":102,"props":1014,"children":1015},{"style":125},[1016],{"type":38,"value":894},{"type":33,"tag":102,"props":1018,"children":1019},{"style":131},[1020],{"type":38,"value":654},{"type":33,"tag":102,"props":1022,"children":1023},{"style":125},[1024],{"type":38,"value":1025},",\n",{"type":33,"tag":102,"props":1027,"children":1028},{"class":104,"line":413},[1029,1033,1037],{"type":33,"tag":102,"props":1030,"children":1031},{"style":131},[1032],{"type":38,"value":1012},{"type":33,"tag":102,"props":1034,"children":1035},{"style":125},[1036],{"type":38,"value":894},{"type":33,"tag":102,"props":1038,"children":1039},{"style":131},[1040],{"type":38,"value":1041},"purchase_revenue_in_usd\n",{"type":33,"tag":102,"props":1043,"children":1044},{"class":104,"line":421},[1045,1050],{"type":33,"tag":102,"props":1046,"children":1047},{"style":679},[1048],{"type":38,"value":1049},"    from",{"type":33,"tag":102,"props":1051,"children":1052},{"style":125},[1053],{"type":38,"value":1054}," source\n",{"type":33,"tag":102,"props":1056,"children":1057},{"class":104,"line":442},[1058,1062,1067,1072,1077,1082,1086,1091],{"type":33,"tag":102,"props":1059,"children":1060},{"style":679},[1061],{"type":38,"value":747},{"type":33,"tag":102,"props":1063,"children":1064},{"style":125},[1065],{"type":38,"value":1066}," event_name ",{"type":33,"tag":102,"props":1068,"children":1069},{"style":679},[1070],{"type":38,"value":1071},"in",{"type":33,"tag":102,"props":1073,"children":1074},{"style":125},[1075],{"type":38,"value":1076}," (",{"type":33,"tag":102,"props":1078,"children":1079},{"style":178},[1080],{"type":38,"value":1081},"'page_view'",{"type":33,"tag":102,"props":1083,"children":1084},{"style":125},[1085],{"type":38,"value":60},{"type":33,"tag":102,"props":1087,"children":1088},{"style":178},[1089],{"type":38,"value":1090},"'purchase'",{"type":33,"tag":102,"props":1092,"children":1093},{"style":125},[1094],{"type":38,"value":1095},")\n",{"type":33,"tag":102,"props":1097,"children":1098},{"class":104,"line":459},[1099],{"type":33,"tag":102,"props":1100,"children":1101},{"style":125},[1102],{"type":38,"value":1095},{"type":33,"tag":102,"props":1104,"children":1105},{"class":104,"line":471},[1106],{"type":33,"tag":102,"props":1107,"children":1108},{"emptyLinePlaceholder":141},[1109],{"type":38,"value":144},{"type":33,"tag":102,"props":1111,"children":1112},{"class":104,"line":492},[1113,1117,1121,1125],{"type":33,"tag":102,"props":1114,"children":1115},{"style":679},[1116],{"type":38,"value":884},{"type":33,"tag":102,"props":1118,"children":1119},{"style":679},[1120],{"type":38,"value":710},{"type":33,"tag":102,"props":1122,"children":1123},{"style":679},[1124],{"type":38,"value":715},{"type":33,"tag":102,"props":1126,"children":1127},{"style":125},[1128],{"type":38,"value":1129}," unnested\n",{"type":33,"tag":34,"props":1131,"children":1132},{},[1133,1135,1141,1143,1149],{"type":38,"value":1134},"Este modelo recibe el prefijo ",{"type":33,"tag":53,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":38,"value":1140},"stg_",{"type":38,"value":1142}," — downstream, nadie toca la source, todos extraen de staging. Los modelos staging pueden ser incrementales: cada día procesan solo la nueva partición. El comando ",{"type":33,"tag":53,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":38,"value":1148},"dbt build --select stg_ga4__events",{"type":38,"value":1150}," lo ejecuta en 30 segundos; los 90 días de historial no se reprocesa cada vez.",{"type":33,"tag":34,"props":1152,"children":1153},{},[1154,1156,1162,1163,1169,1170,1176],{"type":38,"value":1155},"Los modelos intermediate fusionan staging e introducen conceptos analíticos: ",{"type":33,"tag":53,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":38,"value":1161},"int_sessions",{"type":38,"value":60},{"type":33,"tag":53,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":38,"value":1168},"int_customer_cohorts",{"type":38,"value":60},{"type":33,"tag":53,"props":1171,"children":1173},{"className":1172},[],[1174],{"type":38,"value":1175},"int_channel_attribution",{"type":38,"value":1177},". Ocultan la lógica de tabla intermedia. Por ejemplo, el cálculo de atribución multi-touch es intermediate:",{"type":33,"tag":92,"props":1179,"children":1181},{"className":659,"code":1180,"language":661,"meta":16,"style":16},"-- models\u002Fintermediate\u002Fmarketing\u002Fint_channel_attribution.sql\nwith touchpoints as (\n    select\n        user_id,\n        session_start_timestamp,\n        source_medium,\n        row_number() over (partition by user_id order by session_start_timestamp) as touch_position,\n        count(*) over (partition by user_id) as total_touches\n    from {{ ref('stg_sessions') }}\n    where user_id is not null\n),\n\nattributed as (\n    select\n        user_id,\n        source_medium,\n        case\n            when touch_position = 1 then 0.4\n            when touch_position = total_touches then 0.4\n            else 0.2 \u002F (total_touches - 2)\n        end as attribution_weight\n    from touchpoints\n)\n\nselect * from attributed\n",[1182],{"type":33,"tag":53,"props":1183,"children":1184},{"__ignoreMap":16},[1185,1193,1213,1220,1228,1236,1244,1300,1352,1373,1389,1396,1403,1419,1426,1433,1440,1448,1490,1527,1571,1589,1601,1608,1616],{"type":33,"tag":102,"props":1186,"children":1187},{"class":104,"line":105},[1188],{"type":33,"tag":102,"props":1189,"children":1190},{"style":109},[1191],{"type":38,"value":1192},"-- models\u002Fintermediate\u002Fmarketing\u002Fint_channel_attribution.sql\n",{"type":33,"tag":102,"props":1194,"children":1195},{"class":104,"line":115},[1196,1200,1205,1209],{"type":33,"tag":102,"props":1197,"children":1198},{"style":679},[1199],{"type":38,"value":682},{"type":33,"tag":102,"props":1201,"children":1202},{"style":125},[1203],{"type":38,"value":1204}," touchpoints ",{"type":33,"tag":102,"props":1206,"children":1207},{"style":679},[1208],{"type":38,"value":692},{"type":33,"tag":102,"props":1210,"children":1211},{"style":125},[1212],{"type":38,"value":697},{"type":33,"tag":102,"props":1214,"children":1215},{"class":104,"line":137},[1216],{"type":33,"tag":102,"props":1217,"children":1218},{"style":679},[1219],{"type":38,"value":847},{"type":33,"tag":102,"props":1221,"children":1222},{"class":104,"line":147},[1223],{"type":33,"tag":102,"props":1224,"children":1225},{"style":125},[1226],{"type":38,"value":1227},"        user_id,\n",{"type":33,"tag":102,"props":1229,"children":1230},{"class":104,"line":160},[1231],{"type":33,"tag":102,"props":1232,"children":1233},{"style":125},[1234],{"type":38,"value":1235},"        session_start_timestamp,\n",{"type":33,"tag":102,"props":1237,"children":1238},{"class":104,"line":184},[1239],{"type":33,"tag":102,"props":1240,"children":1241},{"style":125},[1242],{"type":38,"value":1243},"        source_medium,\n",{"type":33,"tag":102,"props":1245,"children":1246},{"class":104,"line":202},[1247,1252,1257,1262,1266,1271,1276,1281,1286,1291,1295],{"type":33,"tag":102,"props":1248,"children":1249},{"style":131},[1250],{"type":38,"value":1251},"        row_number",{"type":33,"tag":102,"props":1253,"children":1254},{"style":125},[1255],{"type":38,"value":1256},"() ",{"type":33,"tag":102,"props":1258,"children":1259},{"style":679},[1260],{"type":38,"value":1261},"over",{"type":33,"tag":102,"props":1263,"children":1264},{"style":125},[1265],{"type":38,"value":1076},{"type":33,"tag":102,"props":1267,"children":1268},{"style":679},[1269],{"type":38,"value":1270},"partition",{"type":33,"tag":102,"props":1272,"children":1273},{"style":679},[1274],{"type":38,"value":1275}," by",{"type":33,"tag":102,"props":1277,"children":1278},{"style":125},[1279],{"type":38,"value":1280}," user_id ",{"type":33,"tag":102,"props":1282,"children":1283},{"style":679},[1284],{"type":38,"value":1285},"order by",{"type":33,"tag":102,"props":1287,"children":1288},{"style":125},[1289],{"type":38,"value":1290}," session_start_timestamp) ",{"type":33,"tag":102,"props":1292,"children":1293},{"style":679},[1294],{"type":38,"value":692},{"type":33,"tag":102,"props":1296,"children":1297},{"style":125},[1298],{"type":38,"value":1299}," touch_position,\n",{"type":33,"tag":102,"props":1301,"children":1302},{"class":104,"line":27},[1303,1308,1313,1318,1322,1326,1330,1334,1338,1343,1347],{"type":33,"tag":102,"props":1304,"children":1305},{"style":131},[1306],{"type":38,"value":1307},"        count",{"type":33,"tag":102,"props":1309,"children":1310},{"style":125},[1311],{"type":38,"value":1312},"(",{"type":33,"tag":102,"props":1314,"children":1315},{"style":679},[1316],{"type":38,"value":1317},"*",{"type":33,"tag":102,"props":1319,"children":1320},{"style":125},[1321],{"type":38,"value":933},{"type":33,"tag":102,"props":1323,"children":1324},{"style":679},[1325],{"type":38,"value":1261},{"type":33,"tag":102,"props":1327,"children":1328},{"style":125},[1329],{"type":38,"value":1076},{"type":33,"tag":102,"props":1331,"children":1332},{"style":679},[1333],{"type":38,"value":1270},{"type":33,"tag":102,"props":1335,"children":1336},{"style":679},[1337],{"type":38,"value":1275},{"type":33,"tag":102,"props":1339,"children":1340},{"style":125},[1341],{"type":38,"value":1342}," user_id) ",{"type":33,"tag":102,"props":1344,"children":1345},{"style":679},[1346],{"type":38,"value":692},{"type":33,"tag":102,"props":1348,"children":1349},{"style":125},[1350],{"type":38,"value":1351}," total_touches\n",{"type":33,"tag":102,"props":1353,"children":1354},{"class":104,"line":232},[1355,1359,1364,1369],{"type":33,"tag":102,"props":1356,"children":1357},{"style":679},[1358],{"type":38,"value":1049},{"type":33,"tag":102,"props":1360,"children":1361},{"style":125},[1362],{"type":38,"value":1363}," {{ ref(",{"type":33,"tag":102,"props":1365,"children":1366},{"style":178},[1367],{"type":38,"value":1368},"'stg_sessions'",{"type":33,"tag":102,"props":1370,"children":1371},{"style":125},[1372],{"type":38,"value":739},{"type":33,"tag":102,"props":1374,"children":1375},{"class":104,"line":254},[1376,1380,1384],{"type":33,"tag":102,"props":1377,"children":1378},{"style":679},[1379],{"type":38,"value":747},{"type":33,"tag":102,"props":1381,"children":1382},{"style":125},[1383],{"type":38,"value":1280},{"type":33,"tag":102,"props":1385,"children":1386},{"style":679},[1387],{"type":38,"value":1388},"is not null\n",{"type":33,"tag":102,"props":1390,"children":1391},{"class":104,"line":272},[1392],{"type":33,"tag":102,"props":1393,"children":1394},{"style":125},[1395],{"type":38,"value":816},{"type":33,"tag":102,"props":1397,"children":1398},{"class":104,"line":285},[1399],{"type":33,"tag":102,"props":1400,"children":1401},{"emptyLinePlaceholder":141},[1402],{"type":38,"value":144},{"type":33,"tag":102,"props":1404,"children":1405},{"class":104,"line":303},[1406,1411,1415],{"type":33,"tag":102,"props":1407,"children":1408},{"style":125},[1409],{"type":38,"value":1410},"attributed ",{"type":33,"tag":102,"props":1412,"children":1413},{"style":679},[1414],{"type":38,"value":692},{"type":33,"tag":102,"props":1416,"children":1417},{"style":125},[1418],{"type":38,"value":697},{"type":33,"tag":102,"props":1420,"children":1421},{"class":104,"line":316},[1422],{"type":33,"tag":102,"props":1423,"children":1424},{"style":679},[1425],{"type":38,"value":847},{"type":33,"tag":102,"props":1427,"children":1428},{"class":104,"line":367},[1429],{"type":33,"tag":102,"props":1430,"children":1431},{"style":125},[1432],{"type":38,"value":1227},{"type":33,"tag":102,"props":1434,"children":1435},{"class":104,"line":413},[1436],{"type":33,"tag":102,"props":1437,"children":1438},{"style":125},[1439],{"type":38,"value":1243},{"type":33,"tag":102,"props":1441,"children":1442},{"class":104,"line":421},[1443],{"type":33,"tag":102,"props":1444,"children":1445},{"style":679},[1446],{"type":38,"value":1447},"        case\n",{"type":33,"tag":102,"props":1449,"children":1450},{"class":104,"line":442},[1451,1456,1461,1466,1471,1476,1481,1485],{"type":33,"tag":102,"props":1452,"children":1453},{"style":679},[1454],{"type":38,"value":1455},"            when",{"type":33,"tag":102,"props":1457,"children":1458},{"style":125},[1459],{"type":38,"value":1460}," touch_position ",{"type":33,"tag":102,"props":1462,"children":1463},{"style":679},[1464],{"type":38,"value":1465},"=",{"type":33,"tag":102,"props":1467,"children":1468},{"style":131},[1469],{"type":38,"value":1470}," 1",{"type":33,"tag":102,"props":1472,"children":1473},{"style":679},[1474],{"type":38,"value":1475}," then",{"type":33,"tag":102,"props":1477,"children":1478},{"style":131},[1479],{"type":38,"value":1480}," 0",{"type":33,"tag":102,"props":1482,"children":1483},{"style":125},[1484],{"type":38,"value":894},{"type":33,"tag":102,"props":1486,"children":1487},{"style":131},[1488],{"type":38,"value":1489},"4\n",{"type":33,"tag":102,"props":1491,"children":1492},{"class":104,"line":459},[1493,1497,1501,1505,1510,1515,1519,1523],{"type":33,"tag":102,"props":1494,"children":1495},{"style":679},[1496],{"type":38,"value":1455},{"type":33,"tag":102,"props":1498,"children":1499},{"style":125},[1500],{"type":38,"value":1460},{"type":33,"tag":102,"props":1502,"children":1503},{"style":679},[1504],{"type":38,"value":1465},{"type":33,"tag":102,"props":1506,"children":1507},{"style":125},[1508],{"type":38,"value":1509}," total_touches ",{"type":33,"tag":102,"props":1511,"children":1512},{"style":679},[1513],{"type":38,"value":1514},"then",{"type":33,"tag":102,"props":1516,"children":1517},{"style":131},[1518],{"type":38,"value":1480},{"type":33,"tag":102,"props":1520,"children":1521},{"style":125},[1522],{"type":38,"value":894},{"type":33,"tag":102,"props":1524,"children":1525},{"style":131},[1526],{"type":38,"value":1489},{"type":33,"tag":102,"props":1528,"children":1529},{"class":104,"line":471},[1530,1535,1539,1543,1547,1552,1557,1562,1567],{"type":33,"tag":102,"props":1531,"children":1532},{"style":679},[1533],{"type":38,"value":1534},"            else",{"type":33,"tag":102,"props":1536,"children":1537},{"style":131},[1538],{"type":38,"value":1480},{"type":33,"tag":102,"props":1540,"children":1541},{"style":125},[1542],{"type":38,"value":894},{"type":33,"tag":102,"props":1544,"children":1545},{"style":131},[1546],{"type":38,"value":544},{"type":33,"tag":102,"props":1548,"children":1549},{"style":679},[1550],{"type":38,"value":1551}," \u002F",{"type":33,"tag":102,"props":1553,"children":1554},{"style":125},[1555],{"type":38,"value":1556}," (total_touches ",{"type":33,"tag":102,"props":1558,"children":1559},{"style":679},[1560],{"type":38,"value":1561},"-",{"type":33,"tag":102,"props":1563,"children":1564},{"style":131},[1565],{"type":38,"value":1566}," 2",{"type":33,"tag":102,"props":1568,"children":1569},{"style":125},[1570],{"type":38,"value":1095},{"type":33,"tag":102,"props":1572,"children":1573},{"class":104,"line":492},[1574,1579,1584],{"type":33,"tag":102,"props":1575,"children":1576},{"style":679},[1577],{"type":38,"value":1578},"        end",{"type":33,"tag":102,"props":1580,"children":1581},{"style":679},[1582],{"type":38,"value":1583}," as",{"type":33,"tag":102,"props":1585,"children":1586},{"style":125},[1587],{"type":38,"value":1588}," attribution_weight\n",{"type":33,"tag":102,"props":1590,"children":1591},{"class":104,"line":510},[1592,1596],{"type":33,"tag":102,"props":1593,"children":1594},{"style":679},[1595],{"type":38,"value":1049},{"type":33,"tag":102,"props":1597,"children":1598},{"style":125},[1599],{"type":38,"value":1600}," touchpoints\n",{"type":33,"tag":102,"props":1602,"children":1603},{"class":104,"line":522},[1604],{"type":33,"tag":102,"props":1605,"children":1606},{"style":125},[1607],{"type":38,"value":1095},{"type":33,"tag":102,"props":1609,"children":1611},{"class":104,"line":1610},24,[1612],{"type":33,"tag":102,"props":1613,"children":1614},{"emptyLinePlaceholder":141},[1615],{"type":38,"value":144},{"type":33,"tag":102,"props":1617,"children":1619},{"class":104,"line":1618},25,[1620,1624,1628,1632],{"type":33,"tag":102,"props":1621,"children":1622},{"style":679},[1623],{"type":38,"value":884},{"type":33,"tag":102,"props":1625,"children":1626},{"style":679},[1627],{"type":38,"value":710},{"type":33,"tag":102,"props":1629,"children":1630},{"style":679},[1631],{"type":38,"value":715},{"type":33,"tag":102,"props":1633,"children":1634},{"style":125},[1635],{"type":38,"value":1636}," attributed\n",{"type":33,"tag":34,"props":1638,"children":1639},{},[1640,1642,1648,1650,1656],{"type":38,"value":1641},"Modelo en forma de U — el primer y último contacto reciben 40%, los contactos intermedios reparten el 20% restante. Esta SQL vive en el modelo intermediate; los data scientists modifican el archivo, el dashboard frontend nunca lo toca. Si quieres hacerlo paramétrico, defines ",{"type":33,"tag":53,"props":1643,"children":1645},{"className":1644},[],[1646],{"type":38,"value":1647},"vars.attribution_model: u_shaped",{"type":38,"value":1649}," en dbt_project.yml y lo lees con ",{"type":33,"tag":53,"props":1651,"children":1653},{"className":1652},[],[1654],{"type":38,"value":1655},"{{ var('attribution_model') }}",{"type":38,"value":894},{"type":33,"tag":34,"props":1658,"children":1659},{},[1660,1662,1668,1670,1676,1678,1684,1685,1691,1692,1698,1700,1705,1707,1713,1714,1720],{"type":38,"value":1661},"Los modelos mart son la capa final: la tabla que tu dashboard, herramienta BI o pipeline de ML consume directamente. Llevan el prefijo ",{"type":33,"tag":53,"props":1663,"children":1665},{"className":1664},[],[1666],{"type":38,"value":1667},"fct_",{"type":38,"value":1669}," (fact) o ",{"type":33,"tag":53,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":38,"value":1675},"dim_",{"type":38,"value":1677}," (dimension). Ejemplos: ",{"type":33,"tag":53,"props":1679,"children":1681},{"className":1680},[],[1682],{"type":38,"value":1683},"fct_orders",{"type":38,"value":60},{"type":33,"tag":53,"props":1686,"children":1688},{"className":1687},[],[1689],{"type":38,"value":1690},"dim_customers",{"type":38,"value":60},{"type":33,"tag":53,"props":1693,"children":1695},{"className":1694},[],[1696],{"type":38,"value":1697},"fct_ad_performance",{"type":38,"value":1699},". Los modelos mart pueden desnormalizarse — el overhead de joins se resuelve en dbt, no en la herramienta BI. En lugar de \"desde la tabla de órdenes, haz un join a customer\" en Looker, la tabla ",{"type":33,"tag":53,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":38,"value":1683},{"type":38,"value":1706}," ya contiene ",{"type":33,"tag":53,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":38,"value":1712},"customer_lifetime_value",{"type":38,"value":60},{"type":33,"tag":53,"props":1715,"children":1717},{"className":1716},[],[1718],{"type":38,"value":1719},"customer_cohort",{"type":38,"value":1721}," y otras columnas.",{"type":33,"tag":41,"props":1723,"children":1725},{"id":1724},"semantic-layer-centralizar-definiciones-de-métricas-y-lógica-de-negocio",[1726],{"type":38,"value":1727},"Semantic layer: centralizar definiciones de métricas y lógica de negocio",{"type":33,"tag":34,"props":1729,"children":1730},{},[1731,1733,1739,1741,1747,1749,1755],{"type":38,"value":1732},"dbt 1.6+ introduce la semantic layer, que convierte SQL en el concepto de \"métrica\". Anteriormente, cada dashboard escribía su propia consulta ",{"type":33,"tag":53,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":38,"value":1738},"sum(revenue)",{"type":38,"value":1740}," — ahora defines una única métrica ",{"type":33,"tag":53,"props":1742,"children":1744},{"className":1743},[],[1745],{"type":38,"value":1746},"revenue",{"type":38,"value":1748}," y todos los dashboards la consumen. La definición de métrica vive en YAML dentro de ",{"type":33,"tag":53,"props":1750,"children":1752},{"className":1751},[],[1753],{"type":38,"value":1754},"metrics\u002F",{"type":38,"value":1756},":",{"type":33,"tag":92,"props":1758,"children":1760},{"className":94,"code":1759,"language":96,"meta":16,"style":16},"# models\u002Fmetrics\u002Fmarketing_metrics.yml\nversion: 2\n\nmetrics:\n  - name: total_revenue\n    label: Ingresos Totales\n    model: ref('fct_orders')\n    calculation_method: sum\n    expression: order_total\n    timestamp: order_date\n    time_grains: [day, week, month, quarter, year]\n    dimensions:\n      - channel\n      - customer_cohort\n      - product_category\n\n  - name: customer_acquisition_cost\n    label: Costo de Adquisición de Cliente (CAC)\n    calculation_method: derived\n    expression: \"{{ metric('total_ad_spend') }} \u002F {{ metric('new_customers') }}\"\n    timestamp: order_date\n    time_grains: [month, quarter]\n",[1761],{"type":33,"tag":53,"props":1762,"children":1763},{"__ignoreMap":16},[1764,1772,1787,1794,1806,1826,1843,1860,1877,1894,1911,1969,1981,1993,2005,2017,2024,2044,2060,2076,2092,2107],{"type":33,"tag":102,"props":1765,"children":1766},{"class":104,"line":105},[1767],{"type":33,"tag":102,"props":1768,"children":1769},{"style":109},[1770],{"type":38,"value":1771},"# models\u002Fmetrics\u002Fmarketing_metrics.yml\n",{"type":33,"tag":102,"props":1773,"children":1774},{"class":104,"line":115},[1775,1779,1783],{"type":33,"tag":102,"props":1776,"children":1777},{"style":119},[1778],{"type":38,"value":122},{"type":33,"tag":102,"props":1780,"children":1781},{"style":125},[1782],{"type":38,"value":128},{"type":33,"tag":102,"props":1784,"children":1785},{"style":131},[1786],{"type":38,"value":134},{"type":33,"tag":102,"props":1788,"children":1789},{"class":104,"line":137},[1790],{"type":33,"tag":102,"props":1791,"children":1792},{"emptyLinePlaceholder":141},[1793],{"type":38,"value":144},{"type":33,"tag":102,"props":1795,"children":1796},{"class":104,"line":147},[1797,1802],{"type":33,"tag":102,"props":1798,"children":1799},{"style":119},[1800],{"type":38,"value":1801},"metrics",{"type":33,"tag":102,"props":1803,"children":1804},{"style":125},[1805],{"type":38,"value":157},{"type":33,"tag":102,"props":1807,"children":1808},{"class":104,"line":160},[1809,1813,1817,1821],{"type":33,"tag":102,"props":1810,"children":1811},{"style":125},[1812],{"type":38,"value":166},{"type":33,"tag":102,"props":1814,"children":1815},{"style":119},[1816],{"type":38,"value":171},{"type":33,"tag":102,"props":1818,"children":1819},{"style":125},[1820],{"type":38,"value":128},{"type":33,"tag":102,"props":1822,"children":1823},{"style":178},[1824],{"type":38,"value":1825},"total_revenue\n",{"type":33,"tag":102,"props":1827,"children":1828},{"class":104,"line":184},[1829,1834,1838],{"type":33,"tag":102,"props":1830,"children":1831},{"style":119},[1832],{"type":38,"value":1833},"    label",{"type":33,"tag":102,"props":1835,"children":1836},{"style":125},[1837],{"type":38,"value":128},{"type":33,"tag":102,"props":1839,"children":1840},{"style":178},[1841],{"type":38,"value":1842},"Ingresos Totales\n",{"type":33,"tag":102,"props":1844,"children":1845},{"class":104,"line":202},[1846,1851,1855],{"type":33,"tag":102,"props":1847,"children":1848},{"style":119},[1849],{"type":38,"value":1850},"    model",{"type":33,"tag":102,"props":1852,"children":1853},{"style":125},[1854],{"type":38,"value":128},{"type":33,"tag":102,"props":1856,"children":1857},{"style":178},[1858],{"type":38,"value":1859},"ref('fct_orders')\n",{"type":33,"tag":102,"props":1861,"children":1862},{"class":104,"line":27},[1863,1868,1872],{"type":33,"tag":102,"props":1864,"children":1865},{"style":119},[1866],{"type":38,"value":1867},"    calculation_method",{"type":33,"tag":102,"props":1869,"children":1870},{"style":125},[1871],{"type":38,"value":128},{"type":33,"tag":102,"props":1873,"children":1874},{"style":178},[1875],{"type":38,"value":1876},"sum\n",{"type":33,"tag":102,"props":1878,"children":1879},{"class":104,"line":232},[1880,1885,1889],{"type":33,"tag":102,"props":1881,"children":1882},{"style":119},[1883],{"type":38,"value":1884},"    expression",{"type":33,"tag":102,"props":1886,"children":1887},{"style":125},[1888],{"type":38,"value":128},{"type":33,"tag":102,"props":1890,"children":1891},{"style":178},[1892],{"type":38,"value":1893},"order_total\n",{"type":33,"tag":102,"props":1895,"children":1896},{"class":104,"line":254},[1897,1902,1906],{"type":33,"tag":102,"props":1898,"children":1899},{"style":119},[1900],{"type":38,"value":1901},"    timestamp",{"type":33,"tag":102,"props":1903,"children":1904},{"style":125},[1905],{"type":38,"value":128},{"type":33,"tag":102,"props":1907,"children":1908},{"style":178},[1909],{"type":38,"value":1910},"order_date\n",{"type":33,"tag":102,"props":1912,"children":1913},{"class":104,"line":272},[1914,1919,1924,1928,1932,1937,1941,1946,1950,1955,1959,1964],{"type":33,"tag":102,"props":1915,"children":1916},{"style":119},[1917],{"type":38,"value":1918},"    time_grains",{"type":33,"tag":102,"props":1920,"children":1921},{"style":125},[1922],{"type":38,"value":1923},": [",{"type":33,"tag":102,"props":1925,"children":1926},{"style":178},[1927],{"type":38,"value":561},{"type":33,"tag":102,"props":1929,"children":1930},{"style":125},[1931],{"type":38,"value":60},{"type":33,"tag":102,"props":1933,"children":1934},{"style":178},[1935],{"type":38,"value":1936},"week",{"type":33,"tag":102,"props":1938,"children":1939},{"style":125},[1940],{"type":38,"value":60},{"type":33,"tag":102,"props":1942,"children":1943},{"style":178},[1944],{"type":38,"value":1945},"month",{"type":33,"tag":102,"props":1947,"children":1948},{"style":125},[1949],{"type":38,"value":60},{"type":33,"tag":102,"props":1951,"children":1952},{"style":178},[1953],{"type":38,"value":1954},"quarter",{"type":33,"tag":102,"props":1956,"children":1957},{"style":125},[1958],{"type":38,"value":60},{"type":33,"tag":102,"props":1960,"children":1961},{"style":178},[1962],{"type":38,"value":1963},"year",{"type":33,"tag":102,"props":1965,"children":1966},{"style":125},[1967],{"type":38,"value":1968},"]\n",{"type":33,"tag":102,"props":1970,"children":1971},{"class":104,"line":285},[1972,1977],{"type":33,"tag":102,"props":1973,"children":1974},{"style":119},[1975],{"type":38,"value":1976},"    dimensions",{"type":33,"tag":102,"props":1978,"children":1979},{"style":125},[1980],{"type":38,"value":157},{"type":33,"tag":102,"props":1982,"children":1983},{"class":104,"line":303},[1984,1988],{"type":33,"tag":102,"props":1985,"children":1986},{"style":125},[1987],{"type":38,"value":238},{"type":33,"tag":102,"props":1989,"children":1990},{"style":178},[1991],{"type":38,"value":1992},"channel\n",{"type":33,"tag":102,"props":1994,"children":1995},{"class":104,"line":316},[1996,2000],{"type":33,"tag":102,"props":1997,"children":1998},{"style":125},[1999],{"type":38,"value":238},{"type":33,"tag":102,"props":2001,"children":2002},{"style":178},[2003],{"type":38,"value":2004},"customer_cohort\n",{"type":33,"tag":102,"props":2006,"children":2007},{"class":104,"line":367},[2008,2012],{"type":33,"tag":102,"props":2009,"children":2010},{"style":125},[2011],{"type":38,"value":238},{"type":33,"tag":102,"props":2013,"children":2014},{"style":178},[2015],{"type":38,"value":2016},"product_category\n",{"type":33,"tag":102,"props":2018,"children":2019},{"class":104,"line":413},[2020],{"type":33,"tag":102,"props":2021,"children":2022},{"emptyLinePlaceholder":141},[2023],{"type":38,"value":144},{"type":33,"tag":102,"props":2025,"children":2026},{"class":104,"line":421},[2027,2031,2035,2039],{"type":33,"tag":102,"props":2028,"children":2029},{"style":125},[2030],{"type":38,"value":166},{"type":33,"tag":102,"props":2032,"children":2033},{"style":119},[2034],{"type":38,"value":171},{"type":33,"tag":102,"props":2036,"children":2037},{"style":125},[2038],{"type":38,"value":128},{"type":33,"tag":102,"props":2040,"children":2041},{"style":178},[2042],{"type":38,"value":2043},"customer_acquisition_cost\n",{"type":33,"tag":102,"props":2045,"children":2046},{"class":104,"line":442},[2047,2051,2055],{"type":33,"tag":102,"props":2048,"children":2049},{"style":119},[2050],{"type":38,"value":1833},{"type":33,"tag":102,"props":2052,"children":2053},{"style":125},[2054],{"type":38,"value":128},{"type":33,"tag":102,"props":2056,"children":2057},{"style":178},[2058],{"type":38,"value":2059},"Costo de Adquisición de Cliente (CAC)\n",{"type":33,"tag":102,"props":2061,"children":2062},{"class":104,"line":459},[2063,2067,2071],{"type":33,"tag":102,"props":2064,"children":2065},{"style":119},[2066],{"type":38,"value":1867},{"type":33,"tag":102,"props":2068,"children":2069},{"style":125},[2070],{"type":38,"value":128},{"type":33,"tag":102,"props":2072,"children":2073},{"style":178},[2074],{"type":38,"value":2075},"derived\n",{"type":33,"tag":102,"props":2077,"children":2078},{"class":104,"line":471},[2079,2083,2087],{"type":33,"tag":102,"props":2080,"children":2081},{"style":119},[2082],{"type":38,"value":1884},{"type":33,"tag":102,"props":2084,"children":2085},{"style":125},[2086],{"type":38,"value":128},{"type":33,"tag":102,"props":2088,"children":2089},{"style":178},[2090],{"type":38,"value":2091},"\"{{ metric('total_ad_spend') }} \u002F {{ metric('new_customers') }}\"\n",{"type":33,"tag":102,"props":2093,"children":2094},{"class":104,"line":492},[2095,2099,2103],{"type":33,"tag":102,"props":2096,"children":2097},{"style":119},[2098],{"type":38,"value":1901},{"type":33,"tag":102,"props":2100,"children":2101},{"style":125},[2102],{"type":38,"value":128},{"type":33,"tag":102,"props":2104,"children":2105},{"style":178},[2106],{"type":38,"value":1910},{"type":33,"tag":102,"props":2108,"children":2109},{"class":104,"line":510},[2110,2114,2118,2122,2126,2130],{"type":33,"tag":102,"props":2111,"children":2112},{"style":119},[2113],{"type":38,"value":1918},{"type":33,"tag":102,"props":2115,"children":2116},{"style":125},[2117],{"type":38,"value":1923},{"type":33,"tag":102,"props":2119,"children":2120},{"style":178},[2121],{"type":38,"value":1945},{"type":33,"tag":102,"props":2123,"children":2124},{"style":125},[2125],{"type":38,"value":60},{"type":33,"tag":102,"props":2127,"children":2128},{"style":178},[2129],{"type":38,"value":1954},{"type":33,"tag":102,"props":2131,"children":2132},{"style":125},[2133],{"type":38,"value":1968},{"type":33,"tag":34,"props":2135,"children":2136},{},[2137,2139,2145,2147,2153,2155,2161],{"type":38,"value":2138},"Con esta definición, una consulta en Looker como \"Muéstrame ",{"type":33,"tag":53,"props":2140,"children":2142},{"className":2141},[],[2143],{"type":38,"value":2144},"total_revenue",{"type":38,"value":2146}," por ",{"type":33,"tag":53,"props":2148,"children":2150},{"className":2149},[],[2151],{"type":38,"value":2152},"channel",{"type":38,"value":2154}," para el último trimestre\" se resuelve automáticamente a través de la API de dbt Semantic Layer. No escribes SQL — invocas la métrica. ",{"type":33,"tag":53,"props":2156,"children":2158},{"className":2157},[],[2159],{"type":38,"value":2160},"customer_acquisition_cost",{"type":38,"value":2162}," es una métrica derivada: se calcula a partir de dos métricas distintas. Cuando la fórmula cambia, la editas en un único lugar, sin tener que actualizar 12 dashboards manualmente.",{"type":33,"tag":34,"props":2164,"children":2165},{},[2166,2168,2177,2179,2184,2186,2192,2194,2200,2202,2208],{"type":38,"value":2167},"El segundo beneficio de la semantic layer: requiere una ",{"type":33,"tag":2169,"props":2170,"children":2174},"a",{"href":2171,"rel":2172},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Ffirstparty",[2173],"nofollow",[2175],{"type":38,"value":2176},"arquitectura de datos first-party",{"type":38,"value":2178}," porque la definición de métrica se basa en customer IDs. Si el ",{"type":33,"tag":53,"props":2180,"children":2182},{"className":2181},[],[2183],{"type":38,"value":605},{"type":38,"value":2185}," de GA4 y el ",{"type":33,"tag":53,"props":2187,"children":2189},{"className":2188},[],[2190],{"type":38,"value":2191},"customer_id",{"type":38,"value":2193}," de Shopify representan la misma persona, esa resolución de identidad debe estar resuelta en un modelo intermediate. La tabla ",{"type":33,"tag":53,"props":2195,"children":2197},{"className":2196},[],[2198],{"type":38,"value":2199},"dim_unified_customers",{"type":38,"value":2201}," fusiona todos los señales y devuelve un ",{"type":33,"tag":53,"props":2203,"children":2205},{"className":2204},[],[2206],{"type":38,"value":2207},"canonical_customer_id",{"type":38,"value":2209},". Es ese ID el que usas como dimensión en la semantic layer. Sin un ID canónico, tu métrica de CAC será incorrecta — el mismo cliente se cuenta dos veces.",{"type":33,"tag":41,"props":2211,"children":2213},{"id":2212},"exposures-puntos-de-consumo-downstream",[2214],{"type":38,"value":2215},"Exposures: puntos de consumo downstream",{"type":33,"tag":34,"props":2217,"children":2218},{},[2219],{"type":38,"value":2220},"Exposures es el concepto final de dbt: registrar qué dashboard, qué tarea de Airflow, qué modelo de machine learning consume datos de este pipeline. Se documenta en formato YAML:",{"type":33,"tag":92,"props":2222,"children":2224},{"className":94,"code":2223,"language":96,"meta":16,"style":16},"# models\u002Fexposures\u002Fmarketing_exposures.yml\nversion: 2\n\nexposures:\n  - name: executive_marketing_dashboard\n    type: dashboard\n    maturity: high\n    url: https:\u002F\u002Flookerstudio.google.com\u002Freporting\u002Fabc123\n    description: \"Dashboard del CMO: ingresos, CAC, LTV por canal\"\n    depends_on:\n      - ref('fct_orders')\n      - ref('fct_ad_performance')\n      - metric('total_revenue')\n      - metric('customer_acquisition_cost')\n    owner:\n      name: Marketing Operations Team\n      email: ops@roibase.com.tr\n\n  - name: klaviyo_segment_sync\n    type: application\n    maturity: medium\n    description: \"Sincronización de segmentos BigQuery → Klaviyo vía Hightouch\"\n    depends_on:\n      - ref('dim_unified_customers')\n    owner:\n      name: CRM Automation\n      email: crm@roibase.com.tr\n",[2225],{"type":33,"tag":53,"props":2226,"children":2227},{"__ignoreMap":16},[2228,2236,2251,2258,2270,2290,2307,2324,2341,2358,2370,2381,2393,2405,2417,2429,2446,2463,2470,2490,2506,2522,2538,2549,2561,2572,2589],{"type":33,"tag":102,"props":2229,"children":2230},{"class":104,"line":105},[2231],{"type":33,"tag":102,"props":2232,"children":2233},{"style":109},[2234],{"type":38,"value":2235},"# models\u002Fexposures\u002Fmarketing_exposures.yml\n",{"type":33,"tag":102,"props":2237,"children":2238},{"class":104,"line":115},[2239,2243,2247],{"type":33,"tag":102,"props":2240,"children":2241},{"style":119},[2242],{"type":38,"value":122},{"type":33,"tag":102,"props":2244,"children":2245},{"style":125},[2246],{"type":38,"value":128},{"type":33,"tag":102,"props":2248,"children":2249},{"style":131},[2250],{"type":38,"value":134},{"type":33,"tag":102,"props":2252,"children":2253},{"class":104,"line":137},[2254],{"type":33,"tag":102,"props":2255,"children":2256},{"emptyLinePlaceholder":141},[2257],{"type":38,"value":144},{"type":33,"tag":102,"props":2259,"children":2260},{"class":104,"line":147},[2261,2266],{"type":33,"tag":102,"props":2262,"children":2263},{"style":119},[2264],{"type":38,"value":2265},"exposures",{"type":33,"tag":102,"props":2267,"children":2268},{"style":125},[2269],{"type":38,"value":157},{"type":33,"tag":102,"props":2271,"children":2272},{"class":104,"line":160},[2273,2277,2281,2285],{"type":33,"tag":102,"props":2274,"children":2275},{"style":125},[2276],{"type":38,"value":166},{"type":33,"tag":102,"props":2278,"children":2279},{"style":119},[2280],{"type":38,"value":171},{"type":33,"tag":102,"props":2282,"children":2283},{"style":125},[2284],{"type":38,"value":128},{"type":33,"tag":102,"props":2286,"children":2287},{"style":178},[2288],{"type":38,"value":2289},"executive_marketing_dashboard\n",{"type":33,"tag":102,"props":2291,"children":2292},{"class":104,"line":184},[2293,2298,2302],{"type":33,"tag":102,"props":2294,"children":2295},{"style":119},[2296],{"type":38,"value":2297},"    type",{"type":33,"tag":102,"props":2299,"children":2300},{"style":125},[2301],{"type":38,"value":128},{"type":33,"tag":102,"props":2303,"children":2304},{"style":178},[2305],{"type":38,"value":2306},"dashboard\n",{"type":33,"tag":102,"props":2308,"children":2309},{"class":104,"line":202},[2310,2315,2319],{"type":33,"tag":102,"props":2311,"children":2312},{"style":119},[2313],{"type":38,"value":2314},"    maturity",{"type":33,"tag":102,"props":2316,"children":2317},{"style":125},[2318],{"type":38,"value":128},{"type":33,"tag":102,"props":2320,"children":2321},{"style":178},[2322],{"type":38,"value":2323},"high\n",{"type":33,"tag":102,"props":2325,"children":2326},{"class":104,"line":27},[2327,2332,2336],{"type":33,"tag":102,"props":2328,"children":2329},{"style":119},[2330],{"type":38,"value":2331},"    url",{"type":33,"tag":102,"props":2333,"children":2334},{"style":125},[2335],{"type":38,"value":128},{"type":33,"tag":102,"props":2337,"children":2338},{"style":178},[2339],{"type":38,"value":2340},"https:\u002F\u002Flookerstudio.google.com\u002Freporting\u002Fabc123\n",{"type":33,"tag":102,"props":2342,"children":2343},{"class":104,"line":232},[2344,2349,2353],{"type":33,"tag":102,"props":2345,"children":2346},{"style":119},[2347],{"type":38,"value":2348},"    description",{"type":33,"tag":102,"props":2350,"children":2351},{"style":125},[2352],{"type":38,"value":128},{"type":33,"tag":102,"props":2354,"children":2355},{"style":178},[2356],{"type":38,"value":2357},"\"Dashboard del CMO: ingresos, CAC, LTV por canal\"\n",{"type":33,"tag":102,"props":2359,"children":2360},{"class":104,"line":254},[2361,2366],{"type":33,"tag":102,"props":2362,"children":2363},{"style":119},[2364],{"type":38,"value":2365},"    depends_on",{"type":33,"tag":102,"props":2367,"children":2368},{"style":125},[2369],{"type":38,"value":157},{"type":33,"tag":102,"props":2371,"children":2372},{"class":104,"line":272},[2373,2377],{"type":33,"tag":102,"props":2374,"children":2375},{"style":125},[2376],{"type":38,"value":238},{"type":33,"tag":102,"props":2378,"children":2379},{"style":178},[2380],{"type":38,"value":1859},{"type":33,"tag":102,"props":2382,"children":2383},{"class":104,"line":285},[2384,2388],{"type":33,"tag":102,"props":2385,"children":2386},{"style":125},[2387],{"type":38,"value":238},{"type":33,"tag":102,"props":2389,"children":2390},{"style":178},[2391],{"type":38,"value":2392},"ref('fct_ad_performance')\n",{"type":33,"tag":102,"props":2394,"children":2395},{"class":104,"line":303},[2396,2400],{"type":33,"tag":102,"props":2397,"children":2398},{"style":125},[2399],{"type":38,"value":238},{"type":33,"tag":102,"props":2401,"children":2402},{"style":178},[2403],{"type":38,"value":2404},"metric('total_revenue')\n",{"type":33,"tag":102,"props":2406,"children":2407},{"class":104,"line":316},[2408,2412],{"type":33,"tag":102,"props":2409,"children":2410},{"style":125},[2411],{"type":38,"value":238},{"type":33,"tag":102,"props":2413,"children":2414},{"style":178},[2415],{"type":38,"value":2416},"metric('customer_acquisition_cost')\n",{"type":33,"tag":102,"props":2418,"children":2419},{"class":104,"line":367},[2420,2425],{"type":33,"tag":102,"props":2421,"children":2422},{"style":119},[2423],{"type":38,"value":2424},"    owner",{"type":33,"tag":102,"props":2426,"children":2427},{"style":125},[2428],{"type":38,"value":157},{"type":33,"tag":102,"props":2430,"children":2431},{"class":104,"line":413},[2432,2437,2441],{"type":33,"tag":102,"props":2433,"children":2434},{"style":119},[2435],{"type":38,"value":2436},"      name",{"type":33,"tag":102,"props":2438,"children":2439},{"style":125},[2440],{"type":38,"value":128},{"type":33,"tag":102,"props":2442,"children":2443},{"style":178},[2444],{"type":38,"value":2445},"Marketing Operations Team\n",{"type":33,"tag":102,"props":2447,"children":2448},{"class":104,"line":421},[2449,2454,2458],{"type":33,"tag":102,"props":2450,"children":2451},{"style":119},[2452],{"type":38,"value":2453},"      email",{"type":33,"tag":102,"props":2455,"children":2456},{"style":125},[2457],{"type":38,"value":128},{"type":33,"tag":102,"props":2459,"children":2460},{"style":178},[2461],{"type":38,"value":2462},"ops@roibase.com.tr\n",{"type":33,"tag":102,"props":2464,"children":2465},{"class":104,"line":442},[2466],{"type":33,"tag":102,"props":2467,"children":2468},{"emptyLinePlaceholder":141},[2469],{"type":38,"value":144},{"type":33,"tag":102,"props":2471,"children":2472},{"class":104,"line":459},[2473,2477,2481,2485],{"type":33,"tag":102,"props":2474,"children":2475},{"style":125},[2476],{"type":38,"value":166},{"type":33,"tag":102,"props":2478,"children":2479},{"style":119},[2480],{"type":38,"value":171},{"type":33,"tag":102,"props":2482,"children":2483},{"style":125},[2484],{"type":38,"value":128},{"type":33,"tag":102,"props":2486,"children":2487},{"style":178},[2488],{"type":38,"value":2489},"klaviyo_segment_sync\n",{"type":33,"tag":102,"props":2491,"children":2492},{"class":104,"line":471},[2493,2497,2501],{"type":33,"tag":102,"props":2494,"children":2495},{"style":119},[2496],{"type":38,"value":2297},{"type":33,"tag":102,"props":2498,"children":2499},{"style":125},[2500],{"type":38,"value":128},{"type":33,"tag":102,"props":2502,"children":2503},{"style":178},[2504],{"type":38,"value":2505},"application\n",{"type":33,"tag":102,"props":2507,"children":2508},{"class":104,"line":492},[2509,2513,2517],{"type":33,"tag":102,"props":2510,"children":2511},{"style":119},[2512],{"type":38,"value":2314},{"type":33,"tag":102,"props":2514,"children":2515},{"style":125},[2516],{"type":38,"value":128},{"type":33,"tag":102,"props":2518,"children":2519},{"style":178},[2520],{"type":38,"value":2521},"medium\n",{"type":33,"tag":102,"props":2523,"children":2524},{"class":104,"line":510},[2525,2529,2533],{"type":33,"tag":102,"props":2526,"children":2527},{"style":119},[2528],{"type":38,"value":2348},{"type":33,"tag":102,"props":2530,"children":2531},{"style":125},[2532],{"type":38,"value":128},{"type":33,"tag":102,"props":2534,"children":2535},{"style":178},[2536],{"type":38,"value":2537},"\"Sincronización de segmentos BigQuery → Klaviyo vía Hightouch\"\n",{"type":33,"tag":102,"props":2539,"children":2540},{"class":104,"line":522},[2541,2545],{"type":33,"tag":102,"props":2542,"children":2543},{"style":119},[2544],{"type":38,"value":2365},{"type":33,"tag":102,"props":2546,"children":2547},{"style":125},[2548],{"type":38,"value":157},{"type":33,"tag":102,"props":2550,"children":2551},{"class":104,"line":1610},[2552,2556],{"type":33,"tag":102,"props":2553,"children":2554},{"style":125},[2555],{"type":38,"value":238},{"type":33,"tag":102,"props":2557,"children":2558},{"style":178},[2559],{"type":38,"value":2560},"ref('dim_unified_customers')\n",{"type":33,"tag":102,"props":2562,"children":2563},{"class":104,"line":1618},[2564,2568],{"type":33,"tag":102,"props":2565,"children":2566},{"style":119},[2567],{"type":38,"value":2424},{"type":33,"tag":102,"props":2569,"children":2570},{"style":125},[2571],{"type":38,"value":157},{"type":33,"tag":102,"props":2573,"children":2575},{"class":104,"line":2574},26,[2576,2580,2584],{"type":33,"tag":102,"props":2577,"children":2578},{"style":119},[2579],{"type":38,"value":2436},{"type":33,"tag":102,"props":2581,"children":2582},{"style":125},[2583],{"type":38,"value":128},{"type":33,"tag":102,"props":2585,"children":2586},{"style":178},[2587],{"type":38,"value":2588},"CRM Automation\n",{"type":33,"tag":102,"props":2590,"children":2592},{"class":104,"line":2591},27,[2593,2597,2601],{"type":33,"tag":102,"props":2594,"children":2595},{"style":119},[2596],{"type":38,"value":2453},{"type":33,"tag":102,"props":2598,"children":2599},{"style":125},[2600],{"type":38,"value":128},{"type":33,"tag":102,"props":2602,"children":2603},{"style":178},[2604],{"type":38,"value":2605},"crm@roibase.com.tr\n",{"type":33,"tag":34,"props":2607,"children":2608},{},[2609,2611,2617,2619,2624],{"type":38,"value":2610},"Con este manifiesto, cuando ejecutas ",{"type":33,"tag":53,"props":2612,"children":2614},{"className":2613},[],[2615],{"type":38,"value":2616},"dbt docs generate",{"type":38,"value":2618},", las exposures aparecen como nodos finales en la visualización del DAG. Cuando modificas el modelo ",{"type":33,"tag":53,"props":2620,"children":2622},{"className":2621},[],[2623],{"type":38,"value":1683},{"type":38,"value":2625},", el gráfico de lineage muestra claramente qué dashboard se verá afectado. Una exposure también actúa como regla de alerta: puedes enviar un mensaje a Slack diciendo \"el upstream de executive_marketing_dashboard falló\".",{"type":33,"tag":34,"props":2627,"children":2628},{},[2629,2631,2637,2639,2645,2647,2653],{"type":38,"value":2630},"El campo maturity en exposure también permite rastrear deuda técnica: una exposure con maturity ",{"type":33,"tag":53,"props":2632,"children":2634},{"className":2633},[],[2635],{"type":38,"value":2636},"low",{"type":38,"value":2638}," puede haber sido creada para análisis temporales, mientras que ",{"type":33,"tag":53,"props":2640,"children":2642},{"className":2641},[],[2643],{"type":38,"value":2644},"high",{"type":38,"value":2646}," maturity son críticas para producción. El comando ",{"type":33,"tag":53,"props":2648,"children":2650},{"className":2649},[],[2651],{"type":38,"value":2652},"dbt list --select exposure:executive_marketing_dashboard+",{"type":38,"value":2654}," lista el árbol de dependencias de ese dashboard — útil durante la depreciación de modelos para hacer análisis de impacto.",{"type":33,"tag":41,"props":2656,"children":2658},{"id":2657},"cobertura-de-pruebas-y-contrato-de-calidad-de-datos",[2659],{"type":38,"value":2660},"Cobertura de pruebas y contrato de calidad de datos",{"type":33,"tag":34,"props":2662,"children":2663},{},[2664,2666,2672],{"type":38,"value":2665},"El poder de dbt no es solo la transformación, sino su suite de pruebas. Para cada modelo, defines tests en el archivo ",{"type":33,"tag":53,"props":2667,"children":2669},{"className":2668},[],[2670],{"type":38,"value":2671},"schema.yml",{"type":38,"value":1756},{"type":33,"tag":92,"props":2674,"children":2676},{"className":94,"code":2675,"language":96,"meta":16,"style":16},"# models\u002Fmarts\u002Fmarketing\u002Ffct_orders.yml\nversion: 2\n\nmodels:\n  - name: fct_orders\n    description: \"Tabla de hechos de órdenes desnormalizada para consumo BI\"\n    columns:\n      - name: order_id\n        description: \"Clave primaria\"\n        tests:\n          - unique\n          - not_null\n\n      - name: customer_id\n        description: \"Clave foránea a dim_customers\"\n        tests:\n          - not_null\n          - relationships:\n              to: ref('dim_customers')\n              field: customer_id\n\n      - name: order_total\n        description: \"Total de la orden en USD\"\n        tests:\n          - not_null\n          - dbt_utils.expression_is_true:\n              expression: \">= 0\"\n\n      - name: order_date\n        tests:\n          - not_null\n          - dbt_utils.accepted_range:\n              min_value: \"'2020-01-01'\"\n              max_value: \"current_date()\"\n",[2677],{"type":33,"tag":53,"props":2678,"children":2679},{"__ignoreMap":16},[2680,2688,2703,2710,2722,2742,2758,2770,2790,2807,2819,2832,2844,2851,2871,2887,2898,2909,2925,2942,2958,2965,2984,3000,3011,3022,3038,3055,3063,3083,3095,3107,3124,3142],{"type":33,"tag":102,"props":2681,"children":2682},{"class":104,"line":105},[2683],{"type":33,"tag":102,"props":2684,"children":2685},{"style":109},[2686],{"type":38,"value":2687},"# models\u002Fmarts\u002Fmarketing\u002Ffct_orders.yml\n",{"type":33,"tag":102,"props":2689,"children":2690},{"class":104,"line":115},[2691,2695,2699],{"type":33,"tag":102,"props":2692,"children":2693},{"style":119},[2694],{"type":38,"value":122},{"type":33,"tag":102,"props":2696,"children":2697},{"style":125},[2698],{"type":38,"value":128},{"type":33,"tag":102,"props":2700,"children":2701},{"style":131},[2702],{"type":38,"value":134},{"type":33,"tag":102,"props":2704,"children":2705},{"class":104,"line":137},[2706],{"type":33,"tag":102,"props":2707,"children":2708},{"emptyLinePlaceholder":141},[2709],{"type":38,"value":144},{"type":33,"tag":102,"props":2711,"children":2712},{"class":104,"line":147},[2713,2718],{"type":33,"tag":102,"props":2714,"children":2715},{"style":119},[2716],{"type":38,"value":2717},"models",{"type":33,"tag":102,"props":2719,"children":2720},{"style":125},[2721],{"type":38,"value":157},{"type":33,"tag":102,"props":2723,"children":2724},{"class":104,"line":160},[2725,2729,2733,2737],{"type":33,"tag":102,"props":2726,"children":2727},{"style":125},[2728],{"type":38,"value":166},{"type":33,"tag":102,"props":2730,"children":2731},{"style":119},[2732],{"type":38,"value":171},{"type":33,"tag":102,"props":2734,"children":2735},{"style":125},[2736],{"type":38,"value":128},{"type":33,"tag":102,"props":2738,"children":2739},{"style":178},[2740],{"type":38,"value":2741},"fct_orders\n",{"type":33,"tag":102,"props":2743,"children":2744},{"class":104,"line":184},[2745,2749,2753],{"type":33,"tag":102,"props":2746,"children":2747},{"style":119},[2748],{"type":38,"value":2348},{"type":33,"tag":102,"props":2750,"children":2751},{"style":125},[2752],{"type":38,"value":128},{"type":33,"tag":102,"props":2754,"children":2755},{"style":178},[2756],{"type":38,"value":2757},"\"Tabla de hechos de órdenes desnormalizada para consumo BI\"\n",{"type":33,"tag":102,"props":2759,"children":2760},{"class":104,"line":202},[2761,2766],{"type":33,"tag":102,"props":2762,"children":2763},{"style":119},[2764],{"type":38,"value":2765},"    columns",{"type":33,"tag":102,"props":2767,"children":2768},{"style":125},[2769],{"type":38,"value":157},{"type":33,"tag":102,"props":2771,"children":2772},{"class":104,"line":27},[2773,2777,2781,2785],{"type":33,"tag":102,"props":2774,"children":2775},{"style":125},[2776],{"type":38,"value":238},{"type":33,"tag":102,"props":2778,"children":2779},{"style":119},[2780],{"type":38,"value":171},{"type":33,"tag":102,"props":2782,"children":2783},{"style":125},[2784],{"type":38,"value":128},{"type":33,"tag":102,"props":2786,"children":2787},{"style":178},[2788],{"type":38,"value":2789},"order_id\n",{"type":33,"tag":102,"props":2791,"children":2792},{"class":104,"line":232},[2793,2798,2802],{"type":33,"tag":102,"props":2794,"children":2795},{"style":119},[2796],{"type":38,"value":2797},"        description",{"type":33,"tag":102,"props":2799,"children":2800},{"style":125},[2801],{"type":38,"value":128},{"type":33,"tag":102,"props":2803,"children":2804},{"style":178},[2805],{"type":38,"value":2806},"\"Clave primaria\"\n",{"type":33,"tag":102,"props":2808,"children":2809},{"class":104,"line":254},[2810,2815],{"type":33,"tag":102,"props":2811,"children":2812},{"style":119},[2813],{"type":38,"value":2814},"        tests",{"type":33,"tag":102,"props":2816,"children":2817},{"style":125},[2818],{"type":38,"value":157},{"type":33,"tag":102,"props":2820,"children":2821},{"class":104,"line":272},[2822,2827],{"type":33,"tag":102,"props":2823,"children":2824},{"style":125},[2825],{"type":38,"value":2826},"          - ",{"type":33,"tag":102,"props":2828,"children":2829},{"style":178},[2830],{"type":38,"value":2831},"unique\n",{"type":33,"tag":102,"props":2833,"children":2834},{"class":104,"line":285},[2835,2839],{"type":33,"tag":102,"props":2836,"children":2837},{"style":125},[2838],{"type":38,"value":2826},{"type":33,"tag":102,"props":2840,"children":2841},{"style":178},[2842],{"type":38,"value":2843},"not_null\n",{"type":33,"tag":102,"props":2845,"children":2846},{"class":104,"line":303},[2847],{"type":33,"tag":102,"props":2848,"children":2849},{"emptyLinePlaceholder":141},[2850],{"type":38,"value":144},{"type":33,"tag":102,"props":2852,"children":2853},{"class":104,"line":316},[2854,2858,2862,2866],{"type":33,"tag":102,"props":2855,"children":2856},{"style":125},[2857],{"type":38,"value":238},{"type":33,"tag":102,"props":2859,"children":2860},{"style":119},[2861],{"type":38,"value":171},{"type":33,"tag":102,"props":2863,"children":2864},{"style":125},[2865],{"type":38,"value":128},{"type":33,"tag":102,"props":2867,"children":2868},{"style":178},[2869],{"type":38,"value":2870},"customer_id\n",{"type":33,"tag":102,"props":2872,"children":2873},{"class":104,"line":367},[2874,2878,2882],{"type":33,"tag":102,"props":2875,"children":2876},{"style":119},[2877],{"type":38,"value":2797},{"type":33,"tag":102,"props":2879,"children":2880},{"style":125},[2881],{"type":38,"value":128},{"type":33,"tag":102,"props":2883,"children":2884},{"style":178},[2885],{"type":38,"value":2886},"\"Clave foránea a dim_customers\"\n",{"type":33,"tag":102,"props":2888,"children":2889},{"class":104,"line":413},[2890,2894],{"type":33,"tag":102,"props":2891,"children":2892},{"style":119},[2893],{"type":38,"value":2814},{"type":33,"tag":102,"props":2895,"children":2896},{"style":125},[2897],{"type":38,"value":157},{"type":33,"tag":102,"props":2899,"children":2900},{"class":104,"line":421},[2901,2905],{"type":33,"tag":102,"props":2902,"children":2903},{"style":125},[2904],{"type":38,"value":2826},{"type":33,"tag":102,"props":2906,"children":2907},{"style":178},[2908],{"type":38,"value":2843},{"type":33,"tag":102,"props":2910,"children":2911},{"class":104,"line":442},[2912,2916,2921],{"type":33,"tag":102,"props":2913,"children":2914},{"style":125},[2915],{"type":38,"value":2826},{"type":33,"tag":102,"props":2917,"children":2918},{"style":119},[2919],{"type":38,"value":2920},"relationships",{"type":33,"tag":102,"props":2922,"children":2923},{"style":125},[2924],{"type":38,"value":157},{"type":33,"tag":102,"props":2926,"children":2927},{"class":104,"line":459},[2928,2933,2937],{"type":33,"tag":102,"props":2929,"children":2930},{"style":119},[2931],{"type":38,"value":2932},"              to",{"type":33,"tag":102,"props":2934,"children":2935},{"style":125},[2936],{"type":38,"value":128},{"type":33,"tag":102,"props":2938,"children":2939},{"style":178},[2940],{"type":38,"value":2941},"ref('dim_customers')\n",{"type":33,"tag":102,"props":2943,"children":2944},{"class":104,"line":471},[2945,2950,2954],{"type":33,"tag":102,"props":2946,"children":2947},{"style":119},[2948],{"type":38,"value":2949},"              field",{"type":33,"tag":102,"props":2951,"children":2952},{"style":125},[2953],{"type":38,"value":128},{"type":33,"tag":102,"props":2955,"children":2956},{"style":178},[2957],{"type":38,"value":2870},{"type":33,"tag":102,"props":2959,"children":2960},{"class":104,"line":492},[2961],{"type":33,"tag":102,"props":2962,"children":2963},{"emptyLinePlaceholder":141},[2964],{"type":38,"value":144},{"type":33,"tag":102,"props":2966,"children":2967},{"class":104,"line":510},[2968,2972,2976,2980],{"type":33,"tag":102,"props":2969,"children":2970},{"style":125},[2971],{"type":38,"value":238},{"type":33,"tag":102,"props":2973,"children":2974},{"style":119},[2975],{"type":38,"value":171},{"type":33,"tag":102,"props":2977,"children":2978},{"style":125},[2979],{"type":38,"value":128},{"type":33,"tag":102,"props":2981,"children":2982},{"style":178},[2983],{"type":38,"value":1893},{"type":33,"tag":102,"props":2985,"children":2986},{"class":104,"line":522},[2987,2991,2995],{"type":33,"tag":102,"props":2988,"children":2989},{"style":119},[2990],{"type":38,"value":2797},{"type":33,"tag":102,"props":2992,"children":2993},{"style":125},[2994],{"type":38,"value":128},{"type":33,"tag":102,"props":2996,"children":2997},{"style":178},[2998],{"type":38,"value":2999},"\"Total de la orden en USD\"\n",{"type":33,"tag":102,"props":3001,"children":3002},{"class":104,"line":1610},[3003,3007],{"type":33,"tag":102,"props":3004,"children":3005},{"style":119},[3006],{"type":38,"value":2814},{"type":33,"tag":102,"props":3008,"children":3009},{"style":125},[3010],{"type":38,"value":157},{"type":33,"tag":102,"props":3012,"children":3013},{"class":104,"line":1618},[3014,3018],{"type":33,"tag":102,"props":3015,"children":3016},{"style":125},[3017],{"type":38,"value":2826},{"type":33,"tag":102,"props":3019,"children":3020},{"style":178},[3021],{"type":38,"value":2843},{"type":33,"tag":102,"props":3023,"children":3024},{"class":104,"line":2574},[3025,3029,3034],{"type":33,"tag":102,"props":3026,"children":3027},{"style":125},[3028],{"type":38,"value":2826},{"type":33,"tag":102,"props":3030,"children":3031},{"style":119},[3032],{"type":38,"value":3033},"dbt_utils.expression_is_true",{"type":33,"tag":102,"props":3035,"children":3036},{"style":125},[3037],{"type":38,"value":157},{"type":33,"tag":102,"props":3039,"children":3040},{"class":104,"line":2591},[3041,3046,3050],{"type":33,"tag":102,"props":3042,"children":3043},{"style":119},[3044],{"type":38,"value":3045},"              expression",{"type":33,"tag":102,"props":3047,"children":3048},{"style":125},[3049],{"type":38,"value":128},{"type":33,"tag":102,"props":3051,"children":3052},{"style":178},[3053],{"type":38,"value":3054},"\">= 0\"\n",{"type":33,"tag":102,"props":3056,"children":3058},{"class":104,"line":3057},28,[3059],{"type":33,"tag":102,"props":3060,"children":3061},{"emptyLinePlaceholder":141},[3062],{"type":38,"value":144},{"type":33,"tag":102,"props":3064,"children":3066},{"class":104,"line":3065},29,[3067,3071,3075,3079],{"type":33,"tag":102,"props":3068,"children":3069},{"style":125},[3070],{"type":38,"value":238},{"type":33,"tag":102,"props":3072,"children":3073},{"style":119},[3074],{"type":38,"value":171},{"type":33,"tag":102,"props":3076,"children":3077},{"style":125},[3078],{"type":38,"value":128},{"type":33,"tag":102,"props":3080,"children":3081},{"style":178},[3082],{"type":38,"value":1910},{"type":33,"tag":102,"props":3084,"children":3086},{"class":104,"line":3085},30,[3087,3091],{"type":33,"tag":102,"props":3088,"children":3089},{"style":119},[3090],{"type":38,"value":2814},{"type":33,"tag":102,"props":3092,"children":3093},{"style":125},[3094],{"type":38,"value":157},{"type":33,"tag":102,"props":3096,"children":3098},{"class":104,"line":3097},31,[3099,3103],{"type":33,"tag":102,"props":3100,"children":3101},{"style":125},[3102],{"type":38,"value":2826},{"type":33,"tag":102,"props":3104,"children":3105},{"style":178},[3106],{"type":38,"value":2843},{"type":33,"tag":102,"props":3108,"children":3110},{"class":104,"line":3109},32,[3111,3115,3120],{"type":33,"tag":102,"props":3112,"children":3113},{"style":125},[3114],{"type":38,"value":2826},{"type":33,"tag":102,"props":3116,"children":3117},{"style":119},[3118],{"type":38,"value":3119},"dbt_utils.accepted_range",{"type":33,"tag":102,"props":3121,"children":3122},{"style":125},[3123],{"type":38,"value":157},{"type":33,"tag":102,"props":3125,"children":3127},{"class":104,"line":3126},33,[3128,3133,3137],{"type":33,"tag":102,"props":3129,"children":3130},{"style":119},[3131],{"type":38,"value":3132},"              min_value",{"type":33,"tag":102,"props":3134,"children":3135},{"style":125},[3136],{"type":38,"value":128},{"type":33,"tag":102,"props":3138,"children":3139},{"style":178},[3140],{"type":38,"value":3141},"\"'2020-01-01'\"\n",{"type":33,"tag":102,"props":3143,"children":3145},{"class":104,"line":3144},34,[3146,3151,3155],{"type":33,"tag":102,"props":3147,"children":3148},{"style":119},[3149],{"type":38,"value":3150},"              max_value",{"type":33,"tag":102,"props":3152,"children":3153},{"style":125},[3154],{"type":38,"value":128},{"type":33,"tag":102,"props":3156,"children":3157},{"style":178},[3158],{"type":38,"value":3159},"\"current_date()\"\n",{"type":33,"tag":34,"props":3161,"children":3162},{},[3163,3165,3171,3173,3179],{"type":38,"value":3164},"El comando ",{"type":33,"tag":53,"props":3166,"children":3168},{"className":3167},[],[3169],{"type":38,"value":3170},"dbt test",{"type":38,"value":3172}," ejecuta estas validaciones. Si aparece alguna anomalía como ",{"type":33,"tag":53,"props":3174,"children":3176},{"className":3175},[],[3177],{"type":38,"value":3178},"order_total \u003C 0",{"type":38,"value":3180},", la construcción falla y Slack recibe una alerta. Este contrato permite que las exposures downstream confíen en los datos — la calidad de datos se asegura en el pipeline, no en la herramienta BI.",{"type":33,"tag":34,"props":3182,"children":3183},{},[3184,3186,3192],{"type":38,"value":3185},"Agregar tests personalizados es simple: creas un archivo SQL en la carpeta ",{"type":33,"tag":53,"props":3187,"children":3189},{"className":3188},[],[3190],{"type":38,"value":3191},"tests\u002F",{"type":38,"value":3193},". Ejemplo: \"cada cliente debe tener como máximo una suscripción activa\":",{"type":33,"tag":92,"props":3195,"children":3197},{"className":659,"code":3196,"language":661,"meta":16,"style":16},"-- tests\u002Fassert_single_active_subscription.sql\nwith duplicate_subscriptions as (\n    select\n        customer_id,\n        count(*) as active_count\n    from {{ ref('fct_subscriptions') }}\n    where status = 'active'\n    group by 1\n    having count(*) > 1\n)\n\nselect * from duplicate_subscriptions\n",[3198],{"type":33,"tag":53,"props":3199,"children":3200},{"__ignoreMap":16},[3201,3209,3229,3236,3244,3272,3292,3313,3326,3360,3367,3374],{"type":33,"tag":102,"props":3202,"children":3203},{"class":104,"line":105},[3204],{"type":33,"tag":102,"props":3205,"children":3206},{"style":109},[3207],{"type":38,"value":3208},"-- tests\u002Fassert_single_active_subscription.sql\n",{"type":33,"tag":102,"props":3210,"children":3211},{"class":104,"line":115},[3212,3216,3221,3225],{"type":33,"tag":102,"props":3213,"children":3214},{"style":679},[3215],{"type":38,"value":682},{"type":33,"tag":102,"props":3217,"children":3218},{"style":125},[3219],{"type":38,"value":3220}," duplicate_subscriptions ",{"type":33,"tag":102,"props":3222,"children":3223},{"style":679},[3224],{"type":38,"value":692},{"type":33,"tag":102,"props":3226,"children":3227},{"style":125},[3228],{"type":38,"value":697},{"type":33,"tag":102,"props":3230,"children":3231},{"class":104,"line":137},[3232],{"type":33,"tag":102,"props":3233,"children":3234},{"style":679},[3235],{"type":38,"value":847},{"type":33,"tag":102,"props":3237,"children":3238},{"class":104,"line":147},[3239],{"type":33,"tag":102,"props":3240,"children":3241},{"style":125},[3242],{"type":38,"value":3243},"        customer_id,\n",{"type":33,"tag":102,"props":3245,"children":3246},{"class":104,"line":160},[3247,3251,3255,3259,3263,3267],{"type":33,"tag":102,"props":3248,"children":3249},{"style":131},[3250],{"type":38,"value":1307},{"type":33,"tag":102,"props":3252,"children":3253},{"style":125},[3254],{"type":38,"value":1312},{"type":33,"tag":102,"props":3256,"children":3257},{"style":679},[3258],{"type":38,"value":1317},{"type":33,"tag":102,"props":3260,"children":3261},{"style":125},[3262],{"type":38,"value":933},{"type":33,"tag":102,"props":3264,"children":3265},{"style":679},[3266],{"type":38,"value":692},{"type":33,"tag":102,"props":3268,"children":3269},{"style":125},[3270],{"type":38,"value":3271}," active_count\n",{"type":33,"tag":102,"props":3273,"children":3274},{"class":104,"line":184},[3275,3279,3283,3288],{"type":33,"tag":102,"props":3276,"children":3277},{"style":679},[3278],{"type":38,"value":1049},{"type":33,"tag":102,"props":3280,"children":3281},{"style":125},[3282],{"type":38,"value":1363},{"type":33,"tag":102,"props":3284,"children":3285},{"style":178},[3286],{"type":38,"value":3287},"'fct_subscriptions'",{"type":33,"tag":102,"props":3289,"children":3290},{"style":125},[3291],{"type":38,"value":739},{"type":33,"tag":102,"props":3293,"children":3294},{"class":104,"line":202},[3295,3299,3304,3308],{"type":33,"tag":102,"props":3296,"children":3297},{"style":679},[3298],{"type":38,"value":747},{"type":33,"tag":102,"props":3300,"children":3301},{"style":679},[3302],{"type":38,"value":3303}," status",{"type":33,"tag":102,"props":3305,"children":3306},{"style":679},[3307],{"type":38,"value":923},{"type":33,"tag":102,"props":3309,"children":3310},{"style":178},[3311],{"type":38,"value":3312}," 'active'\n",{"type":33,"tag":102,"props":3314,"children":3315},{"class":104,"line":27},[3316,3321],{"type":33,"tag":102,"props":3317,"children":3318},{"style":679},[3319],{"type":38,"value":3320},"    group by",{"type":33,"tag":102,"props":3322,"children":3323},{"style":131},[3324],{"type":38,"value":3325}," 1\n",{"type":33,"tag":102,"props":3327,"children":3328},{"class":104,"line":232},[3329,3334,3339,3343,3347,3351,3356],{"type":33,"tag":102,"props":3330,"children":3331},{"style":679},[3332],{"type":38,"value":3333},"    having",{"type":33,"tag":102,"props":3335,"children":3336},{"style":131},[3337],{"type":38,"value":3338}," count",{"type":33,"tag":102,"props":3340,"children":3341},{"style":125},[3342],{"type":38,"value":1312},{"type":33,"tag":102,"props":3344,"children":3345},{"style":679},[3346],{"type":38,"value":1317},{"type":33,"tag":102,"props":3348,"children":3349},{"style":125},[3350],{"type":38,"value":933},{"type":33,"tag":102,"props":3352,"children":3353},{"style":679},[3354],{"type":38,"value":3355},">",{"type":33,"tag":102,"props":3357,"children":3358},{"style":131},[3359],{"type":38,"value":3325},{"type":33,"tag":102,"props":3361,"children":3362},{"class":104,"line":254},[3363],{"type":33,"tag":102,"props":3364,"children":3365},{"style":125},[3366],{"type":38,"value":1095},{"type":33,"tag":102,"props":3368,"children":3369},{"class":104,"line":272},[3370],{"type":33,"tag":102,"props":3371,"children":3372},{"emptyLinePlaceholder":141},[3373],{"type":38,"value":144},{"type":33,"tag":102,"props":3375,"children":3376},{"class":104,"line":285},[3377,3381,3385,3389],{"type":33,"tag":102,"props":3378,"children":3379},{"style":679},[3380],{"type":38,"value":884},{"type":33,"tag":102,"props":3382,"children":3383},{"style":679},[3384],{"type":38,"value":710},{"type":33,"tag":102,"props":3386,"children":3387},{"style":679},[3388],{"type":38,"value":715},{"type":33,"tag":102,"props":3390,"children":3391},{"style":125},[3392],{"type":38,"value":3393}," duplicate_subscriptions\n",{"type":33,"tag":34,"props":3395,"children":3396},{},[3397],{"type":38,"value":3398},"Si esta consulta devuelve filas, el test falla. Cuando la cobertura de tests supera el 80%, el número de incidentes de datos cae — métrica de Roibase 2023: después del 85% de cobertura, las alertas de dashboard incorrecto bajaron un 60%.",{"type":33,"tag":41,"props":3400,"children":3402},{"id":3401},"orquestación-del-pipeline-e-implementación-en-producción",[3403],{"type":38,"value":3404},"Orquestación del pipeline e implementación en producción",{"type":33,"tag":34,"props":3406,"children":3407},{},[3408,3410,3416,3418,3424],{"type":38,"value":3409},"Si usas dbt Cloud, defines un job programado: cada día a las 04:00 ejecuta el comando ",{"type":33,"tag":53,"props":3411,"children":3413},{"className":3412},[],[3414],{"type":38,"value":3415},"dbt build --select +fct_orders",{"type":38,"value":3417},". Si usas self-hosted, agregas dbt como un ",{"type":33,"tag":53,"props":3419,"children":3421},{"className":3420},[],[3422],{"type":38,"value":3423},"BashOperator",{"type":38,"value":3425}," a tu DAG de Airflow. Gracias a la estrategia incremental de dbt, 90 días de datos se procesan en 5 minutos — una reconstrucción completa es innecesaria.",{"type":33,"tag":34,"props":3427,"children":3428},{},[3429,3431,3437],{"type":38,"value":3430},"El proceso de CI\u002FCD: cuando abres un Pull Request, GitHub Actions ejecuta ",{"type":33,"tag":53,"props":3432,"children":3434},{"className":3433},[],[3435],{"type":38,"value":3436},"dbt build --select state:modified+",{"type":38,"value":3438}," — solo se prueban los modelos que cambiaron y sus dependencias downstream. Al hacer merge, se implementa en el dataset de BigQuery de producción. dbt Slim CI reduce el tiempo de build a 3 minutos en un proyecto con 200 modelos (la construcción completa tomaría 40 minutos).",{"type":33,"tag":34,"props":3440,"children":3441},{},[3442,3444,3449],{"type":38,"value":3443},"En producción, el output de ",{"type":33,"tag":53,"props":3445,"children":3447},{"className":3446},[],[3448],{"type":38,"value":2616},{"type":38,"value":3450}," se sube como un sitio estático a S3\u002FGCS. Versiones de los archivos markdown — los cambios en el esquema del modelo quedan registrados en git history. Un nuevo miembro del equipo lee en el sitio de dbt docs cómo se calcula cada métrica, evitando el conocimiento tribal.",{"type":33,"tag":3452,"props":3453,"children":3454},"hr",{},[],{"type":33,"tag":34,"props":3456,"children":3457},{},[3458],{"type":38,"value":3459},"dbt + BigQuery no es la única forma de conectar datos de marketing con tu mecanismo de decisión — pero es la más reproducible, testeable y versionable. El source mapping lleva los datos crudos bajo control, la modeling layer convierte conceptos analíticos en SQL, la semantic layer centraliza las definiciones de métricas, y las exposures hacen visible el consumo downstream. Cuando construyes estas cuatro capas, la pregunta \"a cuánto presupuesto asignarle a cada canal\" se convierte en el resultado de una consulta SQL — medición, no conjetura.",{"type":33,"tag":3461,"props":3462,"children":3463},"style",{},[3464],{"type":38,"value":3465},"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":137,"depth":137,"links":3467},[3468,3469,3470,3471,3472,3473],{"id":43,"depth":115,"text":46},{"id":618,"depth":115,"text":621},{"id":1724,"depth":115,"text":1727},{"id":2212,"depth":115,"text":2215},{"id":2657,"depth":115,"text":2660},{"id":3401,"depth":115,"text":3404},"markdown","content:es:data:dbt-bigquery-modern-pila-datos-marketing.md","content","es\u002Fdata\u002Fdbt-bigquery-modern-pila-datos-marketing.md","es\u002Fdata\u002Fdbt-bigquery-modern-pila-datos-marketing","md",1785276284265]