{"id":10245,"date":"2026-08-15T00:30:15","date_gmt":"2026-08-14T22:30:15","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/matomo-tracking-api-builder\/"},"modified":"2026-08-15T00:30:15","modified_gmt":"2026-08-14T22:30:15","slug":"matomo-tracking-api-builder","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/matomo-tracking-api-builder\/","title":{"rendered":"Matomo Tracking-API und Custom Dimensions bauen"},"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;\">Die Matomo-Tracking-API antwortet mit einem leeren Bild, ganz gleich was an der Anfrage falsch war. Dieser Baukasten setzt den Aufruf zusammen, pr\u00fcft die \u00fcblichen Stolperstellen und liefert eine fertige Befehlszeile.<\/p>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap;\">\n<div style=\"flex: 2; min-width: 240px;\">\n            <label for=\"mt-host\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adresse von matomo.php<\/label><br \/>\n            <input type=\"text\" id=\"mt-host\" 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;\" value=\"https:\/\/analytics.example.com\/matomo.php\">\n        <\/div>\n<div style=\"flex: 1; min-width: 110px;\">\n            <label for=\"mt-idsite\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Site-ID<\/label><br \/>\n            <input type=\"text\" id=\"mt-idsite\" 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;\" value=\"1\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"mt-art\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Art des Treffers<\/label><br \/>\n            <select id=\"mt-art\" 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=\"seite\">Seitenaufruf<\/option><option value=\"ereignis\">Ereignis<\/option><option value=\"ziel\">Ziel<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px;\">\n<div style=\"flex: 2; min-width: 240px;\">\n            <label for=\"mt-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adresse der Seite<\/label><br \/>\n            <input type=\"text\" id=\"mt-url\" 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;\" value=\"https:\/\/www.example.com\/preise\">\n        <\/div>\n<div style=\"flex: 1; min-width: 200px;\">\n            <label for=\"mt-name\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Seitentitel (action_name)<\/label><br \/>\n            <input type=\"text\" id=\"mt-name\" 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;\" value=\"Preise\">\n        <\/div>\n<div style=\"flex: 1; min-width: 200px;\">\n            <label for=\"mt-besucher\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Besucherkennung (_id, 16 Hexzeichen)<\/label><br \/>\n            <input type=\"text\" id=\"mt-besucher\" 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=\"0123456789abcdef\">\n        <\/div>\n<\/p><\/div>\n<div id=\"mt-ereignis\" style=\"display: none; gap: 12px; flex-wrap: wrap; margin-top: 12px;\">\n<div style=\"flex: 1; min-width: 150px;\">\n            <label for=\"mt-e-c\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Ereigniskategorie<\/label><br \/>\n            <input type=\"text\" id=\"mt-e-c\" 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;\" value=\"Download\">\n        <\/div>\n<div style=\"flex: 1; min-width: 150px;\">\n            <label for=\"mt-e-a\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Ereignisaktion<\/label><br \/>\n            <input type=\"text\" id=\"mt-e-a\" 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;\" value=\"Klick\">\n        <\/div>\n<div style=\"flex: 1; min-width: 150px;\">\n            <label for=\"mt-e-n\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Ereignisname<\/label><br \/>\n            <input type=\"text\" id=\"mt-e-n\" 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;\" value=\"Preisliste.pdf\">\n        <\/div>\n<div style=\"flex: 1; min-width: 110px;\">\n            <label for=\"mt-e-v\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Ereigniswert<\/label><br \/>\n            <input type=\"text\" id=\"mt-e-v\" 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=\"12.50\">\n        <\/div>\n<\/p><\/div>\n<div id=\"mt-ziel\" style=\"display: none; gap: 12px; flex-wrap: wrap; margin-top: 12px;\">\n<div style=\"flex: 1; min-width: 150px;\">\n            <label for=\"mt-idgoal\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Ziel-ID<\/label><br \/>\n            <input type=\"text\" id=\"mt-idgoal\" 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;\" value=\"3\">\n        <\/div>\n<div style=\"flex: 1; min-width: 150px;\">\n            <label for=\"mt-revenue\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Umsatz<\/label><br \/>\n            <input type=\"text\" id=\"mt-revenue\" 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=\"49.90\">\n        <\/div>\n<\/p><\/div>\n<div style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; margin: 18px 0 8px;\">Custom Dimensions (Nummer und Wert)<\/div>\n<div id=\"mt-liste\" style=\"margin-bottom: 12px;\"><\/div>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap;\">\n        <button id=\"mt-add\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 10px 18px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Dimension hinzuf\u00fcgen<\/button><br \/>\n        <button id=\"mt-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Anfrage bauen<\/button>\n    <\/div>\n<div id=\"mt-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Die Matomo-Tracking-API antwortet mit einem leeren Bild, ganz gleich was an der Anfrage falsch war. Dieser Baukasten setzt den Aufruf zusammen, pr\u00fcft die \u00fcblichen Stolperstellen und liefert eine fertige Befehlszeile.\",\"label_host\":\"Adresse von matomo.php\",\"label_idsite\":\"Site-ID\",\"label_art\":\"Art des Treffers\",\"art_seite\":\"Seitenaufruf\",\"art_ereignis\":\"Ereignis\",\"art_ziel\":\"Ziel\",\"label_url\":\"Adresse der Seite\",\"label_name\":\"Seitentitel (action_name)\",\"label_besucher\":\"Besucherkennung (_id, 16 Hexzeichen)\",\"label_e_c\":\"Ereigniskategorie\",\"label_e_a\":\"Ereignisaktion\",\"label_e_n\":\"Ereignisname\",\"label_e_v\":\"Ereigniswert\",\"label_idgoal\":\"Ziel-ID\",\"label_revenue\":\"Umsatz\",\"label_dimensionen\":\"Custom Dimensions (Nummer und Wert)\",\"ph_dimension\":\"Wert\",\"knopf\":\"Anfrage bauen\",\"knopf_zeile\":\"Dimension hinzuf\u00fcgen\",\"knopf_weg\":\"Entfernen\",\"fehler_host\":\"Die Adresse von matomo.php fehlt.\",\"fehler_host_schema\":\"Die Adresse muss mit http:\\\/\\\/ oder https:\\\/\\\/ beginnen.\",\"fehler_idsite\":\"Die Site-ID muss eine ganze Zahl ab 1 sein.\",\"fehler_besucher\":\"Die Besucherkennung muss aus genau 16 Hexzeichen bestehen, sonst \u00fcbergeht Matomo sie stillschweigend.\",\"fehler_ereignis\":\"Ein Ereignis braucht mindestens Kategorie und Aktion.\",\"fehler_e_v\":\"Der Ereigniswert muss eine Zahl sein.\",\"fehler_idgoal\":\"Die Ziel-ID muss eine ganze Zahl sein.\",\"fehler_revenue\":\"Der Umsatz muss eine Zahl sein.\",\"fehler_dimension\":\"Zeile %s tr\u00e4gt keine g\u00fcltige Dimensionsnummer.\",\"fehler_dimension_doppelt\":\"Dimension %s kommt zweimal vor, der zweite Wert w\u00fcrde den ersten \u00fcberschreiben.\",\"h_befunde\":\"Befunde\",\"h_url\":\"Anfrage als Adresse\",\"h_curl\":\"Derselbe Aufruf f\u00fcr die Befehlszeile\",\"h_parameter\":\"Parameter der Reihe nach\",\"b_ohne_id\":\"Ohne _id leitet Matomo den Besucher aus IP und Browserkennung ab. Im Browser geht das, auf dem Server verschmilzt es alle Besucher zu einem.\",\"b_ohne_url\":\"Weder url noch action_name ist gesetzt, der Treffer landet ohne Namen im Bericht.\",\"b_url_relativ\":\"Die Adresse der Seite ist relativ. Matomo erwartet eine vollst\u00e4ndige Adresse mitsamt Schema.\",\"b_dimension_leer\":\"Dimension %s hat keinen Wert und bleibt weg.\",\"b_dimension_lang\":\"Der Wert von Dimension %s ist l\u00e4nger als 250 Zeichen und wird abgeschnitten.\",\"hinweis_server\":\"Parameter wie cip f\u00fcr die echte IP-Adresse, cdt f\u00fcr einen eigenen Zeitstempel oder die geografischen Felder wirken nur zusammen mit token_auth. Dieses Token geh\u00f6rt auf einen Server: im Browser gibt es jedem Besucher Schreibrecht auf die Statistik.\"};<\/p>\n<p>    \/\/ --- reine Rechenlogik ---<\/p>\n<p>    function textWert(wert) {\n        return String(wert === undefined || wert === null ? '' : wert).trim();\n    }<\/p>\n<p>    function bauen(eingabe) {\n        const ergebnis = { ok: false, fehler: '', parameter: [], url: '', curl: '', befunde: [] };\n        const e = eingabe || {};<\/p>\n<p>        const host = textWert(e.host);\n        if (host === '') { ergebnis.fehler = T.fehler_host; return ergebnis; }\n        if (!\/^https?:\\\/\\\/\/i.test(host)) { ergebnis.fehler = T.fehler_host_schema; return ergebnis; }<\/p>\n<p>        const idsite = textWert(e.idsite);\n        if (!\/^[0-9]+$\/.test(idsite) || parseInt(idsite, 10) < 1) { ergebnis.fehler = T.fehler_idsite; return ergebnis; }\n\n        const art = e.art === 'ereignis' || e.art === 'ziel' ? e.art : 'seite';\n        const url = textWert(e.url);\n        const name = textWert(e.name);\n\n        \/\/ Die Reihenfolge ist die aus der Matomo-Dokumentation gewohnte.\n        const parameter = [];\n        parameter.push(['idsite', idsite]);\n        parameter.push(['rec', '1']);\n        parameter.push(['apiv', '1']);\n        if (url !== '') { parameter.push(['url', url]); }\n        if (name !== '') { parameter.push(['action_name', name]); }\n\n        const besucher = textWert(e.besucher);\n        if (besucher !== '') {\n            if (!\/^[0-9a-fA-F]{16}$\/.test(besucher)) {\n                ergebnis.fehler = T.fehler_besucher;\n                return ergebnis;\n            }\n            parameter.push(['_id', besucher.toLowerCase()]);\n        } else {\n            ergebnis.befunde.push({ schwer: false, text: T.b_ohne_id });\n        }\n\n        if (art === 'ereignis') {\n            const kategorie = textWert(e.e_c);\n            const aktion = textWert(e.e_a);\n            if (kategorie === '' || aktion === '') { ergebnis.fehler = T.fehler_ereignis; return ergebnis; }\n            parameter.push(['e_c', kategorie]);\n            parameter.push(['e_a', aktion]);\n            if (textWert(e.e_n) !== '') { parameter.push(['e_n', textWert(e.e_n)]); }\n            const wert = textWert(e.e_v).replace(',', '.');\n            if (wert !== '') {\n                if (!\/^-?[0-9]+(\\.[0-9]+)?$\/.test(wert)) { ergebnis.fehler = T.fehler_e_v; return ergebnis; }\n                parameter.push(['e_v', wert]);\n            }\n        }\n\n        if (art === 'ziel') {\n            const ziel = textWert(e.idgoal);\n            if (!\/^[0-9]+$\/.test(ziel)) { ergebnis.fehler = T.fehler_idgoal; return ergebnis; }\n            parameter.push(['idgoal', ziel]);\n            const umsatz = textWert(e.revenue).replace(',', '.');\n            if (umsatz !== '') {\n                if (!\/^[0-9]+(\\.[0-9]+)?$\/.test(umsatz)) { ergebnis.fehler = T.fehler_revenue; return ergebnis; }\n                parameter.push(['revenue', umsatz]);\n            }\n        }\n\n        const gesehen = {};\n        const dimensionen = Array.isArray(e.dimensionen) ? e.dimensionen : [];\n        for (let i = 0; i < dimensionen.length; i++) {\n            const nummer = textWert(dimensionen[i].nummer);\n            const wert = textWert(dimensionen[i].wert);\n            if (nummer === '' &#038;&#038; wert === '') { continue; }\n            if (!\/^[0-9]+$\/.test(nummer) || parseInt(nummer, 10) < 1) {\n                ergebnis.fehler = T.fehler_dimension.replace('%s', String(i + 1));\n                return ergebnis;\n            }\n            if (gesehen[nummer]) {\n                ergebnis.fehler = T.fehler_dimension_doppelt.replace('%s', nummer);\n                return ergebnis;\n            }\n            gesehen[nummer] = true;\n            if (wert === '') {\n                ergebnis.befunde.push({ schwer: false, text: T.b_dimension_leer.replace('%s', nummer) });\n                continue;\n            }\n            if (wert.length > 250) {\n                ergebnis.befunde.push({ schwer: true, text: T.b_dimension_lang.replace('%s', nummer) });\n            }\n            parameter.push(['dimension' + nummer, wert]);\n        }<\/p>\n<p>        parameter.push(['send_image', '0']);<\/p>\n<p>        \/\/ Befunde, die nicht am Aufbau haengen\n        if (url === '' && name === '') { ergebnis.befunde.push({ schwer: true, text: T.b_ohne_url }); }\n        if (url !== '' && !\/^https?:\\\/\\\/\/i.test(url)) { ergebnis.befunde.push({ schwer: true, text: T.b_url_relativ }); }<\/p>\n<p>        const abfrage = parameter.map(function (p) {\n            return encodeURIComponent(p[0]) + '=' + encodeURIComponent(p[1]);\n        }).join('&');<\/p>\n<p>        ergebnis.parameter = parameter;\n        ergebnis.url = host + (host.indexOf('?') === -1 ? '?' : '&') + abfrage;\n        ergebnis.curl = 'curl -s -o \/dev\/null -w \"%{http_code}\\\\n\" \\\\\\n  --get \\\\\\n'\n            + parameter.map(function (p) {\n                return '  --data-urlencode ' + hochkomma(p[0] + '=' + p[1]);\n            }).join(' \\\\\\n')\n            + ' \\\\\\n  ' + hochkomma(host);\n        ergebnis.ok = true;\n        return ergebnis;\n    }<\/p>\n<p>    function hochkomma(text) {\n        \/\/ Einfache Anfuehrungszeichen fuer die Kommandozeile absichern.\n        return \"'\" + String(text).replace(\/'\/g, \"'\\\\''\") + \"'\";\n    }<\/p>\n<p>    function besucherkennung(zufall) {\n        \/\/ Matomo erwartet genau sechzehn Hexziffern.\n        const ziffern = '0123456789abcdef';\n        let raus = '';\n        for (let i = 0; i < 16; i++) {\n            const wert = typeof zufall === 'function' ? zufall(i) : Math.floor(Math.random() * 16);\n            raus += ziffern.charAt(Math.abs(Math.floor(wert)) % 16);\n        }\n        return raus;\n    }\n\n    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.MT = { bauen: bauen, besucherkennung: besucherkennung, hochkomma: hochkomma };\n    }\n\n    \/\/ --- Anbindung an das Dokument ---\n\n    const btn = document.getElementById('mt-btn');\n    const out = document.getElementById('mt-ergebnis');\n    const liste = document.getElementById('mt-liste');\n    const addBtn = document.getElementById('mt-add');\n    const artFeld = document.getElementById('mt-art');\n    const ereignisBlock = document.getElementById('mt-ereignis');\n    const zielBlock = document.getElementById('mt-ziel');\n    if (!btn || !out || !liste || !addBtn || !artFeld || !ereignisBlock || !zielBlock) { 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    const FELD = 'padding: 10px; background: var(--bg-panel, #1e1e24); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace;';\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 wert(id) {\n        const knoten = document.getElementById(id);\n        return knoten ? knoten.value : '';\n    }\n\n    let zaehler = 0;\n    function zeileErzeugen(vorgabe) {\n        const v = vorgabe || {};\n        zaehler++;\n        const zeile = el('div', 'display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin-bottom: 8px;');\n        zeile.setAttribute('data-mt', 'zeile');\n\n        const nummer = document.createElement('input');\n        nummer.type = 'text';\n        nummer.id = 'mt-dim-nr-' + zaehler;\n        nummer.setAttribute('style', FELD + ' width: 90px;');\n        nummer.setAttribute('data-mt', 'nummer');\n        nummer.placeholder = 'Nr.';\n        nummer.value = v.nummer ? v.nummer : '';\n        zeile.appendChild(nummer);\n\n        const feldwert = document.createElement('input');\n        feldwert.type = 'text';\n        feldwert.id = 'mt-dim-wert-' + zaehler;\n        feldwert.setAttribute('style', FELD + ' flex: 1; min-width: 200px;');\n        feldwert.setAttribute('data-mt', 'wert');\n        feldwert.placeholder = T.ph_dimension;\n        feldwert.value = v.wert ? v.wert : '';\n        zeile.appendChild(feldwert);\n\n        const weg = el('button', 'background: transparent; color: var(--text-secondary, #a0a0b0); border: 1px solid var(--border, #2a2a35); padding: 10px 14px; border-radius: 6px; cursor: pointer;', T.knopf_weg);\n        weg.type = 'button';\n        weg.addEventListener('click', function () {\n            if (zeile.parentNode) { zeile.parentNode.removeChild(zeile); }\n            if (!liste.querySelector('[data-mt=\"zeile\"]')) { zeileErzeugen({}); }\n        });\n        zeile.appendChild(weg);\n\n        liste.appendChild(zeile);\n    }\n\n    function dimensionenLesen() {\n        const knoten = liste.querySelectorAll('[data-mt=\"zeile\"]');\n        const daten = [];\n        for (let i = 0; i < knoten.length; i++) {\n            const nummer = knoten[i].querySelector('[data-mt=\"nummer\"]');\n            const feldwert = knoten[i].querySelector('[data-mt=\"wert\"]');\n            if (!nummer || !feldwert) { continue; }\n            daten.push({ nummer: nummer.value, wert: feldwert.value });\n        }\n        return daten;\n    }\n\n    function bloeckeZeigen() {\n        ereignisBlock.style.display = artFeld.value === 'ereignis' ? 'flex' : 'none';\n        zielBlock.style.display = artFeld.value === 'ziel' ? 'flex' : 'none';\n    }\n\n    function codeKasten(titel, inhalt) {\n        const rahmen = document.createDocumentFragment();\n        rahmen.appendChild(el('div', UEBERSCHRIFT, titel));\n        const code = el('pre', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); padding: 16px; border-radius: 6px; overflow-x: auto; font-family: monospace; font-size: 0.85rem; line-height: 1.5; white-space: pre-wrap; word-break: break-all; margin-bottom: 18px;', inhalt);\n        rahmen.appendChild(code);\n        return rahmen;\n    }\n\n    function zeigen(erg) {\n        out.textContent = '';\n\n        if (erg.befunde.length) {\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n            const kasten = el('div', KASTEN);\n            erg.befunde.forEach(function (b) {\n                const z = el('div', 'display: flex; gap: 10px; padding: 4px 0;');\n                z.appendChild(el('span', 'color: ' + (b.schwer ? '#ffb86c' : 'var(--text-secondary, #a0a0b0)') + '; font-family: monospace;', b.schwer ? '!' : '-'));\n                z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.9rem; line-height: 1.5;', b.text));\n                kasten.appendChild(z);\n            });\n            out.appendChild(kasten);\n        }\n\n        out.appendChild(codeKasten(T.h_url, erg.url));\n        out.appendChild(codeKasten(T.h_curl, erg.curl));\n\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_parameter));\n        const tabelle = el('div', KASTEN);\n        erg.parameter.forEach(function (p) {\n            const z = el('div', 'display: flex; justify-content: space-between; gap: 14px; flex-wrap: wrap; padding: 4px 0; border-bottom: 1px solid var(--border, #2a2a35);');\n            z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-family: monospace;', p[0]));\n            z.appendChild(el('span', 'color: var(--text-primary, #e8e8ee); font-family: monospace; text-align: right; word-break: break-all; max-width: 70%;', p[1]));\n            tabelle.appendChild(z);\n        });\n        out.appendChild(tabelle);\n\n        out.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; line-height: 1.6;', T.hinweis_server));\n    }\n\n    artFeld.addEventListener('change', bloeckeZeigen);\n    addBtn.addEventListener('click', function () { zeileErzeugen({}); });\n\n    btn.addEventListener('click', function () {\n        const erg = bauen({\n            host: wert('mt-host'),\n            idsite: wert('mt-idsite'),\n            art: artFeld.value,\n            url: wert('mt-url'),\n            name: wert('mt-name'),\n            besucher: wert('mt-besucher'),\n            e_c: wert('mt-e-c'),\n            e_a: wert('mt-e-a'),\n            e_n: wert('mt-e-n'),\n            e_v: wert('mt-e-v'),\n            idgoal: wert('mt-idgoal'),\n            revenue: wert('mt-revenue'),\n            dimensionen: dimensionenLesen()\n        });\n        out.textContent = '';\n        if (!erg.ok) {\n            out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', erg.fehler));\n            return;\n        }\n        zeigen(erg);\n    });\n\n    bloeckeZeigen();\n    zeileErzeugen({ nummer: '1', wert: 'Mitglied' });\n    zeileErzeugen({ nummer: '2', wert: 'Tarif Pro' });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Setzt eine Anfrage an die Matomo-Tracking-API mit Seitenaufrufen, Ereignissen, Zielen und Custom Dimensions zusammen und benennt die Fehler, an denen ein Treffer lautlos verschwindet.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92265,92211],"class_list":["post-10245","page","type-page","status-publish","hentry","tag-prywatnosc-danych-pl-de","tag-self-hosting-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Matomo Tracking-API und Custom Dimensions bauen - 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\/de\/werkzeuge\/matomo-tracking-api-builder\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Matomo Tracking-API und Custom Dimensions bauen - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Setzt eine Anfrage an die Matomo-Tracking-API mit Seitenaufrufen, Ereignissen, Zielen und Custom Dimensions zusammen und benennt die Fehler, an denen ein Treffer lautlos verschwindet.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/matomo-tracking-api-builder\/\" \/>\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\\\/de\\\/werkzeuge\\\/matomo-tracking-api-builder\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/matomo-tracking-api-builder\\\/\",\"name\":\"Matomo Tracking-API und Custom Dimensions bauen - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:30:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/matomo-tracking-api-builder\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/matomo-tracking-api-builder\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/matomo-tracking-api-builder\\\/#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-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Matomo Tracking-API und Custom Dimensions bauen\"}]},{\"@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":"Matomo Tracking-API und Custom Dimensions bauen - 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\/de\/werkzeuge\/matomo-tracking-api-builder\/","og_locale":"en_US","og_type":"article","og_title":"Matomo Tracking-API und Custom Dimensions bauen - Lukas Wojcik - Blog","og_description":"Setzt eine Anfrage an die Matomo-Tracking-API mit Seitenaufrufen, Ereignissen, Zielen und Custom Dimensions zusammen und benennt die Fehler, an denen ein Treffer lautlos verschwindet.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/matomo-tracking-api-builder\/","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\/de\/werkzeuge\/matomo-tracking-api-builder\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/matomo-tracking-api-builder\/","name":"Matomo Tracking-API und Custom Dimensions bauen - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:30:15+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/matomo-tracking-api-builder\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/matomo-tracking-api-builder\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/matomo-tracking-api-builder\/#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-2\/"},{"@type":"ListItem","position":3,"name":"Matomo Tracking-API und Custom Dimensions bauen"}]},{"@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\/10245","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=10245"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10245\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10245"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}