Founding program: Growth free for 90 days for the first 50 SaaS teams Claim a seat →
Free for your first 250 users

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

Next.js
React
Vue
Svelte
Rails
Laravel
Paddle
Stripe
One script to start

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. 1

    Paste the script

    In the <head> of your site and your app. Visits, sources, pages and sign-up clicks start arriving.

  2. 2

    Say who signed in

    One identify() after login. Onboarding steps are read from your /onboarding/ pages.

  3. 3

    Connect your payments

    Paste a Stripe or Paddle key: the webhook is created for you and the key isn't kept.

app/layout.tsx
// 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
Traffic · today
SourceVisitorsSigned up
producthunt3881
google2146
direct or unknown1312
reddit965
💡 Reddit brought a quarter of Product Hunt's visitors, and five times the sign-ups.
What you see

Answers 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 →
Today · worth a look, biggest first
€284/mo at risk6 paying customers went quiet
See them
11 stuck before “install snippet”a shorter step moves more than an email
Funnel
Ana's trial ends in 2 daysa note is already written for her
Email Ana
💡 Email or Done, right from the list: whoever you reach leaves it for a week.

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 →
Paying customers by source
google11392 €
reddit8331 €
producthunt238 €
x387 €
💡 Product Hunt brings more visits; Reddit brings 4× more customers.

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 →
Funnel · signed up in the last 30 days
Signed up96
Started79
Activated44
Paying13
⚠ Biggest drop: 70% of those who activate never pay. Paying takes 9 days, typically.

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 →
Paths · after sign-up · activated
/onboarding/install59↑ 78%
/templates12↑ 75%
/settings21↓ 24%
didn't come back18↓ left
⚠ 21 people go to Settings right after signing up, and few of them activate.

Every 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 →
ana@acme.io · Paying
Mon 10:02INFO/vs/posthog → Pricingfrom reddit.com/r/SaaS
Tue 10:12WARNStopped at “install snippet”24 h without progress
Tue 10:47AUTOYou emailed hera note written for that step
Fri 09:15Subscription active · ProPaddle · 49 €/mo
💡 She came back 8 hours after your note, and paid 3 days later.

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 →
Retention · weeks after signing up
Week 173%
Week 261%
Week 452%
Week 844%
💡 27% don't come back in their second week: the first days decide it.
Bring them back

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.

Pau from Demo SaaSto emma@tallerweb.es
You're one step away

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.

app.demo-saas.com/dashboard
You're one step awayNext: install snippet. Pick up where you left off.Continue
  • Once per visit, never again once they act on it
  • Never shows their name or email
The whole journey

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

Exactly what is stored →

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
Pricing

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

0 € forever
  • 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
Start for free
Most popular

Starter

19 € / month
  • 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
Start a trial

Growth

49 € / month
  • 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
Start a trial

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.