invisit
All posts

By Miraç Berk19 min read

8 best Vercel Analytics alternatives for Next.js in 2026

Cloudflare, Umami, Plausible, PostHog and 4 more Vercel Web Analytics alternatives: Next.js setup, event limits, web vitals, data kept and prices.

Eight soft 3D analytics tiles lifting off a dark triangular base toward a white dashboard, lit by violet dithered light and shadow.

The best Vercel Web Analytics alternative depends on which limit you hit: Cloudflare Web Analytics for free page views and Core Web Vitals on any host, Umami for custom events and funnels on a free plan that allows commercial sites, and Plausible for EU data in a dashboard as plain as Vercel’s. All eight tools below run on any host and go into a Next.js App Router with one script tag or one package, while Vercel Web Analytics only collects on Vercel deployments.

The short answer by reason, as of November 2026:

We checked every price and limit below on the vendors’ own pages and docs on November 3, 2026, type-checked the TypeScript in this post against the current packages, and measured each tracker the same way:

Measuring a tracker
curl -s https://nextjs.org/_vercel/insights/script.js | gzip -9 | wc -c

Why do people look for Vercel Analytics alternatives?

People leave Vercel Web Analytics over six documented limits: it only runs on Vercel, the free plan rules out commercial sites, history is a 1 to 24 month window, events are thin, web vitals are a separate product, and the data is processed in the US. From Vercel’s own pages as of November 2026:

Two things Vercel gets right set the bar for a replacement. It sets no cookies, telling visitors apart with a hash of the request that resets daily, and its script measured 2,043 bytes gzipped.

Stay on Vercel Web Analytics if your site is commercial, already on Vercel Pro, and traffic counts with a few events are all you read. It is one toggle and one <Analytics /> component on a bill you already pay, and up to about 6M events a month it costs about the same as or less than the paid tools below (full price comparison).

What to look for in a Vercel Analytics alternative

A good Vercel Analytics alternative keeps the zero-setup feel and fixes the limit that pushed you. Beyond the events, history, vitals and data location in the table below, three points separate the field for Next.js sites:

Vercel Analytics alternatives compared

The eight alternatives with Vercel Web Analytics as the reference row, as of November 3, 2026:

Tool Next.js setup Free plan Custom events Funnels Web vitals Data kept EU data 1M a month
Vercel Web Analytics <Analytics /> from @vercel/analytics/next 50K events, non-commercial Pro only: 2 properties, 8 with Plus No Separate Speed Insights 1, 12 or 24 months No, US $30
Cloudflare Web Analytics One <Script> No traffic cap None No LCP, INP, CLS 6 months No EU-only option Free
Umami Cloud One <Script> 100K events, 1 site Every plan; properties bill as events Every plan Five, opt-in 6 months to 5 years EU or US region $20
Plausible @plausible-analytics/tracker No, 30-day trial Every plan; properties on Business Business No While subscribed Yes, Germany $69 to $139
Fathom fathom-client plus a route tracker No, 7-day trial A name and a value, no properties No No While subscribed No, stored in the US $60
invisit @invisitdev/web 20K events, 4 sites Every plan, 32 properties Every plan Five, on by default, not billed Forever Yes, Germany $49
PostHog posthog-js in instrumentation-client.ts 1M events Every plan Every plan Four, opt-in, billed 1 year free, 7 years paid EU or US region Free
Rybbit One <Script> No, 7-day trial Every plan Every plan Yes, billed as events 3 or 5 years Yes, Germany, Finland $69 to $139
Google Analytics 4 @next/third-parties Free at any volume 25 parameters Explorations Only if you send them Explorations 2 or 14 months No Free

Prices are monthly in each vendor’s own unit, from its cheapest plan to its most complete self-serve plan. Vercel’s includes the $20 Pro platform fee and assumes the $20 usage credit that comes with it goes to analytics. PostHog sends at least two events per page view, so its free 1M events cover about 500,000 page views.

Each entry also prices one reference site: a commercial Next.js app with 300,000 page views and 50,000 custom events a month. On Vercel Pro that is 350,000 events, or $10.50 of usage, which the $20 credit covers if hosting leaves room; with Plus the bill is $30 a month.

1. Cloudflare Web Analytics: best free replacement for page views and Core Web Vitals

Cloudflare Web Analytics is the nearest thing to Vercel’s toggle that works on any host: free with no traffic cap, no cookies, and Core Web Vitals in the same dashboard as page views. It needs a Cloudflare account and one script tag, and your DNS can stay where it is.

Cloudflare beats Vercel on price and vitals: commercial sites are free at any volume (overview), and LCP, INP and CLS come with the traffic, filterable by URL, browser, country and element (Core Web Vitals), which on Vercel takes Speed Insights Plus.

Cloudflare’s limits, from its FAQ: no custom events, no UTM reports, six months of data with only the last 7 days unsampled, and no unique visitors. The beacon measured 10,267 bytes gzipped, five times Vercel’s, ad blockers block it, and Web Analytics sits outside Cloudflare’s EU Customer Metadata Boundary.

In Next.js, add the beacon with next/script in the root layout; App Router navigations are tracked automatically (SPAs). The one-click setup needs the site proxied through Cloudflare, which Vercel recommends against, so use the manual snippet. There is no track() to map, so the reference site’s 50,000 custom events simply stop, and the rest is free.

Choose Cloudflare Web Analytics for a blog, docs site or side project where page views, referrers and speed are all you read, especially one leaving Vercel Hobby because it started to earn money.

2. Umami: best free plan with custom events and funnels

Umami Cloud’s free Hobby plan gives a commercial site what Vercel keeps behind Pro: custom events with properties, funnels and goals, up to 100,000 events a month on one site. Umami is also MIT-licensed open source, with an official guide to running Umami on Vercel on a Postgres database from the Vercel Marketplace.

Umami beats Vercel on depth for the money: funnels, sessions and retention on every plan, Core Web Vitals (LCP, INP, CLS, FCP and TTFB) with data-performance="true" on the script tag (performance), and an EU or US region chosen at signup (FAQ). Its script measured 3,922 bytes gzipped, about twice Vercel’s.

Umami’s limits: each stored event property bills as one more event, so umami.track('signup', { plan: 'pro' }) uses two (pricing). Hobby keeps 6 months for one site with no teammates; Pro is $20 a month for 1M events, 20 sites and 2 years. Names stop at 50 characters (events), and the visitor hash salt rotates monthly by default (metric definitions). Self-hosting it on Vercel Hobby falls under the same non-commercial rule as any other deployment.

In Next.js, Umami is one <Script> with data-website-id in the root layout, and it follows client-side navigation itself (SPA guide). track(name, data) becomes umami.track(name, data), and Umami Cloud imports CSV history by request from Pro (import). With two properties per event, the reference site sends about 450,000 Umami events: Pro at $20 a month.

Choose Umami for a commercial site that needs events and funnels for free, or open source you can deploy next to your app. See Umami vs invisit.

3. Plausible: best for EU data and a dashboard as plain as Vercel’s

Plausible reads most like Vercel Web Analytics, one page of top pages, sources, countries and devices, with the data stored in Germany by an EU company. It is also the one tool here where you can load your Vercel history into the new dashboard yourself.

Plausible beats Vercel on history and data location: data kept while you subscribe, on Hetzner in Falkenstein with EU-owned providers only (EU hosting), plus email and Slack reports and Search Console data. Its CSV import takes any tool’s data in Plausible’s format, every column optional, so daily page views and visitors from Vercel’s API can become an imported_visitors file covering the days before your first Plausible visitor.

Plausible’s limits: no free plan, only a 30-day trial. Custom properties (up to 30 per event), funnels and the Stats API need Business (custom properties). Starter covers one site, and there are no web vitals and no view of a single visit.

In Next.js, the official @plausible-analytics/tracker package starts with init() in a client component and tracks App Router navigations itself. One catch: init() throws if it runs twice, and React Strict Mode runs effects twice in development, so guard it:

app/plausible.tsx
'use client'
import { useEffect } from 'react'
import { init } from '@plausible-analytics/tracker'

let started = false

export function Plausible() {
  useEffect(() => {
    // init() throws on a second call, and Strict Mode runs effects twice in development.
    if (started) return
    started = true
    init({ domain: 'example.com' })
  }, [])
  return null
}

Render <Plausible /> once in app/layout.tsx; outbound links and file downloads stay off until you pass them to init() (npm package). track('Signup', { location: 'footer' }) becomes track('Signup', { props: { location: 'footer' } }), shown once you add it as a goal (custom events). The reference site costs $49 a month on Starter, or $99 on Business with properties and funnels.

Choose Plausible when EU storage and a simple dashboard matter more than event depth. See Plausible vs invisit.

4. Fathom: best for agencies moving client sites off Vercel

Fathom suits an agency: every plan includes at least 50 sites, each client gets a share link with an optional password and expiry, and weekly or monthly email reports go out on their own. Vercel counts paid client work as commercial, so client sites on Hobby need a new home anyway. Fathom’s script is as small as Vercel’s: 2,096 bytes gzipped against 2,043.

Fathom beats Vercel on price simplicity: one plan with every feature from $15 a month for 100,000 pageviews, 50 more sites for $10 a month (sites), full history while you subscribe, and Google Analytics 4 import.

Fathom’s limits: an event carries a name and an optional value, with no properties at all (events), fewer than Vercel’s 2. There are no funnels and no web vitals, one login per account (shared dashboards), and analytics are stored in the US (data isolation). Custom domains ended in March 2023, and the 7-day trial needs a card.

In Next.js, Fathom’s guide uses the community fathom-client package and a client component that calls trackPageview() whenever usePathname() or useSearchParams() changes: the most code of any tool here. track('Purchase', { price: 49.99 }) becomes trackEvent('Purchase', { _value: 4999 }), in cents, and other properties are dropped. The reference site costs $45 a month on the 500,000 tier.

Choose Fathom for many small client sites with reports to send. See Fathom vs invisit.

5. invisit: best for web vitals, funnels and every visit in one dashboard

invisit, the tool we build, puts what Vercel spreads across plans and products into one dashboard: web vitals from real visitors, funnels, custom events with up to 32 properties, and each visit step by step, kept forever on every plan, free included.

invisit beats Vercel on depth per plan: the five vitals are recorded by default and never billed, funnels take 2 to 8 steps from pages or events (funnels), and identify(user.id) attaches a hash of your own user id. Heatmaps, referrals from 19 AI assistants and payments from Stripe, Paddle and four more providers sit beside traffic. Data is stored in Falkenstein, Germany, and the free plan allows commercial sites: 20,000 events a month, 4 sites, unlimited team members.

invisit’s limits: no self-hosting, and no session recordings, retention cohorts, A/B tests or feature flags, so a Vercel Flags variant split has no equivalent. Revenue is charted beside traffic, not attributed to sources or campaigns. The core script is about 8.5 KB gzipped, about four times Vercel’s, and invisit imports no history, so your Vercel export stays your archive. Cloudflare, a US company, sits in front for DNS and CDN, and crawler reads need @invisitdev/server on your server, where Vercel’s AI Traffic tab needs no code.

In Next.js, @invisitdev/web starts from a client component in the root layout (frameworks), and @invisitdev/server in proxy.ts serves it from /_i on your domain (proxy); our Next.js guide covers signups, payments and funnels end to end.

track(name, props) keeps Vercel’s shape, with names of 1 to 64 characters from A-Z a-z 0-9 _ . : -, and calls from @vercel/analytics/server move to server-side events. The reference site needs the 1M plan at $49 a month; automatic outbound-link and download events count toward it.

Choose invisit when you want vitals, funnels and visit timelines without stitching products together, and data that never ages out. See Vercel Web Analytics vs invisit.

6. PostHog: best for product analytics with flags, experiments and replay

PostHog is the alternative for a product team: funnels, retention, session replay, feature flags, A/B tests and surveys on one event stream, free up to 1 million events a month. If you split analytics by Vercel Flags today, PostHog’s own flags and experiments cover both jobs.

PostHog beats Vercel on depth for nothing: web vitals (LCP, INP, CLS and FCP) once enabled (web vitals), an EU Cloud in Frankfurt (data storage), a free managed reverse proxy, unlimited team members, and 1 year of data free or 7 years on paid plans.

PostHog’s limits: posthog-js sets a first-party cookie for 365 days and uses localStorage by default, and cookieless mode is opt-in, in code and in project settings (persistence). Without it, EU and UK visitors need a banner. The script measured 118,629 bytes gzipped, about 58 times Vercel’s. Every page view costs at least two events, and autocaptured clicks and web vitals are billed as events too.

In Next.js, PostHog initializes posthog-js in instrumentation-client.ts, or npx @posthog/wizard writes the setup (Next.js docs). track(name, data) becomes posthog.capture(name, props), and PostHog imports history from Mixpanel and Amplitude, not Vercel (migrate). The reference site sends about 650,000 events before autocaptured clicks, inside the free 1M; 1M page views, about 2M events, cost about $50 a month.

Choose PostHog when analytics is one part of a product toolkit. See PostHog vs invisit.

7. Rybbit: best open-source pick with session replay and error tracking

Rybbit is cookieless, AGPL-3.0 open source and self-hostable with Docker, and its cheapest plan, Standard, includes funnels, journeys, retention, user profiles, error tracking and web vitals, with session replay on Pro (pricing).

Rybbit beats Vercel on product depth from $19 a month, with 3 years of data on Standard and 5 on Pro, hosting on Hetzner in Germany and Finland (subprocessors), and feature flags of its own.

Rybbit’s limits: no free plan, only a 7-day trial. Rybbit bills page views, custom events, web vitals, outbound clicks and autocaptured clicks, copies and form events, and an organization over its limit stops collecting until the next month or an upgrade (billing). The visitor ID is a hash of IP address and user agent that persists across days unless you turn on User ID Salting (site settings), and identify() keeps the user id in localStorage. The script measured 11,763 bytes gzipped, nearly six times Vercel’s.

In Next.js, Rybbit is one <Script> with ?siteId= in its URL, and client-side navigation is tracked automatically (Next.js guide). track(name, data) becomes window.rybbit.event(name, props), a flat object of at most 2,048 characters as JSON (events), and Rybbit imports history from Plausible, Umami and Simple Analytics, not Vercel. The reference site costs $49 a month on Standard at 500,000 events, or $69 once billed vitals and autocaptured clicks push it past that.

Choose Rybbit for replays and error tracking next to cookieless traffic, hosted or on your own server.

8. Google Analytics 4: best free option at any volume, or with Google Ads

Google Analytics 4 is free at any volume and goes far deeper than Vercel, with explorations, funnels, cohorts, audiences and Google Ads conversions. The price is cookies: GA4 sets _ga cookies for two years (cookie usage), so EU and UK visitors need a consent banner that Vercel’s cookieless setup never asked for.

GA4 beats Vercel on depth for nothing: Google Ads and Search Console links, BigQuery export, an AI Assistant channel since May 2026, and up to 25 parameters per event (limits).

GA4’s limits: gtag.js measured 155,001 bytes gzipped, about 76 times Vercel’s. Explorations keep event-level data for 2 or 14 months (data retention), event names stop at 40 characters and parameter values at 100, there is no EU storage option, and web vitals appear only if you send them as events.

In Next.js, @next/third-parties/google adds <GoogleAnalytics gaId="G-XYZ" /> to the root layout and sendGAEvent() for events, though Next.js still calls the library experimental (Next.js docs). track('Signup', { location: 'footer' }) becomes sendGAEvent('event', 'sign_up', { location: 'footer' }), GA4 imports no history, and the reference site is free.

Choose GA4 when you buy Google Ads or need its depth for free, and already run a consent banner. See GA4 vs invisit.

How do you replace Vercel’s track() calls?

Replace track() from @vercel/analytics with the new tool’s call, rename events to its rules, and keep properties within its limit. Most tools take the same name-plus-object shape; what changes is how many properties survive and what a name may contain. As of November 2026:

Tool Instead of track('Signup', { plan: 'pro' }) Properties per event Names
Vercel Web Analytics track() from @vercel/analytics 2 on Pro, 8 with Plus Up to 255 characters
Cloudflare No custom events None None
Umami umami.track('signup', { plan: 'pro' }) No documented cap; each bills as an event Up to 50 characters
Plausible track('Signup', { props: { plan: 'pro' } }) Up to 30, Business plan Shown once added as a goal
Fathom trackEvent('Signup'), with { _value } in cents None No documented limit
invisit track('signup', { plan: 'pro' }) Up to 32 1 to 64 characters, A-Z a-z 0-9 _ . : -
PostHog posthog.capture('signup', { plan: 'pro' }) No documented cap No documented limit
Rybbit window.rybbit.event('signup', { plan: 'pro' }) Flat object up to 2,048 characters as JSON Up to 256 characters
Google Analytics 4 sendGAEvent('event', 'sign_up', { plan: 'pro' }) 25 parameters, values up to 100 characters Up to 40 characters

Vercel’s third track() argument, flags, has no equivalent outside PostHog and Rybbit, which run feature flags of their own; elsewhere, send the variant as a property.

While both tools run, send every event through one function, so switching Vercel off is a one-line change:

lib/track.ts
import { track as vercelTrack } from '@vercel/analytics'
import { track as newTrack } from '@invisitdev/web' // or your new tool's call

type Props = Record<string, string | number | boolean | null>

// Vercel takes any name up to 255 characters; most tools want short snake_case names.
const rename = (name: string) =>
  name
    .trim()
    .toLowerCase()
    .replace(/[^a-z0-9]+/g, '_')
    .replace(/^_+|_+$/g, '')

// Components call this while both tools run. When Vercel is switched off,
// delete the vercelTrack line and the @vercel/analytics package.
export function track(name: string, props?: Props) {
  vercelTrack(name, props)
  newTrack(rename(name), props)
}

Swap the second import for your new tool’s call, such as umami.track or posthog.capture, or wrap the properties in { props } for Plausible. Server-side calls from @vercel/analytics/server move to the new tool’s server API, such as @invisitdev/server or Plausible’s Events API.

When should you stay on Vercel Web Analytics?

Stay when your site is commercial, already on Vercel Pro, and none of the limits above has cost you anything. Four things have no exact match in the alternatives:

If web vitals are your only gap, keep Vercel for traffic and add Cloudflare Web Analytics for free Core Web Vitals instead of paying for Speed Insights Plus.

How do you switch from Vercel Web Analytics without losing data?

Export first, run the new tool next to Vercel for two to four weeks, then remove <Analytics /> and disable Web Analytics in the project so events stop being billed. Vercel documents no raw export of past events, so what you export now is all you keep. Plausible’s CSV import, and Umami Cloud’s import service on Pro, are the only ways here to load it into a new dashboard.

  1. Export while your reporting window lasts. Each dashboard panel exports up to 250 rows as CSV (export). The Web Analytics API returns aggregated page views and visitors, grouped by up to two dimensions, for any range inside your plan’s window (reference):
export-vercel.sh
# Monthly page views and visitors for the last 12 months, the Pro window.
curl --get "https://api.vercel.com/v1/query/web-analytics/visits/aggregate" \
  -H "Authorization: Bearer $VERCEL_TOKEN" \
  --data-urlencode "teamId=$VERCEL_TEAM_ID" \
  --data-urlencode "projectId=$VERCEL_PROJECT_ID" \
  --data-urlencode "since=2025-11-04" \
  --data-urlencode "until=2026-11-03" \
  --data-urlencode "by=month" \
  --data-urlencode "limit=100" \
  -o vercel-months.json

# The 100 most viewed paths over the same window.
curl --get "https://api.vercel.com/v1/query/web-analytics/visits/aggregate" \
  -H "Authorization: Bearer $VERCEL_TOKEN" \
  --data-urlencode "teamId=$VERCEL_TEAM_ID" \
  --data-urlencode "projectId=$VERCEL_PROJECT_ID" \
  --data-urlencode "since=2025-11-04" \
  --data-urlencode "until=2026-11-03" \
  --data-urlencode "by=requestPath" \
  --data-urlencode "limit=100" \
  -o vercel-paths.json

Grouped queries return at most 100 rows and fold the rest into Others, so query one month at a time with by=day when you need daily rows. Swap by for referrerHostname, country or utmCampaign, and query events/aggregate with by=eventData/plan for custom events. For Plausible, turn each month’s daily rows into its import format:

Terminal
jq -r '"date,visitors,pageviews", (.data[] | "\(.timestamp[0:10]),\(.visitors),\(.pageviews)")' \
  vercel-days-2026-10.json > imported_visitors_20261001_20261031.csv
  1. Add a Drain only if you want raw events during the overlap. Drains stream page views and custom events to your own endpoint from the day you create one, on Pro or Enterprise at $0.50 per GB, so they cannot recover the past.
  2. Install the new tool next to <Analytics />; both run on the same pages. Point preview deployments at a second site, since Vercel sets each variable per environment (environment variables).
  3. Route every track() call through one function, as above, and rebuild each event as a goal or conversion in the new tool.
  4. Compare the two for two to four weeks on page views per path, not visitors. Each tool counts visitors its own way (Vercel and invisit with a daily hash, Umami with a monthly salt, Cloudflare not at all), ad blockers block different paths, and bot filters differ.
  5. Remove <Analytics /> and @vercel/analytics, then choose Disable Web Analytics from the menu on the project’s Analytics page, so events stop being collected and billed (disabling). If the new tool records web vitals, remove <SpeedInsights /> too and choose Turn off Speed Insights Plus on the Speed Insights page (Speed Insights).

Checklist before you turn off Vercel Web Analytics