Guides / Platforms & Tools

Log Events from Vercel Edge Functions

3 min read·Platforms & Tools

Edge Runtime Constraints

Vercel Edge Functions run in a V8 isolate (not Node.js), so Node-specific APIs are unavailable. LogIt's REST API works fine because the Edge runtime supports fetch.

Setup: A Lightweight Edge-Compatible Logger

ts
// lib/logit-edge.ts
interface LogitEvent {
  channel: string;
  event: string;
  description: string;
  icon?: string;
  notify?: boolean;
  tags?: Record<string, string>;
  metadata?: Record<string, unknown>;
}

export function logitFire(apiKey: string, payload: LogitEvent): void {
  // Fire-and-forget — never block the edge response
  fetch("https://api.logit.now/api/ingest", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": `Bearer ${apiKey}`,
    },
    body: JSON.stringify(payload),
  }).catch(() => {});
}

In an Edge API Route

ts
// app/api/track/route.ts
export const runtime = "edge";
import { logitFire } from "@/lib/logit-edge";

export async function POST(req: Request) {
  const { userId, event } = await req.json();
  const geo = (req as any).geo ?? {};

  logitFire(process.env.LOGIT_API_KEY!, {
    channel: "events",
    event,
    description: `${userId}${event}`,
    icon: "⚡",
    notify: false,
    tags: { country: geo.country ?? "unknown" },
    metadata: { userId, event, geo },
  });

  return Response.json({ ok: true });
}

In Vercel Middleware

ts
// middleware.ts
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { logitFire } from "@/lib/logit-edge";

export function middleware(req: NextRequest) {
  if (req.nextUrl.pathname === "/pricing") {
    logitFire(process.env.LOGIT_API_KEY!, {
      channel: "page-views",
      event: "Pricing page viewed",
      description: req.nextUrl.toString(),
      icon: "💰",
      notify: false,
      tags: { country: req.geo?.country ?? "unknown" },
      metadata: { url: req.nextUrl.toString(), referrer: req.headers.get("referer") ?? null },
    });
  }
  return NextResponse.next();
}

export const config = { matcher: ["/pricing", "/checkout/:path*"] };

Tips

  • Never await the LogIt call in edge functions — use fire-and-forget to keep response times fast.
  • Use req.geo (available in Vercel Edge) to enrich events with country/region data.
  • The runtime = "edge" export is required on API routes that explicitly use Edge Runtime.

Try LogIt free

7-day trial. No credit card required.

Start free