★ Founding program: Growth free for 90 days for the first 50 SaaS teams →
Free for your first 250 users ›

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

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

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.

app/layout.tsx
// 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
Stuck right now · onboarding
emma@tallerweb.es 2 daysstopped before “install snippet” · came from reddit
1/3
max@shipfast.dev nudgedstopped before “first event” · came from google
2/3
noah@buildkit.ionever started · came from producthunt
0/3
⚠ 17 of 27 stuck people stopped at “install snippet”. That's the step to fix first.

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 →
Journey · signed up in the last 30 days
Signed up312
Onboarding268
Activated171
Trial64
Paying29
⚠ 26 people are stuck mid-onboarding right now, most before “install snippet”.

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

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 →
ana@acme.io · Paying
Mon 10:02INFOVisited /vs/posthogfrom reddit.com/r/SaaS
Tue 10:12WARNStuck before “install snippet”24 h without progress
Tue 10:47AUTOSent “You're one step away”playbook · email
Fri 09:15Subscription active · ProPaddle · 49 €/mo
💡 She came back 8 hours after the nudge, and paid 3 days later.

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 →
Playbooks · last 90 days
signup_idle88↑ 19 back
onboarding_stuck141↑ 23 back
trial_ending37↑ 9 paid
winback12↑ 2 back
💡 The stuck-onboarding email brought back 23 people this quarter.

Payment integrations

Connect your billing provider and trials, payments, failed charges and cancellations show up on each person's journey by themselves.

Payments →
Billing events · today
09:15ana@acme.io · Prosubscription active · 49 €/mo
08:40WARNwei@acme.copayment failed · being retried
07:02INFOlena@hey.comtrial started · Starter
06:51ERRORomar@buildkit.iosubscription cancelled
⚠ 2 paying customers haven't been back in 7 days: they're at risk.
Bring them back

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.

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
  • 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 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

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

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 people
  • 90 days of history
  • Live journey board and timelines
  • Sources and funnel, to the payment
  • Recovery emails, with our wording
  • Payment integrations
Start for free
Most popular

Starter

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

Growth

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

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.