Jedna zákaznická databáze pro web, prodejny a e-mailing
Meiro sbírá události z webů vaprio.cz a vaprio.sk, z databáze Vapria (objednávky, účtenky, účty) a ze SmartEmailingu, spojuje je do profilů a nad nimi počítá atributy. Z atributů se staví segmenty, měřené scénáře (e-maily přes SmartEmailing, bannery na webu) a reporting.
Co CDP pro Vaprio dělá
Sbírá
Chování na webu v reálném čase (prohlížení, košík, nákup, přihlášení), transakce a účty z databáze jednou za hodinu, e-mailové události ze SmartEmailingu průběžně.
Spojuje
Události se přes customer_id, e-mail a cookie skládají do profilu jednoho člověka. Web, prodejna i e-mail tak končí na jednom místě.
Aktivuje a měří
Nad profily běží scénáře (opuštěný košík, welcome flow, shopping intention) s kontrolními skupinami. SmartEmailing e-maily jen renderuje a odesílá, rozhoduje Meiro.
Architektura a tok dat
Detaily k jednotlivým vrstvám jsou v kapitolách Zdroje a eventy, Web SDK, Databáze Vaprio a SmartEmailing.
Co běží a co se staví
| Scénář | Stav |
|---|---|
| Opuštěný košík – e-mail CZ | Běží |
| Opuštěný košík – web banner CZ desktop | Běží |
| Opuštěný košík – web banner CZ mobil (A/B test) | Běží |
| Welcome flow „výběr na míru“ + DOI | Rozpracováno |
| Shopping intention – e-mail CZ | Dry-run |
| Shopping intention – web banner CZ | Rozpracováno |
| Segmenty do SmartEmailingu (plošné rozesílky) | K dispozici |
| Opuštěný košík SK (e-mail, banner) | Plán |
| Replenishment | Plán |
| Onboarding | Plán |
Popis každého scénáře, jeho podmínky a reporting jsou v kapitole Use-casy.
Kde co najít v Meiru
Instance: vaprio.eu2.pipes.meiro.io. Odkazy níže vedou přímo do aplikace (vyžadují přihlášení).
| Co hledáte | Kde v UI |
|---|---|
| Zdroje dat, event typy, retence, identifier pravidla | Sources |
| Profil zákazníka (identifikátory, eventy, atributy) | Profiles → Search |
| Identifier typy a limity | Profiles → Identity resolution |
| Atributy (SQL, dimenze, test nad profilem) | Attributes |
| Segmenty | Audiences |
| Scénáře (journeys) | Journeys |
| Destinace do SmartEmailingu, DOI | Destinations · Pipes |
| Web bannery | Channels → Web banners |
| Goals, dashboardy | Goals · Reporting |
| Katalogy produktů (feedy) | Catalogs |
| Zdraví systému, fronty, heartbeat | Health |
| Alerting, API tokeny | Settings |
Zdroje dat a eventy
Každý zdroj má vlastní sadu event typů, retenci a pravidla, podle kterých se eventy lepí na profily. Zdroje a event typy zakládá a mění jen implementátor.
Zdroje v instanci
| Zdroj | Typ | Co posílá | Kadence | UI |
|---|---|---|---|---|
| Vaprio.cz CZ | Web SDK (event stream, slug vaprio-cz-1) | chování na webu, identifikace přihlášeného, web bannery | realtime, řádově tisíce eventů za hodinu ve dne | otevřít |
| Vaprio.sk SK | Web SDK (slug vaprio-sk) | totéž pro slovenský web | realtime | otevřít |
| Vaprio.bar – SANDBOX | Web SDK (slug vaprio-cz) | testovací e-shop vaprio.bar; v reportech ignorovat | jen při testech | otevřít |
| SmartEmailing | konektor Meira (webhooky) | kontakty, odhlášení, odeslání / otevření / kliknutí | průběžně, špičky při rozesílkách | otevřít |
| Vaprio database | Cloud App (pull funkce v Meiru) | objednávky, účtenky, zákaznické účty a newsletter kontakty z CSV exportů | každých 30 min; nová data jednou za hodinu | otevřít |
| Vaprio DB backload | event stream (POST /collect s tokenem) | jednorázové dohrání historie a opravy, stejné 4 eventy jako Cloud App | jen na pokyn implementátora | otevřít |
| Subscribe endpoint CZ / SK | event stream (/collect/subscribe-endpoint-cz, -sk) | žádost o newsletter (bez tokenu) a potvrzení DOI (s tokenem) | při každém přihlášení z webu | CZ SK |
vaprio-cz-1 a sandbox původní vaprio-cz.Web eventy (Vaprio.cz, Vaprio.sk, sandbox)
Každý webový zdroj má identickou sadu 54 event typů: 52 ze šablony Meira ve stylu GA4 a dva vlastní, cart_updated a user_identified. Reálně se používá zlomek:
| Event | Kdy vzniká | Klíčová pole | Poznámka |
|---|---|---|---|
page_view | načtení stránky (tracking rule on.page) | url, title, referrer | největší objem; někdy 2–3× na jedno načtení (AJAX košík) |
view_item | detail produktu | items[] s item_id, price, original_price | základ shopping intention |
view_item_list | výpis produktů (kategorie, vyhledávání, doporučení) | item_list_name, items[] | retence 60 dní; prázdné items u search_no_result jsou záměr |
add_to_cart, remove_from_cart | změna košíku (delta) | items[] | nespolehlivé, stav košíku drží cart_updated |
cart_updated (vlastní) | po každé změně košíku, kompletní snapshot | currency, value, items[] (item_id, item_name, item_variant, item_brand, price, original_price, quantity, item_url, item_image) | zdroj pravdy pro opuštěný košík; prázdný košík = items: [] |
begin_checkout, add_shipping_info, add_payment_info | průchod pokladnou | items[] | |
purchase | děkovací stránka | transaction_id (= eshop_code objednávky v DB), value, currency, items[] | jen propojení chování; tržby vždy z DB |
user_identified (vlastní) | přihlášení, každý load přihlášeného, registrace, newsletter, objednávka | email, source (login / session / registration / newsletter / order) | spojuje cookie s profilem účtu |
web_banner_impression / click / close / submit | web bannery Meira | banner_id, action_text, click_url, form_fields | základ reportingu bannerů |
search, login, sign_up, survey_answer … | šablonové eventy | část se posílá, nic na nich nestojí |
Identifikátory na webových eventech: $.user_id (cookie Meira), $.email a $.payload.email, $.device_id (browser), u šablonových typů i email_message_id a phone (telefon se nikdy neplní). Jak eventy vznikají na webu, popisuje kapitola Web SDK.
SmartEmailing eventy
| Event | Význam | Identifikátor |
|---|---|---|
contact_created, contact_updated | založení / změna kontaktu; payload nese contactlists[] se statusem, blacklist a custom field cf_12 = customer_id Vapria | |
unsubscribed_contact | odhlášení | |
email_sent | odeslání kampaně nebo automatizace (automation_id, node_id, campaign_type, utm_content) | |
email_opened, email_clicked | otevření, kliknutí (sid = SmartEmailing ID) | email + SmartEmailing ID |
Retence všech SE eventů je neomezená. Význam seznamů a polí je v kapitole SmartEmailing.
Databázové eventy (Vaprio database + backload)
| Event | Kdy vzniká (event_time) | Obsah | Identifikátory |
|---|---|---|---|
order_created | vznik objednávky (created_at) | jen neměnná pole: order_id, eshop_code, kanál, prodejna, měna, součty, doprava, platba, položky items[] | customer_id; email jen u guest objednávky |
order_updated | každá změna objednávky (max ze všech časových razítek řádku) | vše z order_created + status, is_canceled, časy přípravy, expedice, doručení, storna; verzované snapshoty, atributy berou poslední verzi | customer_id; email jen u guest |
receipt_created | účtenka z prodejny (created_at) | receipt_id, prodejna, měna, součty, body, položky s vazbou order_item_id na objednávku | customer_id + email |
customer_updated | registrace, přihlášení, změna newsletteru (max z časů účtu a souhlasu) | celý řádek účtu; GDPR výmaz jen customer_id + příznak; newsletter kontakty bez účtu jen e-mail a souhlas | customer_id + email (ne u GDPR) |
Backload zdroj má stejné 4 event typy s jinými ID. Atributy proto vždy pracují s unionem obou zdrojů. Retence všech DB eventů je neomezená. Detail transformace je v kapitole Databáze Vaprio.
Subscribe endpointy (DOI)
Dva event typy, identifikátor e-mail: newsletter_subscription_requested (žádost, spouští DOI e-mail) a newsletter_subscription_confirmed (potvrzení z prokliku, posílá webhook SmartEmailingu s tokenem). Interní domény (dataclub.cz, vaprio.cz, vaprio.sk) se zahazují. Celý tok je v kapitole Souhlas a DOI.
Dedup a verzování
Otisk eventu = zdroj + event typ + event_time + identifikátory v payloadu. Event se stejným otiskem se neuloží znovu, i když má jiný payload. Z toho plyne:
- Hodinovka může stejný řádek poslat opakovaně, uloží se jednou. Zpětná oprava eventu neexistuje, oprava = nový event s novějším časem.
- Dvě události stejného typu a zákazníka ve stejné sekundě by se slily, proto Cloud App i backload rozpadají kolize posunem o sekundu.
- Dedup nefunguje napříč zdroji. Překryv Cloud Appu a backloadu řeší atributy přes obchodní klíč (poslední verze per order_id / receipt_id).
- Journeys reagují na čas přijetí, ne na event_time. Při dohrávání historie se journeys pozastavují.
Retence eventů
| Skupina | Retence dnes | Poznámka |
|---|---|---|
| DB eventy (objednávky, účtenky, účty) | neomezená | základ RFM a historie od 1/2024 |
| SmartEmailing | neomezená | |
Web view_item_list | 60 dní | největší objem bez dlouhodobé hodnoty |
Web šablonové eventy (page_view, view_item, purchase, bannery…) | 365 dní | retence šablonových typů je zamčená, mění jen Meiro |
Web cart_updated, user_identified | neomezená | retenční plán čeká na rozhodnutí |
| Subscribe endpointy | neomezená |
Retence je hlavní nástroj na hlídání licenčního objemu uložených eventů, viz Provoz a monitoring.
Dotazy na dokumentaci přes AI
Tlačítko zkopíruje prompt pro AI asistenta (Claude, ChatGPT…). Vložte ho na začátek nové konverzace: asistent si načte aktuální textovou verzi této dokumentace (rozcestník kapitol a Markdown soubory, které se generují z této stránky při každém nasazení) a odpovídá jen z ní, s odkazem na záložku a sekci. Nemá přístup do instance Meira ani k API a nikdy nežádá o tokeny; živé hodnoty vždy ověříte v UI přes odkazy v dokumentaci.
Zobrazit text promptu
Web SDK (mpt.js)
Měření webu vaprio.cz a vaprio.sk běží přes Meiro Web SDK. Web plní GA4 dataLayer, tracking rules v Meiru z něj vyrábí eventy. Implementaci na webu drží Vaprio, tracking rules v Meiru Data Club.
Snippet a first-party doména
Jak je SDK nasazené
- Skript
mpt.jsa sběrný endpoint běží na me.vaprio.cz a me.vaprio.sk (A záznam na IP Meira). Díky tomu je cookiempt_user_idfirst-party a přežívá i v Safari. - Každý web posílá na svůj endpoint: CZ
/collect/vaprio-cz-1, SK/collect/vaprio-sk. Záměna endpointů = smíchaná data, doménový filtr na straně Meira neexistuje. - Snippet volá
mpt("consent", …)se stavem cookie lišty a pakmpt("config", …)s endpointem, link trackingem, tracking rules a přepínačem web bannerů. - Eventy odchází přes
sendBeacon. V DevTools jsou pod typem ping/beacon, filtr Fetch/XHR je skryje. - Soubor mpt.js musí začínat
(()=>{(IIFE build). Starší build bez obalu koliduje s jinými skripty (Leaflet a podobně).
Referenční snippet
<script async src="https://me.vaprio.cz/mpt.js"></script>
<script>
window.mpt = window.mpt || function(){(window.mpt.q = window.mpt.q || []).push(arguments)};
mpt("consent", { storage_persistence: window.meiroConsent,
user_id: window.meiroConsent, session_id: window.meiroConsent });
mpt("config", {
collection_endpoint: "https://me.vaprio.cz/collect/vaprio-cz-1",
link_tracking: { enabled: true },
tracking_rules: { enabled: true },
web_banners: { enabled: window.meiroConsent === "granted" }
});
</script>
window.meiroConsent je "granted" nebo "denied" podle skutečného rozhodnutí návštěvníka. Ve snippetu není žádné ruční page_view, to posílají tracking rules.
Cookie souhlas a SDK
- Consent má tři pole:
storage_persistence,user_id,session_id. Hodnotadenieduuser_idaktivně smaže uložené ID. Proto se nikdy neposílá přechodné „denied“ a hned „granted“ v jednom načtení, identita by se tříštila. - Bez souhlasu eventy dál odchází anonymně (
user_id: null) a bez cookies. Anonymní event bez e-mailu v payloadu se nikdy nepřipojí k profilu. - Web bannery se zobrazují až po souhlasu (
web_banners.enabled). Banner s podmínkou na audienci se bezuser_idnevykreslí ani sám od sebe. Produkční banner má proto vždy podmínku na audienci. - Cookiebot (od 22. 9. na testovacím e-shopu): SDK je blokované do kategorie marketing, stav se předává z
CookiebotOnConsentReady. Výpisy produktů (view_item_list) web posílá při souhlasu statistics nebo marketing, ostatní e-commerce eventy jdou bez podmínky. Po nasazení na produkci uvidí Meiro jen návštěvníky s marketingovým souhlasem.
Tracking rules
Kód běží ve Web Workeru v prohlížeči a servíruje se z https://me.vaprio.cz/tracking-rules/<slug>.js. Ten soubor je jediný autoritativní způsob, jak ověřit nasazenou verzi.
Co pravidla dělají
on.page→page_viewpři každém načtení.on.dataLayer("název")→ přesná shoda názvu eventu v dataLayeru. Zpracují GTM objektové pushe igtag()tuply, včetně bufferu před načtením SDK.- Normalizace položek:
item_idatransaction_idna string,item_variant null → "". Schéma event typu je přísné na datové typy, jinak padá validace celého batche. - Čtou GA4 obálku
ecommercei plochý payload. - Blokace interních domén v
user_identified.
Omezení platformy
- Validátor kódu blokuje literál
location, URL stránky proto v pravidlech není dostupná (nefunguje dedup page_view ani doménový filtr). - Nový custom event typ musí existovat dřív, než na něj přijde traffic. Neznámý typ = HTTP 400 a zahození celého batche bez logu.
- Pravidla se nasazují jako jeden proposal s přesným kódem a po schválení se porovnává servírovaný soubor.
Kontrakt dataLayer (co web posílá)
| Event | Kdy web pushuje | Povinná pole |
|---|---|---|
view_item | detail produktu | currency, value, items[1] |
view_item_list | výpis: kategorie, novinky, akce, výběr, výrobce, vyhledávání, recommender v košíku | item_list_name (product_default, product_news, product_sale, product_selection, manufacturer_detail, search_default, search_no_result, cart_recommender…), items[] |
add_to_cart / remove_from_cart | přidání a odebrání (obě cesty: přímo i přes výběr varianty) | items[] s deltou |
cart_updated | po každé změně košíku, právě jednou; login = obnovený košík účtu | currency, value, items[] (item_id, item_name, item_variant, item_brand, price, original_price, quantity, item_url, item_image); prázdný košík = items: [], value: 0 |
begin_checkout | vstup do pokladny | items[] |
purchase | děkovací stránka | transaction_id = eshop_code (string), currency, value, items[] |
user_identified | login, každý load přihlášeného (session), registrace, přihlášení k newsletteru, dokončení objednávky | email, source |
item_id = zbozi_id (varianta) = ID položky v Heureka feedu = product_id v databázi = external_id v katalogu Meira. Párování napříč systémy je bez převodníků. Nadřazený produkt je katalog_id (web product_id, feed ITEMGROUP_ID).Web bannery a SDK
- Banner běží v iframe (srcdoc). SDK samo posílá
web_banner_impression, u kliknutí na<a href>web_banner_clickshrefa textem, u prvku s atributemdata-mpt-closeweb_banner_close, u odeslání formulářeweb_banner_submits poli formuláře. - Klikací
divs JavaScriptem SDK nezaloguje. Vlastní odstranění iframu neloguje zavření. Odkazy v banneru jsou relativní (/kosik.html), aby stejný kód fungoval na produkci i sandboxu. - Podmínky zobrazení: URL, path (jen cesta bez domény), query, referrer, zařízení podle šířky okna (mobil pod 768 px, tablet do 1023 px, desktop od 1024 px), realtime audience. Trigger
page_load,exit_intent(jen desktop), scroll, klik. Frekvence per session / den / lifetime. - Personalizace: banner si vezme
user_idpřeswindow.parent.mpt("get","user_id",cb)a zavolá Profile API endpoint s realtime atributem. Na web nejde žádný osobní údaj, jen anonymní cookie ID. - SDK resolvuje členství v audienci přes
/profile-api/system-web-bannersna sběrné doméně (routing doplnilo Meiro 18. 9.).
Jak ověřit, že měření funguje
- View-source obou webů: správný endpoint per web, jediné volání consent s dynamickou hodnotou, žádné ruční page_view, mpt.js začíná IIFE.
- Čisté anonymní okno: bez souhlasu eventy s
user_id: nulla bezmpt_*cookies; po souhlasu cookiempt_user_id_jsexistuje a tři refreshe v jednom tabu dají stejné user_id. - DevTools Network, typ beacon, filtr
collect: u každého batche kontrolovat status odpovědi (400 = zahozený batch), ne jen payload. Konzole:mpt("get","user_id",cb). - Projít cesty: detail, varianty, kategorie, vyhledávání bez výsledku, košík (přidat, množství, odebrat, vyprázdnit), checkout, registrace, login. Testovací objednávky jen na sandboxu vaprio.bar.
- V Meiru: Profiles → Search podle e-mailu testovacího účtu: identifikátory browser + user_id + email, timeline eventů. Surové přijaté requesty (posledních 25 batchů) jsou v detailu zdroje.
Známé vady a otevřené body
| Co | Dopad | Stav |
|---|---|---|
page_view 2–3× na načtení při AJAX změnách košíku | objem eventů (licence), na scénáře bez vlivu | čeká na fix URL dedupu u Meira nebo úpravu webu |
DataCloneError z mpt.js v Sentry (formulář recenzí s prvkem name="id" × GA4 form interactions) | výjimka propadá do GTM pushe, možná ztráta GA4 form_submit | nahlášeno Meiru 17. 9., na webu lze přejmenovat prvek |
Proklik ze SmartEmailingu (parametr sid v URL) se na webu nezachytává | cookie se ke kontaktu SE lepí jen přes e-mail po přihlášení | otevřené, v2 SDK nemá url_parts |
Interní forceLogin z administrace Vapria blokuje Meiro blok | interní uživatelé nevidí bannery ani měření | záměr |
Historické profily s desítkami user_id | artefakt z období rotace ID (srpen 2026), nové nepřibývají | bez akce |
Databáze Vaprio → CDP
Zdroj pravdy o zákaznících a transakcích je databáze Vapria. Do Meira jde přes CSV exporty, které stahuje a překládá na eventy Cloud App „Vaprio database“. Historie od 1. 1. 2024 byla nahraná jednorázově přes backload zdroj.
CSV exporty
Vaprio generuje jednou za hodinu (kolem :45) pět souborů na exportní endpoint Vapria chráněný basic auth. Přihlašovací údaje jsou v Meiru uložené jako secrets připojené ke Cloud Appu.
| Soubor | Obsah | Klíč |
|---|---|---|
orders.csv | hlavičky objednávek: eshop_code, zákazník, časy, status, storno, kanál, prodejna, měna, součty, doprava, platba, jazyk webu | order_id |
order_items.csv | položky objednávek | order_item_id (globálně unikátní) |
uctenky.csv | účtenky z prodejen s věrnostní kartou | receipt_id |
uctenky_polozky.csv | položky účtenek; order_item_id ≠ 0 = položka kryje řádek e-shopové objednávky | receipt_id |
customers.csv | zákaznické účty (42 sloupců) + newsletter kontakty bez účtu (jen e-mail a souhlas) | customer_id / email |
- Formát: UTF-8 s BOM, oddělovač
;, časy v Europe/Prague bez zóny (Cloud App převádí na UTC včetně letního času). Živé soubory obsahují posledních 24 hodin změn, hlavičky shodné s historickým dumpem. - Zápis přes temp + rename, takže Meiro nikdy nečte rozepsaný soubor. Změna účtu bumpuje
updated_atjen při registraci, přihlášení a změně newsletteru. - Změny stavů objednávek nebumpují
updated_at. Výběr změněných řádků i čas eventu proto pracují s maximem ze všech časových razítek řádku.
Hodinovka: Cloud App „Vaprio database“
Jak běží
- JavaScript pull funkce běžící v Meiru, interval 30 minut (běhy kolem :22 a :52 UTC). Běh v :22 obvykle nepřinese nic nového, běh v :52 uloží celou hodinu.
- Zpracuje jen řádky změněné za posledních 6 hodin, strop 8 000 eventů a 8,5 MiB na běh (limit platformy 10 000 / 10 MiB, přebytek by se tiše zahodil).
- Rozpad kolizí stejné sekundy (+1 s), kontrola stáří: nejnovější záznam starší než 3 hodiny = chyba a alert do Slacku.
- Stav: Sources → Vaprio database (poslední běh, log). Zapnutá od 11. 9. 2026.
Co z toho plyne
- Objednávka je v Meiru nejdřív ~1 hodinu po vzniku. Webový
purchaseje realtime a slouží jen k propojení; scénáře stavějí realtime ochranu na webových eventech, transakce jsou druhý pás. - Výpadek exportu do 24 hodin se dohraje sám (okno souborů). Delší díra = dohrání přes backload zdroj implementátorem.
- Kód Cloud Appu a jeho nastavení mění jen implementátor. Referenční kopie kódu je v repozitáři projektu.
Transformace na eventy
order_created (jen neměnná pole, jen s položkami) + order_updated (plný snapshot, čas = max všech razítek)receipt_created (jen s položkami; řádky se neagregují, i 0 Kč odměny)customer_updated (čas = max z updated_at, last_login, registration_date, opt-in / opt-out data)"", čísla jako čísla, ID jako stringyKlíčová rozhodnutí
- Každá objednávka vznikla na e-shopu (má
eshop_code). Polechannelv databázi říká způsob vyřízení (Eshop CZ/SK/EU dopravcem, Prodejna = osobní odběr). V atributech protochannel= původ (Eshop objednávka / Prodejna walk-in) asource= objednávka bez účtenky / s účtenkou / walk-in / web. - Trh = měna (CZK → CZ atributy, EUR → SK). Pole
langje jazyk webu, ze kterého zákazník objednal, používá ho atribut Preferred language. - Účtenka je finální prodej prodejnové objednávky (částečné odběry, zaokrouhlení). Objednávka a její účtenky se párují přes
order_item_id; položky účtenky sorder_item_id0 na téže účtence jsou dokup u pultu. Účtenka bez vazby = walk-in. - Tržby vždy z hlavičky databázové objednávky nebo účtenky, nikdy z webového
purchaseani z ceníku položek. Slevy a poukazy na úrovni objednávky nejsou v položkách. - Stav objednávky = poslední verze
order_updatedper order_id; při shodě času má přednostorder_updatedpředorder_created. Zrušení =is_canceled, sekundárně status. - Newsletter kontakty bez účtu jsou stejný event
customer_updatedbezcustomer_id, žádný nový event typ.
Datový model eventů (výběr polí)
| Event | Pole |
|---|---|
order_created | order_id, eshop_code, created_at, lang, channel, store_id, store_name, currency, total_incl_vat, total_excl_vat, payment_method, shipping_method, items[] {order_item_id, product_id, product_group_id, product_name, variant_name, quantity, unit_price_incl_vat, unit_price_excl_vat, is_free}, customer_id, order_email (kontaktní e-mail, není identifikátor), email (jen guest), is_guest |
order_updated | vše výše + status, status_text, prepared_at, checked_at, shipped_at, delivered_at, is_canceled, canceled_at, updated_at |
receipt_created | receipt_id, created_at, store_id, store_name, currency, total_incl_vat, total_excl_vat, points_earned, items[] {order_item_id, product_id, product_name, variant_name, quantity, ceny}, customer_id, email |
customer_updated | customer_id, email, jméno, adresa, market (jazyk účtu), birth_date, registration_date, last_login, account_status, age_verified, newsletter_opt_in, newsletter_opt_in_date, newsletter_opt_out_date, newsletter_sources[] {source, subscribed_at}, věrnostní karta, home_store_id, loyalty_points, statistiky nákupů per měna, favorite_store_id, preferred_liquid_type, updated_at, gdpr_flag |
Hygiena identifikátorů
Identifier pravidla v Meiru jsou nepodmíněný JSONPath, hygiena se dělá vynecháním klíče z payloadu:
customer_id0 nebo prázdný = guest, klíč se nepošle,is_guest: true.- E-mail: lowercase, trim, validace, vyřazení placeholderů a interních domén (dataclub.cz, vaprio.cz, vaprio.sk – prodejny si zakládají účty na firemní adresy a ty by slily prodejní účty do jednoho profilu).
- Kontaktní e-mail objednávky registrovaného zákazníka jde do
order_email(data), protože v části objednávek patří jinému člověku. Guest objednávka a účtenka nesouemailjako identifikátor. - GDPR výmaz (osobní pole přepsaná na XXX) = jen
customer_id+gdpr_flag: true, bez e-mailu a telefonu. - Telefon je jen datové pole, lehce normalizovaný, nikdy identifikátor.
Historie (backload)
- 3.–5. 9. 2026Objednávky a účtenky od 1. 1. 2024 z historického dumpu přes zdroj „Vaprio DB backload“ (stejný transformační kód, dávky po 100 eventech).
- 7.–8. 9.Zákaznické účty (
customer_updated). - 11.–12. 9.Zapnutí hodinovky a dohrání mezery mezi dumpem a prvním během.
- 14. 9.Newsletter kontakty bez účtu; restitch účtů chybně spojených přes kontaktní e-mail objednávky.
Backload zdroj zůstává pro opravy a dohrávky. Píše do něj jen implementátor; atributy počítají s oběma zdroji naráz.
Co v CDP není a proč
- Guest objednávka bez e-mailu: event bez identifikátoru se na profil nenaváže a platforma ho po pár dnech smaže.
- Objednávky bez položek (zlomek procenta):
order_createdse pro ně neemituje,order_updatedano. - Anonymní účtenky bez věrnostní karty: export je neobsahuje.
- Změna jména či adresy bez bumpu
updated_at: do CDP se dostane až s dalším přihlášením.
SmartEmailing
SmartEmailing je e-mailový kanál. Kontakty do něj importuje Vaprio z databáze, scénáře z Meira spouští přes trigger-event s payloadem a SmartEmailing e-mail jen vyrenderuje a odešle. O doručitelnosti (blacklist) rozhoduje SmartEmailing.
Kdo co dělá
Vaprio (DB)
Importuje kontakty a objednávky přes SE API v3, plní seznamy podle souhlasu, propisuje odhlášení a nový souhlas. Je zdrojem cf_12 = customer_id.
Meiro
Rozhoduje kdo, kdy a s jakým obsahem dostane scénářový e-mail. Volá SE POST /trigger-event s payloadem. Spouští DOI import. Čte zpět webhooky o kontaktech a událostech.
SmartEmailing
Renderuje šablony (Twig) nad payloadem, odesílá, drží blacklist a statusy kontaktů, posílá DOI e-maily a webhooky do Meira i do DB Vapria.
Seznamy, custom fields, odesílatelé
| Objekt | ID | Význam |
|---|---|---|
| Seznam CZ souhlas | 6 | marketingový souhlas CZ, řídí všechny rozesílky a automatizace CZ |
| Seznam SK souhlas | 12 | marketingový souhlas SK |
| Seznamy „všechny kontakty“ | 9 (CZ), 15 (SK) | v praxi všechny registrace včetně kontaktů bez objednávky a bez souhlasu; zákaznická báze se bere z databáze v Meiru, ne z těchto seznamů |
| Seznamy DOI | 32 (CZ), 35 (SK) | „Potvrdil Meiro DOI“ – SE sem zapíše kontakt po prokliku DOI, automatizace ho po 7 dnech odebere (status removed) |
| DOI e-maily | 134 (CZ), 137 (SK) | zatím testovací verze, finální dodá Vaprio |
| Custom field „DOI Confirmed“ | 22 | CZ / SK, plní automatizace po prokliku |
| Custom field „Meiro source banner“ | 25 | ID web banneru z Engage, ze kterého přišla žádost o DOI |
| Custom field customer_id | cf_12 | customer_id Vapria, jen v payloadu SE eventů (není identifikátor v Meiru) |
| Odesílatelé | – | ověřené adresy na subdoméně z.vaprio.cz / z.vaprio.sk, jméno Vaprio |
SE API v3 – používané flows
Import kontaktů (Vaprio)
POST /import, Basic Auth, max 500 kontaktů na request, klíčemailaddress.- Objednávka / běžný update:
update: true,preserve_unsubscribed: true,skip_invalid_emails: true, seznamy jen aditivně (confirmed). - Odhlášení:
blacklisted: 1(SE odhlásí ve všech seznamech). - Nový výslovný souhlas / re-opt-in:
preserve_unsubscribed: false+blacklisted: 0+ seznam 6 nebo 12confirmed. Jen s doloženým souhlasem. - Objednávky přes API přepisují webové, klíč
eshop_code+eshop_name.
Volání z Meira
POST /trigger-event{emailaddress, name, payload}– spustí uzel SE automatizace s vlastním triggerem. Názvy triggerů jen s pomlčkami (meiro-abandoned-cart-cz-30), podtržítka SE nezpracuje.POST /importsdouble_opt_in_settings– SE pošle jen DOI e-mail, kontakt a seznam zapíše až po prokliku. Vyžadujesender_credentials;silence_period1 den brání opakovanému DOI.- Všechny destinace volající trigger-event mají od 22. 9. retry: 3 pokusy (1 s, 3 s) jen při HTTP 5xx nebo chybě spojení; 4xx se neopakuje.
Automatizace ve SmartEmailingu
| Automatizace | Trigger | Co dělá | Stav |
|---|---|---|---|
| MEIRO – DOI flow to CDP | přidání do seznamu 32 (CZ) / 35 (SK) = proklik DOI | webhook subscription_confirmed do Meira (subscribe endpoint, s tokenem) → webhook newsletter_subscribe do DB Vapria (souhlas, seznamy 6/12) → cf 22 = CZ/SK → po 7 dnech odebrání z 32/35 | Běží od 16. 9. |
| Opuštěný košík CZ & SK | trigger-event meiro-abandoned-cart-cz-30, …-cz-120, …-cz-2 (nové uzly z Meira); stará SK větev postaru | renderuje košíkový e-mail z payloadu (hero produkt, položky, slevy); stará CZ větev vypnuta 22. 9. | Běží |
| Shopping intention CZ | trigger-event meiro-shopping-intention-cz | zatím jen sbírá payloady, e-mail se staví | Dry-run |
| Welcome selection CZ / SK | trigger-event meiro-welcome-selection-cz / -sk | e-mail s výběrem na míru po potvrzení DOI; šablona se staví | Rozpracováno |
node.id. Na node.id stojí goals v Meiru (otevření a kliky per varianta), po každé změně uzlu je potřeba je aktualizovat. Suppression v journeys naopak jede přes automation_id, přejmenování ji nerozbije.Destinace z Meira do SmartEmailingu
| Destinace | Typ | Co posílá | UI |
|---|---|---|---|
| SE Abandoned cart: Vaprio CZ / SK | profile destination (trigger-event) | payload košíku právě jedné adrese se souhlasem; exportuje consent, košík, zakoupené produkty, počet transakcí | CZ SK |
| SE Shopping intention: Vaprio CZ | profile destination | prohlížené produkty s hero, jen položky aktuálně v katalogu | otevřít |
| SE Welcome selection: Vaprio CZ / SK | profile destination | odpovědi z welcome banneru, doporučení z katalogu, prohlížené produkty; jen profily s potvrzeným DOI | CZ SK |
| SmartEmailing newsletter | profile destination (import) | segment → SE seznam, ručně nebo plánovaně z audience | otevřít |
| SmartEmailing DOI | event destination (import s DOI) | DOI e-mail na každý newsletter_subscription_requested; trh určuje pipe (CZ 134/32, SK 137/35) | Pipes |
Konvence: jedna destinace na scénář a trh, trh je v kódu destinace zapečený. Exportované atributy se do funkce předávají jen vyjmenované (mód Custom).
Payload a šablony
Košíkový a SI payload
orders_count,hero_product,items(max 5, řazené podle hodnoty), souhrn košíku,currency.- Každá položka i hero: název, obrázek, URL,
price,original_price,discount,discount_pctz reálného pole datalayeru (u nezlevněných rovno ceně). - Hero kaskáda košíku: opakovaný nákup → shoda značky → nejvyšší hodnota. U shopping intention rozhoduje počet zobrazení, pak stejná kaskáda; hero jen z produktů aktuálně v katalogu.
- Jména se neposílají, oslovení řeší SE z kontaktu.
Přístup v SE šabloně (Twig)
Payload je pod metadata.event.attributes.*, slevový blok podmíněný discount > 0:
{% set p = metadata.event.attributes %}
{{ p.hero_product.name }} – {{ p.hero_product.price }} {{ p.currency }}
{% for it in p.items %}
{{ it.name }} {% if it.discount > 0 %}(-{{ it.discount_pct }} %){% endif %}
{% endfor %}
Otevřené body
- Význam seznamů 9/15: přegenerovat na kupující, nebo oficiálně předefinovat na „všechny kontakty“.
- Souhlas per trh (souhlas CZ + objednávka SK): dnes je blacklist globální, seznamy oddělené.
- Změna e-mailu v účtu vytvoří v SE nový kontakt, starý zůstává.
- Finální DOI e-maily a welcome šablona od Vapria; zápis ID banneru do cf 25 zatím neověřen reálným kontaktem.
- Výhled: souhlas jako eventový stream přímo v Meiru (subscribe endpointy + odhlášení), pak SE přestane být zdrojem pravdy o souhlasu.
Identita a stitching
Jak se eventy z webu, databáze a SmartEmailingu skládají do profilu jednoho člověka. Nejcitlivější část CDP: špatné pravidlo spojí cizí lidi a oprava (restitch) je drahá. Identifier typy, limity a pravidla mění jen implementátor.
Identifier typy a kde vznikají
| Typ | Limit na profil | Priorita | Odkud (JSONPath na event typu) |
|---|---|---|---|
customer_id | 2 | 10 (vítěz při konfliktu) | DB eventy: $.customer_id (objednávky, účtenky, účty) |
email | 4 | – | DB: $.email (účty, účtenky, guest objednávky); web: $.email, $.payload.email (user_identified, web_banner_submit); SmartEmailing: $.emailaddress, $.contact.emailaddress; subscribe endpointy: $.email. Meiro hodnoty trimuje a převádí na malá písmena. |
user_id | – | – | web: $.user_id = first-party cookie Meira |
browser | – | – | web: $.device_id |
SmartEmailing ID | – | – | SE email_opened / email_clicked: $.sid |
phone, email_message_id, mobile_user_id, push tokeny, sms_message_id | – | – | šablonová pravidla webu a kanálů; telefon se nikdy neplní (sdílená čísla, nekonzistentní formáty) |
Jak se profil skládá
customer_id ↔ e-mail účtu (customer_updated) ↔ objednávky (customer_id) ↔ účtenky (customer_id + e-mail účtenky)user_id / browser se k účtu přilepí přes user_identified.email (login, každý load přihlášeného, registrace, newsletter, objednávka) nebo přes e-mail v odeslaném banneru- Webový
purchasee-mail nepotřebuje, váže se přesuser_id; e-mail dodá souběžnýuser_identifiedz děkovací stránky. - Guest objednávka = jen e-mail. Newsletter kontakt bez účtu = jen e-mail. GDPR anonymizovaný účet = jen
customer_id. - Dva účty Vapria se stejným e-mailem účtu se legitimně spojí do jednoho profilu (limit 2 customer_id).
Pravidla a rozhodnutí
Kontaktní e-mail objednávky není identifikátor
U registrovaného zákazníka jde e-mail z objednávky do pole order_email. V části objednávek patří jinému člověku (partner, rodina, nákup pro známé) a původní pravidlo spojovalo cizí účty. 14. 9. 2026 opraveno restitchem; atributy pracující s e-maily toto pole ignorují.
Účtenka e-mail jako identifikátor má
Účtenky někdy přijdou jen s e-mailem, bez něj by se nenavázaly. Důsledek: osobní odběr cizí objednávky na kartu jiného účtu spojí dva účty. Vědomě přijaté, malý počet případů; pravidlo lze změnit a zopakovat restitch.
Telefon nikdy
Sdílená čísla v rodinách a garbage formáty by způsobily mega-merge profilů. Telefon zůstává datové pole v customer_updated.
Interní domény blokované
E-maily na dataclub.cz, vaprio.cz a vaprio.sk se nikdy nestanou identifikátorem (účty prodejen na firemní adresy). Platí v Cloud Appu, backloadu, tracking rules i subscribe endpointech.
Limity a přetečení
- Třetí
customer_idnebo pátý e-mail se k profilu nepřidá. Event se uloží na profil podle zbývajících identifikátorů (může skončit na jiném profilu) a hodnota zůstane jen v payloadu. - Profil s příliš mnoha identifikátory Meiro dá do karantény (příznak
quarantinedv detailu profilu). - Event bez jediného identifikátoru se neuloží k profilu a platforma ho po pár dnech smaže.
- Atribut Number of Emails hlídá kvalitu identity: počet různých e-mailů na profilu bez kontaktních e-mailů objednávek.
Kde to vidět v Meiru
V detailu profilu: záložka Identity ukazuje identifikátory a historii spojení (merge, přidání identifikátoru).
Restitch (oprava chybně spojených profilů)
Restitch (reprocess profilů) přehraje uložené eventy vybraných profilů s aktuálními pravidly. Staré profily zaniknou, výsledkem může být víc profilů nebo sloučení s existujícím. Nevratné, jen implementátor, jeden běh najednou. Ověřovat až po vyprázdnění fronty identityResolution.
Provedeno 14. 9. 2026 pro účty spojené přes kontaktní e-mail objednávky. Postup: dočasně odebrat pravidlo z event typů, restitch, vrátit pravidlo, guest objednávky poslat znovu.
Marketingový souhlas a DOI
Souhlas se počítá ze dvou zdrojů (databáze Vapria a SmartEmailing) do jednoho atributu. Nová přihlášení z webu jdou přes double opt-in řetězec Meiro → SmartEmailing → Meiro a databáze.
Definice souhlasu
Databáze Vaprio
Souhlas = newsletter_opt_in = 1 a zároveň prázdné newsletter_opt_out_date. Odhlášení (v účtu i z SE webhooku) nastaví opt-out datum a vypne flag; znovupřihlášení opt-out smaže. newsletter_source říká odkud souhlas přišel (prázdné = neuvedeno). Platí i pro newsletter kontakty bez účtu.
SmartEmailing
Souhlas = kontakt confirmed v seznamu 6 (CZ) nebo 12 (SK) a není na blacklistu. SmartEmailing dál rozhoduje o doručitelnosti; databázový souhlas je podklad pro segmentaci, ne povolení k odeslání.
Atribut Email marketing consent
Email marketing consent (email_marketing_consent_1) má řádek pro každý e-mail profilu (bez kontaktních e-mailů objednávek): poslední stav z databáze (customer_updated) a poslední stav ze SmartEmailingu (contact_created / updated, unsubscribed_contact).
| Známé zdroje | Výsledek consent_status |
|---|---|
| DB i SE | sub jen když oba říkají souhlas, jinak unsub |
| jen jeden zdroj | podle něj |
| žádný | unsub |
Dimenze: email, consent_status (sub / unsub), newsletter_sources. Doplňkový atribut Number of emails with marketing consent = počet e-mailů profilu se stavem sub.
Použití v segmentech a scénářích
- Podmínka: Email marketing consent →
consent_statushas any ofsub. - Destinace do SmartEmailingu posílají e-mail právě jedné adrese profilu se stavem sub; profil s nulou nebo více adresami sub scénář přeskočí (obsah košíku je citlivý).
anonymized_account = 1(GDPR výmaz) v atributu Personal information není souhlas; takové profily se nikdy neoslovují.- Cookie souhlas na webu a e-mailový souhlas jsou dvě různé věci. Bannery filtruje cookie souhlas přes SDK, e-maily filtruje
consent_status.
DOI flow (welcome flow)
- Banner na webu (welcome flow, 4 kroky) po validaci pošle
POST https://me.vaprio.cz/collect/subscribe-endpoint-cz(SK-sk) s{event: "subscription_request", email, source, custom_params}. Bez tokenu, protože HTML banneru je veřejné. Teprve po úspěšném uložení SDK odešleweb_banner_submit. - Subscribe endpoint uloží
newsletter_subscription_requested(identifikátor e-mail → cookie profil se spojí s profilem účtu nebo SE kontaktu). - Pipe per trh pošle každý takový event do event destination SmartEmailing DOI: SE
POST /importsdouble_opt_in_settings(DOI e-mail 134 / 137, seznam 32 / 35, ověřený odesílatel, silence period 1 den, ID banneru do cf 25). SE pošle jen DOI e-mail. - Proklik DOI: SE zapíše kontakt do seznamu 32 / 35 a přesměruje na děkovací stránku Vapria (
/email-potvrzeni.html, SK/email-potvrdenie.html). - SE automatizace „MEIRO – DOI flow to CDP“: webhook
subscription_confirmeddo Meira (s tokenem) →newsletter_subscription_confirmed; webhook do DB Vapria → souhlas v databázi a seznamy 6 / 12; cf 22 = CZ / SK; po 7 dnech odebrání ze seznamu 32 / 35. - Do CDP se souhlas propíše z databáze (
customer_updatedpřes hodinovku, do ~1 h) a ze SmartEmailingu (contact_updated). Eventnewsletter_subscription_confirmedje spouštěč pro welcome e-mail.
newsletter_subscription_requested chodí jen to, co má dostat DOI. Přihlášení, které DOI nepotřebuje (backend Vapria), se posílá rovnou jako subscription_confirmed s tokenem.Objekty DOI v instanci
| Objekt | Role | UI |
|---|---|---|
| Subscribe endpoint CZ / SK | event stream, transform v8: request bez tokenu, confirmed s tokenem; blokace interních domén; event_time = čas přijetí | CZ SK |
| Pipes „Subscribe endpoint CZ / SK – SmartEmailing DOI“ | propouští každý requested event s použitelným e-mailem, nese parametry trhu (DOI e-mail, seznam, odesílatel, děkovací stránka) | CZ SK |
| Event destination „SmartEmailing DOI“ | společná pro oba trhy, SE import s DOI; chyba SE = delivery failed a alert | Destinations |
| SE automatizace „MEIRO – DOI flow to CDP“ | potvrzení zpět do Meira a do databáze | SmartEmailing → Automatizace |
| Atribut Web banner submitted on Vaprio.CZ / .SK | řádek per odeslání banneru: odpovědi, odchodová stránka, čas žádosti o DOI a čas potvrzení (prázdné = nepotvrdil) | CZ SK |
Ověřený průběh (17. 9.): odeslání banneru → DOI proklik za sekundy → kontakt v SE seznamu 6 z databáze do 5 minut → customer_updated se souhlasem v Meiru do 45 minut.
Otevřené body
- Finální DOI e-maily (134 / 137 jsou testovací) a text děkovací stránky dodá Vaprio.
- Welcome e-mail po potvrzení: journey v Meiru a SE automatizace se šablonou (viz Use-casy).
- Cílový stav: souhlas jako eventový stream v Meiru včetně odhlášení, SmartEmailing pak přestane být zdrojem pravdy o souhlasu.
Atributy
Atribut je SQL dotaz nad eventy jednoho profilu. Výsledek je jeden nebo více řádků s dimenzemi. Přepočítává se při refreshi profilu, tedy když profilu přijde nový event. Seznam všech: Attributes.
Transakce (databáze)
| Atribut | Účel | Logika | Dimenze |
|---|---|---|---|
| All transactions made on Vaprio.CZ / .SK implementátor | řádek = jedna transakce (objednávka nebo walk-in účtenka); základ RFM, post-purchase a suppression | union objednávek z obou DB zdrojů → poslední verze per order_id; účtenky napárované přes order_item_id (částka z účtenek včetně dokupu), walk-in samostatně; web purchase bez DB protějšku dočasně jako source = web; trh podle měny | order_id, source, status_text, channel, store_id, store_name, created_date, last_updated, is_canceled, shipped_at, delivered_at, receipt_date, currency, total_price, items_count, shipping_method, points_earned, receipt_ids |
| All products purchased on Vaprio.CZ / .SK implementátor | řádek = zakoupená položka obohacená katalogem (kategorie, příchuť, nikotin) | položky objednávek (poslední verze) + účtenek + web purchase; metadata z katalogu produktů; realtime ochrana scénářů proti odeslání po nákupu | item_id, product_name, variant, manufacturer, category, flavor_type, nicotine_strength, nicotine_type, cooling, image_url, url, order_id, purchase_date, status_text, is_canceled, source, channel, quantity, unit_price, currency |
| Number of completed transactions CZ / SK | počet vyřízených transakcí bez zrušených | z téže logiky jako All transactions | completed_transactions |
| Preferred language | jazyk komunikace | nejčastější lang z posledních 3 objednávek, při shodě poslední; profil bez objednávky hodnotu nemá | preferred_language |
| Personal information | údaje účtu pro personalizaci | 1 řádek na účet z poslední verze customer_updated; GDPR účty bez osobních polí s anonymized_account = 1; kontakty bez účtu se nezobrazují | customer_id, email, first_name, last_name, phone, city, zip, registration_date, birth_date, loyalty_points, favorite_store_id, account_status, account_language, first_purchase_date, last_login, anonymized_account |
Košík a prohlížení (web)
| Atribut | Účel | Logika |
|---|---|---|
| All products in cart on Vaprio.CZ / .SK implementátor | aktuální obsah košíku pro opuštěný košík (e-mail) | poslední snapshot cart_updated; nákup (purchase) košík vyprázdní; položky s original_price, slevou, katalogovými metadaty; last_cart_update pro podmínky stáří; řádky samy nemizí, TTL 60 dní |
| All products in cart + hero on Vaprio.CZ | data pro košíkový web banner přes Profile API | stejný košík + is_hero podle kaskády opakovaný nákup → značka → nejvyšší hodnota; bez důvodu výběru (privacy) |
| All viewed products + hero on Vaprio.CZ | shopping intention (e-mail i banner) | max 10 produktů za 30 dní z view_item: počet zobrazení, první / poslední zobrazení, cena a sleva z posledního zobrazení, živá katalogová cena a dostupnost (in_catalog), is_hero (počet zobrazení → opakovaný nákup → značka → cena) |
| Last 10 viewed products CZ / SK, Most viewed item CZ / SK | šablonové atributy Meira | posledních 10 zobrazených produktů (základ welcome selection), nejčastěji zobrazený produkt |
E-mail a souhlas
| Atribut | Účel | Logika |
|---|---|---|
| Email marketing consent implementátor | souhlas per e-mail profilu | DB + SE, sub jen když oba souhlasí (kapitola Souhlas); dimenze email, consent_status, newsletter_sources |
| Number of emails with marketing consent | kolik adres profilu má souhlas | count sub |
| Number of Emails | kontrola kvality identity | počet různých e-mailů profilu bez kontaktních e-mailů objednávek |
| All emails received_v2 implementátor | suppression košíkových a SI e-mailů, goals | řádek per email_sent: kampaň, automation_id, node_id, sid, campaign_type, send_at, utm_content; suppression jede přes automation_id |
Web bannery
| Atribut | Účel | Logika |
|---|---|---|
| All web banner interactions implementátor | event log bannerů: základ dashboardu Web banners, segmentů, hlídek | řádek = imprese / klik / zavření / odeslání, CZ + SK s dimenzí market, sandbox mimo, bez osobních údajů; device, page_path, visitor_status (anonym / identifikovaný v okamžiku události), minutes_since_identified; strop 500 řádků; v podmínkách vždy banner_id |
| All web banners seen, All web banners clicked | čitelnější podmínky v segment builderu a destinacích | jen imprese, resp. jen kliky |
| Web banner click attribution | post-click atribuce (není inkrement) | řádek = klik + první následná nestornovaná objednávka do 30 dní, minutes_to_order; okno (24 h, 7 d) se volí až filtrem v reportu |
| Web banner submitted on Vaprio.CZ / .SK | odpovědi z welcome flow + stav DOI | řádek per odeslání: banner, čas, e-mail, experience, flavor, budget, odchodová stránka, doi_requested_at, doi_confirmed_at |
Experimenty a provoz
| Atribut | Účel | Logika |
|---|---|---|
| Control Groups & Experiment Metrics kanonický | kontrolní skupiny a metriky experimentů | single-row: bucket_email, bucket_cookie (hash 0–99), nákupy a tržby 30 / 90 dní celkem i per trh, kvalifikační příznaky scénářů s trhem kvalifikace; hash blok a salt se nikdy nemění |
| Stored events by type | licence: uložené eventy per zdroj a typ | count eventů profilu per source / event_type; dashboard Licence |
| Goal · … · Summary / Daily buckets | spravované atributy goals | Meiro si je zakládá ke každému goalu (2 na goal), jsou read-only |
Šablonové atributy Meira
Web: Number of visits CZ / SK, All viewed web pages (timeline), All user_ids, All Google / Facebook IDs. SmartEmailing: All emails opened / clicked / received (email_sent_history), Last campaign received / opened / clicked, Number of emails received / opened / clicked, Date of last …, All email interactions, All email unsubscribes, SmartEmailing subscription status, SmartEmailing Email engagement, First / Last name, All emails, Number of events from SmartEmailing. Vlastník je Meiro nebo Vaprio, na scénářích Data Clubu nestojí (kromě Last 10 viewed products ve welcome selection).
Pravidla platformy (ověřená)
- Max 20 dimenzí; dimenze po založení nelze měnit. Nový atribut se stejným názvem dostane ID s příponou
_1, protože původní zůstává v koši. - SQL bez
;, CTE se nesmí jmenovatrows. Verzované eventy (order_updated) se v SQL vždy redukují na poslední verzi. - Hodnota se přepočítá až při refreshi profilu. Nový atribut se plní postupně (backfill desítky minut až hodiny), neaktivní profil drží starou hodnotu. Podmínky stáří v segmentech proto přes časové dimenze (
last_cart_update), ne přes „řádky zmizí“.
- Test bez čekání na backfill: v UI Attributes → atribut → Test (SQL nad konkrétním profilem) a validace SQL při ukládání.
- Atributy nesou fakta s časovými dimenzemi, agregace patří do reportů. Předpočítaná okna v atributu zastarávají (poučení z odstraněného
web_banner_stats). - Realtime ochrana scénářů stojí na webových eventech (košík, purchase); atributy z databáze se plní se zpožděním hodinovky a jsou vždy druhý pás.
Postup pro nový atribut
- Účel a dimenze zapsat; zkontrolovat, zda to neumí existující atribut nebo report.
- SQL podle vzorů, preview / test na 5–10 profilech různých typů (účet s objednávkami, walk-in, guest, GDPR, profil bez účtu) a ruční porovnání s eventy.
- Schválení: předložit název, SQL, dimenze, single / multi-row. Před založením otázka „Chcete se poradit s implementátorem?“.
- Založit a uložit definici do repozitáře projektu, zapsat kdo, co, kdy.
Use-casy
Každý scénář má stejný půdorys: spouštěč, kdo je způsobilý (souhlas, kontrolní skupina, suppression), co odchází a kudy, jak se měří. Stav je označen u každého scénáře; u rozpracovaných je jen popis a co zbývá.
Opuštěný košík – e-mail
CZBěžíostrý provoz od 22. 9. 2026cart_updated (neprázdný košík)bucket_email; kontrolka 5–24, holdout 0–4 a profil bez bucketu končípage_view: 30 min (varianta A) nebo 120 min (B) bez aktivitymeiro-abandoned-cart-cz-30 / -120 s payloadem košíkuDruhý krok (od 21. 9.)
Po odeslání čeká journey 24 h na purchase. Když nákup nepřijde a košík je stále neprázdný (realtime atribut) a souhlas trvá, odchází druhý e-mail přes trigger meiro-abandoned-cart-cz-2 (společný pro obě varianty). Záměrně bez 7denní suppression, ta by druhý krok vždy zablokovala.
Timing test
Varianta A (30 min) = buckety 25–44 a 65–82, varianta B (120 min) = 45–64 a 83–99. Každá varianta má polovinu Main group i polovinu cizích kontrolek, vyhodnocení jen nad průnikem s Main (65–82 vs 83–99). Otevření a kliky se čtou po ~2 týdnech, nákupy rozhodují za 6–8 týdnů.
- Objekty
- Journey wait 30 Journey wait 120 Destinace SE Abandoned cart CZ Dry-run journey (pauznutá)
- Obsah
- hero produkt (opakovaný nákup → značka → hodnota), max 5 položek podle hodnoty, ceny se slevou, počet dosavadních objednávek; SE šablona v automatizaci „Opuštěný košík CZ & SK“
- Měření
- goals Web purchase CZ (primární), Abandoned cart email opened / clicked pro wait 30, wait 120 a krok 2 (filtr na node.id uzlů SE); Control vs Main v dashboardu Experiments; hlídka WATCHDOG košíkový e-mail v kontrolce musí být 0
- SK
- slovenská větev jede postaru ve SmartEmailingu; klon Meiro stavby po odladění CZ (destinace SE Abandoned cart SK už existuje)
Opuštěný košík – personalizovaný web banner
CZBěžídesktop od 18. 9., mobil A/B od 21. 9. 2026Pro košík je většina způsobilých návštěvníků anonymní, na které e-mail nedosáhne. Banner na webu je proto větší polovina scénáře. Architektura je první použití Profile API v týmu:
cart-banner-cz: jen identifikátor user_id, jen tento atributuser_id ze SDK, načte data, vykreslí hero + „a další X položek“, klik vede do košíku; bez dat generická karta- Kdy se zobrazí
- audience „Abandoned cart banner CZ“: košík neprázdný a poslední změna starší než 1 h, bucket 25–99 (kontrolka a holdout mimo), bez nákupu za 24 h; path pravidlo vylučuje košík, objednávku, děkovačku, platbu a reklamace; zařízení desktop, resp. mobil; 1 zobrazení za den
- Mobilní A/B
- varianta A (řádek se šipkou) pro sudé buckety, B (plné CTA „Zpátky do košíku“) pro liché; liší se jen formou výzvy; vyhodnocení CTR z event logu po ~2 týdnech
- Objekty
- Banner desktop Mobil A Mobil B Audience desktop Profile API endpoint
- Měření
- dashboard Web banners (imprese, kliky, zavření, CTR, anonym vs identifikovaný, stránky, post-click atribuce); přínos = Experiments (kontrolka vs Main); hlídka WATCHDOG košík banner v kontrolce
- Poznámky
- na web nejde žádný osobní údaj, jen anonymní cookie ID; cookie souhlas filtruje bannery automaticky (bez user_id se audience nevyhodnotí); frequency cap košíkového banneru zůstává 1×/den, SI banner (viz níže) má 3×/den
Welcome flow „výběr na míru“ + DOI
CZSKRozpracovánoDOI řetězec od 15. 9. 2026Pop-up se 3 otázkami (zkušenost s vapováním, oblíbené chutě max 2, rozpočet), e-mailem a povinnými checkboxy 18+ a marketingový souhlas. Po odeslání odchází DOI e-mail; po potvrzení má přijít welcome e-mail s doporučením produktů podle odpovědí, prohlíženými produkty a nejbližší prodejnou.
| Část | Stav | Poznámka |
|---|---|---|
| DOI řetězec (banner → subscribe endpoint → SE DOI → potvrzení do Meira a DB) | Běží | kapitola Souhlas a DOI |
| Bannery v2 CZ desktop / mobil | Test na produkci | zapnuté na Vaprio.cz, ale zobrazí se jen s testovacím parametrem v URL; čeká na CZ odkaz na zásady ochrany OÚ, cookie souhlas na webu a rozhodnutí o triggeru (exit intent je jen desktop) |
| Bannery v2 SK | Vypnuté | čeká na schválení SK textů |
| Atribut Web banner submitted CZ / SK | Nasazen | odpovědi, odchodová stránka, časy DOI |
| Destinace SE Welcome selection CZ / SK | Nasazena | hlavní produkt ze „Setů e-cigaret“ v cenovém pásmu, 3 e-liquidy podle chutí, prohlížené produkty, prodejna z účtu; trigger meiro-welcome-selection-cz / -sk |
Journey na newsletter_subscription_confirmed | Staví se | eligibility s bucket guardem, krok destinace |
| SE automatizace + šablona welcome e-mailu, finální DOI e-maily | Vaprio | šablona nad payloadem destinace |
| Nejbližší prodejna, popisky produktů, logika doporučení z nového feedu | Čeká na podklady | feed prodejen s GPS, nový produktový feed (typ zařízení, bestsellery) |
Shopping intention – e-mail a banner
CZDry-runBanner rozpracovándry-run od 21. 9. 2026Kvalifikace: zobrazení detailu produktu (view_item) bez nákupu. Kdo má košík, patří košíkovému scénáři. Kontrolní pásmo 25–34, timing fixně 60 minut po konci návštěvy, trigger meiro-shopping-intention-cz.
view_item, cooldown 1 den na profilpage_viewbucket_email (5–24 a 35–99)| Část | Stav | Poznámka |
|---|---|---|
| Atribut All viewed products + hero CZ | Nasazen | hero kaskáda: počet zobrazení → opakovaný nákup → značka → cena |
| Destinace SE Shopping intention CZ | Nasazena | čte pořadí a hero z atributu, nereplikuje logiku |
| Journey „Shopping intention CZ (Testing)“ | Dry-run | SE automatizace sbírá payloady pro šablonu, nic neodesílá |
| Journey „Shopping intention CZ production“ | Draft | před spuštěním: vypnout dry-run, doplnit suppression SI e-mailu −7 d (automation_id), goals podle node.id, éra do metodiky |
| Web banner SI (prohlížené produkty) | Rozpracováno | Profile API endpoint viewed-banner-cz, audience a bannery desktop/mobil hotové (frequency cap 3×/den); zapnutí čeká na vizuální test na produkci |
Segmenty do SmartEmailingu (plošné rozesílky)
CZSKK dispoziciLibovolná realtime audience v Engage se přes profile destination „SmartEmailing newsletter“ pošle do SE seznamu, ručně nebo plánovaně. Plošné newslettery a transakční maily dostávají všechna pásma včetně kontrolek a holdoutu; kontrolní skupiny se týkají jen scénářů.
- Vzory podmínek
- nakupující: All transactions made →
order_idhas a value,status_textVyřízeno, RFM přescreated_dateatotal_price; jazyk: Preferred language; souhlas:consent_status = sub; vždy vyloučitanonymized_account = 1 - Objekty
- Audiences Destinace SmartEmailing newsletter
Plán
Opuštěný košík SK
PlánKlon CZ journeys a bannerů po odladění CZ; destinace SE Abandoned cart SK existuje. Přepnutí stejnou sekvencí: spuštění Meiro větve, vypnutí staré SE větve.
Replenishment
PlánPřipomenutí dokupu spotřebního zboží (liquidy, cartridge) podle historie nákupů a katalogu. Kontrolní pásmo 35–44 vyhrazeno, reporty v dashboardu Experiments připravené.
Onboarding
PlánSérie po první objednávce (trigger order_created, stav z atributů, nikdy order_updated). Kontrolní pásmo 45–64 vyhrazeno.
Měření a reporting
Přínos scénářů se měří kontrolními skupinami, ne atribucí. Každý profil má trvalé číslo 0–99 a podle něj patří do pásma; scénář se vyhodnocuje jako kontrolka scénáře proti Main group, která dostává vše.
Jak fungují kontrolní skupiny
Bucket 0–99
- Hash (md5 se stálým saltem) z klíče profilu, prvních 8 hex znaků mod 100. Není to uložený stav, ale výpočet z eventů profilu, takže vyjde vždy stejně a nic se nezapisuje.
- Identifikovaný profil →
bucket_emailz nejstaršího identitního e-mailu (účet, user_identified, SE kontakt, guest objednávka; ne kontaktní e-mail objednávky), fallback nejstarší customer_id. - Anonym →
bucket_cookiez nejstaršíhouser_id. - Člověk s více e-maily se počítá jednou. Kontrolní profil se nedostane do žádného segmentu, takže se nikam neexportuje.
Vyhodnocení
- O skupině je rozhodnuto předem; členem experimentu se profil stává kvalifikačním eventem (měl košík, prohlížel bez nákupu…).
- Intention-to-treat: kvalifikovaní vs. kvalifikovaní, doručení je jen diagnostika.
- Hlavní metriky: podíl bez nákupu (nižší = lepší) a průměrná tržba na kvalifikovaného, Control vs Main, per trh. Cizí kontrolky se do srovnání nepočítají.
- Nový scénář = přidělit pásmo a zapsat éru startu do metodiky. Salt ani klíč se nikdy nemění, změna by přemíchala skupiny.
Mapa pásem
| Bucket | Podíl | Role |
|---|---|---|
| 0–4 | 5 % | globální holdout – žádný scénář (plošné newslettery a transakční maily ano) |
| 5–24 | 20 % | kontrolka opuštěný košík |
| 25–34 | 10 % | kontrolka shopping intention |
| 35–44 | 10 % | kontrolka replenishment |
| 45–64 | 20 % | kontrolka onboarding |
| 65–99 | 35 % | Main group – dostává vše |
UI testy (varianty bannerů, timing) se řežou kolmo: sudé vs. liché buckety, nebo stratifikovaný výčet bucketů tak, aby každá varianta měla polovinu Main i polovinu cizích kontrolek. Experimenty se pak nealiasují.
Dashboard Experiments
Reporting → Experiments (18 reportů nad atributem Control Groups & Experiment Metrics), pro každý scénář stejná sada:
- dvě rate karty „without purchase“ Control group vs Main group za 30 dní (replenishment 90 dní),
- průměrná tržba na kvalifikovaného per trh (bar), mix trhů (donut), tabulka Control vs Main per trh,
- plus Onboarding (první nákup), Global holdout a Attribute coverage (kolik profilů má atribut napočítaný).
Trh = měna, EUR přepočet do CZK pevným kurzem jen pro součty. Limit platformy: 20 reportů na dashboard.
Goals
| Goal | Režim | Zdroj události | K čemu |
|---|---|---|---|
| Web purchase CZ / SK | každý event | purchase z Vaprio.cz / .sk, hodnota $.value | primární goal košíkových journeys, srovnání timing variant |
| First web purchase CZ / SK | první na profil | purchase | nováčci |
| Kliknutí v e-mailu | každý event | SE email_clicked | obecné e-mailové kliky |
| Abandoned cart email opened / clicked – wait 30, wait 120, krok 2 | každý event | SE email_opened / email_clicked s filtrem $.node.id na konkrétní uzel SE automatizace | otevření a kliky per varianta košíkového e-mailu |
Ostatní dashboardy
| Dashboard | Co ukazuje | Zdroj |
|---|---|---|
| Web banners | event log per banner (imprese, kliky, zavření, odeslání, zasažené profily, CTR, submit rate), anonym vs identifikovaný, stránky zobrazení; post-click atribuce (objednávky do 24 h a 7 d po kliku) a distribuce času klik → objednávka. Atribuce není inkrement, přínos říká Experiments. | all_web_banner_interactions, web_banner_click_attribution |
| Licence – uložené eventy | uložené eventy celkem, podle zdroje a typu, pokrytí profilů atributem; hlídání licenčního objemu | stored_events_by_type |
| Emailing performance | dostali / otevřeli / klikli, engagement úrovně, kliky podle rozesílky, CTOR, odhlášení | šablonové SE atributy |
| Pracovní dashboard Vapria | prázdný, pro vlastní reporty marketingu | – |
Reporty reagují na výběr období dashboardu přes časovou dimenzi atributu (event_time, clicked_at). Čísla jsou úplná až po naplnění atributu na všech profilech; testovací profily zkreslují CTR, odečítají se dočasným filtrem na audienci nebo se testuje na sandboxu.
Hlídky (watchdog audience)
Report neumí spojit dva atributy, proto hlídky „zásah do kontrolky = 0“ existují jako uložené audience:
- WATCHDOG košíkový e-mail v kontrolce: bucket_email 0–24 a přijatý košíkový e-mail z nových uzlů.
- WATCHDOG košík banner v kontrolce: bucket_email 0–24 a imprese košíkového banneru více než 10 minut po identifikaci (dřívější imprese anonymní cookie v pásmu je legitimní).
Velikost audience v přehledu je cache. Živý stav dává náhled profilů v detailu audience nebo přepočet velikosti.
Jak číst čísla
- Otevření e-mailů po ~2 týdnech, kliky průběžně, rozdíl v nákupech Control vs Main až za 6–8 týdnů.
- Éry: každý start scénáře nebo změna kontraktu (např. desktop banner měří zavření a skutečné URL až od 22. 9.) je zapsaná v metodice; období před érou se do srovnání nebere.
- Výpadek přepočtu profilů (19. 9. 2026, 11 hodin) zamrazil audience a atributy; eventy se neztratily, ale den je pro vyhodnocení bannerů zkreslený.
- Purchase rate košíkové kvalifikace je vysoký, protože kvalifikace zahrnuje i checkout. Proto velké karty ukazují podíl bez nákupu, kde je rozdíl citlivější.
Provoz a monitoring
Co běží samo, kde se to hlídá, co je normální a co dělat, když něco nejde.
Co běží samo
| Co | Kdy | Kde hlídat |
|---|---|---|
| Cloud App „Vaprio database“ | každých 30 min; nová data jednou za hodinu (export Vapria v :45) | Sources → Vaprio database (poslední běh, stav, log) |
| Web SDK, SmartEmailing, subscribe endpointy | realtime | Health (fronty), zdroje → eventy za poslední hodinu |
| Journeys (košík CZ, SI dry-run) | průběžně | Journeys → aktivní instance, doručení |
| Destinace do SmartEmailingu | při každém odeslání | Destinations → logy doručení; Error logs |
| Heartbeat (Piper) | každou hodinu, report za předchozí hodinu | Health → Heartbeat; při problému Slack |
| Error alerting | při nové chybě (max 1× za 5 min) | Slack webhook (Settings → Error alerting) |
Heartbeat a alerty
Hodinový AI health report Meira běží podle promptu Data Clubu (verze 12 od 19. 9. 2026). Co hlídá:
- Weby Vaprio.cz a Vaprio.sk pod 100 eventů za hodinu (kdykoli).
- Vaprio database: 0 eventů za hodinu mezi 06–20 UTC, nebo selhaný běh.
- SmartEmailing: nejnovější event starší než 12 hodin (nula v jedné hodině je normální).
- Subscribe endpointy: nikdy nulu, ale nadměrný počet žádostí = podezření na spam; selhané doručení SmartEmailing DOI vždy.
- Fronty: přes 5 000 položek, nebo stojící worker (fronta neprázdná, nejstarší položka starší než hodinu, nula zpracovaných za minutu).
- Selhání destinací: jedno až dvě HTTP 5xx ze SmartEmailingu za hodinu jen do reportu, alert od tří, nebo při jiné chybě než 5xx.
- Nikdy nehlásí nulu u backloadu, sandboxu a systémových zdrojů. Notifikace česky, s čísly.
Stav a historie běhů: Health → Heartbeat; prompt se mění v Settings (jen implementátor).
Co je normální
- Vaprio database: stovky až nízké tisíce eventů za hodinu ve dne, stejné číslo dvakrát po sobě (běh v :22 nepřinese nic nového), v noci 0 objednávek.
- Weby: tisíce eventů za hodinu ve dne, stovky v noci.
- Fronta
profileRefreshroste po hromadných zápisech a velkých rozesílkách (do tisíců) a během minut odtéká;identityResolutionse drží u nuly.
- Log Cloud Appu:
mimo_okno,order_email_as_data,guest_ordersjsou statistiky, ne chyby.oriznuto > 0= strop 8 000 eventů, vznikla díra. - Journey instance čekající na čerstvý refresh profilu (
deferredReason: profile_refresh) a retry po 30 s jsou design platformy, ne chyba. - Nový atribut krátce po založení ukazuje „no data“; plní se backfillem.
Když něco nejde
| Symptom | Příčina | Kdo řeší |
|---|---|---|
| Slack: „Zdrojové CSV Vaprio nejsou aktualizována… starší než 3 h“ | výpadek exportu na straně Vapria | Vaprio (databáze, exporty); běh se opakuje sám, 24h okno dohání do jednoho dne |
| Slack: „download … HTTP 401 / 5xx“ | přístup nebo servery Vapria | Vaprio (databáze, exporty) |
Díra delší než okno (Cloud App vypnutý přes 3 h, oriznuto) | chybějící data | implementátor dohraje přes backload zdroj |
| Heartbeat: Vaprio.cz / .sk 0 eventů | SDK na webu se nenačítá | Vaprio (web); ověřit v prohlížeči (Network → collect) |
| SmartEmailing bez eventů 12 h+ | konektor nebo konfigurace SE | Meiro support, Vaprio |
| Destinace SE: HTTP 5xx nebo TLS chyba | přechodná chyba SmartEmailingu; retry 3× | od tří selhání za hodinu alert; Vaprio / SE |
| Fronta profileRefresh stojí | worker platformy | Meiro (restart); atributy, audience a journeys mezitím zamrzlé |
| Profil vypadá špatně (cizí objednávky, divné e-maily) | identita | zkontrolovat identifikátory a identity audit, hlásit implementátorovi, neopravovat ručně |
Limity platformy (naučené)
- Cloud App: výstup do 10 000 eventů a ~10 MiB na běh (přebytek se tiše zahodí), limit běhu 5 minut, kolem 8–10 odchozích requestů na běh.
/collect: 1 MB na request, 10 000 eventů na request, 429 při plné frontě.- Refresh profilu bere max 10 000 nejnovějších eventů; detail profilu v API vrací max 100 eventů (zbytek přes cursor).
- Atribut max 20 dimenzí, dimenze neměnné, žádný přepočet po změně SQL. Dashboard max 20 reportů. Jeden restitch najednou.
- Profile API vrací pro neznámý identifikátor 404 s JSON tělem; při health-checku kontrolovat tělo, ne jen status.
- Aktivní journey nejde uložit; postup pauza → uložit → spustit. Hrany grafu musí mít ID.
Objem eventů a retence
Licence je omezená celkovým počtem uložených eventů. Největší podíl dělá webový page_view. Retence (kolik dní se event drží, 0 = navždy) se nastavuje per event typ a mění ji jen implementátor; retence šablonových typů webu je zamčená u Meira.
| Skupina | Dnes | Návrh (čeká na rozhodnutí) |
|---|---|---|
| DB transakce a účty | navždy | navždy (účty 365 d) |
Web view_item_list | 60 d | 60 d |
Web page_view | 365 d | 30 d |
Web user_identified, cart_updated | navždy | 30 / 90 d |
Web view_item a ostatní | 365 d | 180 d |
| SmartEmailing | navždy | 365 d |
Sledování: dashboard Licence – uložené eventy. Změna retence maže jen data starší než limit, čerstvá data nejsou ohrožena. Retenční rozhodnutí není urgentní, do začátku roku 2027 limit nehrozí.
Incidenty
- 19. 9. 2026Worker přepočtu profilů stál 11 hodin (platforma Meiro). Atributy, audience a journeys zamrzlé; eventy se neztratily, po restartu se dopočítaly. Heartbeat upraven na v12 (stojící worker se hlásí do hodiny), Meiro přidalo interní monitoring front.
- 17.–21. 9. 2026Ojedinělé HTTP 500 a TLS chyby SmartEmailingu při volání trigger-event, 20.–21. 9. degradace SE. Destinace bez retry doručení propadaly; 22. 9. nasazen retry do všech pěti destinací.
- 15. 9. 2026Planý poplach heartbeatu (počty ze vzorku) a padající běhy; Meiro opravilo runtime 15./16. 9., prompt přepsán na absolutní prahy.
- 2. 9. 2026Cloud App vrátil přes 10 000 eventů, platforma zdroj vypnula. Řešení: okno 6 h a strop 8 000 eventů na běh.