Every user's journey, from first visit to paying
User journey analytics for SaaS. See where your users come from, how far they get and who's stuck, then write to the ones who need a nudge.
- One script, set up in five minutes
- No card needed
- No cookies for visitors
Works on any website or web app, with the billing you already use
Paste it in. See where they go by tonight.
Visits, sources, pages, sign-ups and onboarding steps from the first page view. Payments from your payment provider. You never write a tracking plan or build a funnel.
- 1
Paste the script
In the <head> of your site and your app. Visits, sources, pages and sign-up clicks start arriving.
- 2
Say who signed in
One identify() after login. Onboarding steps are read from your /onboarding/ pages.
- 3
Connect your payments
Paste a Stripe or Paddle key: the webhook is created for you and the key isn't kept.
// 1. in your <head> <script src="https://userjourney.dev/uj.js" data-key="pk_…" defer /> // 2. once someone is signed in uj.identify(user.id, { email: user.email, }) // 3. payments: one click in the // dashboard, Stripe or Paddle
producthunt3881google2146direct or unknown1312reddit965Answers first, then the people behind them
Every page starts with a sentence that says what matters, and every number opens to the people behind it.
Know what to do this week
Today puts the few things worth your time first, biggest first, with the people behind each one, and the three people who need a word from you now. Every Monday, the same in your inbox.
Set it up in five minutes →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.
Which channel pays →google11392 €reddit8331 €producthunt238 €x387 €See how far they get
Every step from the first visit to paying, for the people who signed up, with the biggest drop in one sentence and how long each step takes.
Where users drop off →See which way they go
Where people go after signing up or after any page, and how they reached it, coloured by who goes on to activate. Returning users too.
User paths →/onboarding/install59↑ 78%/templates12↑ 75%/settings21↓ 24%didn't come back18↓ leftEvery person's path
Where they came from, each visit page by page and how long they stayed, what you sent them and when they paid. The story behind each customer, and each one you lost.
Identify →Know who stays
People by the week they signed up, and how many still use your product each week after, next to how many activated and pay.
Who's about to cancel →A note from you, or a playbook that sends it
Write to anyone from Today or their profile: the note is already written for where they are, and opens in your own mail app. Or turn on the playbooks: the same nudge by email when they're gone, and as a card in your app while they're there.
Recovery emails
Plain text, from your name, replies to your inbox. You read them first, then turn them on. 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
- Your own playbooks, each in the person's language
- 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 your payment provider. 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
Private by design
Your visitors aren't followed around the web. Your customers are yours: you choose what you send about them.
- No cookies, and nothing stored for visitors
- 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 users
- 90 days of reports
- Today: what to look at each week
- The Monday email: your week, and who needs you
- Every person's story and path, list or live board
- Traffic, funnel and sources, to the payment
- Paths from each visit and the sign-up
- Recovery emails, with our wording
- Payments from your provider
Starter
- 3 projects
- Up to 2,500 users
- 1 year of reports
- Up to 3 teammates per project
- Everything in Free, plus:
- Paths from any page, both ways
- Every playbook, in your own words
- Your own playbooks, up to 10
- Branded emails, with your logo and color
- In-app cards, or your own components
- Alerts as things happen, by email, Slack, Discord or webhook
- At-risk alerts by email
Growth
- Unlimited projects (fair use)
- Up to 10,000 users
- 1 year of reports
- Unlimited teammates per project
- Everything in Starter, plus:
- Export users to CSV
- Priority support from the founders
Users are the people who signed up in your product; anonymous visitors are free and unlimited. Over the limit nothing breaks: playbooks pause until you upgrade. Over 10,000 people? Write to us at hello@userjourney.dev.
Frequently asked questions
Something else? Read the docs.
Is it free?
Yes, up to 250 signed-up users on one project: Today, traffic, the funnel and the paths people take, retention, every person's story, recovery emails and your payments. Starter (19 €/month) adds paths from any page, your own wording on every playbook, your own playbooks, branded emails, in-app cards and alerts as things happen, for up to 2,500 users. Growth (49 €/month) adds CSV export and up to 10,000 users. Anonymous visitors are free and unlimited on every plan.
Do I need a cookie banner for it?
Not for your visitors: they're counted with a hash that changes every day and is deleted after two days, and nothing is stored in their browser. Once someone signs in to your app, the snippet keeps their id in that tab (sessionStorage) until it's closed, so their pages count as theirs. They're 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 your payment provider. 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.
How is it different from Google Analytics?
Google Analytics counts traffic: sessions, events and pages, with cookies. UserJourney follows people: each visitor and each signed-up user, from the first visit to paying, inside your app too, with their payments, and tells you who needs a word today. Many teams keep Google Analytics for ads and use UserJourney for the product.
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, which way they went, from which channel) and acts on them with notes and playbooks. Many teams use both.
Which payment providers does it work with?
Stripe and Paddle today, with more on the way. 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.
See every user's journey by tonight
One script and one line of code. Free for your first 250 users.