Skip to main content

Vercel Analytics vs Plausible vs Umami: Privacy-First Analytics 2026

·PkgPulse Team

Vercel Analytics vs Plausible vs Umami: Privacy-First Analytics 2026

TL;DR

Google Analytics 4's complexity and privacy concerns have accelerated the shift to simpler, privacy-first analytics. Three tools lead the space in 2026. Vercel Analytics is the zero-friction option for Vercel-hosted projects — automatic Web Vitals, pageview tracking, and audience insights built into the Vercel dashboard with @vercel/analytics installed in 5 minutes and no cookie banner required; it's tightly coupled to Vercel infrastructure but unbeatable for DX. Plausible is the privacy-friendly, cookie-free alternative to Google Analytics — GDPR-compliant by default, beautiful dashboard with real-time stats, goals, funnels, properties, 1.8kB script, available as cloud ($9/mo) or self-hosted; it's the best standalone analytics service for production websites. Umami is the open-source, self-hosted analytics platform — deploy on your own Postgres database, no cloud costs beyond your own infrastructure, full feature set with event tracking, custom properties, and team sharing; the go-to for developers who want full data ownership. For Vercel projects needing quick analytics: Vercel Analytics. For a polished privacy-friendly cloud service: Plausible. For self-hosted with full data control: Umami.

Key Takeaways

  • Vercel Analytics is zero-config — install @vercel/analytics, done; no cookie banner
  • Plausible tracks zero personal data — no cookies, no IP storage, GDPR/CCPA compliant
  • Umami is fully self-hosted — your Postgres, your data, your infrastructure
  • All three are cookie-free — no consent banner required in most jurisdictions
  • Plausible has funnels — multi-step conversion tracking in cloud plan
  • Vercel Analytics includes Web Vitals — LCP, CLS, FID per route, percentile breakdown
  • Umami is free — cost is only your hosting; Postgres on Railway/Supabase works

Feature Overview

Vercel Analytics    Web Vitals + pageviews, Vercel-only, instant setup
Plausible           Privacy-first SaaS/self-hosted, full analytics suite
Umami               Open-source, self-hosted, full analytics, free

Vercel Analytics: Zero-Friction for Vercel Projects

Vercel Analytics is built directly into the Vercel platform — Web Vitals monitoring, audience analytics, and real-time pageviews with one package install.

Installation

npm install @vercel/analytics

Next.js App Router Setup

// app/layout.tsx
import { Analytics } from "@vercel/analytics/react";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        {children}
        <Analytics />
      </body>
    </html>
  );
}

Pages Router Setup

// pages/_app.tsx
import { Analytics } from "@vercel/analytics/react";
import type { AppProps } from "next/app";

export default function App({ Component, pageProps }: AppProps) {
  return (
    <>
      <Component {...pageProps} />
      <Analytics />
    </>
  );
}

Web Vitals (Speed Insights)

npm install @vercel/speed-insights
// app/layout.tsx
import { Analytics } from "@vercel/analytics/react";
import { SpeedInsights } from "@vercel/speed-insights/next";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        {children}
        <Analytics />
        <SpeedInsights />  {/* Automatic LCP, CLS, FID per route */}
      </body>
    </html>
  );
}

Custom Events

// Track custom events beyond pageviews
import { track } from "@vercel/analytics";

// Track a button click
function handleSignUp() {
  track("signup_click", {
    plan: "pro",
    source: "pricing_page",
  });
  // ... handle signup
}

// Track a purchase
function handlePurchase(amount: number, product: string) {
  track("purchase", {
    amount,
    product,
    currency: "USD",
  });
}

Vercel Dashboard

After installation, the Vercel dashboard shows:

  • Pageviews and unique visitors by day/week/month
  • Top pages, referrers, countries, devices, browsers
  • Web Vitals per route: LCP/CLS/FID at P50/P75/P90/P99
  • Real-time visitor count
  • Custom event funnel
  • No cookies, no consent required

What Vercel Analytics CANNOT do

❌ Self-host — Vercel infrastructure only
❌ Works with non-Vercel deployments
❌ Custom dashboards or data export (paid plan needed)
❌ Session recording
❌ A/B testing
❌ Heatmaps

Plausible: Privacy-First Cloud Analytics

Plausible is purpose-built for privacy — no cookies, no personal data, GDPR by design, with a clean dashboard that developers actually want to use.

Installation

npm install next-plausible

Next.js Integration

// app/layout.tsx — App Router
import PlausibleProvider from "next-plausible";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <PlausibleProvider domain="yourdomain.com">
        <body>{children}</body>
      </PlausibleProvider>
    </html>
  );
}

Pages Router

// pages/_app.tsx
import PlausibleProvider from "next-plausible";
import type { AppProps } from "next/app";

export default function App({ Component, pageProps }: AppProps) {
  return (
    <PlausibleProvider domain="yourdomain.com">
      <Component {...pageProps} />
    </PlausibleProvider>
  );
}

Or Via Script Tag (Any Framework)

<!-- Simple embed — no npm package needed -->
<script
  defer
  data-domain="yourdomain.com"
  src="https://plausible.io/js/script.js"
></script>

<!-- With outbound link tracking -->
<script
  defer
  data-domain="yourdomain.com"
  src="https://plausible.io/js/script.outbound-links.js"
></script>

<!-- Combined: outbound links + file downloads -->
<script
  defer
  data-domain="yourdomain.com"
  src="https://plausible.io/js/script.outbound-links.file-downloads.js"
></script>

Custom Events

// Using next-plausible hook
import { usePlausible } from "next-plausible";

export function SignupButton() {
  const plausible = usePlausible();

  return (
    <button
      onClick={() => {
        plausible("Signup Click", {
          props: {
            plan: "pro",
            source: "pricing_page",
          },
        });
      }}
    >
      Get Started
    </button>
  );
}

Revenue Tracking

// Track e-commerce events with revenue
import { usePlausible } from "next-plausible";

export function CheckoutButton({ amount }: { amount: number }) {
  const plausible = usePlausible();

  return (
    <button
      onClick={() => {
        plausible("Purchase", {
          revenue: { currency: "USD", amount },
          props: { product: "pro_plan" },
        });
      }}
    >
      Complete Purchase
    </button>
  );
}

Plausible Dashboard Features

✅ Real-time visitors
✅ Pageviews, unique visitors, bounce rate, session duration
✅ Top pages, referrers, UTM sources, countries
✅ Custom goals and events with properties
✅ Funnels (multi-step conversion tracking)
✅ Revenue attribution
✅ Outbound link clicks (automatic)
✅ File download tracking (automatic)
✅ 404 page tracking
✅ Shared dashboards (public or password-protected)
✅ CSV/TSV export
✅ API for programmatic data access
✅ Email digests (weekly/monthly)
❌ Session recording
❌ Heatmaps
❌ A/B testing

Self-Hosting Plausible

# docker-compose.yml — self-hosted Plausible
version: "3.3"

services:
  mail:
    image: bytemark/smtp

  plausible_db:
    image: postgres:14-alpine
    environment:
      - POSTGRES_PASSWORD=postgres
    volumes:
      - db-data:/var/lib/postgresql/data

  plausible_events_db:
    image: clickhouse/clickhouse-server:23.3-alpine
    volumes:
      - event-data:/var/lib/clickhouse
      - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
      - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro

  plausible:
    image: ghcr.io/plausible/community-edition:v2.1
    command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
    depends_on:
      - plausible_db
      - plausible_events_db
      - mail
    ports:
      - 8000:8000
    environment:
      - BASE_URL=https://analytics.yourdomain.com
      - SECRET_KEY_BASE=your-secret-key
      - DATABASE_URL=postgres://postgres:postgres@plausible_db:5432/plausible_db
      - CLICKHOUSE_DATABASE_URL=http://plausible_events_db:8123/plausible_events_db

volumes:
  db-data:
  event-data:

Umami: Self-Hosted Open Source

Umami is a fully open-source, self-hosted analytics platform — deploy it once to your own infrastructure and get complete data ownership with zero recurring analytics costs.

Self-Hosting Setup

# Clone and deploy
git clone https://github.com/umami-software/umami.git
cd umami

# Environment setup
cp .env.example .env.local
# Edit .env.local:
# DATABASE_URL=postgresql://user:password@localhost:5432/umami
# NEXTAUTH_SECRET=your-random-secret

Deploy on Railway (Fastest)

1. Railway → New Project → Deploy from GitHub → umami-software/umami
2. Add Postgres plugin (auto-generates DATABASE_URL)
3. Set environment variables:
   - DATABASE_URL: (auto-filled by Railway plugin)
   - NEXTAUTH_SECRET: (generate with: openssl rand -base64 32)
   - NEXT_PUBLIC_UMAMI_APP_URL: https://your-railway-app.up.railway.app
4. Deploy — Umami runs on Railway's free tier or $5/mo

Next.js Integration

// app/layout.tsx
import Script from "next/script";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <head>
        <Script
          src="https://analytics.yourdomain.com/script.js"
          data-website-id="your-website-id"  // From Umami dashboard
          strategy="afterInteractive"
        />
      </head>
      <body>{children}</body>
    </html>
  );
}

Custom Events via umami.track

// Track events from any JavaScript
declare global {
  interface Window {
    umami: {
      track: (event: string, data?: Record<string, string | number>) => void;
    };
  }
}

// In your components
function handleSignUp() {
  window.umami.track("signup", {
    plan: "pro",
    source: "pricing_page",
  });
}

// Or use the npm package
// npm install @umami/node
import { track } from "@umami/node";

await track("https://yourdomain.com", "purchase", {
  revenue: 99,
  product: "pro_plan",
});

Umami React Hook

// Wrapper hook for Umami tracking
import { useCallback } from "react";

export function useUmami() {
  const track = useCallback((event: string, data?: Record<string, string | number>) => {
    if (typeof window !== "undefined" && window.umami) {
      window.umami.track(event, data);
    }
  }, []);

  return { track };
}

// Usage
export function PricingButton({ plan }: { plan: string }) {
  const { track } = useUmami();

  return (
    <button
      onClick={() => {
        track("pricing_cta_click", { plan });
        window.location.href = `/checkout?plan=${plan}`;
      }}
    >
      Get {plan}
    </button>
  );
}

Feature Comparison

FeatureVercel AnalyticsPlausibleUmami
PricingFree (100K events), $10/mo (1M)$9/mo (10K visitors)Free (self-host)
Self-hostable❌ Vercel only✅ Community Edition✅ Open source
Cookie-free
GDPR compliant
Web Vitals✅ LCP/CLS/FID
Real-time
Custom events
Funnels✅ (paid)
Revenue trackingLimited
API access
CSV export✅ (paid)
Shared dashboardsLimited
Next.js package@vercel/analyticsnext-plausibleScript tag
Script size~5kB~1.8kB~2kB
Data ownershipVercelPlausible/yours✅ 100% yours
GitHub starsN/A20k23k
DeploymentVercelCloud or DockerSelf-hosted

When to Use Each

Choose Vercel Analytics if:

  • Already on Vercel and want zero-friction setup
  • Web Vitals monitoring per route is important (LCP/CLS/FID)
  • Small project — free tier is generous for indie projects
  • Want analytics in the same dashboard as deployments
  • Don't need funnels, cohorts, or advanced segmentation

Choose Plausible if:

  • Want a polished, maintained cloud analytics service
  • Privacy-first is a selling point (GDPR countries, privacy-conscious audience)
  • Need funnels, revenue attribution, and shared public dashboards
  • Not on Vercel (Plausible works anywhere)
  • Happy to pay $9-19/mo for a managed service vs self-hosting

Choose Umami if:

  • Want $0 analytics costs (just hosting)
  • Need complete data ownership (healthcare, legal, privacy-sensitive)
  • Multiple websites, multiple team members (Umami supports multi-site)
  • Self-hosting experience is already part of your stack
  • Want to modify the analytics platform itself (open source)

Methodology

Data sourced from Vercel Analytics documentation (vercel.com/docs/analytics), Plausible documentation (plausible.io/docs), Umami documentation (umami.is/docs), pricing pages as of February 2026, npm weekly download statistics as of February 2026, GitHub star counts as of February 2026, and community discussions from the Vercel Discord, Plausible community forums, and indie hacker communities.


Related: PostHog vs Mixpanel vs Amplitude product analytics for full product analytics with session recording and feature flags, or Hotjar vs FullStory vs Microsoft Clarity session replay for heatmaps and session recording.

Comments

Stay Updated

Get the latest package insights, npm trends, and tooling tips delivered to your inbox.