Production runtime
| Layer | Technology |
|---|---|
| Reverse proxy / TLS | Traefik v3, Let’s Encrypt HTTP-01 |
| Ingestion API | Node.js 18, Express, @clickhouse/client, node-fetch |
| Database | ClickHouse (MergeTree), SQL migrations under server/migrations/ |
| Dashboard | Next.js 14 (Pages Router), React 18, Tailwind CSS, ApexCharts |
| Containers | Docker Compose (uts-api, uts-dashboard, uts-db, traefik, …) |
External integrations
| Destination | Mechanism |
|---|---|
| GA4 | Measurement Protocol → google-analytics.com/mp/collect |
| Meta | Conversions API via facebook-nodejs-business-sdk |
| Google Ads | uploadClickConversions when gclid / wbraid / gbraid present + G_ADS_CONVERSION_ACTIONS_JSON; LeadFormSubmitted deduped per lead when identifiable (see Lead form deduplication) |
| Microsoft Clarity | Browser-only: clarity.ms tag + custom events from tracker |
Repo layout (high level)
server/— API +public/uts-tracker.jsdashboard/— Next app +/api/*ClickHouse queriesdocker-compose.yml— Stack definitiondocs/kb/— This knowledge base (Markdown)