Funnel Setups

SaaS Trial Funnel

Track a SaaS registration funnel end to end – from the ad or organic click to the free sign-up, the started trial and the paid purchase. Connect your ad channels, tag your organic and email links, send sign-up and trial events from your app, and capture recurring revenue with Stripe.

A SaaS trial funnel turns a click into a free sign-up, a sign-up into an active trial, and a trial into a paying subscriber. This guide wires up tracking for every stage of that journey, so you can see which ad, post or email actually produced a sign-up, a trial and a purchase – not just a click. Complete the steps in the order they're given.

What you'll be able to see

For every channel → campaign → ad set → ad: sign-ups, trials started, paying customers and revenue / MRR – with cost per sign-up, CAC and ROAS – for your paid, organic and email traffic side by side. In short: which source brings trials that convert and stay, and which one quietly fills your funnel with churn.

This builds on the tracking foundation

A funnel guide assumes the basics are already live: a tracking domain and the tracking script installed on your marketing site and app. If you haven't done that yet, run the Advertiser playbook first – it covers workspace basics, the tracking domain and the script – then come back here for the SaaS-specific stages.

The chain you're building

A SaaS funnel is different from a webinar or sales-call funnel in one important way: the interesting moments are spread over days or weeks, and almost all of them happen inside your app, not on a marketing page. LeadJourney stitches them back into one journey, matched on a click ID (or the user's email):

Ad / organic click → free sign-up → trial started → trial converts → paying customer & revenue.

If you want the concept behind that chain first, read How attribution works. Otherwise, follow the steps below.

What you'll set up

StepCoversWhy it matters
1. Ad channelsConnect Meta, Google, LinkedIn, Bing + tracking parametersPulls spend automatically and tags every paid click down to the ad.
2. Organic & emailGoogle Organic, email, social, custom linksTags the non-paid traffic that also brings sign-ups.
3. Free sign-upCapture the click ID at sign-up and send a FreeSignup eventRecords the sign-up and ties the whole later journey to the click.
4. In-product lifecycleTrialStarted, TrialEnded sent from your appTurns sign-ups into a real trial funnel per campaign.
5. Purchase & revenueStripe (subscriptions) or a WonClient eventUnlocks ROAS, CAC payback and LTV per channel and ad.

Before you start sending data, decide which milestones you'll track. These are the stages most SaaS trial funnels measure – create the ones that exist in your product under Settings → Events. Each name is just the type you'll send, so rename them to whatever your team already says.

EventWhen it firesSent from
FreeSignupSomeone creates a free account.Your app (step 3)
TrialStarted (optional)The trial actually begins (may equal sign-up).Your app (step 4)
TrialEnded (optional)The trial expires without converting.Your app / billing logic (step 4)
WonClientThe trial converts to a paid plan – send a revenue value.Stripe or your app (step 5)

You don't need every stage on day one

Two well-chosen stages already give a usable funnel. Start with FreeSignup and WonClient, then add TrialStarted and TrialEnded once those are flowing.

Set up your ad channels

Connect the platforms you spend on so cost data syncs automatically – that's the "spend" half of every cost-per-sign-up and CAC number. LeadJourney also tags each ad click down to the campaign, ad set and ad, so a sign-up can be traced back to the exact creative that drove it.

Connect your ad platforms

OAuth into Meta, Google, LinkedIn and Bing, then add the LeadJourney tracking parameters.

After connecting, each platform adds the lj_ tracking parameters to your ad URLs automatically, so every paid click that lands on your site already carries its campaign, ad set and ad. See How attribution works for what those parameters carry.

B2B SaaS leans on LinkedIn

If LinkedIn is a core channel for you, connect it so its cost syncs and clicks are tagged the same way Meta and Google are. You connect each platform once and then turn on every ad account it can reach – see Connect multiple ad accounts.

Configure tracking for organic & email sources

Trials rarely come from paid ads alone – a lot of sign-ups start with Google organic, your email list, a LinkedIn post, a docs page or a partner. Paid platforms auto-tag their clicks, but these non-paid links have to be tagged by hand, or LeadJourney can only file the visit under Direct / Unknown.

Build a tracked link for each non-paid source with the UTM Builder and use it everywhere you share your site – your newsletter button, your bio link, the organic post.

UTM parameters & the UTM Builder

Tag organic, email and social links so they show up in your reports like paid ads.

One link per source

Use a consistent lj_channel per source – email, linkedin_organic, google_organic, a custom key for partners – so every sign-up is grouped under the right channel. Building a separate link per placement (newsletter vs. bio vs. post) lets you compare which one actually produces trials.

Track the free sign-up

This is the heart of a SaaS funnel – and the one stage with a twist. The sign-up happens in the browser, where the click ID is still available. But the later stages – trial started, trial ended, purchase – fire server-side, days later, long after the browser is gone. So you capture the click ID once and reuse it forever:

Capture the click ID once, store it on the user, replay it forever

At sign-up, read localStorage.getItem('clickId') and save it on the user record in your own database (a column like lj_click_id). Every later lifecycle event – trial started, trial ended, even the purchase – reads that stored value back and sends it along. One capture, reused for the whole customer journey.

Then send a FreeSignup event from your app the moment the account is created. Because these are in-product state changes only your app knows about, you send them yourself through LeadJourney's Conversion API (a tiny server route that keeps your Postback Secret safe).

Track your full SaaS funnel (with code)

The capture-and-replay pattern, the server route, and each lifecycle event with copy-paste code.

Email is your safety net

Always send the user's email with every event. LeadJourney also matches on email, so even if a click ID was never captured (an organic or direct sign-up) the stages still stitch onto the same person – and can be attributed later if they clicked a tracked link before. The deep dive on the sign-up event, including Google / Microsoft SSO, is in Track sign-ups in your app.

Track the in-product lifecycle

After sign-up, the journey continues inside your product: the trial starts, runs, and either converts or expires. These milestones don't happen on a marketing page, so your app sends each one to LeadJourney as an event – the same Conversion API route as the sign-up, just a different type and the stored click_id.

Mirror the stages that matter for your funnel – fire TrialStarted when the trial actually begins (which may be at sign-up, or later when the user adds a card or picks a plan) and TrialEnded from your billing logic or a nightly cron when a trial expires without converting.

Send your lifecycle events

Create TrialStarted and TrialEnded and grab the Conversion API credentials.

De-duplicate in-product events

Lifecycle events are often sent from retried webhooks or a cron that re-scans users, so the same event can fire twice for one person. Set FreeSignup, TrialStarted and TrialEnded to Ignore duplicate postbacks in the Events Manager to keep your funnel counts honest. See the mode table in Events & the Events Manager.

Keep TrialEnded out of ad optimisation

TrialEnded is a drop-off signal, not a conversion – it's useful for spotting which campaigns bring trials that never convert. Turn Send back to Ads off for it so your ad platforms don't optimise toward people whose trial expired.

Track the purchase & revenue

The last link is the paid conversion – the trial turns into a subscription. You have two ways to capture it; pick whichever matches how you bill:

  • From Stripe (native integration). If you bill through Stripe, connect it once and map payment succeeded (or subscription created) → WonClient. Payments, subscriptions and refunds then flow in automatically, attributed to the campaign and ad that earned them – no code. The tracking script even decorates your Stripe Payment Links with the click ID, so payments tie back on their own.
  • From your app (Conversion API). If you bill outside Stripe, fire a WonClient event from the same server route when the trial converts, and include a revenue value.

Connect Stripe

Auto-capture purchases, subscriptions and refunds as revenue, attributed to the right campaign.

Decide how recurring revenue shows up

A subscription pays every month. Set WonClient to Edit conversion with new data for current MRR / plan value, or Keep original data, increment payout for total collected. Net out cancellations with a negative revenue on a Stripe refund, or a Churned event. Full detail in Events & the Events Manager and the SaaS funnel guide.

Always send a revenue value

ROAS, CAC payback and LTV only appear when your conversions carry a revenue value. Whether the sale comes from Stripe or your own billing, make sure the amount travels with it – otherwise LeadJourney can show paying customers, but not the money.

See your results

Once data is flowing through all five stages, your SaaS funnel lives in the reports:

  • Traffic Channel Report – every source side by side: clicks, cost, sign-ups, trials, paying customers, revenue and ROAS. Your "where should the budget go?" view.
  • Campaign Report – drill campaign → ad set → ad and sort by trials or paying customers to find which creative brings buyers that stay.
  • Lead Overview – the real accounts behind the numbers, each with their full journey from click to sign-up to paying customer.
  • Report Builder & Dashboards – build CAC, payback and LTV views and pin them where the team will see them.

Just ask

Don't want to build a report? Ask in plain English with Ask Atlas"Which campaign had the lowest cost per paying customer last quarter?"

Tips for clean SaaS trial data

  • Store the click ID at sign-up – this is the whole game. Without it, trials and purchases that fire days later, server-side, can't attribute to the ad that earned them. Email is your backup, not your primary key.
  • Send a test first. Open your app from a tracked link, walk a test account through sign-up → trial → purchase, and watch each event turn Active in the Events Manager before you trust the numbers. Inspect a single call in the API Postbacks log.
  • Pick an attribution model that fits the cycle. SaaS journeys often span weeks – set your attribution window to cover the gap between sign-up and purchase (B2B SaaS often needs 60–90 days), and consider first click so the source that started the journey gets credit.
  • Don't forget non-API spend. Add SEO, content and tooling costs under Channel Costs so blended CAC is honest.

On this page