
If you run a SaaS with free trials, not every signup deserves the same attention. Some trial users are showing signs that they may convert. Others look like valuable accounts but are getting stuck before they reach the point where they can see the product’s value.
Here’s a workflow that checks trial users at key points during the trial, scores their behavior, and helps you decide who may need sales attention, onboarding help, or no action yet.
The workflow assumes your product already sends basic usage data to Supabase. If your data is stored somewhere else, use that system instead of Supabase in these steps.
First, decide which actions show that a user is getting value from your product. For a reporting tool, you could track:
Next, choose actions that can show buying interest:
Don't rely on weak signals such as logins. Someone who logs in five times may be very engaged. It might also mean the user cannot work out what to do. Focus on actions that give you useful info.
In Supabase:
Add these columns (or customize them based on the signals you want to track):
Use Boolean for true/false fields, integers for numbers, timestamps for dates and times, and text for labels. activation_events_completed can be a text array.
Make sure your product sends the events you want to track to Supabase. The workflow cannot know about an event that your product doesn't record.
The sessions_7d and core_actions_7d fields should cover the last seven days only. For account_fit, use high, medium, or low based on info collected at signup. Don't use AI to guess this from an email address.
Now, all the trial data the workflow needs is in one place.
Create a workflow in n8n.
Add: Schedule Trigger
Set:
Make sure the workflow timezone is correct, since n8n uses the workflow timezone — or the instance timezone if one is not set — to determine when the trigger runs.
The Schedule Trigger runs workflows at fixed times. Scheduled workflows must be saved and published to run automatically.
Next:
Now, every morning, n8n receives the latest trial data it needs for the rest of the workflow.
Give each trial two scores before bringing in AI:
In n8n:
Calculate:
Use simple rules to start:
Treat these as high scores for now:
Then set the route:
Also calculate _trial\day in this Code node. Then create _should\check and set it to true only for users who are on day 3, 5, or 7, have not converted, and have not reached the end of the trial.
You can change these rules later as you see which behaviors lead to conversions.
Only send users to OpenAI if the user:
In your Code node, create a _should\check field that returns true only when all three conditions are met.
Then:
Only those users continue to OpenAI.
Now, let AI look at the trial data and explain what is going on.
Add: OpenAI
Select:
Create four string fields:
Use this prompt (or something similar):
You are reviewing a SaaS trial.
Use ONLY the supplied data. Never EVER invent activity.
The route has already been decided. Don’t change it.
In a single sentence, explain why this user received this route:
If route = sales, focus the message on helping them make a buying decision.
If route = onboarding, identify the most important activation step they haven't completed.
Return:
Summary
Missing_activation_event
Email_subject
Email_body
Pass in the user's trial data, including _activation\_events\completed, the scores, and route.
That's it. AI interprets the data and writes the message. Your scoring rules still control the route.
Next, separate the trials based on the route from your Code node.
Set the Switch rules using the route created in your Code node, not a new route generated by OpenAI.
Create three outputs:
The Switch node supports multiple conditional routes. For ignore, stop there. For sales and onboarding, continue to Gmail.
Start with drafts, not automatic emails.
Add: Gmail
Select:
Map:
For the first few weeks, review the drafts before sending them. Look for wrong recommendations, awkward emails, and incorrect routes. Once you're happy with the results, automate the sending.
The last step is to feed the results back into the system.
After the Gmail step, add another Supabase node:
Update the record using _user\id. If a user can start more than one trial, use a unique trial ID instead.
Save:
When a user converts, or their trial expires, have your app or a separate n8n workflow update outcome. This workflow only checks users at specific trial checkpoints, so let the app or separate workflow track the final outcome.
Then review your results every 20–30 completed trials:
Don't start with a smarter AI. Start with better signals.
Strong framing on better signals over smarter AI. I’d calibrate the score thresholds against actual conversions by cohort and review a small holdout each week—checkout_started can be noisy, and account_fit labels can encode bias. Logging the outcome of each intervention will show whether onboarding actually helps, while starting with drafts keeps the workflow safe.
The distinction between activation and intent is useful. I’ve found it helps to keep the scoring model explainable, then use support questions and failed setup steps as signals rather than treating repeated logins as interest. Reviewing outcomes after a few dozen trials should make it easier to tune thresholds without overfitting.
I like the emphasis on behavioral signals rather than login counts. I’ve found it useful to pair the score with time-to-value and the last meaningful action, then tailor the next touch to the missing step instead of sending a generic “just checking in” message.
The activation-versus-intent split is a useful way to avoid treating every signup as equally valuable. I especially like starting with explicit rules before adding AI. For an early product, I would also track time-to-first-value and the exact action that made the user return, since those signals often reveal the best onboarding change.
Nice framing of separating activation from intent and using simple rules before AI. I’d add a small holdout check: after 20–30 trials, compare each signal’s conversion rate against a baseline and look for confounders like plan type or company size. For the onboarding route, sending one concrete next step tied to the missing activation event may outperform a multi-paragraph AI email. Also track time-to-first-value alongside conversion so you see where friction starts, not just who eventually pays.
Agree on logins. In my case the only signal I trust is finishing the first block of tasks, that's the moment the product makes sense to someone or it doesn't. I show the trial offer right after that and not before.
Too early to say if it works, I have no real users yet.
The 'no action yet' bucket is the most interesting one. Timing matters as much as the score itself - a high-scoring user on day 2 of a 14-day trial is a very different situation than the same score on day 12.
The AI-drafted email is the right call. Sales outreach bottlenecks on writing, not on knowing who to contact. Taking that off the plate means teams actually send the email instead of putting it in a backlog.
Question: are the scoring thresholds static once you set them, or do you have a feedback loop where actual conversion data adjusts what counts as a 'high intent' signal over time? The first version of those thresholds is usually a guess that gets a lot better after a few cohorts.
Separating "looks valuable" from "actually reached the aha moment" is the part most trial dashboards skip. A big company name on the signup form is not the same as completing the first real workflow.
We learned a similar split on a Discord discovery side project: vanity joins vs people who came back in seven days and did one meaningful action. The second group is tiny, and they are the only ones worth a personal note.
Do you weight product-usage signals higher than firmographic ones once someone is past day two, or still mix them?
skip staring at the screen and wondering, haha. thanks again!