Skip to content

Session Replay Coming Soon

Coming Soon

Session Replay is currently under development. The documentation below describes the planned features and API.

Replay user sessions to understand how errors occurred and improve user experience.

Overview

Session Replay records user interactions and allows you to replay them in the Nadi dashboard. This helps you:

  • Understand exactly what users did before an error
  • Reproduce bugs without asking for reproduction steps
  • Identify UX issues and friction points
  • Debug complex user flows

Configuration

Enable Session Replay

javascript
import { init } from '@nadi-pro/browser'

init({
  appKey: 'your-app-key',
  enableSessionReplay: true,
})

Full Configuration

javascript
init({
  appKey: 'your-app-key',
  enableSessionReplay: true,
  sessionReplayOptions: {
    // Privacy - mask all input values
    maskAllInputs: true,

    // Privacy - mask all text content
    maskAllText: false,

    // CSS class to block recording
    blockClass: 'nadi-block',

    // CSS class to ignore in recording
    ignoreClass: 'nadi-ignore',

    // Input types to always mask
    maskInputTypes: ['password', 'email', 'tel', 'ssn'],

    // Sampling rate (0-1)
    sampleRate: 0.1,

    // Only record sessions with errors
    recordOnErrorOnly: false,

    // Maximum session duration (ms)
    maxSessionDuration: 3600000, // 1 hour
  },
})

Privacy Controls

Masking Inputs

javascript
{
  sessionReplayOptions: {
    // Mask all input values (shows ****)
    maskAllInputs: true,

    // Or mask specific input types
    maskAllInputs: false,
    maskInputTypes: ['password', 'email', 'tel', 'credit-card'],
  }
}

Masking Text

javascript
{
  sessionReplayOptions: {
    // Mask all text (shows placeholder text)
    maskAllText: true,
  }
}

Blocking Elements

Block specific elements from being recorded:

html
<!-- This element won't appear in replay -->
<div class="nadi-block">
  Sensitive content here
</div>
javascript
{
  sessionReplayOptions: {
    blockClass: 'nadi-block',
    // Or use multiple classes
    blockClass: ['nadi-block', 'private'],
  }
}

Ignoring Elements

Ignore interactions with specific elements:

html
<!-- Clicks on this won't be recorded -->
<button class="nadi-ignore">Secret Action</button>

Blocking Selectors

Block by CSS selector:

javascript
{
  sessionReplayOptions: {
    blockSelector: '[data-private], .credit-card-form',
  }
}

Sampling

Sample Rate

Control what percentage of sessions are recorded:

javascript
{
  sessionReplayOptions: {
    sampleRate: 0.1, // 10% of sessions
  }
}

Error-Only Recording

Only record sessions where an error occurs:

javascript
{
  sessionReplayOptions: {
    recordOnErrorOnly: true,
  }
}

This starts buffering immediately but only saves if an error occurs.

Conditional Recording

Start/stop recording programmatically:

javascript
import { startSessionReplay, stopSessionReplay } from '@nadi-pro/browser'

// Start recording for specific user flow
function startCheckout() {
  startSessionReplay()
  // ... checkout logic
}

// Stop recording
function exitCheckout() {
  stopSessionReplay()
}

What's Recorded

Captured

  • Mouse movements and clicks
  • Keyboard input (masked by default)
  • Scroll events
  • Page navigation
  • DOM changes
  • Network requests (metadata only)
  • Console output

Not Captured

  • Input values (when masked)
  • Blocked elements
  • Network request/response bodies
  • Local storage/cookies
  • WebSocket data

Viewing Replays

In the Dashboard

  1. Navigate to an error in Nadi
  2. Click "View Session Replay"
  3. Use playback controls:
    • Play/Pause
    • Speed control (1x, 2x, 4x)
    • Skip to error
    • Timeline scrubbing

Features

  • Timeline - See events over time
  • Skip inactivity - Jump over idle periods
  • DOM inspector - Inspect elements at any point
  • Console tab - See console output
  • Network tab - See API calls

Session Metadata

Add context to sessions:

javascript
import { setSessionData } from '@nadi-pro/browser'

setSessionData({
  user_flow: 'checkout',
  cart_value: 99.99,
  experiment: 'new-checkout-v2',
})

Link to specific sessions:

javascript
import { getSessionUrl } from '@nadi-pro/browser'

// Get URL to current session
const replayUrl = getSessionUrl()
console.log('Replay URL:', replayUrl)

// Include in support tickets
supportTicket.replayUrl = getSessionUrl()

Performance Impact

Session Replay is designed for minimal impact:

  • ~50KB additional JavaScript
  • ~1-2% CPU overhead during recording
  • Events are batched and compressed
  • Minimal network usage

Optimizing Performance

javascript
{
  sessionReplayOptions: {
    // Reduce mutation observer overhead
    slimDOMOptions: {
      script: true,
      comment: true,
      headFavicon: true,
      headWhitespace: true,
    },

    // Reduce sampling for mouse moves
    mousemoveWait: 100, // ms

    // Compress payloads
    compress: true,
  }
}

Debugging

Check Recording Status

javascript
import { isRecording, getSessionId } from '@nadi-pro/browser'

console.log('Recording:', isRecording())
console.log('Session ID:', getSessionId())

Debug Mode

javascript
init({
  appKey: 'your-app-key',
  enableSessionReplay: true,
  debug: true, // Logs replay events
})

Best Practices

Do

  • Always mask sensitive inputs
  • Block elements with PII
  • Use sampling in production
  • Test replay quality in staging

Don't

  • Record without user consent (where required)
  • Include full network bodies
  • Set sample rate too high (costs + performance)
  • Forget about GDPR/privacy compliance

Privacy Compliance

GDPR Considerations

  • Inform users about recording in your privacy policy
  • Consider requiring consent before recording
  • Ensure PII is properly masked
  • Allow users to opt out
javascript
// Only start recording after consent
if (userHasConsented()) {
  init({
    appKey: 'your-app-key',
    enableSessionReplay: true,
  })
}

Troubleshooting

Replay Not Playing

  1. Check session was recorded (sampling)
  2. Verify no blockers on the page
  3. Check for JavaScript errors in replay

Missing Content

  1. Add fonts and images to CDN
  2. Check blocked elements
  3. Verify CSS is accessible

Performance Issues

  1. Reduce sample rate
  2. Use error-only recording
  3. Block heavy animations

Next Steps

Released under the MIT License.