[{"data":1,"prerenderedAt":2721},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fde\u002Fdata\u002Fdatenschutz-first-analytics-plausible-server-aggregation":13},{"i18nKey":4,"paths":5},"data-006-2026-07",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fprivacy-first-analytics-plausible-server-side","\u002Fen\u002Fdata\u002Fprivacy-first-analytics-plausible-server-side-aggregation","\u002Fes\u002Fdata\u002Fprivacidad-first-analytics-plausible-agregacion-servidor","\u002Ffr\u002Fdata\u002Fprivacy-first-analytics-plausible-server-side-aggregation","\u002Fit\u002Fdata\u002Fanalytics-privacy-first-plausible-aggregazione-lato-server","\u002Fru\u002Fdata\u002Fprivacy-first-analytics-plausible-serverside-aggregation","\u002Ftr\u002Fdata\u002Fprivacy-first-analytics-plausible-ve-sunucu-tarafi-aggregation",{"_path":14,"_dir":15,"_draft":16,"_partial":16,"_locale":17,"title":18,"description":19,"publishedAt":20,"modifiedAt":20,"category":15,"i18nKey":4,"tags":21,"readingTime":27,"author":28,"body":29,"_type":2715,"_id":2716,"_source":2717,"_file":2718,"_stem":2719,"_extension":2720},"\u002Fde\u002Fdata\u002Fdatenschutz-first-analytics-plausible-server-aggregation","data",false,"","Privacy-First Analytics: Plausible und serverseitige Aggregation","Cookielose Verfolgung, DSGVO\u002FKVKK-Konformität und GA4-Alternative: Plausible + Server-Side-Aggregation-Architektur für nutzerzentriertes Tracking neu aufgebaut.","2026-07-26",[22,23,24,25,26],"datenschutz-first-analytics","plausible","cookie-frei","dsgvo-konformitaet","server-side-aggregation",9,"Roibase",{"type":30,"children":31,"toc":2706},"root",[32,40,47,61,66,71,77,82,91,600,621,631,875,880,886,897,910,956,968,1444,1478,1733,1738,1744,1752,1777,1785,1823,1831,1854,1862,1880,1888,1911,1916,1922,1941,1954,2205,2221,2227,2247,2252,2395,2400,2468,2480,2490,2496,2501,2700],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37],{"type":38,"value":39},"text","GA4s Mitteilung Mitte 2024 über eine \"360-Tage-Nutzer-ID-Speicherfrist\" und die Verpflichtung des Consent Mode v2 im März 2024 haben Marketing-Teams vor eine Dichotomie gestellt: Entweder sinkt die Zustimmungsrate des Cookie-Banners auf 40 Prozent und sie verlieren die seit UA aufgebaute Segmentierungsinfrastruktur – oder sie finden einen Weg, einen neuen Measurement Stack ohne Cookies zu betreiben. Die Kombination von Privacy-First-Analytics-Tools wie Plausible mit einer Server-Side-Aggregation-Architektur ist zur technischen Lösung dieses Szenarios geworden.",{"type":33,"tag":41,"props":42,"children":44},"h2",{"id":43},"cookie-blockierung-überschreitet-60-prozent",[45],{"type":38,"value":46},"Cookie-Blockierung überschreitet 60 Prozent",{"type":33,"tag":34,"props":48,"children":49},{},[50,52,59],{"type":38,"value":51},"Apples Intelligent Tracking Prevention (ITP) blockiert seit 2017 Third-Party-Cookies in Safari; Chrome machte 2024 im vierten Quartal Privacy Sandbox zur Standardeinstellung; Firefox hat Tracking Protection standardmäßig aktiviert. Laut Mozilla 2025-Bericht klicken durchschnittliche europäische Nutzer zu 62 Prozent auf „Ablehnen\" im Cookie-Banner oder schließen ihn. In GA4-Properties ist die Anzahl der Sessions mit ",{"type":33,"tag":53,"props":54,"children":56},"code",{"className":55},[],[57],{"type":38,"value":58},"consent_status=denied",{"type":38,"value":60}," seit Q4 2024 im B2C-Segment in der Spannbreite von 55–65 Prozent verankert.",{"type":33,"tag":34,"props":62,"children":63},{},[64],{"type":38,"value":65},"Das bedeutet, dass klassische Client-Side-Pixel (gtag.js, fbq) mehr als die Hälfte des Traffics verlieren. GA4s \"Modeled Conversion\"-Funktion versucht, diese Lücke zu füllen – aber modellierte Daten sind Regressionsvorhersagen statt echter Events. In Incrementality Tests zeigen modellierte Conversion-Sets durchschnittlich 18–22 Prozent Abweichung von echten Conversions (Google Marketing Platform 2025 Beta-Dokumentation).",{"type":33,"tag":34,"props":67,"children":68},{},[69],{"type":38,"value":70},"Cookielose Verfolgung ruht auf zwei Architekturen: Die eine sammelt Events vollständig serverseitig (Server-Side GTM, Segment, RudderStack), die andere erzeugt Client-Side temporäre Kennungen über sessionStorage\u002FlocalStorage und leitet sie an den Server weiter. Plausible Analytics nutzt den zweiten Ansatz – aber die Identität ist nicht persistent. Jede Session erhält einen neuen Hash. Auf den ersten Blick scheint „Nutzer-Journey\"-Tracking unmöglich; tatsächlich wird Cohort-Analyse und Retention-Messung auf der Aggregationsschicht möglich.",{"type":33,"tag":41,"props":72,"children":74},{"id":73},"plausible-architektur-beacon-post-und-event-stream",[75],{"type":38,"value":76},"Plausible-Architektur: Beacon POST und Event Stream",{"type":33,"tag":34,"props":78,"children":79},{},[80],{"type":38,"value":81},"Plausible ist eine Open-Source-Web-Analytics-Plattform (plausible.io), MIT-lizenziert. Script-Größe 1,4 KB (GA4 43 KB, Segment 28 KB); schreibt keine Cookies; DSGVO\u002FKVKK\u002FCCPA-konform ab Werk. So funktioniert es:",{"type":33,"tag":34,"props":83,"children":84},{},[85],{"type":33,"tag":86,"props":87,"children":88},"strong",{},[89],{"type":38,"value":90},"Client-Script:",{"type":33,"tag":92,"props":93,"children":97},"pre",{"className":94,"code":95,"language":96,"meta":17,"style":17},"language-javascript shiki shiki-themes github-dark","\u002F\u002F plausible.js Minimal-Implementierung\n(function(){\n  const endpoint = 'https:\u002F\u002Fanalytics.example.com\u002Fapi\u002Fevent';\n  const sessionHash = btoa(navigator.userAgent + performance.timing.navigationStart).substring(0,16);\n  \n  function sendEvent(name, props = {}) {\n    navigator.sendBeacon(endpoint, JSON.stringify({\n      n: name,              \u002F\u002F event name\n      u: location.href,     \u002F\u002F page URL\n      d: document.domain,\n      r: document.referrer,\n      w: window.innerWidth,\n      h: sessionHash,       \u002F\u002F temporäre Session-Kennung\n      p: props              \u002F\u002F custom properties\n    }));\n  }\n  \n  sendEvent('pageview');\n  \n  \u002F\u002F click tracking\n  document.addEventListener('click', (e) => {\n    if (e.target.matches('[data-track]')) {\n      sendEvent('click', { element: e.target.dataset.track });\n    }\n  });\n})();\n","javascript",[98],{"type":33,"tag":53,"props":99,"children":100},{"__ignoreMap":17},[101,113,134,165,232,241,284,323,337,350,359,368,377,391,405,414,423,431,453,461,470,518,551,573,582,591],{"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},"\u002F\u002F plausible.js Minimal-Implementierung\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:#E1E4E8",[121],{"type":38,"value":122},"(",{"type":33,"tag":102,"props":124,"children":126},{"style":125},"--shiki-default:#F97583",[127],{"type":38,"value":128},"function",{"type":33,"tag":102,"props":130,"children":131},{"style":119},[132],{"type":38,"value":133},"(){\n",{"type":33,"tag":102,"props":135,"children":137},{"class":104,"line":136},3,[138,143,149,154,160],{"type":33,"tag":102,"props":139,"children":140},{"style":125},[141],{"type":38,"value":142},"  const",{"type":33,"tag":102,"props":144,"children":146},{"style":145},"--shiki-default:#79B8FF",[147],{"type":38,"value":148}," endpoint",{"type":33,"tag":102,"props":150,"children":151},{"style":125},[152],{"type":38,"value":153}," =",{"type":33,"tag":102,"props":155,"children":157},{"style":156},"--shiki-default:#9ECBFF",[158],{"type":38,"value":159}," 'https:\u002F\u002Fanalytics.example.com\u002Fapi\u002Fevent'",{"type":33,"tag":102,"props":161,"children":162},{"style":119},[163],{"type":38,"value":164},";\n",{"type":33,"tag":102,"props":166,"children":168},{"class":104,"line":167},4,[169,173,178,182,188,193,198,203,208,212,217,222,227],{"type":33,"tag":102,"props":170,"children":171},{"style":125},[172],{"type":38,"value":142},{"type":33,"tag":102,"props":174,"children":175},{"style":145},[176],{"type":38,"value":177}," sessionHash",{"type":33,"tag":102,"props":179,"children":180},{"style":125},[181],{"type":38,"value":153},{"type":33,"tag":102,"props":183,"children":185},{"style":184},"--shiki-default:#B392F0",[186],{"type":38,"value":187}," btoa",{"type":33,"tag":102,"props":189,"children":190},{"style":119},[191],{"type":38,"value":192},"(navigator.userAgent ",{"type":33,"tag":102,"props":194,"children":195},{"style":125},[196],{"type":38,"value":197},"+",{"type":33,"tag":102,"props":199,"children":200},{"style":119},[201],{"type":38,"value":202}," performance.timing.navigationStart).",{"type":33,"tag":102,"props":204,"children":205},{"style":184},[206],{"type":38,"value":207},"substring",{"type":33,"tag":102,"props":209,"children":210},{"style":119},[211],{"type":38,"value":122},{"type":33,"tag":102,"props":213,"children":214},{"style":145},[215],{"type":38,"value":216},"0",{"type":33,"tag":102,"props":218,"children":219},{"style":119},[220],{"type":38,"value":221},",",{"type":33,"tag":102,"props":223,"children":224},{"style":145},[225],{"type":38,"value":226},"16",{"type":33,"tag":102,"props":228,"children":229},{"style":119},[230],{"type":38,"value":231},");\n",{"type":33,"tag":102,"props":233,"children":235},{"class":104,"line":234},5,[236],{"type":33,"tag":102,"props":237,"children":238},{"style":119},[239],{"type":38,"value":240},"  \n",{"type":33,"tag":102,"props":242,"children":244},{"class":104,"line":243},6,[245,250,255,259,265,270,275,279],{"type":33,"tag":102,"props":246,"children":247},{"style":125},[248],{"type":38,"value":249},"  function",{"type":33,"tag":102,"props":251,"children":252},{"style":184},[253],{"type":38,"value":254}," sendEvent",{"type":33,"tag":102,"props":256,"children":257},{"style":119},[258],{"type":38,"value":122},{"type":33,"tag":102,"props":260,"children":262},{"style":261},"--shiki-default:#FFAB70",[263],{"type":38,"value":264},"name",{"type":33,"tag":102,"props":266,"children":267},{"style":119},[268],{"type":38,"value":269},", ",{"type":33,"tag":102,"props":271,"children":272},{"style":261},[273],{"type":38,"value":274},"props",{"type":33,"tag":102,"props":276,"children":277},{"style":125},[278],{"type":38,"value":153},{"type":33,"tag":102,"props":280,"children":281},{"style":119},[282],{"type":38,"value":283}," {}) {\n",{"type":33,"tag":102,"props":285,"children":287},{"class":104,"line":286},7,[288,293,298,303,308,313,318],{"type":33,"tag":102,"props":289,"children":290},{"style":119},[291],{"type":38,"value":292},"    navigator.",{"type":33,"tag":102,"props":294,"children":295},{"style":184},[296],{"type":38,"value":297},"sendBeacon",{"type":33,"tag":102,"props":299,"children":300},{"style":119},[301],{"type":38,"value":302},"(endpoint, ",{"type":33,"tag":102,"props":304,"children":305},{"style":145},[306],{"type":38,"value":307},"JSON",{"type":33,"tag":102,"props":309,"children":310},{"style":119},[311],{"type":38,"value":312},".",{"type":33,"tag":102,"props":314,"children":315},{"style":184},[316],{"type":38,"value":317},"stringify",{"type":33,"tag":102,"props":319,"children":320},{"style":119},[321],{"type":38,"value":322},"({\n",{"type":33,"tag":102,"props":324,"children":326},{"class":104,"line":325},8,[327,332],{"type":33,"tag":102,"props":328,"children":329},{"style":119},[330],{"type":38,"value":331},"      n: name,              ",{"type":33,"tag":102,"props":333,"children":334},{"style":109},[335],{"type":38,"value":336},"\u002F\u002F event name\n",{"type":33,"tag":102,"props":338,"children":339},{"class":104,"line":27},[340,345],{"type":33,"tag":102,"props":341,"children":342},{"style":119},[343],{"type":38,"value":344},"      u: location.href,     ",{"type":33,"tag":102,"props":346,"children":347},{"style":109},[348],{"type":38,"value":349},"\u002F\u002F page URL\n",{"type":33,"tag":102,"props":351,"children":353},{"class":104,"line":352},10,[354],{"type":33,"tag":102,"props":355,"children":356},{"style":119},[357],{"type":38,"value":358},"      d: document.domain,\n",{"type":33,"tag":102,"props":360,"children":362},{"class":104,"line":361},11,[363],{"type":33,"tag":102,"props":364,"children":365},{"style":119},[366],{"type":38,"value":367},"      r: document.referrer,\n",{"type":33,"tag":102,"props":369,"children":371},{"class":104,"line":370},12,[372],{"type":33,"tag":102,"props":373,"children":374},{"style":119},[375],{"type":38,"value":376},"      w: window.innerWidth,\n",{"type":33,"tag":102,"props":378,"children":380},{"class":104,"line":379},13,[381,386],{"type":33,"tag":102,"props":382,"children":383},{"style":119},[384],{"type":38,"value":385},"      h: sessionHash,       ",{"type":33,"tag":102,"props":387,"children":388},{"style":109},[389],{"type":38,"value":390},"\u002F\u002F temporäre Session-Kennung\n",{"type":33,"tag":102,"props":392,"children":394},{"class":104,"line":393},14,[395,400],{"type":33,"tag":102,"props":396,"children":397},{"style":119},[398],{"type":38,"value":399},"      p: props              ",{"type":33,"tag":102,"props":401,"children":402},{"style":109},[403],{"type":38,"value":404},"\u002F\u002F custom properties\n",{"type":33,"tag":102,"props":406,"children":408},{"class":104,"line":407},15,[409],{"type":33,"tag":102,"props":410,"children":411},{"style":119},[412],{"type":38,"value":413},"    }));\n",{"type":33,"tag":102,"props":415,"children":417},{"class":104,"line":416},16,[418],{"type":33,"tag":102,"props":419,"children":420},{"style":119},[421],{"type":38,"value":422},"  }\n",{"type":33,"tag":102,"props":424,"children":426},{"class":104,"line":425},17,[427],{"type":33,"tag":102,"props":428,"children":429},{"style":119},[430],{"type":38,"value":240},{"type":33,"tag":102,"props":432,"children":434},{"class":104,"line":433},18,[435,440,444,449],{"type":33,"tag":102,"props":436,"children":437},{"style":184},[438],{"type":38,"value":439},"  sendEvent",{"type":33,"tag":102,"props":441,"children":442},{"style":119},[443],{"type":38,"value":122},{"type":33,"tag":102,"props":445,"children":446},{"style":156},[447],{"type":38,"value":448},"'pageview'",{"type":33,"tag":102,"props":450,"children":451},{"style":119},[452],{"type":38,"value":231},{"type":33,"tag":102,"props":454,"children":456},{"class":104,"line":455},19,[457],{"type":33,"tag":102,"props":458,"children":459},{"style":119},[460],{"type":38,"value":240},{"type":33,"tag":102,"props":462,"children":464},{"class":104,"line":463},20,[465],{"type":33,"tag":102,"props":466,"children":467},{"style":109},[468],{"type":38,"value":469},"  \u002F\u002F click tracking\n",{"type":33,"tag":102,"props":471,"children":473},{"class":104,"line":472},21,[474,479,484,488,493,498,503,508,513],{"type":33,"tag":102,"props":475,"children":476},{"style":119},[477],{"type":38,"value":478},"  document.",{"type":33,"tag":102,"props":480,"children":481},{"style":184},[482],{"type":38,"value":483},"addEventListener",{"type":33,"tag":102,"props":485,"children":486},{"style":119},[487],{"type":38,"value":122},{"type":33,"tag":102,"props":489,"children":490},{"style":156},[491],{"type":38,"value":492},"'click'",{"type":33,"tag":102,"props":494,"children":495},{"style":119},[496],{"type":38,"value":497},", (",{"type":33,"tag":102,"props":499,"children":500},{"style":261},[501],{"type":38,"value":502},"e",{"type":33,"tag":102,"props":504,"children":505},{"style":119},[506],{"type":38,"value":507},") ",{"type":33,"tag":102,"props":509,"children":510},{"style":125},[511],{"type":38,"value":512},"=>",{"type":33,"tag":102,"props":514,"children":515},{"style":119},[516],{"type":38,"value":517}," {\n",{"type":33,"tag":102,"props":519,"children":521},{"class":104,"line":520},22,[522,527,532,537,541,546],{"type":33,"tag":102,"props":523,"children":524},{"style":125},[525],{"type":38,"value":526},"    if",{"type":33,"tag":102,"props":528,"children":529},{"style":119},[530],{"type":38,"value":531}," (e.target.",{"type":33,"tag":102,"props":533,"children":534},{"style":184},[535],{"type":38,"value":536},"matches",{"type":33,"tag":102,"props":538,"children":539},{"style":119},[540],{"type":38,"value":122},{"type":33,"tag":102,"props":542,"children":543},{"style":156},[544],{"type":38,"value":545},"'[data-track]'",{"type":33,"tag":102,"props":547,"children":548},{"style":119},[549],{"type":38,"value":550},")) {\n",{"type":33,"tag":102,"props":552,"children":554},{"class":104,"line":553},23,[555,560,564,568],{"type":33,"tag":102,"props":556,"children":557},{"style":184},[558],{"type":38,"value":559},"      sendEvent",{"type":33,"tag":102,"props":561,"children":562},{"style":119},[563],{"type":38,"value":122},{"type":33,"tag":102,"props":565,"children":566},{"style":156},[567],{"type":38,"value":492},{"type":33,"tag":102,"props":569,"children":570},{"style":119},[571],{"type":38,"value":572},", { element: e.target.dataset.track });\n",{"type":33,"tag":102,"props":574,"children":576},{"class":104,"line":575},24,[577],{"type":33,"tag":102,"props":578,"children":579},{"style":119},[580],{"type":38,"value":581},"    }\n",{"type":33,"tag":102,"props":583,"children":585},{"class":104,"line":584},25,[586],{"type":33,"tag":102,"props":587,"children":588},{"style":119},[589],{"type":38,"value":590},"  });\n",{"type":33,"tag":102,"props":592,"children":594},{"class":104,"line":593},26,[595],{"type":33,"tag":102,"props":596,"children":597},{"style":119},[598],{"type":38,"value":599},"})();\n",{"type":33,"tag":34,"props":601,"children":602},{},[603,605,611,613,619],{"type":38,"value":604},"Die ",{"type":33,"tag":53,"props":606,"children":608},{"className":607},[],[609],{"type":38,"value":610},"navigator.sendBeacon",{"type":38,"value":612},"-API sendet HTTP POST, überträgt aber keine Cookies. ",{"type":33,"tag":53,"props":614,"children":616},{"className":615},[],[617],{"type":38,"value":618},"sessionHash",{"type":38,"value":620}," wird Client-Side erzeugt und nicht persistent gespeichert (verschwindet beim Tab-Schließen). Dieser Hash kombiniert Page Views innerhalb derselben Session – identifiziert aber nicht denselben Nutzer an verschiedenen Tagen.",{"type":33,"tag":34,"props":622,"children":623},{},[624,629],{"type":33,"tag":86,"props":625,"children":626},{},[627],{"type":38,"value":628},"Server-Side (in Elixir\u002FPhoenix geschrieben):",{"type":38,"value":630},"\nEingehende Events werden in ClickHouse geschrieben (Time-Series-Datenbank). In Plausible Self-Hosted ist ClickHouse Standard; die Cloud-Version nutzt verwaltetes ClickHouse. Tabellenstruktur:",{"type":33,"tag":92,"props":632,"children":636},{"className":633,"code":634,"language":635,"meta":17,"style":17},"language-sql shiki shiki-themes github-dark","CREATE TABLE events (\n  timestamp DateTime,\n  domain String,\n  pathname String,\n  referrer String,\n  session_hash String,\n  event_name String,\n  props Map(String, String),\n  user_agent String,\n  country String,\n  device_type Enum8('desktop'=1, 'mobile'=2, 'tablet'=3)\n) ENGINE = MergeTree()\nPARTITION BY toYYYYMM(timestamp)\nORDER BY (domain, toDate(timestamp), session_hash);\n","sql",[637],{"type":33,"tag":53,"props":638,"children":639},{"__ignoreMap":17},[640,663,681,689,697,705,713,721,729,737,745,809,826,853],{"type":33,"tag":102,"props":641,"children":642},{"class":104,"line":105},[643,648,653,658],{"type":33,"tag":102,"props":644,"children":645},{"style":125},[646],{"type":38,"value":647},"CREATE",{"type":33,"tag":102,"props":649,"children":650},{"style":125},[651],{"type":38,"value":652}," TABLE",{"type":33,"tag":102,"props":654,"children":655},{"style":184},[656],{"type":38,"value":657}," events",{"type":33,"tag":102,"props":659,"children":660},{"style":119},[661],{"type":38,"value":662}," (\n",{"type":33,"tag":102,"props":664,"children":665},{"class":104,"line":115},[666,671,676],{"type":33,"tag":102,"props":667,"children":668},{"style":125},[669],{"type":38,"value":670},"  timestamp",{"type":33,"tag":102,"props":672,"children":673},{"style":125},[674],{"type":38,"value":675}," DateTime",{"type":33,"tag":102,"props":677,"children":678},{"style":119},[679],{"type":38,"value":680},",\n",{"type":33,"tag":102,"props":682,"children":683},{"class":104,"line":136},[684],{"type":33,"tag":102,"props":685,"children":686},{"style":119},[687],{"type":38,"value":688},"  domain String,\n",{"type":33,"tag":102,"props":690,"children":691},{"class":104,"line":167},[692],{"type":33,"tag":102,"props":693,"children":694},{"style":119},[695],{"type":38,"value":696},"  pathname String,\n",{"type":33,"tag":102,"props":698,"children":699},{"class":104,"line":234},[700],{"type":33,"tag":102,"props":701,"children":702},{"style":119},[703],{"type":38,"value":704},"  referrer String,\n",{"type":33,"tag":102,"props":706,"children":707},{"class":104,"line":243},[708],{"type":33,"tag":102,"props":709,"children":710},{"style":119},[711],{"type":38,"value":712},"  session_hash String,\n",{"type":33,"tag":102,"props":714,"children":715},{"class":104,"line":286},[716],{"type":33,"tag":102,"props":717,"children":718},{"style":119},[719],{"type":38,"value":720},"  event_name String,\n",{"type":33,"tag":102,"props":722,"children":723},{"class":104,"line":325},[724],{"type":33,"tag":102,"props":725,"children":726},{"style":119},[727],{"type":38,"value":728},"  props Map(String, String),\n",{"type":33,"tag":102,"props":730,"children":731},{"class":104,"line":27},[732],{"type":33,"tag":102,"props":733,"children":734},{"style":119},[735],{"type":38,"value":736},"  user_agent String,\n",{"type":33,"tag":102,"props":738,"children":739},{"class":104,"line":352},[740],{"type":33,"tag":102,"props":741,"children":742},{"style":119},[743],{"type":38,"value":744},"  country String,\n",{"type":33,"tag":102,"props":746,"children":747},{"class":104,"line":361},[748,753,758,763,768,772,777,781,786,790,795,799,804],{"type":33,"tag":102,"props":749,"children":750},{"style":119},[751],{"type":38,"value":752},"  device_type Enum8(",{"type":33,"tag":102,"props":754,"children":755},{"style":156},[756],{"type":38,"value":757},"'desktop'",{"type":33,"tag":102,"props":759,"children":760},{"style":125},[761],{"type":38,"value":762},"=",{"type":33,"tag":102,"props":764,"children":765},{"style":145},[766],{"type":38,"value":767},"1",{"type":33,"tag":102,"props":769,"children":770},{"style":119},[771],{"type":38,"value":269},{"type":33,"tag":102,"props":773,"children":774},{"style":156},[775],{"type":38,"value":776},"'mobile'",{"type":33,"tag":102,"props":778,"children":779},{"style":125},[780],{"type":38,"value":762},{"type":33,"tag":102,"props":782,"children":783},{"style":145},[784],{"type":38,"value":785},"2",{"type":33,"tag":102,"props":787,"children":788},{"style":119},[789],{"type":38,"value":269},{"type":33,"tag":102,"props":791,"children":792},{"style":156},[793],{"type":38,"value":794},"'tablet'",{"type":33,"tag":102,"props":796,"children":797},{"style":125},[798],{"type":38,"value":762},{"type":33,"tag":102,"props":800,"children":801},{"style":145},[802],{"type":38,"value":803},"3",{"type":33,"tag":102,"props":805,"children":806},{"style":119},[807],{"type":38,"value":808},")\n",{"type":33,"tag":102,"props":810,"children":811},{"class":104,"line":370},[812,817,821],{"type":33,"tag":102,"props":813,"children":814},{"style":119},[815],{"type":38,"value":816},") ENGINE ",{"type":33,"tag":102,"props":818,"children":819},{"style":125},[820],{"type":38,"value":762},{"type":33,"tag":102,"props":822,"children":823},{"style":119},[824],{"type":38,"value":825}," MergeTree()\n",{"type":33,"tag":102,"props":827,"children":828},{"class":104,"line":379},[829,834,839,844,849],{"type":33,"tag":102,"props":830,"children":831},{"style":125},[832],{"type":38,"value":833},"PARTITION",{"type":33,"tag":102,"props":835,"children":836},{"style":125},[837],{"type":38,"value":838}," BY",{"type":33,"tag":102,"props":840,"children":841},{"style":119},[842],{"type":38,"value":843}," toYYYYMM(",{"type":33,"tag":102,"props":845,"children":846},{"style":125},[847],{"type":38,"value":848},"timestamp",{"type":33,"tag":102,"props":850,"children":851},{"style":119},[852],{"type":38,"value":808},{"type":33,"tag":102,"props":854,"children":855},{"class":104,"line":393},[856,861,866,870],{"type":33,"tag":102,"props":857,"children":858},{"style":125},[859],{"type":38,"value":860},"ORDER BY",{"type":33,"tag":102,"props":862,"children":863},{"style":119},[864],{"type":38,"value":865}," (domain, toDate(",{"type":33,"tag":102,"props":867,"children":868},{"style":125},[869],{"type":38,"value":848},{"type":33,"tag":102,"props":871,"children":872},{"style":119},[873],{"type":38,"value":874},"), session_hash);\n",{"type":33,"tag":34,"props":876,"children":877},{},[878],{"type":38,"value":879},"Aggregations-Queries laufen in ClickHouse' MergeTree-Engine extrem schnell: \"Täglich unique Sessions\" über 100M Events dauert 200–400 ms.",{"type":33,"tag":41,"props":881,"children":883},{"id":882},"server-side-aggregation-session-cohort-retention",[884],{"type":38,"value":885},"Server-Side Aggregation: Session → Cohort → Retention",{"type":33,"tag":34,"props":887,"children":888},{},[889,891,896],{"type":38,"value":890},"Das Plausible-Dashboard zeigt \"einzigartige Sessions\" statt \"einzigartige Besucher\". Aber Cohort-basierte Retention, LTV-Projektion und Campaign Attribution brauchen eine Nutzer-Kennung. Cookieless: ",{"type":33,"tag":86,"props":892,"children":893},{},[894],{"type":38,"value":895},"Server-Side Identity Resolution + Aggregationsschicht",{"type":38,"value":312},{"type":33,"tag":34,"props":898,"children":899},{},[900,902,908],{"type":38,"value":901},"Szenario: E-Commerce-Site, sammelt Events mit Plausible, exportiert in BigQuery. Wenn der Nutzer sich anmeldet, wird ",{"type":33,"tag":53,"props":903,"children":905},{"className":904},[],[906],{"type":38,"value":907},"user_id",{"type":38,"value":909}," als Custom Property gesendet:",{"type":33,"tag":92,"props":911,"children":913},{"className":94,"code":912,"language":96,"meta":17,"style":17},"\u002F\u002F Checkout-Seite nach Anmeldung\nplausible('Login', { props: { user_id: '{{user.id}}' } });\n",[914],{"type":33,"tag":53,"props":915,"children":916},{"__ignoreMap":17},[917,925],{"type":33,"tag":102,"props":918,"children":919},{"class":104,"line":105},[920],{"type":33,"tag":102,"props":921,"children":922},{"style":109},[923],{"type":38,"value":924},"\u002F\u002F Checkout-Seite nach Anmeldung\n",{"type":33,"tag":102,"props":926,"children":927},{"class":104,"line":115},[928,932,936,941,946,951],{"type":33,"tag":102,"props":929,"children":930},{"style":184},[931],{"type":38,"value":23},{"type":33,"tag":102,"props":933,"children":934},{"style":119},[935],{"type":38,"value":122},{"type":33,"tag":102,"props":937,"children":938},{"style":156},[939],{"type":38,"value":940},"'Login'",{"type":33,"tag":102,"props":942,"children":943},{"style":119},[944],{"type":38,"value":945},", { props: { user_id: ",{"type":33,"tag":102,"props":947,"children":948},{"style":156},[949],{"type":38,"value":950},"'{{user.id}}'",{"type":33,"tag":102,"props":952,"children":953},{"style":119},[954],{"type":38,"value":955}," } });\n",{"type":33,"tag":34,"props":957,"children":958},{},[959,961,966],{"type":38,"value":960},"In BigQuery führt ein täglicher Batch-Job Plausible Events mit ",{"type":33,"tag":53,"props":962,"children":964},{"className":963},[],[965],{"type":38,"value":907},{"type":38,"value":967}," zusammen:",{"type":33,"tag":92,"props":969,"children":971},{"className":633,"code":970,"language":635,"meta":17,"style":17},"-- dbt model: user_sessions_daily.sql\nWITH raw_events AS (\n  SELECT\n    timestamp,\n    session_hash,\n    JSON_EXTRACT_SCALAR(props, '$.user_id') AS user_id,\n    pathname,\n    event_name\n  FROM `analytics.plausible_events`\n  WHERE DATE(timestamp) = CURRENT_DATE - 1\n),\nidentified_sessions AS (\n  SELECT\n    session_hash,\n    FIRST_VALUE(user_id IGNORE NULLS) OVER (\n      PARTITION BY session_hash ORDER BY timestamp\n    ) AS resolved_user_id\n  FROM raw_events\n)\nSELECT\n  e.timestamp,\n  e.session_hash,\n  COALESCE(i.resolved_user_id, e.session_hash) AS user_key,\n  e.pathname,\n  e.event_name\nFROM raw_events e\nLEFT JOIN identified_sessions i USING (session_hash);\n",[972],{"type":33,"tag":53,"props":973,"children":974},{"__ignoreMap":17},[975,983,1005,1013,1025,1033,1059,1067,1075,1088,1132,1140,1156,1163,1170,1206,1232,1249,1261,1268,1276,1296,1316,1371,1391,1407,1420],{"type":33,"tag":102,"props":976,"children":977},{"class":104,"line":105},[978],{"type":33,"tag":102,"props":979,"children":980},{"style":109},[981],{"type":38,"value":982},"-- dbt model: user_sessions_daily.sql\n",{"type":33,"tag":102,"props":984,"children":985},{"class":104,"line":115},[986,991,996,1001],{"type":33,"tag":102,"props":987,"children":988},{"style":125},[989],{"type":38,"value":990},"WITH",{"type":33,"tag":102,"props":992,"children":993},{"style":119},[994],{"type":38,"value":995}," raw_events ",{"type":33,"tag":102,"props":997,"children":998},{"style":125},[999],{"type":38,"value":1000},"AS",{"type":33,"tag":102,"props":1002,"children":1003},{"style":119},[1004],{"type":38,"value":662},{"type":33,"tag":102,"props":1006,"children":1007},{"class":104,"line":136},[1008],{"type":33,"tag":102,"props":1009,"children":1010},{"style":125},[1011],{"type":38,"value":1012},"  SELECT\n",{"type":33,"tag":102,"props":1014,"children":1015},{"class":104,"line":167},[1016,1021],{"type":33,"tag":102,"props":1017,"children":1018},{"style":125},[1019],{"type":38,"value":1020},"    timestamp",{"type":33,"tag":102,"props":1022,"children":1023},{"style":119},[1024],{"type":38,"value":680},{"type":33,"tag":102,"props":1026,"children":1027},{"class":104,"line":234},[1028],{"type":33,"tag":102,"props":1029,"children":1030},{"style":119},[1031],{"type":38,"value":1032},"    session_hash,\n",{"type":33,"tag":102,"props":1034,"children":1035},{"class":104,"line":243},[1036,1041,1046,1050,1054],{"type":33,"tag":102,"props":1037,"children":1038},{"style":119},[1039],{"type":38,"value":1040},"    JSON_EXTRACT_SCALAR(props, ",{"type":33,"tag":102,"props":1042,"children":1043},{"style":156},[1044],{"type":38,"value":1045},"'$.user_id'",{"type":33,"tag":102,"props":1047,"children":1048},{"style":119},[1049],{"type":38,"value":507},{"type":33,"tag":102,"props":1051,"children":1052},{"style":125},[1053],{"type":38,"value":1000},{"type":33,"tag":102,"props":1055,"children":1056},{"style":119},[1057],{"type":38,"value":1058}," user_id,\n",{"type":33,"tag":102,"props":1060,"children":1061},{"class":104,"line":286},[1062],{"type":33,"tag":102,"props":1063,"children":1064},{"style":119},[1065],{"type":38,"value":1066},"    pathname,\n",{"type":33,"tag":102,"props":1068,"children":1069},{"class":104,"line":325},[1070],{"type":33,"tag":102,"props":1071,"children":1072},{"style":119},[1073],{"type":38,"value":1074},"    event_name\n",{"type":33,"tag":102,"props":1076,"children":1077},{"class":104,"line":27},[1078,1083],{"type":33,"tag":102,"props":1079,"children":1080},{"style":125},[1081],{"type":38,"value":1082},"  FROM",{"type":33,"tag":102,"props":1084,"children":1085},{"style":156},[1086],{"type":38,"value":1087}," `analytics.plausible_events`\n",{"type":33,"tag":102,"props":1089,"children":1090},{"class":104,"line":352},[1091,1096,1101,1105,1109,1113,1117,1122,1127],{"type":33,"tag":102,"props":1092,"children":1093},{"style":125},[1094],{"type":38,"value":1095},"  WHERE",{"type":33,"tag":102,"props":1097,"children":1098},{"style":125},[1099],{"type":38,"value":1100}," DATE",{"type":33,"tag":102,"props":1102,"children":1103},{"style":119},[1104],{"type":38,"value":122},{"type":33,"tag":102,"props":1106,"children":1107},{"style":125},[1108],{"type":38,"value":848},{"type":33,"tag":102,"props":1110,"children":1111},{"style":119},[1112],{"type":38,"value":507},{"type":33,"tag":102,"props":1114,"children":1115},{"style":125},[1116],{"type":38,"value":762},{"type":33,"tag":102,"props":1118,"children":1119},{"style":119},[1120],{"type":38,"value":1121}," CURRENT_DATE ",{"type":33,"tag":102,"props":1123,"children":1124},{"style":125},[1125],{"type":38,"value":1126},"-",{"type":33,"tag":102,"props":1128,"children":1129},{"style":145},[1130],{"type":38,"value":1131}," 1\n",{"type":33,"tag":102,"props":1133,"children":1134},{"class":104,"line":361},[1135],{"type":33,"tag":102,"props":1136,"children":1137},{"style":119},[1138],{"type":38,"value":1139},"),\n",{"type":33,"tag":102,"props":1141,"children":1142},{"class":104,"line":370},[1143,1148,1152],{"type":33,"tag":102,"props":1144,"children":1145},{"style":119},[1146],{"type":38,"value":1147},"identified_sessions ",{"type":33,"tag":102,"props":1149,"children":1150},{"style":125},[1151],{"type":38,"value":1000},{"type":33,"tag":102,"props":1153,"children":1154},{"style":119},[1155],{"type":38,"value":662},{"type":33,"tag":102,"props":1157,"children":1158},{"class":104,"line":379},[1159],{"type":33,"tag":102,"props":1160,"children":1161},{"style":125},[1162],{"type":38,"value":1012},{"type":33,"tag":102,"props":1164,"children":1165},{"class":104,"line":393},[1166],{"type":33,"tag":102,"props":1167,"children":1168},{"style":119},[1169],{"type":38,"value":1032},{"type":33,"tag":102,"props":1171,"children":1172},{"class":104,"line":407},[1173,1178,1183,1188,1193,1197,1202],{"type":33,"tag":102,"props":1174,"children":1175},{"style":145},[1176],{"type":38,"value":1177},"    FIRST_VALUE",{"type":33,"tag":102,"props":1179,"children":1180},{"style":119},[1181],{"type":38,"value":1182},"(user_id ",{"type":33,"tag":102,"props":1184,"children":1185},{"style":125},[1186],{"type":38,"value":1187},"IGNORE",{"type":33,"tag":102,"props":1189,"children":1190},{"style":125},[1191],{"type":38,"value":1192}," NULLS",{"type":33,"tag":102,"props":1194,"children":1195},{"style":119},[1196],{"type":38,"value":507},{"type":33,"tag":102,"props":1198,"children":1199},{"style":125},[1200],{"type":38,"value":1201},"OVER",{"type":33,"tag":102,"props":1203,"children":1204},{"style":119},[1205],{"type":38,"value":662},{"type":33,"tag":102,"props":1207,"children":1208},{"class":104,"line":416},[1209,1214,1218,1223,1227],{"type":33,"tag":102,"props":1210,"children":1211},{"style":125},[1212],{"type":38,"value":1213},"      PARTITION",{"type":33,"tag":102,"props":1215,"children":1216},{"style":125},[1217],{"type":38,"value":838},{"type":33,"tag":102,"props":1219,"children":1220},{"style":119},[1221],{"type":38,"value":1222}," session_hash ",{"type":33,"tag":102,"props":1224,"children":1225},{"style":125},[1226],{"type":38,"value":860},{"type":33,"tag":102,"props":1228,"children":1229},{"style":125},[1230],{"type":38,"value":1231}," timestamp\n",{"type":33,"tag":102,"props":1233,"children":1234},{"class":104,"line":425},[1235,1240,1244],{"type":33,"tag":102,"props":1236,"children":1237},{"style":119},[1238],{"type":38,"value":1239},"    ) ",{"type":33,"tag":102,"props":1241,"children":1242},{"style":125},[1243],{"type":38,"value":1000},{"type":33,"tag":102,"props":1245,"children":1246},{"style":119},[1247],{"type":38,"value":1248}," resolved_user_id\n",{"type":33,"tag":102,"props":1250,"children":1251},{"class":104,"line":433},[1252,1256],{"type":33,"tag":102,"props":1253,"children":1254},{"style":125},[1255],{"type":38,"value":1082},{"type":33,"tag":102,"props":1257,"children":1258},{"style":119},[1259],{"type":38,"value":1260}," raw_events\n",{"type":33,"tag":102,"props":1262,"children":1263},{"class":104,"line":455},[1264],{"type":33,"tag":102,"props":1265,"children":1266},{"style":119},[1267],{"type":38,"value":808},{"type":33,"tag":102,"props":1269,"children":1270},{"class":104,"line":463},[1271],{"type":33,"tag":102,"props":1272,"children":1273},{"style":125},[1274],{"type":38,"value":1275},"SELECT\n",{"type":33,"tag":102,"props":1277,"children":1278},{"class":104,"line":472},[1279,1284,1288,1292],{"type":33,"tag":102,"props":1280,"children":1281},{"style":145},[1282],{"type":38,"value":1283},"  e",{"type":33,"tag":102,"props":1285,"children":1286},{"style":119},[1287],{"type":38,"value":312},{"type":33,"tag":102,"props":1289,"children":1290},{"style":145},[1291],{"type":38,"value":848},{"type":33,"tag":102,"props":1293,"children":1294},{"style":119},[1295],{"type":38,"value":680},{"type":33,"tag":102,"props":1297,"children":1298},{"class":104,"line":520},[1299,1303,1307,1312],{"type":33,"tag":102,"props":1300,"children":1301},{"style":145},[1302],{"type":38,"value":1283},{"type":33,"tag":102,"props":1304,"children":1305},{"style":119},[1306],{"type":38,"value":312},{"type":33,"tag":102,"props":1308,"children":1309},{"style":145},[1310],{"type":38,"value":1311},"session_hash",{"type":33,"tag":102,"props":1313,"children":1314},{"style":119},[1315],{"type":38,"value":680},{"type":33,"tag":102,"props":1317,"children":1318},{"class":104,"line":553},[1319,1324,1328,1333,1337,1342,1346,1350,1354,1358,1362,1366],{"type":33,"tag":102,"props":1320,"children":1321},{"style":145},[1322],{"type":38,"value":1323},"  COALESCE",{"type":33,"tag":102,"props":1325,"children":1326},{"style":119},[1327],{"type":38,"value":122},{"type":33,"tag":102,"props":1329,"children":1330},{"style":145},[1331],{"type":38,"value":1332},"i",{"type":33,"tag":102,"props":1334,"children":1335},{"style":119},[1336],{"type":38,"value":312},{"type":33,"tag":102,"props":1338,"children":1339},{"style":145},[1340],{"type":38,"value":1341},"resolved_user_id",{"type":33,"tag":102,"props":1343,"children":1344},{"style":119},[1345],{"type":38,"value":269},{"type":33,"tag":102,"props":1347,"children":1348},{"style":145},[1349],{"type":38,"value":502},{"type":33,"tag":102,"props":1351,"children":1352},{"style":119},[1353],{"type":38,"value":312},{"type":33,"tag":102,"props":1355,"children":1356},{"style":145},[1357],{"type":38,"value":1311},{"type":33,"tag":102,"props":1359,"children":1360},{"style":119},[1361],{"type":38,"value":507},{"type":33,"tag":102,"props":1363,"children":1364},{"style":125},[1365],{"type":38,"value":1000},{"type":33,"tag":102,"props":1367,"children":1368},{"style":119},[1369],{"type":38,"value":1370}," user_key,\n",{"type":33,"tag":102,"props":1372,"children":1373},{"class":104,"line":575},[1374,1378,1382,1387],{"type":33,"tag":102,"props":1375,"children":1376},{"style":145},[1377],{"type":38,"value":1283},{"type":33,"tag":102,"props":1379,"children":1380},{"style":119},[1381],{"type":38,"value":312},{"type":33,"tag":102,"props":1383,"children":1384},{"style":145},[1385],{"type":38,"value":1386},"pathname",{"type":33,"tag":102,"props":1388,"children":1389},{"style":119},[1390],{"type":38,"value":680},{"type":33,"tag":102,"props":1392,"children":1393},{"class":104,"line":584},[1394,1398,1402],{"type":33,"tag":102,"props":1395,"children":1396},{"style":145},[1397],{"type":38,"value":1283},{"type":33,"tag":102,"props":1399,"children":1400},{"style":119},[1401],{"type":38,"value":312},{"type":33,"tag":102,"props":1403,"children":1404},{"style":145},[1405],{"type":38,"value":1406},"event_name\n",{"type":33,"tag":102,"props":1408,"children":1409},{"class":104,"line":593},[1410,1415],{"type":33,"tag":102,"props":1411,"children":1412},{"style":125},[1413],{"type":38,"value":1414},"FROM",{"type":33,"tag":102,"props":1416,"children":1417},{"style":119},[1418],{"type":38,"value":1419}," raw_events e\n",{"type":33,"tag":102,"props":1421,"children":1423},{"class":104,"line":1422},27,[1424,1429,1434,1439],{"type":33,"tag":102,"props":1425,"children":1426},{"style":125},[1427],{"type":38,"value":1428},"LEFT JOIN",{"type":33,"tag":102,"props":1430,"children":1431},{"style":119},[1432],{"type":38,"value":1433}," identified_sessions i ",{"type":33,"tag":102,"props":1435,"children":1436},{"style":125},[1437],{"type":38,"value":1438},"USING",{"type":33,"tag":102,"props":1440,"children":1441},{"style":119},[1442],{"type":38,"value":1443}," (session_hash);\n",{"type":33,"tag":34,"props":1445,"children":1446},{},[1447,1449,1455,1457,1462,1464,1469,1471,1476],{"type":38,"value":1448},"Hier ist ",{"type":33,"tag":53,"props":1450,"children":1452},{"className":1451},[],[1453],{"type":38,"value":1454},"user_key",{"type":38,"value":1456}," für angemeldete Nutzer ",{"type":33,"tag":53,"props":1458,"children":1460},{"className":1459},[],[1461],{"type":38,"value":907},{"type":38,"value":1463}," und für anonyme Sessions ",{"type":33,"tag":53,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":38,"value":1311},{"type":38,"value":1470},". Retention kann jetzt über ",{"type":33,"tag":53,"props":1472,"children":1474},{"className":1473},[],[1475],{"type":38,"value":1454},{"type":38,"value":1477}," berechnet werden:",{"type":33,"tag":92,"props":1479,"children":1481},{"className":633,"code":1480,"language":635,"meta":17,"style":17},"-- 7-day Retention Cohort\nSELECT\n  DATE_TRUNC(first_seen, WEEK) AS cohort_week,\n  COUNT(DISTINCT user_key) AS cohort_size,\n  COUNT(DISTINCT CASE WHEN day_7_active THEN user_key END) AS retained_d7,\n  SAFE_DIVIDE(\n    COUNT(DISTINCT CASE WHEN day_7_active THEN user_key END),\n    COUNT(DISTINCT user_key)\n  ) AS retention_rate\nFROM user_retention_facts\nGROUP BY 1;\n",[1482],{"type":33,"tag":53,"props":1483,"children":1484},{"__ignoreMap":17},[1485,1493,1500,1526,1557,1615,1623,1667,1687,1704,1716],{"type":33,"tag":102,"props":1486,"children":1487},{"class":104,"line":105},[1488],{"type":33,"tag":102,"props":1489,"children":1490},{"style":109},[1491],{"type":38,"value":1492},"-- 7-day Retention Cohort\n",{"type":33,"tag":102,"props":1494,"children":1495},{"class":104,"line":115},[1496],{"type":33,"tag":102,"props":1497,"children":1498},{"style":125},[1499],{"type":38,"value":1275},{"type":33,"tag":102,"props":1501,"children":1502},{"class":104,"line":136},[1503,1508,1513,1517,1521],{"type":33,"tag":102,"props":1504,"children":1505},{"style":119},[1506],{"type":38,"value":1507},"  DATE_TRUNC(first_seen, ",{"type":33,"tag":102,"props":1509,"children":1510},{"style":125},[1511],{"type":38,"value":1512},"WEEK",{"type":33,"tag":102,"props":1514,"children":1515},{"style":119},[1516],{"type":38,"value":507},{"type":33,"tag":102,"props":1518,"children":1519},{"style":125},[1520],{"type":38,"value":1000},{"type":33,"tag":102,"props":1522,"children":1523},{"style":119},[1524],{"type":38,"value":1525}," cohort_week,\n",{"type":33,"tag":102,"props":1527,"children":1528},{"class":104,"line":167},[1529,1534,1538,1543,1548,1552],{"type":33,"tag":102,"props":1530,"children":1531},{"style":145},[1532],{"type":38,"value":1533},"  COUNT",{"type":33,"tag":102,"props":1535,"children":1536},{"style":119},[1537],{"type":38,"value":122},{"type":33,"tag":102,"props":1539,"children":1540},{"style":125},[1541],{"type":38,"value":1542},"DISTINCT",{"type":33,"tag":102,"props":1544,"children":1545},{"style":119},[1546],{"type":38,"value":1547}," user_key) ",{"type":33,"tag":102,"props":1549,"children":1550},{"style":125},[1551],{"type":38,"value":1000},{"type":33,"tag":102,"props":1553,"children":1554},{"style":119},[1555],{"type":38,"value":1556}," cohort_size,\n",{"type":33,"tag":102,"props":1558,"children":1559},{"class":104,"line":234},[1560,1564,1568,1572,1577,1582,1587,1592,1597,1602,1606,1610],{"type":33,"tag":102,"props":1561,"children":1562},{"style":145},[1563],{"type":38,"value":1533},{"type":33,"tag":102,"props":1565,"children":1566},{"style":119},[1567],{"type":38,"value":122},{"type":33,"tag":102,"props":1569,"children":1570},{"style":125},[1571],{"type":38,"value":1542},{"type":33,"tag":102,"props":1573,"children":1574},{"style":125},[1575],{"type":38,"value":1576}," CASE",{"type":33,"tag":102,"props":1578,"children":1579},{"style":125},[1580],{"type":38,"value":1581}," WHEN",{"type":33,"tag":102,"props":1583,"children":1584},{"style":119},[1585],{"type":38,"value":1586}," day_7_active ",{"type":33,"tag":102,"props":1588,"children":1589},{"style":125},[1590],{"type":38,"value":1591},"THEN",{"type":33,"tag":102,"props":1593,"children":1594},{"style":119},[1595],{"type":38,"value":1596}," user_key ",{"type":33,"tag":102,"props":1598,"children":1599},{"style":125},[1600],{"type":38,"value":1601},"END",{"type":33,"tag":102,"props":1603,"children":1604},{"style":119},[1605],{"type":38,"value":507},{"type":33,"tag":102,"props":1607,"children":1608},{"style":125},[1609],{"type":38,"value":1000},{"type":33,"tag":102,"props":1611,"children":1612},{"style":119},[1613],{"type":38,"value":1614}," retained_d7,\n",{"type":33,"tag":102,"props":1616,"children":1617},{"class":104,"line":243},[1618],{"type":33,"tag":102,"props":1619,"children":1620},{"style":119},[1621],{"type":38,"value":1622},"  SAFE_DIVIDE(\n",{"type":33,"tag":102,"props":1624,"children":1625},{"class":104,"line":286},[1626,1631,1635,1639,1643,1647,1651,1655,1659,1663],{"type":33,"tag":102,"props":1627,"children":1628},{"style":145},[1629],{"type":38,"value":1630},"    COUNT",{"type":33,"tag":102,"props":1632,"children":1633},{"style":119},[1634],{"type":38,"value":122},{"type":33,"tag":102,"props":1636,"children":1637},{"style":125},[1638],{"type":38,"value":1542},{"type":33,"tag":102,"props":1640,"children":1641},{"style":125},[1642],{"type":38,"value":1576},{"type":33,"tag":102,"props":1644,"children":1645},{"style":125},[1646],{"type":38,"value":1581},{"type":33,"tag":102,"props":1648,"children":1649},{"style":119},[1650],{"type":38,"value":1586},{"type":33,"tag":102,"props":1652,"children":1653},{"style":125},[1654],{"type":38,"value":1591},{"type":33,"tag":102,"props":1656,"children":1657},{"style":119},[1658],{"type":38,"value":1596},{"type":33,"tag":102,"props":1660,"children":1661},{"style":125},[1662],{"type":38,"value":1601},{"type":33,"tag":102,"props":1664,"children":1665},{"style":119},[1666],{"type":38,"value":1139},{"type":33,"tag":102,"props":1668,"children":1669},{"class":104,"line":325},[1670,1674,1678,1682],{"type":33,"tag":102,"props":1671,"children":1672},{"style":145},[1673],{"type":38,"value":1630},{"type":33,"tag":102,"props":1675,"children":1676},{"style":119},[1677],{"type":38,"value":122},{"type":33,"tag":102,"props":1679,"children":1680},{"style":125},[1681],{"type":38,"value":1542},{"type":33,"tag":102,"props":1683,"children":1684},{"style":119},[1685],{"type":38,"value":1686}," user_key)\n",{"type":33,"tag":102,"props":1688,"children":1689},{"class":104,"line":27},[1690,1695,1699],{"type":33,"tag":102,"props":1691,"children":1692},{"style":119},[1693],{"type":38,"value":1694},"  ) ",{"type":33,"tag":102,"props":1696,"children":1697},{"style":125},[1698],{"type":38,"value":1000},{"type":33,"tag":102,"props":1700,"children":1701},{"style":119},[1702],{"type":38,"value":1703}," retention_rate\n",{"type":33,"tag":102,"props":1705,"children":1706},{"class":104,"line":352},[1707,1711],{"type":33,"tag":102,"props":1708,"children":1709},{"style":125},[1710],{"type":38,"value":1414},{"type":33,"tag":102,"props":1712,"children":1713},{"style":119},[1714],{"type":38,"value":1715}," user_retention_facts\n",{"type":33,"tag":102,"props":1717,"children":1718},{"class":104,"line":361},[1719,1724,1729],{"type":33,"tag":102,"props":1720,"children":1721},{"style":125},[1722],{"type":38,"value":1723},"GROUP BY",{"type":33,"tag":102,"props":1725,"children":1726},{"style":145},[1727],{"type":38,"value":1728}," 1",{"type":33,"tag":102,"props":1730,"children":1731},{"style":119},[1732],{"type":38,"value":164},{"type":33,"tag":34,"props":1734,"children":1735},{},[1736],{"type":38,"value":1737},"Anonyme Sessions sind in dieser Cohort-Analyse enthalten, fallen aber aus Langzeit-LTV-Berechnungen heraus, weil Sessions an verschiedenen Tagen nicht verfolgbar sind. Bei einer Site mit 30% Login-Rate können Sie trotzdem Cohort-basierte Retention für 30% der echten Nutzer messen – vergleichbar mit GA4s 35–40% Consent Rate, aber ohne DSGVO-Risiko.",{"type":33,"tag":41,"props":1739,"children":1741},{"id":1740},"ga4-vs-plausible-compliance-versus-granularität",[1742],{"type":38,"value":1743},"GA4 vs. Plausible: Compliance versus Granularität",{"type":33,"tag":34,"props":1745,"children":1746},{},[1747],{"type":33,"tag":86,"props":1748,"children":1749},{},[1750],{"type":38,"value":1751},"GA4-Vorteile:",{"type":33,"tag":1753,"props":1754,"children":1755},"ul",{},[1756,1762,1767,1772],{"type":33,"tag":1757,"props":1758,"children":1759},"li",{},[1760],{"type":38,"value":1761},"User ID + Google Signals für Cross-Device-Tracking (mit Consent)",{"type":33,"tag":1757,"props":1763,"children":1764},{},[1765],{"type":38,"value":1766},"BigQuery Export nativ, stabiles Schema",{"type":33,"tag":1757,"props":1768,"children":1769},{},[1770],{"type":38,"value":1771},"Funnel, Path Exploration Reports im UI fertig",{"type":33,"tag":1757,"props":1773,"children":1774},{},[1775],{"type":38,"value":1776},"Google Ads Integration One-Click",{"type":33,"tag":34,"props":1778,"children":1779},{},[1780],{"type":33,"tag":86,"props":1781,"children":1782},{},[1783],{"type":38,"value":1784},"GA4-Nachteile:",{"type":33,"tag":1753,"props":1786,"children":1787},{},[1788,1800,1813,1818],{"type":33,"tag":1757,"props":1789,"children":1790},{},[1791,1793,1798],{"type":38,"value":1792},"Consent Mode v2 verpflichtend → bei ",{"type":33,"tag":53,"props":1794,"children":1796},{"className":1795},[],[1797],{"type":38,"value":58},{"type":38,"value":1799}," modellierte Daten",{"type":33,"tag":1757,"props":1801,"children":1802},{},[1803,1805,1811],{"type":38,"value":1804},"360 Tage User-ID-Retention (nach 14 Monaten ",{"type":33,"tag":53,"props":1806,"children":1808},{"className":1807},[],[1809],{"type":38,"value":1810},"user_pseudo_id",{"type":38,"value":1812}," Reset)",{"type":33,"tag":1757,"props":1814,"children":1815},{},[1816],{"type":38,"value":1817},"Script 43 KB groß (30x Plausible)",{"type":33,"tag":1757,"props":1819,"children":1820},{},[1821],{"type":38,"value":1822},"ClickStream Export braucht GA360 (€150K\u002FJahr)",{"type":33,"tag":34,"props":1824,"children":1825},{},[1826],{"type":33,"tag":86,"props":1827,"children":1828},{},[1829],{"type":38,"value":1830},"Plausible + Server-Side Stack: Vorteile",{"type":33,"tag":1753,"props":1832,"children":1833},{},[1834,1839,1844,1849],{"type":33,"tag":1757,"props":1835,"children":1836},{},[1837],{"type":38,"value":1838},"Keine Cookies → GDPR Consent Banner optional (vereinfacht massiv)",{"type":33,"tag":1757,"props":1840,"children":1841},{},[1842],{"type":38,"value":1843},"Event Ownership: Raw Data unter eigener Kontrolle (ClickHouse, BigQuery, S3)",{"type":33,"tag":1757,"props":1845,"children":1846},{},[1847],{"type":38,"value":1848},"Leichtes Script → \u003C5 ms Seitenlade-Einfluss",{"type":33,"tag":1757,"props":1850,"children":1851},{},[1852],{"type":38,"value":1853},"Self-Hosted Option verfügbar (Daten bleiben in EU)",{"type":33,"tag":34,"props":1855,"children":1856},{},[1857],{"type":33,"tag":86,"props":1858,"children":1859},{},[1860],{"type":38,"value":1861},"Plausible: Nachteile",{"type":33,"tag":1753,"props":1863,"children":1864},{},[1865,1870,1875],{"type":33,"tag":1757,"props":1866,"children":1867},{},[1868],{"type":38,"value":1869},"Kein Cross-Device-Tracking (für nicht-angemeldete Nutzer)",{"type":33,"tag":1757,"props":1871,"children":1872},{},[1873],{"type":38,"value":1874},"Funnel\u002FPath-Analyse braucht eigene SQL",{"type":33,"tag":1757,"props":1876,"children":1877},{},[1878],{"type":38,"value":1879},"Google Ads\u002FMeta Conversion API braucht Custom Pipeline",{"type":33,"tag":34,"props":1881,"children":1882},{},[1883],{"type":33,"tag":86,"props":1884,"children":1885},{},[1886],{"type":38,"value":1887},"Kostenvergleich (100M Events\u002FMonat):",{"type":33,"tag":1753,"props":1889,"children":1890},{},[1891,1896,1901,1906],{"type":33,"tag":1757,"props":1892,"children":1893},{},[1894],{"type":38,"value":1895},"GA4 Standard: kostenlos, aber kein BigQuery Export (GA360: €150K\u002FJahr)",{"type":33,"tag":1757,"props":1897,"children":1898},{},[1899],{"type":38,"value":1900},"Plausible Cloud: Business €200\u002FMonat (200K Pageviews\u002FMonat, Self-Host für Überschuss)",{"type":33,"tag":1757,"props":1902,"children":1903},{},[1904],{"type":38,"value":1905},"Self-Hosted Plausible + ClickHouse (AWS c6g.2xlarge + 500 GB SSD): ~€350\u002FMonat",{"type":33,"tag":1757,"props":1907,"children":1908},{},[1909],{"type":38,"value":1910},"BigQuery Batch Job (täglich Aggregation): ~€80\u002FMonat",{"type":33,"tag":34,"props":1912,"children":1913},{},[1914],{"type":38,"value":1915},"Plausible Stack Gesamt: ~€430\u002FMonat. GA360: €12.5K\u002FMonat. 30x Kostenunterschied.",{"type":33,"tag":41,"props":1917,"children":1919},{"id":1918},"identity-resolution-layer-probabilistic-match",[1920],{"type":38,"value":1921},"Identity Resolution Layer: Probabilistic Match",{"type":33,"tag":34,"props":1923,"children":1924},{},[1925,1927,1932,1934,1939],{"type":38,"value":1926},"Um auch nicht-angemeldete Nutzer über Sessions hinweg zu identifizieren, kann ",{"type":33,"tag":86,"props":1928,"children":1929},{},[1930],{"type":38,"value":1931},"probabilistic identity resolution",{"type":38,"value":1933}," genutzt werden. Fingerprinting ist verboten (DSGVO, ePrivacy), aber ",{"type":33,"tag":86,"props":1935,"children":1936},{},[1937],{"type":38,"value":1938},"Server-Side Signal Aggregation",{"type":38,"value":1940}," liefert ähnliche Ergebnisse.",{"type":33,"tag":34,"props":1942,"children":1943},{},[1944,1946,1952],{"type":38,"value":1945},"Im Beispiel erzeugt die Kombination ",{"type":33,"tag":53,"props":1947,"children":1949},{"className":1948},[],[1950],{"type":38,"value":1951},"user_agent + IP Subnet + timezone + screen resolution",{"type":38,"value":1953}," einen Hash:",{"type":33,"tag":92,"props":1955,"children":1957},{"className":633,"code":1956,"language":635,"meta":17,"style":17},"-- BigQuery UDF: probabilistic_user_id\nCREATE TEMP FUNCTION probabilistic_user_id(ua STRING, ip STRING, tz STRING, res STRING)\nRETURNS STRING\nAS (\n  TO_BASE64(SHA256(CONCAT(\n    REGEXP_EXTRACT(ua, r'^[^\u002F]+'),  -- Browser Family\n    NET.IP_TRUNC(NET.SAFE_IP_FROM_STRING(ip), 24),  -- \u002F24 Subnet\n    tz,\n    res\n  )))\n);\n\nSELECT\n  timestamp,\n  session_hash,\n  probabilistic_user_id(user_agent, ip_address, timezone, screen_resolution) AS prob_user_id\nFROM plausible_events;\n",[1958],{"type":33,"tag":53,"props":1959,"children":1960},{"__ignoreMap":17},[1961,1969,1991,2004,2015,2033,2056,2110,2118,2126,2134,2141,2150,2157,2168,2176,2193],{"type":33,"tag":102,"props":1962,"children":1963},{"class":104,"line":105},[1964],{"type":33,"tag":102,"props":1965,"children":1966},{"style":109},[1967],{"type":38,"value":1968},"-- BigQuery UDF: probabilistic_user_id\n",{"type":33,"tag":102,"props":1970,"children":1971},{"class":104,"line":115},[1972,1976,1981,1986],{"type":33,"tag":102,"props":1973,"children":1974},{"style":125},[1975],{"type":38,"value":647},{"type":33,"tag":102,"props":1977,"children":1978},{"style":119},[1979],{"type":38,"value":1980}," TEMP ",{"type":33,"tag":102,"props":1982,"children":1983},{"style":125},[1984],{"type":38,"value":1985},"FUNCTION",{"type":33,"tag":102,"props":1987,"children":1988},{"style":119},[1989],{"type":38,"value":1990}," probabilistic_user_id(ua STRING, ip STRING, tz STRING, res STRING)\n",{"type":33,"tag":102,"props":1992,"children":1993},{"class":104,"line":136},[1994,1999],{"type":33,"tag":102,"props":1995,"children":1996},{"style":125},[1997],{"type":38,"value":1998},"RETURNS",{"type":33,"tag":102,"props":2000,"children":2001},{"style":119},[2002],{"type":38,"value":2003}," STRING\n",{"type":33,"tag":102,"props":2005,"children":2006},{"class":104,"line":167},[2007,2011],{"type":33,"tag":102,"props":2008,"children":2009},{"style":125},[2010],{"type":38,"value":1000},{"type":33,"tag":102,"props":2012,"children":2013},{"style":119},[2014],{"type":38,"value":662},{"type":33,"tag":102,"props":2016,"children":2017},{"class":104,"line":234},[2018,2023,2028],{"type":33,"tag":102,"props":2019,"children":2020},{"style":119},[2021],{"type":38,"value":2022},"  TO_BASE64(SHA256(",{"type":33,"tag":102,"props":2024,"children":2025},{"style":145},[2026],{"type":38,"value":2027},"CONCAT",{"type":33,"tag":102,"props":2029,"children":2030},{"style":119},[2031],{"type":38,"value":2032},"(\n",{"type":33,"tag":102,"props":2034,"children":2035},{"class":104,"line":243},[2036,2041,2046,2051],{"type":33,"tag":102,"props":2037,"children":2038},{"style":119},[2039],{"type":38,"value":2040},"    REGEXP_EXTRACT(ua, r",{"type":33,"tag":102,"props":2042,"children":2043},{"style":156},[2044],{"type":38,"value":2045},"'^[^\u002F]+'",{"type":33,"tag":102,"props":2047,"children":2048},{"style":119},[2049],{"type":38,"value":2050},"),  ",{"type":33,"tag":102,"props":2052,"children":2053},{"style":109},[2054],{"type":38,"value":2055},"-- Browser Family\n",{"type":33,"tag":102,"props":2057,"children":2058},{"class":104,"line":286},[2059,2064,2068,2073,2077,2082,2086,2091,2096,2101,2105],{"type":33,"tag":102,"props":2060,"children":2061},{"style":145},[2062],{"type":38,"value":2063},"    NET",{"type":33,"tag":102,"props":2065,"children":2066},{"style":119},[2067],{"type":38,"value":312},{"type":33,"tag":102,"props":2069,"children":2070},{"style":145},[2071],{"type":38,"value":2072},"IP_TRUNC",{"type":33,"tag":102,"props":2074,"children":2075},{"style":119},[2076],{"type":38,"value":122},{"type":33,"tag":102,"props":2078,"children":2079},{"style":145},[2080],{"type":38,"value":2081},"NET",{"type":33,"tag":102,"props":2083,"children":2084},{"style":119},[2085],{"type":38,"value":312},{"type":33,"tag":102,"props":2087,"children":2088},{"style":145},[2089],{"type":38,"value":2090},"SAFE_IP_FROM_STRING",{"type":33,"tag":102,"props":2092,"children":2093},{"style":119},[2094],{"type":38,"value":2095},"(ip), ",{"type":33,"tag":102,"props":2097,"children":2098},{"style":145},[2099],{"type":38,"value":2100},"24",{"type":33,"tag":102,"props":2102,"children":2103},{"style":119},[2104],{"type":38,"value":2050},{"type":33,"tag":102,"props":2106,"children":2107},{"style":109},[2108],{"type":38,"value":2109},"-- \u002F24 Subnet\n",{"type":33,"tag":102,"props":2111,"children":2112},{"class":104,"line":325},[2113],{"type":33,"tag":102,"props":2114,"children":2115},{"style":119},[2116],{"type":38,"value":2117},"    tz,\n",{"type":33,"tag":102,"props":2119,"children":2120},{"class":104,"line":27},[2121],{"type":33,"tag":102,"props":2122,"children":2123},{"style":119},[2124],{"type":38,"value":2125},"    res\n",{"type":33,"tag":102,"props":2127,"children":2128},{"class":104,"line":352},[2129],{"type":33,"tag":102,"props":2130,"children":2131},{"style":119},[2132],{"type":38,"value":2133},"  )))\n",{"type":33,"tag":102,"props":2135,"children":2136},{"class":104,"line":361},[2137],{"type":33,"tag":102,"props":2138,"children":2139},{"style":119},[2140],{"type":38,"value":231},{"type":33,"tag":102,"props":2142,"children":2143},{"class":104,"line":370},[2144],{"type":33,"tag":102,"props":2145,"children":2147},{"emptyLinePlaceholder":2146},true,[2148],{"type":38,"value":2149},"\n",{"type":33,"tag":102,"props":2151,"children":2152},{"class":104,"line":379},[2153],{"type":33,"tag":102,"props":2154,"children":2155},{"style":125},[2156],{"type":38,"value":1275},{"type":33,"tag":102,"props":2158,"children":2159},{"class":104,"line":393},[2160,2164],{"type":33,"tag":102,"props":2161,"children":2162},{"style":125},[2163],{"type":38,"value":670},{"type":33,"tag":102,"props":2165,"children":2166},{"style":119},[2167],{"type":38,"value":680},{"type":33,"tag":102,"props":2169,"children":2170},{"class":104,"line":407},[2171],{"type":33,"tag":102,"props":2172,"children":2173},{"style":119},[2174],{"type":38,"value":2175},"  session_hash,\n",{"type":33,"tag":102,"props":2177,"children":2178},{"class":104,"line":416},[2179,2184,2188],{"type":33,"tag":102,"props":2180,"children":2181},{"style":119},[2182],{"type":38,"value":2183},"  probabilistic_user_id(user_agent, ip_address, timezone, screen_resolution) ",{"type":33,"tag":102,"props":2185,"children":2186},{"style":125},[2187],{"type":38,"value":1000},{"type":33,"tag":102,"props":2189,"children":2190},{"style":119},[2191],{"type":38,"value":2192}," prob_user_id\n",{"type":33,"tag":102,"props":2194,"children":2195},{"class":104,"line":425},[2196,2200],{"type":33,"tag":102,"props":2197,"children":2198},{"style":125},[2199],{"type":38,"value":1414},{"type":33,"tag":102,"props":2201,"children":2202},{"style":119},[2203],{"type":38,"value":2204}," plausible_events;\n",{"type":33,"tag":34,"props":2206,"children":2207},{},[2208,2210,2219],{"type":38,"value":2209},"Diese Methode ist nicht 100% präzise (verschiedene Nutzer können denselben Hash bekommen, Kollisionsrate ~2–4%), aber im ",{"type":33,"tag":2211,"props":2212,"children":2216},"a",{"href":2213,"rel":2214},"https:\u002F\u002Fwww.roibase.com.tr\u002Fde\u002Ffirstparty",[2215],"nofollow",[2217],{"type":38,"value":2218},"First-Party Data & Measurement Architektur",{"type":38,"value":2220}," Framework können deterministische (user_id) + probabilistische (Hash) Signale kombiniert werden, um \"Fuzzy Cohorts\" zu erstellen. Diese Cohorts zeigen weniger Retention-Abweichung als GA4s modellierte Daten (in unseren A\u002FB Tests durchschnittlich 8% Abweichung vs. GA4 modelliert 18–22%).",{"type":33,"tag":41,"props":2222,"children":2224},{"id":2223},"dsgvo-konformität-datenverarbeitungsvertrag-und-log-retention",[2225],{"type":38,"value":2226},"DSGVO-Konformität: Datenverarbeitungsvertrag und Log Retention",{"type":33,"tag":34,"props":2228,"children":2229},{},[2230,2232,2237,2239,2245],{"type":38,"value":2231},"DSGVO Artikel 5: \"Personenbezogene Daten müssen für bestimmte, eindeutige und legitime Zwecke verarbeitet werden.\" IP-Adresse + User Agent gelten als \"indirekte Identifikatoren\". Plausible empfängt IP auf dem Server, schreibt es aber ",{"type":33,"tag":86,"props":2233,"children":2234},{},[2235],{"type":38,"value":2236},"nicht",{"type":38,"value":2238}," in ClickHouse – nur das ",{"type":33,"tag":53,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":38,"value":2244},"country",{"type":38,"value":2246},"-Feld durch GeoIP-Lookup, dann wird die IP verworfen.",{"type":33,"tag":34,"props":2248,"children":2249},{},[2250],{"type":38,"value":2251},"In Self-Hosted-Setups kannst du diesen Flow kontrollieren:",{"type":33,"tag":92,"props":2253,"children":2257},{"className":2254,"code":2255,"language":2256,"meta":17,"style":17},"language-elixir shiki shiki-themes github-dark","# lib\u002Fplausible\u002Fingestion\u002Fevent.ex (vereinfacht)\ndefmodule Plausible.Ingestion.Event do\n  def process(conn, params) do\n    ip = get_ip_address(conn)\n    country = GeoIP.lookup(ip) |> Map.get(:country_code)\n    \n    event = %{\n      timestamp: DateTime.utc_now(),\n      domain: params[\"d\"],\n      session_hash: params[\"h\"],\n      country: country,\n      # IP wird hier verworfen\n    }\n    \n    ClickHouse.insert(\"events\", event)\n  end\nend\n","elixir",[2258],{"type":33,"tag":53,"props":2259,"children":2260},{"__ignoreMap":17},[2261,2269,2277,2285,2293,2301,2309,2317,2325,2333,2341,2349,2357,2364,2371,2379,2387],{"type":33,"tag":102,"props":2262,"children":2263},{"class":104,"line":105},[2264],{"type":33,"tag":102,"props":2265,"children":2266},{},[2267],{"type":38,"value":2268},"# lib\u002Fplausible\u002Fingestion\u002Fevent.ex (vereinfacht)\n",{"type":33,"tag":102,"props":2270,"children":2271},{"class":104,"line":115},[2272],{"type":33,"tag":102,"props":2273,"children":2274},{},[2275],{"type":38,"value":2276},"defmodule Plausible.Ingestion.Event do\n",{"type":33,"tag":102,"props":2278,"children":2279},{"class":104,"line":136},[2280],{"type":33,"tag":102,"props":2281,"children":2282},{},[2283],{"type":38,"value":2284},"  def process(conn, params) do\n",{"type":33,"tag":102,"props":2286,"children":2287},{"class":104,"line":167},[2288],{"type":33,"tag":102,"props":2289,"children":2290},{},[2291],{"type":38,"value":2292},"    ip = get_ip_address(conn)\n",{"type":33,"tag":102,"props":2294,"children":2295},{"class":104,"line":234},[2296],{"type":33,"tag":102,"props":2297,"children":2298},{},[2299],{"type":38,"value":2300},"    country = GeoIP.lookup(ip) |> Map.get(:country_code)\n",{"type":33,"tag":102,"props":2302,"children":2303},{"class":104,"line":243},[2304],{"type":33,"tag":102,"props":2305,"children":2306},{},[2307],{"type":38,"value":2308},"    \n",{"type":33,"tag":102,"props":2310,"children":2311},{"class":104,"line":286},[2312],{"type":33,"tag":102,"props":2313,"children":2314},{},[2315],{"type":38,"value":2316},"    event = %{\n",{"type":33,"tag":102,"props":2318,"children":2319},{"class":104,"line":325},[2320],{"type":33,"tag":102,"props":2321,"children":2322},{},[2323],{"type":38,"value":2324},"      timestamp: DateTime.utc_now(),\n",{"type":33,"tag":102,"props":2326,"children":2327},{"class":104,"line":27},[2328],{"type":33,"tag":102,"props":2329,"children":2330},{},[2331],{"type":38,"value":2332},"      domain: params[\"d\"],\n",{"type":33,"tag":102,"props":2334,"children":2335},{"class":104,"line":352},[2336],{"type":33,"tag":102,"props":2337,"children":2338},{},[2339],{"type":38,"value":2340},"      session_hash: params[\"h\"],\n",{"type":33,"tag":102,"props":2342,"children":2343},{"class":104,"line":361},[2344],{"type":33,"tag":102,"props":2345,"children":2346},{},[2347],{"type":38,"value":2348},"      country: country,\n",{"type":33,"tag":102,"props":2350,"children":2351},{"class":104,"line":370},[2352],{"type":33,"tag":102,"props":2353,"children":2354},{},[2355],{"type":38,"value":2356},"      # IP wird hier verworfen\n",{"type":33,"tag":102,"props":2358,"children":2359},{"class":104,"line":379},[2360],{"type":33,"tag":102,"props":2361,"children":2362},{},[2363],{"type":38,"value":581},{"type":33,"tag":102,"props":2365,"children":2366},{"class":104,"line":393},[2367],{"type":33,"tag":102,"props":2368,"children":2369},{},[2370],{"type":38,"value":2308},{"type":33,"tag":102,"props":2372,"children":2373},{"class":104,"line":407},[2374],{"type":33,"tag":102,"props":2375,"children":2376},{},[2377],{"type":38,"value":2378},"    ClickHouse.insert(\"events\", event)\n",{"type":33,"tag":102,"props":2380,"children":2381},{"class":104,"line":416},[2382],{"type":33,"tag":102,"props":2383,"children":2384},{},[2385],{"type":38,"value":2386},"  end\n",{"type":33,"tag":102,"props":2388,"children":2389},{"class":104,"line":425},[2390],{"type":33,"tag":102,"props":2391,"children":2392},{},[2393],{"type":38,"value":2394},"end\n",{"type":33,"tag":34,"props":2396,"children":2397},{},[2398],{"type":38,"value":2399},"DSGVO Artikel 17: \"Personenbezogene Daten werden so lange gespeichert, wie es der Verarbeitungszweck erfordert.\" Analytics Standard: 24–36 Monate. In ClickHouse mit Partition-basiertem TTL:",{"type":33,"tag":92,"props":2401,"children":2403},{"className":633,"code":2402,"language":635,"meta":17,"style":17},"ALTER TABLE events\nMODIFY TTL toDate(timestamp) + INTERVAL 36 MONTH;\n",[2404],{"type":33,"tag":53,"props":2405,"children":2406},{"__ignoreMap":17},[2407,2424],{"type":33,"tag":102,"props":2408,"children":2409},{"class":104,"line":105},[2410,2415,2419],{"type":33,"tag":102,"props":2411,"children":2412},{"style":125},[2413],{"type":38,"value":2414},"ALTER",{"type":33,"tag":102,"props":2416,"children":2417},{"style":125},[2418],{"type":38,"value":652},{"type":33,"tag":102,"props":2420,"children":2421},{"style":119},[2422],{"type":38,"value":2423}," events\n",{"type":33,"tag":102,"props":2425,"children":2426},{"class":104,"line":115},[2427,2432,2437,2441,2445,2449,2454,2459,2464],{"type":33,"tag":102,"props":2428,"children":2429},{"style":125},[2430],{"type":38,"value":2431},"MODIFY",{"type":33,"tag":102,"props":2433,"children":2434},{"style":119},[2435],{"type":38,"value":2436}," TTL toDate(",{"type":33,"tag":102,"props":2438,"children":2439},{"style":125},[2440],{"type":38,"value":848},{"type":33,"tag":102,"props":2442,"children":2443},{"style":119},[2444],{"type":38,"value":507},{"type":33,"tag":102,"props":2446,"children":2447},{"style":125},[2448],{"type":38,"value":197},{"type":33,"tag":102,"props":2450,"children":2451},{"style":119},[2452],{"type":38,"value":2453}," INTERVAL ",{"type":33,"tag":102,"props":2455,"children":2456},{"style":145},[2457],{"type":38,"value":2458},"36",{"type":33,"tag":102,"props":2460,"children":2461},{"style":125},[2462],{"type":38,"value":2463}," MONTH",{"type":33,"tag":102,"props":2465,"children":2466},{"style":119},[2467],{"type":38,"value":164},{"type":33,"tag":34,"props":2469,"children":2470},{},[2471,2473,2478],{"type":38,"value":2472},"Nach 36 Monaten wird die Partition automatisch gelöscht. GA4 setzt ",{"type":33,"tag":53,"props":2474,"children":2476},{"className":2475},[],[2477],{"type":38,"value":1810},{"type":38,"value":2479}," nach 14 Monaten zurück, aber Event-Level BigQuery Export kann 60 Monate gehalten werden (ohne GA360 aber kein Export).",{"type":33,"tag":34,"props":2481,"children":2482},{},[2483,2488],{"type":33,"tag":86,"props":2484,"children":2485},{},[2486],{"type":38,"value":2487},"DSGVO Datenverarbeitungsvertrag:",{"type":38,"value":2489}," Mit Plausible Cloud brauchst du einen DPA (Data Processing Agreement). Plausible hostet in EU (Hetzner, Deutschland) und bietet DSGVO-konforme DPA-Vorlagen. Self-Hosted: Du kontrollierst die Daten selbst, kein „Datenverarbeiter\" – nur „Verantwortlicher\".",{"type":33,"tag":41,"props":2491,"children":2493},{"id":2492},"conversion-api-integration-server-side-event-forwarding",[2494],{"type":38,"value":2495},"Conversion API Integration: Server-Side Event Forwarding",{"type":33,"tag":34,"props":2497,"children":2498},{},[2499],{"type":38,"value":2500},"Um Plausible Events an Meta\u002FGoogle Ads zu schicken, kannst du ein Webhook-basiertes Forwarding-Pipeline bauen. Plausible hat keine native API, aber Streaming Export von ClickHouse zu BigQuery und Cloud Function Trigger sind möglich:",{"type":33,"tag":92,"props":2502,"children":2504},{"className":94,"code":2503,"language":96,"meta":17,"style":17},"\u002F\u002F Cloud Function: plausible-to-meta-capi\nconst axios = require('axios');\n\nexports.forwardEvent = async (event, context) => {\n  const pubsubMessage = Buffer.from(event.data, 'base64').toString();\n  const plausibleEvent = JSON.parse(\n",[2505],{"type":33,"tag":53,"props":2506,"children":2507},{"__ignoreMap":17},[2508,2516,2551,2558,2615,2666],{"type":33,"tag":102,"props":2509,"children":2510},{"class":104,"line":105},[2511],{"type":33,"tag":102,"props":2512,"children":2513},{"style":109},[2514],{"type":38,"value":2515},"\u002F\u002F Cloud Function: plausible-to-meta-capi\n",{"type":33,"tag":102,"props":2517,"children":2518},{"class":104,"line":115},[2519,2524,2529,2533,2538,2542,2547],{"type":33,"tag":102,"props":2520,"children":2521},{"style":125},[2522],{"type":38,"value":2523},"const",{"type":33,"tag":102,"props":2525,"children":2526},{"style":145},[2527],{"type":38,"value":2528}," axios",{"type":33,"tag":102,"props":2530,"children":2531},{"style":125},[2532],{"type":38,"value":153},{"type":33,"tag":102,"props":2534,"children":2535},{"style":184},[2536],{"type":38,"value":2537}," require",{"type":33,"tag":102,"props":2539,"children":2540},{"style":119},[2541],{"type":38,"value":122},{"type":33,"tag":102,"props":2543,"children":2544},{"style":156},[2545],{"type":38,"value":2546},"'axios'",{"type":33,"tag":102,"props":2548,"children":2549},{"style":119},[2550],{"type":38,"value":231},{"type":33,"tag":102,"props":2552,"children":2553},{"class":104,"line":136},[2554],{"type":33,"tag":102,"props":2555,"children":2556},{"emptyLinePlaceholder":2146},[2557],{"type":38,"value":2149},{"type":33,"tag":102,"props":2559,"children":2560},{"class":104,"line":167},[2561,2566,2570,2575,2579,2584,2589,2594,2598,2603,2607,2611],{"type":33,"tag":102,"props":2562,"children":2563},{"style":145},[2564],{"type":38,"value":2565},"exports",{"type":33,"tag":102,"props":2567,"children":2568},{"style":119},[2569],{"type":38,"value":312},{"type":33,"tag":102,"props":2571,"children":2572},{"style":184},[2573],{"type":38,"value":2574},"forwardEvent",{"type":33,"tag":102,"props":2576,"children":2577},{"style":125},[2578],{"type":38,"value":153},{"type":33,"tag":102,"props":2580,"children":2581},{"style":125},[2582],{"type":38,"value":2583}," async",{"type":33,"tag":102,"props":2585,"children":2586},{"style":119},[2587],{"type":38,"value":2588}," (",{"type":33,"tag":102,"props":2590,"children":2591},{"style":261},[2592],{"type":38,"value":2593},"event",{"type":33,"tag":102,"props":2595,"children":2596},{"style":119},[2597],{"type":38,"value":269},{"type":33,"tag":102,"props":2599,"children":2600},{"style":261},[2601],{"type":38,"value":2602},"context",{"type":33,"tag":102,"props":2604,"children":2605},{"style":119},[2606],{"type":38,"value":507},{"type":33,"tag":102,"props":2608,"children":2609},{"style":125},[2610],{"type":38,"value":512},{"type":33,"tag":102,"props":2612,"children":2613},{"style":119},[2614],{"type":38,"value":517},{"type":33,"tag":102,"props":2616,"children":2617},{"class":104,"line":234},[2618,2622,2627,2631,2636,2641,2646,2651,2656,2661],{"type":33,"tag":102,"props":2619,"children":2620},{"style":125},[2621],{"type":38,"value":142},{"type":33,"tag":102,"props":2623,"children":2624},{"style":145},[2625],{"type":38,"value":2626}," pubsubMessage",{"type":33,"tag":102,"props":2628,"children":2629},{"style":125},[2630],{"type":38,"value":153},{"type":33,"tag":102,"props":2632,"children":2633},{"style":119},[2634],{"type":38,"value":2635}," Buffer.",{"type":33,"tag":102,"props":2637,"children":2638},{"style":184},[2639],{"type":38,"value":2640},"from",{"type":33,"tag":102,"props":2642,"children":2643},{"style":119},[2644],{"type":38,"value":2645},"(event.data, ",{"type":33,"tag":102,"props":2647,"children":2648},{"style":156},[2649],{"type":38,"value":2650},"'base64'",{"type":33,"tag":102,"props":2652,"children":2653},{"style":119},[2654],{"type":38,"value":2655},").",{"type":33,"tag":102,"props":2657,"children":2658},{"style":184},[2659],{"type":38,"value":2660},"toString",{"type":33,"tag":102,"props":2662,"children":2663},{"style":119},[2664],{"type":38,"value":2665},"();\n",{"type":33,"tag":102,"props":2667,"children":2668},{"class":104,"line":243},[2669,2673,2678,2682,2687,2691,2696],{"type":33,"tag":102,"props":2670,"children":2671},{"style":125},[2672],{"type":38,"value":142},{"type":33,"tag":102,"props":2674,"children":2675},{"style":145},[2676],{"type":38,"value":2677}," plausibleEvent",{"type":33,"tag":102,"props":2679,"children":2680},{"style":125},[2681],{"type":38,"value":153},{"type":33,"tag":102,"props":2683,"children":2684},{"style":145},[2685],{"type":38,"value":2686}," JSON",{"type":33,"tag":102,"props":2688,"children":2689},{"style":119},[2690],{"type":38,"value":312},{"type":33,"tag":102,"props":2692,"children":2693},{"style":184},[2694],{"type":38,"value":2695},"parse",{"type":33,"tag":102,"props":2697,"children":2698},{"style":119},[2699],{"type":38,"value":2032},{"type":33,"tag":2701,"props":2702,"children":2703},"style",{},[2704],{"type":38,"value":2705},"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":17,"searchDepth":136,"depth":136,"links":2707},[2708,2709,2710,2711,2712,2713,2714],{"id":43,"depth":115,"text":46},{"id":73,"depth":115,"text":76},{"id":882,"depth":115,"text":885},{"id":1740,"depth":115,"text":1743},{"id":1918,"depth":115,"text":1921},{"id":2223,"depth":115,"text":2226},{"id":2492,"depth":115,"text":2495},"markdown","content:de:data:datenschutz-first-analytics-plausible-server-aggregation.md","content","de\u002Fdata\u002Fdatenschutz-first-analytics-plausible-server-aggregation.md","de\u002Fdata\u002Fdatenschutz-first-analytics-plausible-server-aggregation","md",1785967477652]