GitHub - rejourneyco/rejourney: Lightweight Product Analytics, Session Replay, Crash/ANR/Error reporting, and Reveune Leak Prediction for web and mobile apps!

GitHub

6 min read Original article ↗

Rejourney

Find and fix conversion issues before they cost you users.

Website · Silly Demo (With Cats)

Rejourney is an open-source platform for finding problems in web and mobile user journeys before they become larger conversion, retention, or revenue problems. It combines session replay, the business events you define, and technical context such as request failures, crashes, and ANRs to surface patterns worth investigating.

Replay Workbench showing a mobile recording, synchronized console, DOM, metadata, and event timeline

SUPPORTED PLATFORMS

Next.js and React Redux Toolkit replay React Native and Expo Flutter SDK documentation Swift Vue and Nuxt Angular SvelteKit

Remix Gatsby Shopify Hydrogen

How it works

  1. Install a Rejourney SDK in your web, Swift, React Native, or Flutter app.
  2. Track the few product events that matter most to your business, such as a completed signup, subscription purchase, or successful checkout. These are your critical conversion events.
  3. Rejourney records the surrounding user journey and interaction data, then connects it with the events and technical signals from that session.
  4. Similar sessions are grouped into cohorts. When a cohort shows a worrying trend around a critical conversion event, Rejourney brings the replays and evidence forward for analysis.
  5. The result is an issue report with the relevant context and a suggested fix that your team can review and use in its development workflow. Connecting a GitHub repository can add code context and a proposed code change.

Ranked issue feed with affected sessions, error evidence, and issue context

What Rejourney captures

Rejourney relates the outcome you care about to what happened before it. The SDKs collect session, route or screen, interaction, and event context. That includes touches, scrolls, pans, repeated or rage taps, and the sequence of the user journey. When available, it also adds the technical evidence that makes an issue easier to diagnose: API response times and status codes, errors, crash traces, and ANRs.

Replays, journeys, and interaction patterns

Session replay shows the actual path a person took through a flow. Journey maps and heatmaps make it easier to compare paths, spot loops, and see where people try to interact with an unresponsive or confusing part of the interface.

Journey map used to compare user paths through a product flow

Mobile interaction heatmap showing touch density on a product screen

API, crashes, and stability context

Replay alone does not explain every problem. Endpoint views show latency, errors, and status-code breakdowns. Crash and ANR detail adds the app version, device, and runtime context around a failure, helping connect a broken flow to the technical condition behind it.

API endpoint view showing request errors, latency, and status-code breakdown

Crash and ANR issue detail tied to application and device context

Device and geographic cohorts

Filter a cohort by app version, operating system, device, geography, and other context to distinguish a broad regression from a problem limited to a release, device family, region, or network path.

Device cohort view showing engagement and issue pressure by device

Geographic view showing regional session quality and performance context

Analytics and revenue context

The replay and issue views sit alongside project-level analytics: version adoption, engagement, stability, retention, cohorts, custom events, and—when a revenue source is connected—transactions, refunds, subscribers, and trends. Open an image for the full-resolution capture.

Track critical conversion events

Track stable, domain-level events for the actions that establish intent and a successful outcome. For example, a checkout flow might use checkout_started and purchase_completed:

Rejourney.logEvent('checkout_started', {
  orderId: 'order_123',
  amount: 49,
  currency: 'USD',
});

Rejourney.logEvent('purchase_completed', {
  orderId: 'order_123',
  transactionId: 'txn_456',
  amount: 49,
  currency: 'USD',
});

Rejourney uses these events to compare journeys and outcomes across similar sessions. A reported pattern is a starting point for investigation, not proof of causality: review the representative replays and your authoritative product or payment state before shipping a fix.

Quick integration

Web

npm install @rejourneyco/browser
import { Rejourney } from '@rejourneyco/browser';

await Rejourney.init('rj_your_public_key');
await Rejourney.start();

Call start() after consent when your site requires it. Add the application domain to Allowed Domains in Project Settings; web recording does not start until it is allowed. See web getting started for framework-specific entry points, route naming, identity, and privacy settings.

React Native

npm install @rejourneyco/react-native
import { Rejourney } from '@rejourneyco/react-native';

Rejourney.init('rj_your_public_key');
Rejourney.start();

React Native requires native code and does not run in Expo Go. See React Native getting started for navigation tracking, session controls, event naming, and privacy settings.

Flutter

flutter pub add rejourney
import 'package:rejourney/rejourney.dart';

await Rejourney.init('rj_your_public_key');
await Rejourney.start();

The Flutter plugin supports iOS 15.1+ and Android API 24+. It includes native capture, navigator observation, region masking, error hooks, and HTTP timing. See Flutter getting started and the runnable Flutter example.

Swift

In Xcode, choose File → Add Package Dependencies and add:

https://github.com/rejourneyco/rejourney

Rejourney requires iOS 15.1 or later.

import SwiftUI
import Rejourney

@main
struct MyApp: App {
    @MainActor
    init() {
        Rejourney.configure(publicKey: "rj_your_public_key")
        Task { await Rejourney.start() }
    }

    var body: some Scene {
        WindowGroup { ContentView() }
    }
}

See iOS getting started for screen tracking, identity, event capture, and recording controls.

Privacy and data handling

Privacy is a core consideration when recording user sessions. Configure consent, capture controls, sampling, allowed domains, and masking for your product. Do not send PII, credentials, payment data, secrets, or sensitive application payloads in events or logs.

Rejourney supports short recording-retention periods, commonly seven days. When a recording expires, the retention worker removes its replay artifacts and marks the session as no longer replayable. Aggregated analytics and separately configured research-lake exports have their own lifecycle and privacy controls; they are not a copy of the expired recording. Make sure your configuration and policies meet the privacy and GDPR requirements that apply to your users.

Performance measurements

The checked-in web benchmark compares the Rejourney browser SDK with PostHog on the same scripted flow in local Next.js, SvelteKit, and Nuxt fixtures. It measures SDK capture overhead, not issue-detection accuracy or a latency SLA.

Fixture Rejourney upload PostHog upload Rejourney task time PostHog task time Rejourney script time PostHog script time Rejourney final heap PostHog final heap
Next.js 21.29 KiB 45.35 KiB 417.96 ms 449.91 ms 160.46 ms 185.06 ms 15.81 MiB 16.19 MiB
SvelteKit 8.38 KiB 24.99 KiB 268.72 ms 304.03 ms 19.35 ms 42.02 ms 6.63 MiB 9.17 MiB
Nuxt 8.40 KiB 26.57 KiB 305.51 ms 322.24 ms 21.12 ms 41.17 ms 11.33 MiB 15.44 MiB

The published run used Chromium at 1365×768, three iterations per framework/mode, and a shared flow that included navigation, form edits, events, requests, errors, scrolling, and a controlled long task. Rerun it before applying these results to a different application.

Mobile package sizes and device capture timings change with SDK releases, framework versions, build settings, and hardware, so this README does not keep static comparison tables. The Flutter package has a reproducible Dart-layer regression benchmark; use the Flutter benchmark method and limitations and its latest checked-in result. Benchmark claims should always be reported with the checked-in method, environment, and result date.

Development and deployment

For a local development environment, start with local Kubernetes development. For single-node self-hosting, use the self-hosted guide. Architecture and deployment references are in the architecture documentation. Contributors should read CONTRIBUTING.md for repository layout, package-specific checks, and local development commands.

License

Client-side components, including the Flutter package's Dart API, bridges, native core, examples, and documentation, are licensed under Apache 2.0. Server-side components (backend and dashboard) are licensed under SSPL 1.0. See LICENSE-APACHE, LICENSE-SSPL, and the Flutter package license.