This package provides a simple way to add privacy-friendly pageview and event tracking using Simple Analytics to your Next.js application.
You can find the full documentation for this package at simpleanalytics-next-docs.vercel.app.
To install the package, run:
npm i @simpleanalytics/next
You need to pass the website domain you have added to the Simple Analytics dashboard as an environment variable:
NEXT_PUBLIC_SIMPLE_ANALYTICS_HOSTNAME=example.com
SIMPLE_ANALYTICS_HOSTNAME=example.com
To enable client-side tracking and to ensure the Simple Analytics script you must add the Next.js plugin withSimpleAnalytics
from @simpleanalytics/next
in your Next.js config (next.config.ts
):
import { NextConfig } from "next";
import withSimpleAnalytics from "@simpleanalytics/next/plugin";
const nextConfig: NextConfig = {
/* the rest of your Next.js config */
};
export default withSimpleAnalytics(nextConfig);
The client-side analytics component, SimpleAnalytics
, imports the Simple Analytics tracking script:
import { SimpleAnalytics } from "@simpleanalytics/next";
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body>
{children}
<SimpleAnalytics />
</body>
</html>
);
}
To start tracking programmatically tracking events in client components use the trackEvent
function.
This requires the <SimpleAnalytics />
component to be present on the page or layout.
"use client";
import { trackEvent } from "@simpleanalytics/next";
import { useState } from "react";
export default function Page() {
return (
<div>
<button
onClick={() => {
trackEvent("clicked");
}}
>
increment
</button>
</div>
);
}
To track events in server actions, use the trackEvent
function from @simpleanalytics/next/server
.
This function requires you to pass the request headers that can be obtained using headers
.
"use server";
import { after } from "next/server";
import { headers } from "next/headers";
import { trackEvent } from "@simpleanalytics/next/server";
export async function exampleAction() {
// Add your logic here...
after(async () => {
await trackEvent("event_in_example_action", {
headers: await headers(),
});
});
return { success: true };
}