68 lines
2.7 KiB
Markdown
68 lines
2.7 KiB
Markdown
# Tracking systém
|
||
|
||
## Jak to funguje
|
||
|
||
Tracking probíhá přes JavaScript soubor `public/collect.js`, který se vloží na sledovaný web. Každý web/eshop má přiřazený **Site Key** (`TrackingSite.public_key`), který se předává jako `data-site-key` atribut scriptu.
|
||
|
||
```html
|
||
<script src="https://app.domena.cz/collect.js"
|
||
data-site-key="abc123"
|
||
data-api-base="https://app.domena.cz">
|
||
</script>
|
||
```
|
||
|
||
## Visitor ID
|
||
|
||
- Každý anonymní návštěvník dostane náhodné `visitor_id` (UUID), které se ukládá do cookie `ft_vid` a localStorage.
|
||
- Po identifikaci (přihlášení, vyplnění emailu) se `visitor_id` propojí s `Contact` přes tabulku `visitor_identities` – viz `IdentityLinker`.
|
||
|
||
## IngestEvent pipeline
|
||
|
||
Všechny eventy (browser i server-side) prochází přes `App\Services\Ingest\IngestEvent::ingest()`:
|
||
|
||
1. Parsuje a normalizuje data (visitor_id, contact_id, occurred_at...)
|
||
2. Volitelně provede identify (pokud přišel `identity.email`)
|
||
3. Pokud chybí `visitor_id`, generuje náhradní (`contact:{id}` nebo `integration:{source}`)
|
||
4. Uloží `FunnelEvent` do databáze (idempotentně přes `external_event_id`)
|
||
5. Vrátí uložený `FunnelEvent`
|
||
|
||
Po ingestion volají controllery `RulesEngine::evaluate()` – viz [Automations](Automations).
|
||
|
||
## Události (event typy)
|
||
|
||
| Event | Kdy se posílá |
|
||
|-------|--------------|
|
||
| `page_view` | Každé zobrazení stránky |
|
||
| `cart_upsert` | Změna obsahu košíku |
|
||
| `cart_completed` | Dokončení objednávky |
|
||
| `newsletter_subscribe` | Přihlášení k newsletteru |
|
||
| `gallery_config_submit` | Odeslání konfigurátoru |
|
||
| `identify` | Identifikace návštěvníka |
|
||
|
||
## Identifikace návštěvníka
|
||
|
||
Třída `IdentityLinker` zajišťuje propojení `visitor_id → Contact`:
|
||
|
||
- **`identify()`** – podle emailu (přihlášení, formulář)
|
||
- **`identifyByToken()`** – podle `ftclid` (klik z emailové kampaně)
|
||
- Mapping ukládá do `visitor_identities`
|
||
- Backfilluje `contact_id` ke starším eventům pro stejné `visitor_id`
|
||
|
||
## Automatická identifikace v collect.js
|
||
|
||
1. Přes `ftclid` v URL (z emailového odkazu)
|
||
2. Přes `gident` / `tag` UTM parametr
|
||
3. Přes email v payloadu (při odeslání formuláře)
|
||
|
||
## Bot detekce
|
||
|
||
`BotDetector` flaguje requesty od crawlerů a botů. `FunnelEvent.bot = 1` pro botí eventy – tyto se do statistik nezapočítávají.
|
||
|
||
## GTM / dataLayer integrace
|
||
|
||
`collect.js` naslouchá na `window.dataLayer.push()` a zachytává standardní ecommerce eventy (`purchase`, `order_completed`, `transaction`, `ecommerce_purchase`) – automaticky je převede na `cart_completed`.
|
||
|
||
## Cross-domain tracking
|
||
|
||
Pokud zákazník přechází mezi doménami, `collect.js` automaticky doplňuje `visitor_id` jako URL parametr do odkazů podle konfigurace `data-propagate-link-domains`.
|