{"id":10234,"date":"2026-08-15T00:13:13","date_gmt":"2026-08-14T22:13:13","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/ga4-channel-grouping-debugger\/"},"modified":"2026-08-15T00:13:13","modified_gmt":"2026-08-14T22:13:13","slug":"ga4-channel-grouping-debugger","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/","title":{"rendered":"Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">GA4 przechodzi osiemna\u015bcie regu\u0142 od g\u00f3ry do do\u0142u i wybiera pierwsz\u0105 pasuj\u0105c\u0105. Tutaj ten sam \u0142a\u0144cuch dzia\u0142a na adresie strony docelowej albo na wpisanych warto\u015bciach, a regu\u0142a rozstrzygaj\u0105ca zostaje wyr\u00f3\u017cniona.<\/p>\n<p>    <label for=\"cg-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adres strony docelowej (opcjonalnie, wype\u0142nia pola poni\u017cej)<\/label><br \/>\n    <input type=\"text\" id=\"cg-url\" class=\"form-control\" style=\"width: 100%; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; font-size: 0.85rem; box-sizing: border-box;\" placeholder=\"https:\/\/example.com\/strona?utm_source=newsletter&amp;utm_medium=email\"><\/p>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 15px;\">\n<div style=\"flex: 1; min-width: 170px;\">\n            <label for=\"cg-quelle\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">utm_source<\/label><br \/>\n            <input type=\"text\" id=\"cg-quelle\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" placeholder=\"google\">\n        <\/div>\n<div style=\"flex: 1; min-width: 170px;\">\n            <label for=\"cg-medium\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">utm_medium<\/label><br \/>\n            <input type=\"text\" id=\"cg-medium\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" placeholder=\"cpc\">\n        <\/div>\n<div style=\"flex: 1; min-width: 170px;\">\n            <label for=\"cg-kampagne\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">utm_campaign<\/label><br \/>\n            <input type=\"text\" id=\"cg-kampagne\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" placeholder=\"summer_sale\">\n        <\/div>\n<div style=\"flex: 1; min-width: 200px;\">\n            <label for=\"cg-kategorie\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Kategoria \u017ar\u00f3d\u0142a<\/label><br \/>\n            <select id=\"cg-kategorie\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\"><option value=\"auto\">rozpoznaj automatycznie<\/option><option value=\"none\">brak albo nieznane \u017ar\u00f3d\u0142o<\/option><option value=\"SEARCH\">wyszukiwarka<\/option><option value=\"SOCIAL\">serwis spo\u0142eczno\u015bciowy<\/option><option value=\"VIDEO\">serwis wideo<\/option><option value=\"SHOPPING\">serwis zakupowy<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 18px 0 0;\">\n        <button id=\"cg-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Ustal kana\u0142<\/button><br \/>\n        <button id=\"cg-beispiel\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 12px 20px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Wczytaj przyk\u0142ad<\/button>\n    <\/div>\n<div id=\"cg-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"GA4 przechodzi osiemna\u015bcie regu\u0142 od g\u00f3ry do do\u0142u i wybiera pierwsz\u0105 pasuj\u0105c\u0105. Tutaj ten sam \u0142a\u0144cuch dzia\u0142a na adresie strony docelowej albo na wpisanych warto\u015bciach, a regu\u0142a rozstrzygaj\u0105ca zostaje wyr\u00f3\u017cniona.\",\"label_url\":\"Adres strony docelowej (opcjonalnie, wype\u0142nia pola poni\u017cej)\",\"ph_url\":\"https:\\\/\\\/example.com\\\/strona?utm_source=newsletter\\u0026utm_medium=email\",\"label_quelle\":\"utm_source\",\"label_medium\":\"utm_medium\",\"label_kampagne\":\"utm_campaign\",\"label_kategorie\":\"Kategoria \u017ar\u00f3d\u0142a\",\"kat_auto\":\"rozpoznaj automatycznie\",\"kat_keine\":\"brak albo nieznane \u017ar\u00f3d\u0142o\",\"kat_suche\":\"wyszukiwarka\",\"kat_social\":\"serwis spo\u0142eczno\u015bciowy\",\"kat_video\":\"serwis wideo\",\"kat_shopping\":\"serwis zakupowy\",\"knopf\":\"Ustal kana\u0142\",\"beispiel\":\"Wczytaj przyk\u0142ad\",\"fehler_url_leer\":\"Nie podano adresu.\",\"fehler_keine_parameter\":\"Adres nie zawiera parametr\u00f3w, nie ma czego odczyta\u0107.\",\"ergebnis_kopf\":\"Domy\u015blna grupa kana\u0142\u00f3w\",\"ergebnis_stelle\":\"Rozstrzygni\u0119te przez regu\u0142\u0119 %s - pierwsze trafienie wygrywa, regu\u0142y poni\u017cej nie s\u0105 ju\u017c sprawdzane.\",\"grund_unassigned\":\"\u017badna z osiemnastu regu\u0142 nie pasuje, dlatego sesja trafia do Unassigned.\",\"h_werte\":\"U\u017cyte warto\u015bci\",\"h_hinweise\":\"Ustalenia\",\"h_regeln\":\"\u0141a\u0144cuch regu\u0142\",\"regeln_erklaerung\":\"Plus oznacza regu\u0142\u0119, kt\u00f3ra pasuje. Wyr\u00f3\u017cniony wiersz to ten, przy kt\u00f3rym GA4 si\u0119 zatrzymuje.\",\"l_kategorie\":\"Kategoria \u017ar\u00f3d\u0142a\",\"r_direct\":\"\u0179r\u00f3d\u0142o to (direct), a medium to (none) albo (not set).\",\"r_crossnetwork\":\"Nazwa kampanii zawiera cross-network.\",\"r_paidshopping\":\"\u0179r\u00f3d\u0142o jest serwisem zakupowym albo nazwa kampanii wygl\u0105da na zakupow\u0105, a medium jest p\u0142atne.\",\"r_paidsearch\":\"\u0179r\u00f3d\u0142o jest wyszukiwark\u0105, a medium jest p\u0142atne.\",\"r_paidsocial\":\"\u0179r\u00f3d\u0142o jest serwisem spo\u0142eczno\u015bciowym, a medium jest p\u0142atne.\",\"r_paidvideo\":\"\u0179r\u00f3d\u0142o jest serwisem wideo, a medium jest p\u0142atne.\",\"r_display\":\"Medium to display, banner, expandable, interstitial albo cpm.\",\"r_paidother\":\"Medium pasuje do wzorca medi\u00f3w p\u0142atnych: wszystko z cp w \u015brodku, a tak\u017ce ppc, retargeting i wszystko zaczynaj\u0105ce si\u0119 od paid.\",\"r_orgshopping\":\"\u0179r\u00f3d\u0142o jest serwisem zakupowym albo nazwa kampanii wygl\u0105da na zakupow\u0105.\",\"r_orgsocial\":\"\u0179r\u00f3d\u0142o jest serwisem spo\u0142eczno\u015bciowym albo medium to social, social-network, social-media lub sm.\",\"r_orgvideo\":\"\u0179r\u00f3d\u0142o jest serwisem wideo albo medium zawiera video.\",\"r_orgsearch\":\"\u0179r\u00f3d\u0142o jest wyszukiwark\u0105 albo medium to organic.\",\"r_referral\":\"Medium to referral, app albo link.\",\"r_email\":\"\u0179r\u00f3d\u0142o albo medium to email, e-mail, e_mail lub e mail.\",\"r_affiliate\":\"Medium to affiliate.\",\"r_audio\":\"Medium to audio.\",\"r_sms\":\"\u0179r\u00f3d\u0142o albo medium to sms.\",\"r_push\":\"Medium ko\u0144czy si\u0119 na push albo zawiera mobile lub notification, albo \u017ar\u00f3d\u0142em jest firebase.\",\"h_gclid\":\"Obecny jest gclid, gbraid albo wbraid: przy w\u0142\u0105czonym automatycznym tagowaniu GA4 wyprowadza z niego google \\\/ cpc nawet bez parametr\u00f3w utm.\",\"h_msclkid\":\"Obecny jest msclkid: automatyczne tagowanie Microsoft Advertising prowadzi do bing \\\/ cpc.\",\"h_fbclid\":\"fbclid to wy\u0142\u0105cznie identyfikator klikni\u0119cia Meta. GA4 nie wyprowadza z niego \u017ar\u00f3d\u0142a, wi\u0119c sesja pozostaje odes\u0142aniem z facebook.com albo wraca do direct.\",\"h_utmid\":\"utm_id bez utm_source: sam identyfikator nie tworzy \u017ar\u00f3d\u0142a i nie trafia do grupowania kana\u0142\u00f3w.\",\"h_leerzeichen\":\"%s zawiera spacj\u0119 na pocz\u0105tku albo na ko\u0144cu, kt\u00f3ra staje si\u0119 cz\u0119\u015bci\u0105 zapisanej warto\u015bci.\",\"h_grossbuchstaben\":\"%s zawiera wielkie litery. GA4 zapisuje je bez zmian, przez co Email i email tworz\u0105 dwa osobne wiersze.\",\"h_medium_fehlt\":\"Brakuje utm_medium, cho\u0107 utm_source jest ustawione. To najcz\u0119stsza przyczyna Unassigned.\",\"h_quelle_fehlt\":\"Brakuje utm_source. Bez \u017ar\u00f3d\u0142a samo medium rzadko daje kana\u0142.\",\"h_tippfehler\":\"Medium %s nie jest warto\u015bci\u0105 znan\u0105 GA4, zwykle kryje si\u0119 za tym liter\u00f3wka.\",\"hinweis_namen\":\"Nazwy kana\u0142\u00f3w pojawiaj\u0105 si\u0119 w postaci zwracanej przez Data API i eksport do BigQuery. Interfejs GA4 t\u0142umaczy je na j\u0119zyk raportu. Zapisane tu kategorie \u017ar\u00f3de\u0142 s\u0105 wyci\u0105giem z listy publikowanej przez Google - je\u015bli \u017ar\u00f3d\u0142a brakuje, kategori\u0119 mo\u017cna ustawi\u0107 r\u0119cznie.\"};<\/p>\n<p>    \/\/ --- reine Auswertung, ohne Zugriff auf das Dokument ---<\/p>\n<p>    \/\/ Auszug aus den Quellkategorien von Google. Die vollstaendige Liste hat\n    \/\/ ueber tausend Eintraege; wer eine fehlende Quelle pruefen will, stellt\n    \/\/ die Kategorie von Hand ein.\n    const KATEGORIEN = {\n        SEARCH: ['google', 'bing', 'yahoo', 'duckduckgo', 'baidu', 'yandex', 'ecosia', 'ask',\n            'aol', 'brave', 'startpage', 'seznam', 'naver', 'qwant', 'sogou', 'msn', 'lycos',\n            'search.google.com', 'google.com', 'bing.com', 'duckduckgo.com', 'yandex.ru'],\n        SOCIAL: ['facebook', 'instagram', 'twitter', 't.co', 'linkedin', 'pinterest', 'reddit',\n            'tiktok', 'snapchat', 'vk.com', 'weibo', 'quora', 'tumblr', 'threads', 'xing',\n            'facebook.com', 'instagram.com', 'linkedin.com', 'l.facebook.com', 'lm.facebook.com',\n            'm.facebook.com', 'pinterest.com', 'tiktok.com', 'reddit.com'],\n        VIDEO: ['youtube', 'vimeo', 'dailymotion', 'twitch', 'youtube.com', 'm.youtube.com', 'vimeo.com', 'twitch.tv'],\n        SHOPPING: ['amazon', 'ebay', 'etsy', 'alibaba', 'aliexpress', 'walmart', 'shopify',\n            'allegro', 'otto', 'amazon.com', 'amazon.de', 'ebay.com', 'ebay.de', 'etsy.com', 'allegro.pl']\n    };<\/p>\n<p>    \/\/ Die bezahlten Medien nach der Regel von Google: alles mit \"cp\" darin,\n    \/\/ dazu ppc, retargeting und alles, was mit paid beginnt.\n    const BEZAHLT = \/^(.*cp.*|ppc|retargeting|paid.*)$\/;\n    const EINKAUF_KAMPAGNE = \/^(.*(([^a-df-z]|^)shop|shopping).*)$\/;\n    const ANZEIGE = ['display', 'banner', 'expandable', 'interstitial', 'cpm'];\n    const SOZIAL_MEDIUM = ['social', 'social-network', 'social-media', 'sm', 'social network', 'social media'];\n    const EMPFEHLUNG = ['referral', 'app', 'link'];\n    const POST = ['email', 'e-mail', 'e_mail', 'e mail'];<\/p>\n<p>    function klein(wert) {\n        return String(wert === undefined || wert === null ? '' : wert).trim().toLowerCase();\n    }<\/p>\n<p>    function kategorieVon(quelle) {\n        const q = klein(quelle);\n        if (q === '') { return ''; }\n        const namen = Object.keys(KATEGORIEN);\n        for (let i = 0; i < namen.length; i++) {\n            const liste = KATEGORIEN[namen[i]];\n            for (let j = 0; j < liste.length; j++) {\n                const eintrag = liste[j];\n                \/\/ Treffer bei genauer Gleichheit oder wenn die Quelle den\n                \/\/ Namen als Wortbestandteil einer Domain traegt.\n                if (q === eintrag || q === eintrag + '.com' || q.indexOf(eintrag + '.') === 0 || q.indexOf('.' + eintrag + '.') !== -1) {\n                    return namen[i];\n                }\n            }\n        }\n        return '';\n    }\n\n    \/**\n     * Die Reihenfolge ist die eigentliche Aussage: GA4 nimmt die erste Regel,\n     * die zutrifft, und hoert dann auf. Deshalb steht hier jede Regel als\n     * eigener Eintrag mit ihrer Bedingung.\n     *\/\n    function regeln(quelle, medium, kampagne, kategorie) {\n        const q = klein(quelle);\n        const m = klein(medium);\n        const k = klein(kampagne);\n        const kat = kategorie || kategorieVon(q);\n        const bezahlt = BEZAHLT.test(m);\n\n        return [\n            { name: 'Direct', bedingung: T.r_direct,\n              trifft: (q === '(direct)' || q === 'direct' || q === '') &#038;&#038; (m === '(none)' || m === '(not set)' || m === 'none' || m === '') },\n            { name: 'Cross-network', bedingung: T.r_crossnetwork,\n              trifft: k.indexOf('cross-network') !== -1 },\n            { name: 'Paid Shopping', bedingung: T.r_paidshopping,\n              trifft: (kat === 'SHOPPING' || EINKAUF_KAMPAGNE.test(k)) &#038;&#038; bezahlt },\n            { name: 'Paid Search', bedingung: T.r_paidsearch,\n              trifft: kat === 'SEARCH' &#038;&#038; bezahlt },\n            { name: 'Paid Social', bedingung: T.r_paidsocial,\n              trifft: kat === 'SOCIAL' &#038;&#038; bezahlt },\n            { name: 'Paid Video', bedingung: T.r_paidvideo,\n              trifft: kat === 'VIDEO' &#038;&#038; bezahlt },\n            { name: 'Display', bedingung: T.r_display,\n              trifft: ANZEIGE.indexOf(m) !== -1 },\n            { name: 'Paid Other', bedingung: T.r_paidother,\n              trifft: bezahlt },\n            { name: 'Organic Shopping', bedingung: T.r_orgshopping,\n              trifft: kat === 'SHOPPING' || EINKAUF_KAMPAGNE.test(k) },\n            { name: 'Organic Social', bedingung: T.r_orgsocial,\n              trifft: kat === 'SOCIAL' || SOZIAL_MEDIUM.indexOf(m) !== -1 },\n            { name: 'Organic Video', bedingung: T.r_orgvideo,\n              trifft: kat === 'VIDEO' || \/video\/.test(m) },\n            { name: 'Organic Search', bedingung: T.r_orgsearch,\n              trifft: kat === 'SEARCH' || m === 'organic' },\n            { name: 'Referral', bedingung: T.r_referral,\n              trifft: EMPFEHLUNG.indexOf(m) !== -1 },\n            { name: 'Email', bedingung: T.r_email,\n              trifft: POST.indexOf(q) !== -1 || POST.indexOf(m) !== -1 },\n            { name: 'Affiliates', bedingung: T.r_affiliate,\n              trifft: m === 'affiliate' },\n            { name: 'Audio', bedingung: T.r_audio,\n              trifft: m === 'audio' },\n            { name: 'SMS', bedingung: T.r_sms,\n              trifft: q === 'sms' || m === 'sms' },\n            { name: 'Mobile Push Notifications', bedingung: T.r_push,\n              trifft: m.length >= 4 && m.slice(-4) === 'push' || m.indexOf('mobile') !== -1 || m.indexOf('notification') !== -1 || q === 'firebase' }\n        ];\n    }<\/p>\n<p>    function ausUrl(url) {\n        const raus = { ok: false, fehler: '', parameter: {}, quelle: '', medium: '', kampagne: '', hinweise: [] };\n        const roh = String(url === undefined || url === null ? '' : url).trim();\n        if (roh === '') { raus.fehler = T.fehler_url_leer; return raus; }<\/p>\n<p>        let abfrage = '';\n        const fragezeichen = roh.indexOf('?');\n        if (fragezeichen !== -1) {\n            abfrage = roh.slice(fragezeichen + 1);\n            const raute = abfrage.indexOf('#');\n            if (raute !== -1) { abfrage = abfrage.slice(0, raute); }\n        }\n        if (abfrage === '') { raus.fehler = T.fehler_keine_parameter; return raus; }<\/p>\n<p>        abfrage.split('&').forEach(function (paar) {\n            if (paar === '') { return; }\n            const teil = paar.split('=');\n            const name = decodeURIComponent(teil[0].replace(\/\\+\/g, ' '));\n            const wert = teil.length > 1 ? decodeURIComponent(teil.slice(1).join('=').replace(\/\\+\/g, ' ')) : '';\n            raus.parameter[name] = wert;\n        });<\/p>\n<p>        const p = raus.parameter;\n        raus.quelle = p.utm_source || '';\n        raus.medium = p.utm_medium || '';\n        raus.kampagne = p.utm_campaign || '';<\/p>\n<p>        \/\/ Automatische Kennzeichnung: die Klickkennungen setzen Quelle und\n        \/\/ Medium, ohne dass utm-Parameter noetig waeren.\n        if (!raus.quelle && (p.gclid || p.gbraid || p.wbraid)) {\n            raus.quelle = 'google';\n            raus.medium = raus.medium || 'cpc';\n            raus.hinweise.push(T.h_gclid);\n        }\n        if (!raus.quelle && p.msclkid) {\n            raus.quelle = 'bing';\n            raus.medium = raus.medium || 'cpc';\n            raus.hinweise.push(T.h_msclkid);\n        }\n        if (p.fbclid && !p.utm_source) {\n            raus.hinweise.push(T.h_fbclid);\n        }\n        if (p.utm_id && !p.utm_source) {\n            raus.hinweise.push(T.h_utmid);\n        }\n        raus.ok = true;\n        return raus;\n    }<\/p>\n<p>    function pruefeWerte(quelle, medium, kampagne) {\n        const hinweise = [];\n        const roh = { quelle: String(quelle || ''), medium: String(medium || ''), kampagne: String(kampagne || '') };<\/p>\n<p>        Object.keys(roh).forEach(function (feld) {\n            const wert = roh[feld];\n            if (wert !== wert.trim()) {\n                hinweise.push(T.h_leerzeichen.replace('%s', feld === 'quelle' ? 'utm_source' : (feld === 'medium' ? 'utm_medium' : 'utm_campaign')));\n            }\n            if (wert.trim() !== '' && wert !== wert.toLowerCase()) {\n                hinweise.push(T.h_grossbuchstaben.replace('%s', feld === 'quelle' ? 'utm_source' : (feld === 'medium' ? 'utm_medium' : 'utm_campaign')));\n            }\n        });<\/p>\n<p>        const q = klein(quelle);\n        const m = klein(medium);\n        if (q !== '' && m === '') { hinweise.push(T.h_medium_fehlt); }\n        if (q === '' && m !== '') { hinweise.push(T.h_quelle_fehlt); }\n        if (m === 'referal' || m === 'referrer') { hinweise.push(T.h_tippfehler.replace('%s', m)); }\n        if (m === 'cpc ' || m === 'ppc.') { hinweise.push(T.h_tippfehler.replace('%s', m)); }\n        if (m === 'social' && q === '') { hinweise.push(T.h_quelle_fehlt); }\n        if (m === 'email' && q === '') { hinweise.push(T.h_quelle_fehlt); }\n        return hinweise;\n    }<\/p>\n<p>    function bestimmen(quelle, medium, kampagne, kategorie) {\n        const liste = regeln(quelle, medium, kampagne, kategorie === 'auto' || !kategorie ? '' : (kategorie === 'none' ? 'KEINE' : kategorie));\n        let kanal = 'Unassigned';\n        let grund = T.grund_unassigned;\n        let stelle = -1;\n        for (let i = 0; i < liste.length; i++) {\n            if (liste[i].trifft) {\n                kanal = liste[i].name;\n                grund = liste[i].bedingung;\n                stelle = i;\n                break;\n            }\n        }\n        return {\n            kanal: kanal,\n            grund: grund,\n            stelle: stelle,\n            regeln: liste,\n            kategorie: kategorie === 'auto' || !kategorie ? kategorieVon(quelle) : (kategorie === 'none' ? '' : kategorie),\n            hinweise: pruefeWerte(quelle, medium, kampagne)\n        };\n    }\n\n    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.CG = {\n            bestimmen: bestimmen,\n            ausUrl: ausUrl,\n            kategorieVon: kategorieVon,\n            regeln: regeln\n        };\n    }\n\n    \/\/ --- Anbindung an das Dokument ---\n\n    const btn = document.getElementById('cg-btn');\n    const out = document.getElementById('cg-ergebnis');\n    const urlFeld = document.getElementById('cg-url');\n    const quelleFeld = document.getElementById('cg-quelle');\n    const mediumFeld = document.getElementById('cg-medium');\n    const kampagneFeld = document.getElementById('cg-kampagne');\n    const katFeld = document.getElementById('cg-kategorie');\n    const beispielBtn = document.getElementById('cg-beispiel');\n    if (!btn || !out || !urlFeld || !quelleFeld || !mediumFeld || !kampagneFeld || !katFeld || !beispielBtn) { return; }\n\n    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';\n\n    function el(tag, css, text) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (text !== undefined &#038;&#038; text !== null) { knoten.textContent = text; }\n        return knoten;\n    }\n\n    function zeile(kasten, name, wert) {\n        const z = el('div', 'display: flex; justify-content: space-between; gap: 14px; flex-wrap: wrap; padding: 5px 0;');\n        z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0);', name));\n        z.appendChild(el('span', 'color: var(--text-primary, #e8e8ee); font-family: monospace; text-align: right; word-break: break-all;', wert));\n        kasten.appendChild(z);\n    }\n\n    function zeigen(erg, quelle, medium, kampagne) {\n        out.textContent = '';\n\n        const treffer = erg.kanal !== 'Unassigned';\n        const kopf = el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid ' + (treffer ? 'var(--accent, #7ee787)' : '#ffb86c') + '; border-radius: 6px; padding: 18px; margin-bottom: 18px;');\n        kopf.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.85rem;', T.ergebnis_kopf));\n        kopf.appendChild(el('div', 'color: ' + (treffer ? 'var(--accent, #7ee787)' : '#ffb86c') + '; font-size: 1.5rem; font-weight: 700; font-family: monospace; margin: 4px 0 8px;', erg.kanal));\n        kopf.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.9rem;', erg.grund));\n        if (erg.stelle >= 0) {\n            kopf.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; margin-top: 6px;', T.ergebnis_stelle.replace('%s', String(erg.stelle + 1))));\n        }\n        out.appendChild(kopf);<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_werte));\n        const werte = el('div', KASTEN);\n        zeile(werte, 'utm_source', quelle === '' ? '(not set)' : quelle);\n        zeile(werte, 'utm_medium', medium === '' ? '(not set)' : medium);\n        zeile(werte, 'utm_campaign', kampagne === '' ? '(not set)' : kampagne);\n        zeile(werte, T.l_kategorie, erg.kategorie === '' ? T.kat_keine : erg.kategorie);\n        out.appendChild(werte);<\/p>\n<p>        if (erg.hinweise.length) {\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_hinweise));\n            const kasten = el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; border-radius: 6px; padding: 14px; margin-bottom: 18px;');\n            erg.hinweise.forEach(function (h) {\n                kasten.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); padding: 4px 0; font-size: 0.9rem;', h));\n            });\n            out.appendChild(kasten);\n        }<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_regeln));\n        out.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; margin-bottom: 10px;', T.regeln_erklaerung));\n        const tabelle = el('div', KASTEN);\n        erg.regeln.forEach(function (r, i) {\n            const genommen = i === erg.stelle;\n            const z = el('div', 'display: flex; gap: 12px; align-items: flex-start; padding: 7px 0; border-bottom: 1px solid var(--border, #2a2a35);' + (genommen ? ' background: rgba(126, 231, 135, 0.07);' : ''));\n            z.appendChild(el('span', 'width: 26px; color: var(--text-secondary, #a0a0b0); font-family: monospace; font-size: 0.8rem;', String(i + 1)));\n            z.appendChild(el('span', 'width: 22px; color: ' + (r.trifft ? 'var(--accent, #7ee787)' : 'var(--text-secondary, #a0a0b0)') + '; font-family: monospace;', r.trifft ? '+' : '-'));\n            const text = el('span', 'flex: 1;');\n            text.appendChild(el('div', 'color: ' + (genommen ? 'var(--accent, #7ee787)' : 'var(--text-primary, #e8e8ee)') + '; font-weight: ' + (genommen ? '700' : '400') + '; font-family: monospace; font-size: 0.88rem;', r.name));\n            text.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; line-height: 1.5;', r.bedingung));\n            z.appendChild(text);\n            tabelle.appendChild(z);\n        });\n        out.appendChild(tabelle);<\/p>\n<p>        out.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.85rem;', T.hinweis_namen));\n    }<\/p>\n<p>    function auswerten() {\n        let quelle = quelleFeld.value;\n        let medium = mediumFeld.value;\n        let kampagne = kampagneFeld.value;\n        let zusatz = [];<\/p>\n<p>        if (urlFeld.value.trim() !== '') {\n            const zerlegt = ausUrl(urlFeld.value);\n            if (!zerlegt.ok) {\n                out.textContent = '';\n                out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid var(--accent, #7ee787); color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', zerlegt.fehler));\n                return;\n            }\n            quelle = zerlegt.quelle;\n            medium = zerlegt.medium;\n            kampagne = zerlegt.kampagne;\n            quelleFeld.value = quelle;\n            mediumFeld.value = medium;\n            kampagneFeld.value = kampagne;\n            zusatz = zerlegt.hinweise;\n        }<\/p>\n<p>        const erg = bestimmen(quelle, medium, kampagne, katFeld.value);\n        erg.hinweise = zusatz.concat(erg.hinweise);\n        zeigen(erg, quelle, medium, kampagne);\n    }<\/p>\n<p>    btn.addEventListener('click', auswerten);<\/p>\n<p>    beispielBtn.addEventListener('click', function () {\n        urlFeld.value = 'https:\/\/www.example.com\/landing?utm_source=newsletter&utm_campaign=august';\n        quelleFeld.value = '';\n        mediumFeld.value = '';\n        kampagneFeld.value = '';\n        katFeld.value = 'auto';\n        auswerten();\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pokazuje, do kt\u00f3rej domy\u015blnej grupy kana\u0142\u00f3w GA4 przypisuje kombinacj\u0119 \u017ar\u00f3d\u0142a, medium i kampanii, kt\u00f3ra z osiemnastu regu\u0142 zadzia\u0142a\u0142a oraz dlaczego sesja trafia do Unassigned.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92097,92038,92100],"class_list":["post-10234","page","type-page","status-publish","hentry","tag-data-quality-pl","tag-marketing-cyfrowy-pl-pl","tag-google-analytics-4-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Pokazuje, do kt\u00f3rej domy\u015blnej grupy kana\u0142\u00f3w GA4 przypisuje kombinacj\u0119 \u017ar\u00f3d\u0142a, medium i kampanii, kt\u00f3ra z osiemnastu regu\u0142 zadzia\u0142a\u0142a oraz dlaczego sesja trafia do Unassigned.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/ga4-channel-grouping-debugger\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/ga4-channel-grouping-debugger\\\/\",\"name\":\"Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:13:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/ga4-channel-grouping-debugger\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/ga4-channel-grouping-debugger\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/ga4-channel-grouping-debugger\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/","og_locale":"en_US","og_type":"article","og_title":"Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned - Lukas Wojcik - Blog","og_description":"Pokazuje, do kt\u00f3rej domy\u015blnej grupy kana\u0142\u00f3w GA4 przypisuje kombinacj\u0119 \u017ar\u00f3d\u0142a, medium i kampanii, kt\u00f3ra z osiemnastu regu\u0142 zadzia\u0142a\u0142a oraz dlaczego sesja trafia do Unassigned.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/","name":"Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:13:13+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-channel-grouping-debugger\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Analiza grupowania kana\u0142\u00f3w GA4 i przypadk\u00f3w Unassigned"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10234"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10234\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10234"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}