Trial-to-paid conversion is one of the most important metrics for any SaaS business. It tells you whether your product delivers enough value to justify a purchase decision. Yet most SaaS companies monitor this metric badly they rely on analytics tools that only track surface-level events, they wait for monthly reports that are already stale, or they depend on a data analyst to pull numbers on demand.
The root problem is simple: trial conversion data lives in your database. The users table, subscriptions table, and payment events table contain everything you need. But unless you can query that data directly and automatically, you end up with lagging indicators, not real signals.
This guide covers how to track trial-to-paid conversion from your database what queries to run, what to monitor, and how to set up automated alerts so your team knows the moment something changes.
Why Analytics Tools Miss the Full Picture
Most SaaS teams track trial conversions through product analytics platforms like Mixpanel, Amplitude, or Segment. These tools are good at what they do: tracking user events, showing funnels, measuring feature adoption.
But they have a structural limitation: they can only show you what users did in your product. They can't tell you whether a user who converted is still paying, whether their invoice cleared, or whether they downgraded the next month. That data lives in your billing system and your database.
Consider a typical trial conversion flow:
users tableactivated_at timestamp updatedtrial_ends_at passed, plan_id still 'trial'subscriptions row created, status = 'active'payments row created, amount recordedYour analytics tool sees steps 1 and 2. Maybe step 4 if you fire a tracking event. But it doesn't inherently know whether the subscription is still active, what plan the user chose, or what their monthly value is. Your database knows all of that.
The Core Queries Every SaaS Team Should Be Running
Here are the foundational SQL queries for monitoring trial conversion. These assume a fairly standard schema adapt the table and column names to match yours.
Overall trial conversion rate, last 30 days:
SELECT
COUNT(*) FILTER (WHERE trial_started_at >= NOW() - INTERVAL '30 days') AS trials_started,
COUNT(*) FILTER (
WHERE trial_started_at >= NOW() - INTERVAL '30 days'
AND converted_at IS NOT NULL
) AS conversions,
ROUND(
COUNT(*) FILTER (
WHERE trial_started_at >= NOW() - INTERVAL '30 days'
AND converted_at IS NOT NULL
) * 100.0 /
NULLIF(COUNT(*) FILTER (WHERE trial_started_at >= NOW() - INTERVAL '30 days'), 0),
2
) AS conversion_rate_pct
FROM users;Users currently in trial, segmented by days remaining:
SELECT
CASE
WHEN trial_ends_at - NOW() < INTERVAL '2 days' THEN 'expiring soon (< 2 days)'
WHEN trial_ends_at - NOW() < INTERVAL '7 days' THEN 'expiring this week'
ELSE 'more than 7 days left'
END AS trial_bucket,
COUNT(*) AS user_count
FROM users
WHERE plan_id = 'trial'
AND trial_ends_at > NOW()
GROUP BY 1
ORDER BY MIN(trial_ends_at);Trial-to-paid conversion by signup cohort (weekly):
SELECT
DATE_TRUNC('week', trial_started_at) AS cohort_week,
COUNT(*) AS trials,
COUNT(converted_at) AS conversions,
ROUND(COUNT(converted_at) * 100.0 / NULLIF(COUNT(*), 0), 1) AS conversion_rate
FROM users
WHERE trial_started_at >= NOW() - INTERVAL '90 days'
GROUP BY 1
ORDER BY 1;Users whose trial expired without converting (last 7 days):
SELECT
u.id,
u.email,
u.trial_ends_at,
u.trial_started_at,
u.last_active_at,
, Days between last activity and trial expiry
EXTRACT(DAY FROM u.trial_ends_at - u.last_active_at) AS days_inactive_before_expiry
FROM users u
WHERE u.plan_id = 'trial'
AND u.trial_ends_at BETWEEN NOW() - INTERVAL '7 days' AND NOW()
AND u.converted_at IS NULL
ORDER BY u.last_active_at DESC;This last query is particularly useful for sales or customer success follow-up these are warm leads who tried your product and didn't convert. Knowing when they last used the product helps you prioritize outreach.
What to Actually Monitor (Not Just Measure)
There's a difference between a report you read and a signal you respond to. For trial conversions, here are the metrics worth watching actively:
Daily trial conversion rate if today's rate drops significantly below your 30-day baseline, something may be wrong with your onboarding, checkout flow, or a recent product change.
Trials expiring with zero conversion action users whose trial ends in 48 hours with no payment attempt. This is your list for last-chance outreach.
Time-to-convert distribution how many days after trial start do most conversions happen? If users typically convert on day 10 and you're on a 14-day trial, day 8-10 is your critical window for outreach.
Conversion rate by acquisition source if users from one channel convert at 3% and users from another convert at 18%, your acquisition strategy needs rebalancing.
Conversion rate by feature usage which product features predict conversion? This tells you what to push in your onboarding flow.
Setting Up Automated Monitoring Without a DBA
Manually running queries every day isn't sustainable. What you want is automatic monitoring the database watches itself and tells you when something matters.
AI for Database has an action workflow feature that does exactly this. You define a condition (like "daily trial conversion rate drops below 8%") and an action (like "send Slack alert" or "call webhook"). The system runs the check automatically and fires the action when the condition is met.
A practical workflow for trial conversion monitoring:
Alert when daily conversions drop below baseline:
today's conversion count < (30-day average * 0.7)Alert on high-value trial expiring without converting:
enterprise plan type with trial expiring in 24 hours, no payment attemptDaily trial health digest:
Without a dedicated data engineer, setting these up traditionally required stored procedures, cron jobs, or a separate workflow tool. With purpose-built database workflow tools, you describe the condition in plain English and the system handles the execution.
Conversion Funnel Analysis: Where Users Drop Off
Understanding when users fail to convert is as important as knowing that they don't. A proper trial funnel analysis breaks down the journey into stages:
WITH funnel AS (
SELECT
u.id,
u.trial_started_at IS NOT NULL AS signed_up,
u.activated_at IS NOT NULL AS activated,
u.first_key_action_at IS NOT NULL AS reached_aha_moment,
u.checkout_started_at IS NOT NULL AS started_checkout,
u.converted_at IS NOT NULL AS converted
FROM users u
WHERE u.trial_started_at >= NOW() - INTERVAL '30 days'
)
SELECT
COUNT(*) FILTER (WHERE signed_up) AS total_trials,
COUNT(*) FILTER (WHERE activated) AS activated,
COUNT(*) FILTER (WHERE reached_aha_moment) AS reached_aha,
COUNT(*) FILTER (WHERE started_checkout) AS started_checkout,
COUNT(*) FILTER (WHERE converted) AS converted
FROM funnel;This tells you where users are falling out of the funnel. If 70% activate but only 12% reach the "aha moment," your onboarding is the bottleneck. If 40% start checkout but only 20% complete it, your checkout flow needs attention.
Segmenting Conversions by Plan and Revenue
Not all conversions are equal. A user converting to your $29/month starter plan is different from one converting to your $299/month growth plan. Track revenue impact, not just conversion count:
SELECT
s.plan_id,
s.billing_interval,
COUNT(*) AS new_subscriptions,
SUM(s.monthly_amount) AS mrr_added,
ROUND(AVG(s.monthly_amount), 2) AS avg_plan_value,
ROUND(AVG(
EXTRACT(DAY FROM s.created_at - u.trial_started_at)
), 1) AS avg_days_to_convert
FROM subscriptions s
JOIN users u ON u.id = s.user_id
WHERE s.created_at >= NOW() - INTERVAL '30 days'
AND s.status = 'active'
GROUP BY 1, 2
ORDER BY mrr_added DESC;This shows you MRR added by plan, plus average days to convert per plan. Higher-value plans often take longer to convert knowing this helps you calibrate follow-up timing.
Using Database Data to Personalize Trial Outreach
One of the best uses of direct database access during a trial is personalizing outreach based on actual behavior. Instead of generic "your trial is ending soon" emails, you can send messages based on what users have actually done:
User who set up a dashboard but never ran a query:
SELECT email FROM users
WHERE dashboard_created_at IS NOT NULL
AND first_query_at IS NULL
AND trial_ends_at < NOW() + INTERVAL '5 days'
AND converted_at IS NULL;Message: "Looks like you set up a dashboard here's how to pull your first insight from it."
User who ran queries but didn't try the alerts feature:
SELECT email FROM users
WHERE first_query_at IS NOT NULL
AND first_alert_created_at IS NULL
AND trial_ends_at < NOW() + INTERVAL '3 days'
AND converted_at IS NULL;Message: "You've been querying your data did you know you can set up automatic alerts?"
This kind of behavioral segmentation dramatically outperforms generic trial expiry emails. The data is all in your database; the only question is whether you can access it fast enough to make it actionable.
Closing
Trial-to-paid conversion is too important to measure by gut feel or weekly spreadsheet. Every day you don't have visibility into who's converting, who's dropping off, and why, is a day of lost signal.
Your database already has the answers. The task is making those answers accessible in real time not through a ticket to your data team, but through a dashboard you can check in the morning and alerts that surface problems before they become trends.
Set up direct database monitoring for your trial conversions and you'll stop reacting to problems and start catching them early. Try it free at aifordatabase.com.