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.
SUPPORTED PLATFORMS
How it works
- Install a Rejourney SDK in your web, Swift, React Native, or Flutter app.
- 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.
- Rejourney records the surrounding user journey and interaction data, then connects it with the events and technical signals from that session.
- 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.
- 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.
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.
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.
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.
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.







