Na vlastním webu mipaco.cz jsem při auditu našel chybu, která zkreslovala vyhodnocení nabídky: obecné tlačítko v analytice přebíralo dříve zvolenou SEO konzultaci. Událost se odeslala, jen k ní patřila nesprávná informace.
Oprava je nasazená a prošla kontrolou na produkci 21. října 2026. Níže je konkrétní scénář, podstatná část změny v kódu a výsledek ověření. MIPACO je můj vlastní web na Next.js; ukázka neobsahuje klientská data.
Co bylo zadáním auditu
Potřeboval jsem ověřit, zda se návštěvník dostane od nabídky k poptávce a zda poznám, o jakou službu měl zájem. Kontrola proto zahrnovala web, Google Tag Manager (GTM) a Google Analytics 4 (GA4), včetně skutečného doručení zprávy z formuláře.
Současně se kontrolovala indexace v Google Search Console a mobilní rychlost. Pro tento rozbor vybírám chybu měření a jednu technickou opravu. U obou lze ukázat původní stav i kontrolu změny.
Problém: obecné tlačítko zdědilo nabídku
Po zobrazení SEO konzultace zůstala v datovém modelu GTM hodnota offer_id = seo-entry. Další kliknutí na obecné tlačítko ji nevyprázdnilo. Tag Assistant pak i u tohoto kliknutí ukazoval konkrétní nabídku.
Důsledek pro rozhodování: při porovnávání nabídek bych se nemohl spolehnout na přiřazení kliknutí. Z těchto dat by se špatně posuzovalo, zda návštěvník zvolil SEO konzultaci, nebo chtěl obecně probrat spolupráci.
| Kontrolní scénář | Před opravou | Po opravě |
|---|---|---|
| Zobrazení SEO konzultace, potom obecné tlačítko | offer_id zůstalo seo-entry |
offer_id je prázdné |
| Parametry odeslané poptávky | V GTM chybělo předání nabídky a typu | GA4 přijal správnou nabídku i typ contact |
Převzetí nabídky u obecného tlačítka bylo zachycené na živém webu v Tag Assistantu. Správné parametry poptávky potvrdil produkční test popsaný níže.
Oprava: kontext patří jen aktuální události
Do společné funkce pro odesílání událostí přibyly prázdné výchozí hodnoty pro nabídku a typ poptávky. Parametry konkrétní události je potom přepíšou, pokud je mají nést.
Podstatná část opravy vypadá takto:
w.dataLayer.push({
event,
offer_id: "",
lead_type: "",
...params,
});
Pořadí je záměrné. Obecné tlačítko dostane prázdnou nabídku. Odeslaná poptávka po výběru SEO konzultace si naopak ponechá offer_id = seo-entry a typ contact, protože je předá ve vlastních parametrech.
Doplněné byly také značky a parametry v GTM a vlastní dimenze v GA4. Samotné volání v kódu totiž ještě nepotvrzuje, že se správná hodnota dostala až do analytiky.
Jak proběhlo ověření na produkci
Kontrola sledovala celý průchod formulářem:
- Bez vyplněných povinných polí prohlížeč odeslání zastavil. Z tohoto pokusu nevznikla událost poptávky.
- Platné testovací odeslání zobrazilo potvrzení a e-mail dorazil do schránky příjemce formuláře.
- Tag Assistant i přehled DebugView v GA4 ukázaly právě jeden
generate_leadz testovacího odeslání. Nesloffer_id = seo-entryalead_type = contact. - Opakovaný scénář s obecným tlačítkem už měl prázdné
offer_id. - Po odmítnutí analytiky a novém načtení se GTM nenačetl. Ani přepnutí nabídky jej nespustilo.
Testovací odeslání bylo označené kampaní measurement-20261021. Při obchodním vyhodnocení jej vynechávám. Ověřeným výsledkem je doručení zprávy a správně přijatá událost z kontrolního odeslání. Obchodní dopad opravy zatím změřený není.
Zjednodušenou reprodukci si můžete spustit
Kontrolní skript pro Node.js na plochých parametrech napodobuje uchování předchozích hodnot a ukazuje rozdíl mezi původním a opraveným odesláním:
node mipaco-mereni-repro-2026-10-21.mjs --before
node mipaco-mereni-repro-2026-10-21.mjs
První příkaz záměrně skončí chybou kontroly, protože obecné tlačítko zdědí seo-entry. Druhý projde. Jde o izolovanou reprodukci problému, bez připojení k účtu Google. Přijetí události v GA4 bylo ověřené zvlášť na produkci.
Záznam ověření z 21. 10. 2026 shrnuje scénáře a jejich výsledky. Je to můj autorský záznam, nikoli původní export z analytiky.
Co ukázala oprava mobilní rychlosti
Běžné stránky načítaly samostatný soubor stylů pro font JetBrains Mono, který na nich nebyl potřeba. Font jsem přesunul ke komponentám s ukázkami kódu. Stránka AI konzultace tak místo dvou souborů stylů odkazovala na jeden; font zůstal tam, kde se používá.
V PageSpeed Insights se 21. října 2026 porovnal mobilní běh před a po nasazení. Metrika Largest Contentful Paint (LCP) vyjadřuje čas vykreslení největšího viditelného obrázku nebo textového bloku.
| Stránka | LCP před | LCP po |
|---|---|---|
| Homepage | 4,2 s | 3,4 s |
| AI konzultace | 2,9 s | 2,9 s |
Zdroje: homepage před, homepage po, AI konzultace před, AI konzultace po. Emulovaný Moto G Power, Slow 4G, Lighthouse 13.5.0.
V každém stavu proběhl jeden laboratorní běh na stránku. Reporty neměly data skutečných návštěvníků. Odstranění nepotřebného požadavku je ověřené; rozdíl homepage z tohoto vzorku nelze spolehlivě připsat samotné opravě. U AI stránky zůstalo LCP stejné. Rychlost proto dál patří mezi otevřené úkoly.
Jakou roli měla AI a co kontroluje člověk
Na auditu a opravách jsem pracoval s AI v Codexu. Já jsem určil obchodní zadání, rozsah nabídky a zveřejnění této ukázky. Agent pomohl projít zdrojový kód, připravit opravy a provést automatické i prohlížečové kontroly.
Při převzetí takové práce má člověk k dispozici konkrétní kontrolní body: kterou událost sleduje, jaké parametry očekává a kde se potvrdilo jejich přijetí. Změna kódu, doručení e-mailu a přijetí v GA4 mají vlastní ověření. Výsledek posuzujete podle zaznamenaného chování webu.
Tato ukázka dokládá opravené chování měření a odstraněný technický požadavek. Změna organické návštěvnosti, počtu zakázek nebo citací v AI odpovědích zůstává nevyhodnocená.
Co z podobného auditu dostanete
U SEO auditu předávám nález s důkazem, prioritou a zadáním pro vývoj. Předem se určí, jak má vypadat správný stav a kdo jej po nasazení ověří. Rozsah měření a implementace si domluvíme podle konkrétního webu.
Chcete podobný postup použít ve vlastním týmu? U AI konzultace vybereme jeden úkol a projdeme jej na vašich podkladech.
