Skip to main content
This guide covers how to install Userplane in a Next.js (App Router) application.

Adding the script

The fastest way to add Userplane is the CDN embed. Add these two tags to the <head> of your root layout:
You can copy the snippet with your workspace ID pre-filled from Workspace Settings > Domains in the Userplane dashboard.

npm SDK

Use the npm SDK when you need programmatic control — triggering recordings from a button, attaching user metadata, or reading recording state.

Installation

Initialization

Create a client component that initializes the SDK and mount it in your root layout.
The 'use client' boundary is required because useEffect only runs in the browser. The dynamic import() is a bundle-size optimization — a static import {initialize} from '@userplane/sdk' at the top of the file also works since the SDK is SSR-safe.

URL parameters

Next.js middleware and route guards may redirect users before the SDK reads the userplane-token and userplane-action query parameters. If your app redirects unauthenticated users to a login page, preserve userplane- prefixed parameters through the redirect. Add USERPLANE_URL_PARAMS to your middleware allowlist so those params survive the redirect:
See Installation for the full list of parameters to preserve.

Sensitive data

Add data-userplane-blur to any element you want blurred in recordings. See Sensitive Data Redaction for the full reference.

Metadata

Call set() after initialize() to attach user context to recordings:
See Metadata SDK for the full API.

SSR

@userplane/sdk is SSR-safe to import — it does not reference window or document at module evaluation time. A static import at the top of a 'use client' file will not cause a server-side error. The initialize() call must run client-side. Calling it inside useEffect (or a dynamic import()) guarantees it runs only in the browser.

Example app

A complete Next.js example is available at github.com/userplanehq/userplane-sdk-examples/tree/main/examples/nextjs.

Example app