First-party data v online reklamě, část 2: Jak je sbírat a posílat do mediálních systémů

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.
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
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.
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ě.
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á).
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)
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.
Nastavení v GTM a sGTM
Prerekvizity
- first-party údaje v datové vrstvě
- GTM kontejner nasazený na webu
- nastavené serverové měření sGTM (přes vlastní server v GCP nebo třetí stranu)
1. Předpokládejme, že máte v datové vrstvě nasazené údaje s událostí purchase:
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: '78342916504217',
value: 249,
tax: 43.21,
shipping: 0,
currency: 'CZK',
coupon: '',
items: [
{
item_id: 'ALZMNTB01',
item_name: 'Alzament PLA Basic 1kg Black',
item_brand: 'Alzament',
item_category: 'Počítače a notebooky',
item_category2: '3D tisk',
item_category3: 'Filamenty pro 3D tiskárny',
price: 249,
quantity: 1,
index: 0
}
]
},
new_customer: true,
customer_type: 'new',
user_data: {
email: 'jan.novak@example.cz',
phone_number: '+420731458920',
address: {
first_name: 'Jan',
last_name: 'Novák',
street: 'Hlavní 456',
city: 'Brno',
region: 'Jihomoravský kraj',
postal_code: '602 00',
country: 'CZ'
}
}
});
2. V GTM si vytvoříte pro každý údaj proměnnou typu “Data Layer Variable”

3. Pro Google Ads si pomocí těchto proměnných zaplníte hodnotami proměnnou “User-Provided data”

4. V browser GTM můžete nastavit odesílání first-party data pro Meta tags pomocí oficiální šablony od Meta (Meta Pixel). Stačí zaškrtnout “Enable Advanced Matching” a poté doplnit příslušná pole:

5. Pro odesílání first-party data do serveru musíte ve své transportní GA4 značce přidat proměnnou User-provided data jako součást config parametrů nebo si jednotlivé first-party proměnné poslat s jiným typem transportního tagu jednotlivě (Data tag)

6. V sGTM díky předchozímu kroku budete dostávat user_data object spolu s událostí purchase (nebo kdykoli budou data k dispozici v datové vrstvě. Pro měření konverzí do Google Ads máte hotovo - značka si údaje bere z objectu user_data automaticky.
Teď už zbývá jen nastavení odesílání uživatelských údajů pro serverové značky Meta Ads - ať už používáte template od Mety nebo od Stape:

Po nasazení je dobré si validovat, že vše chodí jak má - ve správném formátu a správně odchází.
V rámci GTM preview mode:
-> web GTM
-> zkontrolujte si, že se vám user_data v pohodě plní - jednotlivě i jako object:


-> a že se také odesílají do Meta tagu a sGTM v konverzních značkách:


Tímto máte hotovou základní architekturu: data tečou z dataLayeru přes sGTM do Google Ads i Meta, jsou správně normalizovaná a hashovaná. To je ta těžší část.
Jenže jak poznáte, že to opravdu funguje?
Match rate může být nízká ze tří různých důvodů a každý se řeší jinak. V příštím dílu si projdeme debugging = jak číst signály v GTM preview, co vám řekne Google Tag Diagnostics a jak interpretovat Event Match Quality skóre v Meta. Tedy: jak si ověřit, že všechna ta práce, kterou jste právě udělali, skutečně přináší výsledky.






























