This commit is contained in:
2026-04-22 13:01:47 +02:00
commit 803acf3da3
14 changed files with 1101 additions and 0 deletions

67
Tracking.md Normal file
View File

@@ -0,0 +1,67 @@
# 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`.