Go Back

Apr 17, 2025

Analytics, A/B Testing, and Personalization

we’ll cover integrating analytics, running A/B tests, and delivering personalized experiences.

Analytics, A/B Testing, and Personalization

1. Analytics Integration

a. Vercel Analytics
Vercel provides built-in analytics that track real user metrics without impacting performance:

  1. Enable Analytics in the Vercel dashboard for your project.

  2. View metrics like Web Vitals, performance, and geographic distribution in real time.

b. Google Analytics
Use the @vercel/analytics package or traditional GA integration:

npm install @vercel/analytics
// pages/_app.js
import { Analytics } from '@vercel/analytics/react';

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

Or manually add GA script in pages/_document.js:

<Head>
  <script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX"></script>
  <script dangerouslySetInnerHTML={{ __html: `
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}gtag('js', new Date());
    gtag('config', 'G-XXXXXXX', { page_path: window.location.pathname });
  `}} />
</Head>

c. Segment or other CDP
Aggregate multiple analytics providers:

npm install analytics @segment/analytics-next
import Analytics from '@segment/analytics-next';

const analytics = Analytics.load({ writeKey: 'YOUR_WRITE_KEY' });
analytics.page();

2. A/B Testing and Feature Flags

a. Vercel Edge Config
Use Vercel Edge Config to serve feature flags at the edge:

  1. Create an Edge Config in the Vercel dashboard.

  2. Fetch flags in middleware:

import { getConfig } from '@vercel/edge-config';

export async function middleware(req) {
  const flags = await getConfig('YOUR_EDGE_CONFIG_ID');
  const showBanner = flags.get('homepageBanner');
  req.nextUrl.searchParams.set('showBanner', showBanner);
  return NextResponse.rewrite(req.nextUrl);
}

b. LaunchDarkly or Split.io
Integrate third-party flag services for robust experimentation:

npm install launchdarkly-node-server-sdk
import LDClient from 'launchdarkly-node-server-sdk';

const ldClient = LDClient.init('YOUR_SDK_KEY');
await ldClient.waitForInitialization();
const showNewFeature = await ldClient.variation('new-feature-flag', { key: 'user-id' }, false);

c. Running Experiments

3. Personalization

a. Cookies and Local Storage
Store user preferences (theme, language, A/B variant) in cookies or localStorage:

// Set cookie
import cookie from 'js-cookie';
cookie.set('variant', 'A');

b. Server-Side Personalization
Use getServerSideProps to deliver dynamic content based on cookies or headers:

export async function getServerSideProps({ req }) {
  const variant = req.cookies.variant || 'A';
  const data = await fetchDataForVariant(variant);
  return { props: { data, variant } };
}

c. Contextual Personalization
Leverage user metadata to recommend content:

import { useEffect, useState } from 'react';

function Recommendations({ user }) {
  const [recs, setRecs] = useState([]);
  useEffect(() => {
    fetch(`/api/recommendations?user=${user.id}`)
      .then(res => res.json())
      .then(setRecs);
  }, [user]);
  return <List items={recs} />;
}

4. Real-Time Dashboards

Integrate tools like Supabase or Firebase to push real-time metrics:

import { createClient } from '@supabase/supabase-js';

const supabase = createClient('SUPABASE_URL', 'SUPABASE_KEY');

supabase
  .from('metrics')
  .on('INSERT', payload => {
    console.log('New metric:', payload.new);
  })
  .subscribe();

Visualize data using chart libraries (e.g., Recharts) in a dashboard page.

5. Privacy and Compliance

With robust analytics, experimentation, and personalization, you can iterate faster, tailor experiences, and measure impact effectively. In Next Article, we’ll cover community, ecosystem, and staying up to date with Next.js.