Know where every user came from, how far they got, where they stopped and who's about to leave. One script and your Paddle or Stripe account.
Works on any website or web app, with the billing you already use
Paste it in. See who's stuck by tonight.
Visits, sources, sign-ups and onboarding steps from the first page view. Payments from Paddle or Stripe. You never write a tracking plan or build a funnel.
// in your <head>: visits, sources and // onboarding pages are tracked from here <script src="https://userjourney.dev/uj.js" data-key="pk_…" defer /> // once someone is signed in uj.identify(user.id, { email: user.email, }) // payments: connect Paddle or Stripe // in the dashboard, one click
See where everyone is
A live board with every person in their stage: signed up, onboarding, stuck, activated, trial, paying, at risk or gone.
Stages →Know which channel pays
Every sign-up is credited to the visit that brought it, and followed to the payment. Revenue per channel, not page views.
Sources →google11392 €reddit8331 €producthunt238 €x387 €Every person, one timeline
Where they came from, every step, what was sent to them and when they paid. The story behind each customer, and each one you lost.
Timelines →Bring them back on autopilot
Recovery emails that are already written, signed with your name, sent once at the right moment. On from the start.
Playbooks →signup_idle88↑ 19 backonboarding_stuck141↑ 23 backtrial_ending37↑ 9 paidwinback12↑ 2 backPayment integrations
Connect your billing provider and trials, payments, failed charges and cancellations show up on each person's journey by themselves.
Payments →An email when they're gone, a card when they're there
The same nudge, in the two places it works: their inbox, and your app while they're using it. Both written for you, both counted, both easy to turn off.
Recovery emails
Plain text, from your name, replies to your inbox. They name the exact step someone stopped at and link straight to it.
Hi Emma, you got as far as “create project” and stopped before “install snippet”. Here's where to pick it up: app.demo-saas.com/onboarding/install
- Sign-up reminder, stuck onboarding, trial ending, payment failed, win-back
- See who came back after each one
In-app cards
While they're in your app, a small card shows the next step. Or draw it with your own components: the snippet hands it to you.
- Once per visit, never again once they act on it
- Never shows their name or email
From a first visit to a customer who stays
The funnel product analytics tools make you build by hand: where people come from, how far they get, and which of them end up paying.
Your whole funnel, without building it
Visits come from the snippet. Sign-ups from identify(). Onboarding from your URLs. Payments from Paddle or Stripe. Nothing to configure.
- Sources, campaigns and landing pages, without cookies
- Onboarding steps read from /onboarding/<step> URLs
- Stuck, at risk and churned worked out for you
snippet4,120
identify()312
your onboarding171
Paddle / Stripe29
Private by design
Your visitors aren't followed around the web. Your customers are yours: you choose what you send about them.
- No cookies, no local storage, no consent banner
- Visitor hashes change daily and are deleted after two days
- One-click unsubscribe on every email
Safe to ship
One small script with no dependencies, loaded deferred. It never blocks your page and never throws.
- Single-page apps: route changes are page views
- Works with Next.js, React, Vue, Svelte, Rails, Laravel…
- Server-side API for steps that happen in your backend
Pay for people, not events.
Billed by the signed-up users we follow. Anonymous visitors are free and unlimited, so a post going viral doesn't move your bill.
Free
- 1 project
- Up to 250 people
- 90 days of history
- Live journey board and timelines
- Sources and funnel, to the payment
- Recovery emails, with our wording
- Payment integrations
Starter
- 3 projects
- Up to 2,500 people
- 1 year of history
- Up to 3 people per project
- Everything in Free, plus:
- Every playbook, with your own wording
- In-app cards, or your own components
- Send from your own domain
- At-risk alerts by email
- A weekly summary of your journey
Growth
- Unlimited projects (fair use)
- Up to 10,000 people
- 2 years of history
- Unlimited people per project
- Everything in Starter, plus:
- At-risk alerts in Slack and Discord
- Your own stages and activation rules
- Server-side API with higher limits
- Data export (CSV and API)
- Priority support from the founders
People are the signed-up users we follow; anonymous visitors are free and unlimited. Over 10,000? Scale is 99 €/month for 50,000. Over the limit nothing breaks.
Frequently asked questions
Something else? Read the docs.
Is it free?
Yes, up to 250 signed-up people on one project, with the journey board, timelines, the funnel by source, recovery emails and payment integrations. Starter (19 €/month) adds every playbook with your own wording, in-app cards and your own sending domain. Growth (49 €/month) adds alerts in Slack and Discord, your own stages and data export. Anonymous visitors are free and unlimited on every plan.
Do I need a cookie banner for it?
Not for userjourney. Anonymous visitors are counted with a hash that changes every day and is deleted after two days; nothing is stored in the browser. Signed-in users are your customers, and you choose what you send about them.
What do I have to set up?
A script tag, one identify() after login, and a click to connect Paddle or Stripe. Onboarding steps are read from /onboarding/<step> URLs; if yours look different, one uj.step() per step. That's it.
Who do the emails come from?
From your name, with replies to your inbox. They're plain text, read like a note from a founder, and each goes out once per person. You can change every word, or turn any of them off.
Isn't this what PostHog or Mixpanel do?
They answer the questions you set them up to ask. userjourney starts with the answers (who's stuck, where, from which channel) and acts on them with emails and in-app cards. Many teams use both.
Does it work with Paddle as well as Stripe?
Yes, both from day one. Paste an API key and the webhook is created for you; the key is used once and never stored.
Will it slow my site down?
No. The snippet has no dependencies, loads deferred and sends one small request per page. It never blocks rendering, and if anything fails it stays quiet.
Stop guessing where your users drop
Add one script, sign in once, and watch your journey board fill up.