V první části seriálu o využití first-party dat v online reklamě jsme vysvětlili proč jsou first-party data důležitá pro mediální cílení a zvýšení výkonu kampaní. V této části si podrobně popíšeme jak first-party data správně sbírat a posílat do mediálních systémů. Projedeme celou cestu first-party dat od dataLayeru přes normalizaci a hashování až po odeslání skrze server-side Google Tag Manager (sGTM) do Google Ads a Meta. Cílem je poskytnout vám konkrétní návod, který můžete rovnou implementovat včetně code snippetů, edge casů včetně míst, kde to v praxi skřípe nejvíc.
Dobrou zprávou je, že samotné odeslání first-party dat do reklamních systémů není technicky složité. Horší zpráva: detaily, na kterých záleží, jsou schované v normalizaci, hashování a v tom, jak přesně data zabalíte před odesláním. Pokud víte, jak na to, je to záležitost na jedno odpoledne. Pokud ne, strávíte daleko víc času laděním toho, proč se hash neshoduje (v horším případě to ani vědět nebudete) nebo proč data v platformě chybí.
Tenhle článek vám ušetří obojí. Projdeme celou technickou flow od sběru dat v dataLayeru přes normalizaci a hashování až po odeslání do Google Ads a Meta:
1. Uživatel provede akci na webu (nákup, odeslání formuláře), při které vám poskytne svoje osobní údaje a ty web vydá do datalayer objektu user_data.
2. Browserový GTM kontejner zachytí dataLayer event a například GA4 tag (lze odesílat i přes jiné trackery a templates) odešle hit na váš sGTM endpoint (nikoliv na Google servery) i s těmito údaji
3. Na straně sGTM přijme hit GA4 Client (speciální komponenta v sGTM, jejíž úkolem je rozpoznat v jakém formátu data přichází a správně je zpracovat), který přijme příchozí payload a transformuje ho do tzv. Event Data Objectu, strukturovaného datového objektu. Tento objekt obsahuje veškerá pole odeslaná z prohlížeče včetně objektu user_data.
4. Následně se aktivují příslušné tagy:
a. Google Ads Conversion Tracking tag na konkrétním konverzním eventu (např. purchase) automaticky parsuje user_data z Event Data Objectu, provede SHA- 256 hashování polí v objectu user_data a odešle konverzní hit na Google Ads servery (upřímně setup je ve skutečnosti hybridní - Google Ads tag v sGTM vrací v HTTP response instrukci pro GA4 knihovnu v prohlížeči, aby provedla redirect na DoubleClick doménu pro third-party cookie stitching).
b. Meta (Facebook) CAPI template (ať už používáte ten oficiální od Meta nebo třeba ten od Stape.io) si taktéž automaticky bere user_data z Event Data Objectu - pozor na to, dělá to i když mu je nenastavíte manuálně napřímo.
Sběr user dat: dataLayer jako základ všeho
Sběr first-party dat začíná na vašem webu - konkrétně ve chvíli, kdy vám uživatel své údaje předá: při registraci, odeslání objednávky nebo přihlášení k newsletteru. Standardní cestou je push do dataLayeru. Už tady můžete narazit na první úskalí.
Několik klíčových best practices:
- user_data musí být součástí stejného pushe jako event, protože GTM zpracovává data v kontextu konkrétního eventu a data pushnutá samostatně nemusí být dostupná v okamžiku spuštění tagu
- před pushnutím nových ecommerce dat by měl být vždy vymazán předchozí stav nebo obsah datové vrsty: dataLayer.push({ ecommerce: null }); zabrání to „prosakování" dat z předchozích eventů.
- i když Google dokumentace tvrdí opak, nestačí přidat user_data pouze do Google tagu (konfiguračního tagu), přidejte ho i na jednotlivé GA4 event tagy (purchase, generate_lead atd.). Více specialistů se shoduje, že přidání pouze na config tag není vždy spolehlivé.
- pokud některá hodnota z user_data není k dispozici, pole jednoduše vynechte, nikdy neposílejte placeholder (prázdný řetězec, "unknown", "N/A" apod.). Systémy placeholder zahashují a použijí jako regulérní identifikátor, čímž sloučí všechny uživatele bez dané hodnoty do jednoho profilu. Výsledkem je zkreslená analytika jak v reklamních platformách, tak v GA4.
Edge case: V praxi se často stává, že first-party data
nejsou k dispozici přesně v okamžiku konverzního eventu. Typický příklad:
e-mail znáte z přihlášení na jiné stránce, ale na thank-you page s potvrzením objednávky
už k němu nemáte přístup. Řešení nabízí kombinace sGTM Transformations + Firestore lookup:
- Při přihlášení nebo registraci uložíte user data do Firestore s klíčem client_id nebo user_id.
- Na konverzním eventu, kde data v dataLayer chybí, použijete v sGTM Augment Event Transformation s Firestore Lookup proměnnou.
- Transformation obohatí Event Data Object o uložená data ještě předtím, než k nim přistoupí jakýkoliv tag.
Tento pattern má zásadní výhodu: citlivá data, například e-mail nebo telefon, nemusí
vůbec projít přes prohlížeč. sGTM si je vytáhne přímo z databáze.
Simo Ahava to popisuje elegantně:
„Stačí na frontendu zachytit transaction_id a v sGTM si přes Firestore nebo HTTP API dotáhnete kompletní ecommerce data včetně skutečného profitu místo hodnoty z frontendu.“
SHA-256 hashování
Zásadní prvek implementace first-party dat je hashování. Ve světě reklamních platforem typu Google nebo Meta se standardně používá jeden konkrétní algoritmus - SHA-256. SHA-256 je jednosměrný hashovací algoritmus, který převede libovolný vstup na 64znakový hexadecimální řetězec. Google, Meta, ale i Reddit, X, Pinterest, TikTok a další používají SHA-256 pro matching first-party dat proti své databázi přihlášených uživatelů.
Klíčové rozhodnutí je, kde hashovat. Na klientovi (v prohlížeči), nebo na serveru (v sGTM)?
Dobrá zpráva - pokud si chcete ušetřit práci a starosti, z praktického hlediska nemusíte hashování řešit ručně; všechny tagy a templaty pro Google Ads i Meta Pixel/CAPI provádějí hashování automaticky - ať už na browseru nebo v serveru. Google Ads tag automaticky hashuje pole user_data před odesláním a Meta CAPI tag (jak oficiální Facebook šablona, tak Stape šablona) dělá totéž. Navíc dokáží detekovat, zda data už hashovaná jsou, a v tom případě je nehashují znovu.
Otázka ale není jen technická, ale i bezpečnostní. Chcete otázku ochrany citlivých dat svěřit automatizovanému skriptu od Googlu nebo Mety? Pokud ne, máte v zásadě tři úrovně možného zabezpečení:
1. hashovat data ještě před odesláním do datové vrstvy, takže raw e-mail nebo telefon se v prohlížeči nikdy neobjeví;
2. osobní údaje v prohlížeči vynechat a poslat je ze svého CRM a hashovat přes funkci na server-side GTM
3. hashovat na vlastním serveru nebo backendu ještě před odesláním do sGTM
Každá z těchto cest má jiné nároky na implementaci i jiný bezpečnostní dopad. Otázce kdy a kde hashovat se budeme věnovat podrobněji v jednom z dalších dílů.
Normalizace dat před hashováním
Normalizace je krok, který rozhoduje o tom, jestli vaše data vůbec budou k něčemu. Špatně normalizovaný hash se s databází platformy neshodne a konverze se nepřiřadí. Navíc Google a Meta mají pravidla na několika místech odlišná, takže jedna funkce pro obě nestačí.
Dokumentace Google: https://developers.google.com/google-ads/api/docs/conversions/upload-offline#prepare-data
Dokumentace Meta: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters/#formatting-the-user-data-parameters
E-mail
Obě platformy vyžadují převod na lowercase a odstranění úvodních/koncových mezer (trim). Zásadní rozdíl je ale v zacházení s Gmail adresami - Google Ads Enhanced Conversions vyžaduje pro adresy na gmail.com a googlemail.com odstranění teček z username části a odstranění všeho za znakem + (plus-addressing). Meta CAPI toto nevyžaduje, jejich dokumentace explicitně uvádí pouze trim a lowercase. Odstranění teček z Gmail adresy pro Meta by vedlo k nesprávnému hashi.
| Pole |
Vstup |
Google |
Meta |
| E-mail |
Jan.Novák+tag@gmail.com |
jannovak@gmail.com |
jan.novak+tag@gmail.com |
Telefon
Obě platformy vyžadují formát se country prefixem:
- Google požaduje E.164 formát Google Support s + na začátku
- Meta vyžaduje prakticky totéž, ale bez znaku + pouze číslice včetně kódu země.
Žádné mezery, pomlčky ani závorky. Vždy uvádějte kód země, i když všechna data pocházejí z jedné země.
| Pole |
Vstup |
Google |
Meta |
| Telefon |
731 458 920 |
+420731458920 |
420731458920 |
Jméno a příjmení
Obě platformy: lowercase, bez interpunkce. Meta navíc požaduje odstranění speciálních znaků (ale česká diakritika je OK a má být zachovaná).
| Pole |
Vstup |
Google |
Meta |
| Jméno |
Novák |
novák |
novák |
| Příjmení |
Červený |
červený |
červený |
Adresa
Meta hashuje všechna adresní pole (město, stát, ZIP, země), zatímco Google hashuje pouze jméno, příjmení a ulici - město, region, PSČ a země se posílají v plaintextu. Země musí být ve formátu ISO 3166-1 alpha-2 (CZ, SK, DE) pro Google, zatímco Meta chce lowercase (cz, sk)
| Pole |
Vstup |
Google |
Meta |
| Ulice |
Hlavní 456 |
hlavní 456 |
hlavní 456 |
| Město |
Brno |
Brno (plaintext) |
brno |
| Region |
Jihomoravský kraj |
Jihomoravský kraj (plaintext) |
jihomoravský kraj |
| PSČ |
602 00 |
602 00 (plaintext) |
60200 |
| Země |
- |
CZ |
cz |
Jak normalizovat?
Normalizovat byste měli optimálně už na webu, tzn. aby vám vývojář posílal do datové vrstvy rovnou normalizované a klidně i rovnou hashované osobní údaje. Pokud to z nějakého důvodu není možné, můžete si normalizační funkci v GTM napsat sami, může vypadat třeba takto:
Google:
function normalizeEmail(email, platform) {
email = email.trim().toLowerCase();
if (platform === 'google') {
const [user, domain] = email.split('@');
if (['gmail.com', 'googlemail.com'].includes(domain)) {
let cleanUser = user.replace(/\./g, '');
if (cleanUser.includes('+')) {
cleanUser = cleanUser.substring(0, cleanUser.indexOf('+'));
}
return cleanUser + '@' + domain;
}
}
return email;
}
function normalizePhone(phone, platform) {
let digits = phone.replace(/[\s\-\(\)]/g, '');
if (!digits.startsWith('+')) digits = '+' + digits;
// Meta: without +
return platform === 'meta' ? digits.replace('+', '') : digits;
}
Meta:
function normalizeEmailMeta(email) {
return email.trim().toLowerCase(); // no gmail dot-stripping
}
function normalizePhoneMeta(phone) {
let digits = phone.replace(/[\s\-\(\)]/g, '');
if (!digits.startsWith('+')) digits = '+' + digits;
return digits.replace('+', ''); // no +: 420234567890
}
Specifické požadavky pro Google Ads
Minimální požadavek: alespoň jeden identifikátor (e-mail, telefon, nebo kompletní adresa (jméno + příjmení + PSČ + země) - pokud pošlete jen jméno a příjmení, dojde k silent failu = raději neposílejte nekompletní adresu).
Implementujte fallback logiku: pokud telefon není k dispozici, pošlete alespoň e-mail. Pokud nemáte ani jedno, konverze se stále odešle. Platforma ji nezmatčuje, ale může ji započítat jako unattributed conversion a použít modeling.
Specifické požadavky pro Meta Ads
Meta hashuje všechna customer information pole (e-mail, telefon, jméno, příjmení, město, stát, PSČ, země). V Meta Ads získávají vaše události hodnocení tzv. Event Match Quality (EMQ), což je Meta skóre na stupnici 0 až 10, která hodnotí kvalitu matchování.
Vaším cílem by mělo být získat 6+ pro hlavní konverzní eventy, ideálně 8+ pro purchase. Přidání hashovaného e-mailu přinese zhruba +4 body, telefonu +3 body. Lepší je poslat méně přesných, ale správně normalizovaných parametrů, než mnoho špatně zpracovaných.