Back to Playbooks

Turn expiring SEO trials into revenue with a 3‑day conversion push

Free

A detailed Spreeflo journey that turns quietly expiring SEO trials into paid revenue by running a focused 3‑day conversion push, segmenting activated vs dormant users, pacing urgency emails, and routing high‑intent near‑miss accounts for human follow‑up.

Industry

Niche

Pattern

Loading sequence...

A lot of your “churn” isn’t churn at all. It’s trials that quietly expire because nobody nudged the user properly in the final 72 hours.

Take RankPulse, a three‑person SEO rank tracker doing ~$40k MRR. They were getting plenty of trials from content and SERP visibility, but only ~15% of them converted. The only thing running in the final days was a single, generic “your trial is ending” email. High‑intent accounts slipped away without anyone noticing.

The sequence at the top of this page is the whole journey, end to end. It’s the opposite of that: a focused 3‑day conversion push that treats activated and dormant trials differently, and taps your team in when it matters.

Why the last 3 days of trial decide your LTV

By the time someone is a trial user of your SEO tool, you’ve already paid the expensive part of the funnel: content, SEO, integrations, product development, support. Letting them drift out of trial without a fight is pure lifetime‑value leakage.

For an SEO SaaS charging $79/month with an average lifetime of 12 months:

  • Moving trial‑to‑paid from 15% to 20% is worth thousands per month.

  • The leads you’re saving already have strong intent: they installed your script, connected Google Search Console, or uploaded a domain list.

  • Those are the exact people most businesses ignore or ping once, then forget.

Brand message #3 matters here: most businesses leak lifetime value because they don’t nurture engagement. Trial expiry is one of the biggest leaks you can plug with a single, thoughtful automation.

This playbook shows how to build that automation in Spreeflo as a continuously running journey. If you’re new to the canvas, skimming how campaigns and journeys work is a useful primer before you start wiring nodes.

What this journey does, in plain English

Here’s the behaviour we’re aiming for:

  • Detect when a trial hits “ending soon” (for example, 3 days left).

  • Immediately split users by activation:

  • Activated: they’ve added keywords, connected GSC, or generated briefs.

  • Dormant: they signed up but didn’t meaningfully touch the product.

  • Send different “3 days left” messages to each side.

  • Re‑join the paths, then send:

  • A 1‑day‑left reminder to everyone still on trial.

  • A day‑of‑expiry “last call” email to those who still haven’t paid.

  • After expiry, flag non‑converters for:

  • Internal follow‑up if they were engaged.

  • A different nurture if they stayed dormant.

All of that runs automatically once you’ve set it up. Your team only steps in for the handful of high‑intent trials that hit the deadline without converting.

Wire up the data once so automation can do the rest

Before you touch the journey builder, make sure Spreeflo sees three things you already track in your app.

1. Plan and trial status on the contact

You want a reliable view of where someone is in their subscription:

  • plan_type (values like trial, pro, agency)

  • trial_status (for example: active, ending_soon, expired)

Your backend already knows these. Have it update those fields on the corresponding contact via the Spreeflo API whenever a user starts a trial, moves into the “ending soon” window, or converts.

A simple daily job that marks trials with 3 days left as trial_status = ending_soon is enough to drive this journey. The date math lives in your app; Spreeflo just reacts to the attribute change.

2. Activation signals as custom events

For an SEO SaaS, meaningful “activation” tends to look like:

  • added_first_keyword

  • connected_google_search_console

  • generated_content_brief

  • ran_site_audit

Track those as custom events via the Spreeflo SDK in your web app, and from your backend into the events API when actions happen server‑side. We’ll use these as activation criteria inside Spreeflo’s segment builder.

3. A conversion signal

Finally, you need a way to tell “this person became a paying customer”:

  • Either update plan_type from trial to pro / agency when Stripe confirms payment.

  • Or emit a custom event like upgraded_plan.

We’ll use this to skip urgency emails for people who have already converted, and to decide who gets internal follow‑ups after expiry.

Step 1: Trigger only when a trial enters the danger zone

This is a journey, not a one‑off campaign. You want it running indefinitely, catching each trial as it approaches expiry.

Use a Criteria Match trigger:

  • Type: Criteria Match

  • Re-enrollment: Off (most users only get one trial; turn it on only if you intentionally offer multiple trials)

  • Criteria (using the segment builder):

  • Contact attribute plan_type is trial

  • AND contact attribute trial_status is ending_soon

  • AND Email Subscription Status is Subscribed

This ensures you only enrol people who:

  • Are currently in a trial.

  • Have just hit your “ending soon” window.

  • Are still eligible to receive marketing email.

Because this is journey‑scoped, if you later add another trigger to the same journey, it won’t unexpectedly re‑enrol past participants while they’re still moving through this flow.

Step 2: Split immediately by activation vs dormant

Right after the trigger, add an If/Else process node to fork the path:

  • Condition (activation group, AND):

  • Custom event added_first_keyword has triggered at least 1 time over all time

  • OR custom event connected_google_search_console has triggered at least 1 time

  • OR custom event generated_content_brief has triggered at least 1 time

Contacts who match this condition go down the “Activated” branch. Everyone else goes down the “Dormant” branch.

Why this split matters:

  • Activated trials already know what your tool does. They need reassurance and a clear pricing path, not another tour.

  • Dormant trials never reached “aha.” For them, urgency alone just feels like pressure; they need a minimal success plan.

You’re using the same segment builder logic you’d use for a standalone segment, but embedded in a process node.

Step 3: T‑3 email: different story for activated vs dormant

Now design the first set of emails — one for each branch.

For the Activated branch:

  • Action: Send Email

  • Content: A value recap plus soft CTA.

  • “In your trial so far, you’ve tracked 37 keywords and generated 4 briefs.”

  • Highlight concrete wins: improved rankings, audits completed, hours saved.

  • CTA: “Lock this in” — link directly to your billing/upgrade page.

For the Dormant branch:

  • Action: Send Email

  • Content: A quick‑start, not a recap.

  • Show a 2‑step “get value in 10 minutes” path: e.g., “Connect GSC” + “Add your first 20 keywords.”

  • Include a single screenshot or GIF of the core workflow.

  • CTA: “Get set up before your trial ends” — deep‑link back into the app, not just pricing.

Build both emails with the email builder so they’re easy to test and reuse in other flows.

This is the first email in the journey for each contact, so pacing isn’t a concern yet — there’s no previous send.

Immediately after each Send Email, add a Time Delay:

  • Delay: 2 days (or 48 hours)

  • Unit: Day(s) or Hour(s) depending on your preference

The delay spacing is what turns “ending soon” into a 3‑day cadence: T‑3 email now, T‑1 email after two days, then a final day‑of‑expiry message.

Step 4: Re‑join paths and skip people who’ve already paid

After the 2‑day delay on each branch, use a Merge node so both paths feed into a single shared flow.

From the Merge, add an If/Else process to avoid nagging people who have already upgraded in the meantime:

  • Condition:

  • Contact attribute plan_type is trial

If the condition is true (still on trial), they go down the “Still trial” branch. If false, they go down the “Already paid” branch.

On the “Already paid” branch:

  • Optional: Add Tag action (for example, tag trial_converted_in_window)

  • Then end the path for that contact.

On the “Still trial” branch you’ll send the T‑1 email next.

Step 5: T‑1 email: clear, direct urgency

Now you’re talking to people who:

  • Had 3 days’ warning.

  • Haven’t upgraded yet.

  • Are still within trial.

On the “Still trial” branch:

  • Action: Send Email (this is your 1‑day‑left message)

Content notes:

  • Be explicit about the deadline: “Your trial ends tomorrow.”

  • For activated users, lean on what they’ll lose access to (reports, history, briefs).

  • For dormant users, keep pitching the quick‑start path and position payment as a commitment to finally fixing SEO, not just to “try the tool more.”

After this Send Email, add a Time Delay of 1 day. That spaces out the T‑1 and T‑0 emails so they’re never back‑to‑back.

Then add another If/Else to check conversion again before sending a final last‑call email:

  • Condition:

  • Contact attribute plan_type is trial

Same idea as before: if they upgraded overnight, they exit gracefully instead of getting “your trial ends today” after they’ve paid.

Step 6: T‑0 email: last call before expiry

On the “Still trial” branch after that second If/Else, add your final user‑facing message:

  • Action: Send Email (trial ends today)

Content ideas:

  • Subject and header should be crystal clear about “Trial ends today.”

  • Offer a simple choice: “Upgrade now” vs “Let it expire.”

  • Optionally, for higher‑value accounts (agencies, big sites), mention that replying to the email will get them a custom walkthrough or help migrating projects.

This is your third and final marketing email in the sequence. Across the journey, every pair of emails is separated by at least a 1‑day Time Delay, so you’re staying well clear of the spammy “three emails in a row” pattern.

Step 7: Wait once more, then route non‑converters for follow‑up

Some people will click that final email and pay within a few hours. Others will do nothing. You don’t want to guess; you want the journey to watch for a bit and then route each contact cleanly.

Right after the T‑0 Send Email, add a Wait Condition:

  • Condition:

  • Timeout: 1 day

  • Contact attribute plan_type is not trial (or custom event upgraded_plan has triggered at least once in the last day)

Spreeflo will hold the contact at this node until either:

  • They convert (condition becomes true), or

  • 24 hours pass.

After the Wait Condition, add a Multi‑way Split to sort people into three outcomes:

  1. Converted after the last email\nCondition:\n- Contact attribute plan_type is not trial

  2. Still trial / expired but engaged\nCondition:\n- Contact attribute plan_type is trial\n- AND custom events show activation (same activation group as earlier)

  3. Still trial / expired and dormant\nCondition:\n- Contact attribute plan_type is trial\n- AND activation events have not triggered over all time

Order the branches so “Converted” is first, then “Engaged but not converted,” then “Dormant and not converted.” The else branch catches any edge cases.

Now handle each:

Branch 1: Converted after last email

Here you just need light bookkeeping:

  • Action: Add Tag (for example, trial_converted_after_deadline)

  • Optional: send a separate onboarding journey triggered by this tag.

  • Then end this path.

Branch 2: Engaged but didn’t convert (your near‑miss gold)

These are the people you really care about. They used the tool but didn’t pull the trigger.

Two actions work well:

  1. Send Internal Email

  2. Add Tag

Send Internal Email

  • Recipient: founder or success inbox.

  • Content: trial account details, domains tracked, what they used, and a link to their CRM record.

  • Goal: prompt a short, personal outreach (“Saw you were testing our rank alerts but didn’t upgrade — anything missing for your use case?”).

Add Tag

  • Example: expired_trial_engaged so you can build a specific follow‑up segment or retarget them later.

Then end the path.

Because this is an internal email, it doesn’t impact your customer‑facing pacing, but it gives your small team a clear, human to‑do list.

Branch 3: Dormant and didn’t convert

They never activated, and they didn’t pay. Don’t burn cycles chasing them 1:1.

  • Action: Add Tag (for example, expired_trial_dormant)

  • Then end.

That tag can feed a slower, educational nurture sequence later (“When you’re ready to take SEO seriously, here’s a simple 3‑step plan”) without cluttering this high‑intent journey.

Adapting this pattern to your SEO SaaS

A few smart knobs to adjust:

  • Trial length: if you run 7‑day trials, make your Time Delays shorter so T‑3, T‑1, T‑0 still map to the final window. The structure stays identical.

  • Activation definition: for a content‑brief tool like BrieflySEO, the key events might be “generated_content_brief” and “shared_brief_with_writer” instead of “added_first_keyword.”

  • Internal thresholds: if you have thousands of trials a month, tighten your “engaged” definition so only high‑value, near‑miss trials trigger internal emails (for example, “tracked at least 100 keywords” or “connected 3+ domains”).

Because this all runs as a journey, any new trial that matches the Criteria Match trigger will simply flow through. You set it up once; it keeps saving conversions for you with zero extra headcount.

If you’re curious how many of your contacts count toward automation usage as you scale this, the explainer on about Spreeflo pricing plans breaks down marketing contacts clearly.

What to measure once it’s live

You don’t need a PhD in analytics here. Track three simple numbers before and after turning the journey on:

  • Trial‑to‑paid conversion rate\nThe main KPI. Even a 3–5 point lift is huge for SEO SaaS economics.

  • Open and click rates for each of the three emails\nEspecially the T‑1 and T‑0 messages. If they’re underperforming, tweak subject lines and CTAs, not just send volume.

  • Count of “engaged but didn’t convert” internal alerts vs. wins from follow‑up\nThat tells you whether the internal step is justified and helps your team refine their outreach.

Because everything is built from the same campaigns and journeys layer, you can iterate copy and conditions without rewriting logic in your app.

Plugging an LTV leak you can actually control

You can’t control Google’s next core update. You can’t control a client’s fickle content budget. You can absolutely control what happens to a trial user who’s three days from expiry.

Founder‑led teams often focus all their creativity on acquisition and product, then leave the most valuable part of the funnel — engaged trials on the brink of conversion — on autopilot. This journey fixes that. It treats each trial according to their behaviour, gives them clear chances to say yes, and hands your team a short list of relationships worth saving.

Set it up once, let it run, and your expiring trials stop being a quiet leak and start becoming a predictable source of revenue.