Files
turbostarter/packages/analytics/web/src/providers/umami/server.ts
Alejandro Gutiérrez 3527e732d4 feat: turbostarter boilerplate
Production-ready Next.js boilerplate with:
- Runtime env validation (fail-fast on missing vars)
- Feature-gated config (S3, Stripe, email, OAuth)
- Docker + Coolify deployment pipeline
- PostgreSQL + pgvector, MinIO S3, Better Auth
- TypeScript strict mode (no ignoreBuildErrors)
- i18n (en/es), AI modules, billing, monitoring

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 01:01:55 +01:00

46 lines
1.5 KiB
TypeScript

import { logger } from "@turbostarter/shared/logger";
import { env } from "./env";
import type { AnalyticsProviderServerStrategy } from "@turbostarter/analytics";
export const { track } = {
track: (event, data) => {
const hostname =
typeof data?.hostname === "string" ? data.hostname : undefined;
const language =
typeof data?.language === "string" ? data.language : undefined;
const referrer =
typeof data?.referrer === "string" ? data.referrer : undefined;
const screen = typeof data?.screen === "string" ? data.screen : undefined;
const title = typeof data?.title === "string" ? data.title : undefined;
const url = typeof data?.url === "string" ? data.url : "app://server-side";
void fetch(`${env.UMAMI_API_HOST}/api/send`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-umami-api-key": env.UMAMI_API_KEY ?? "",
},
body: JSON.stringify({
type: "event",
payload: {
website: env.NEXT_PUBLIC_UMAMI_WEBSITE_ID,
name: event,
url: url,
...(hostname && { hostname }),
...(language && { language }),
...(referrer && { referrer }),
...(screen && { screen }),
...(title && { title }),
data,
},
}),
}).then((res) => {
if (!res.ok) {
logger.error("Failed to post event to Umami: ", res);
}
});
},
} satisfies AnalyticsProviderServerStrategy;