Logical diagram
┌─────────────────┐ HTTPS POST /track ┌──────────────────┐ │ Brand websites │ ────────────────────────► │ uts-api (Node) │ │ uts-tracker.js │ JSON + attribution │ Express │ └────────┬────────┘ └────────┬─────────┘ │ gtag / fbq / Clarity (browser) │ ▼ ▼ ┌─────────────────┐ ┌───────────────┐ │ Google / Meta │ │ ClickHouse │ │ (tags + APIs) │ │ uts_events + │ └─────────────────┘ │ attribution_* │ └───────┬───────┘ │ ▼ ┌───────────────┐ │ uts-dashboard │ │ Next.js + API │ └───────────────┘
Major parts
| Part | Role |
|---|---|
uts-tracker.js | Client library: IDs, attribution capture, sendEvent, optional gtag / fbq / Clarity hooks, beacon to /track. See Browser tracker. |
uts-api (server.js) | Express app: CORS, ClickHouse inserts, GA4 MP + Meta CAPI + Google Ads offline forwarding, lead-form dedupe for LeadFormSubmitted. See Server forwarding. |
| ClickHouse | Columnar store: uts_events primary fact table; optional attribution tables for journey/sources. See ClickHouse & attribution. |
| Traefik | TLS + routing: analytics.* → API, dashboard.* → dashboard container. |
| Dashboard | Operator UI: events, widgets, CAPI status, Knowledge Base. |
Environment boundaries
- Public:
/track, static/uts-tracker.js, healthGET /. - Authenticated admin:
/admin/*with bearer key (operational use).