Back to Playbooks

When Freemium Stops Being Free: A Usage-Cap Handoff That Actually Converts

Free

This playbook shows how to turn freemium usage-cap moments in an SEO SaaS into a Spreeflo journey that triggers contextual emails and sales assists, converting high-intent free users into reliable, trackable paid revenue.

Industry

Niche

Pattern

Loading sequence...

A trial user doesn’t book a demo when they’re “curious.” They book it when your app stops them mid-flow and says, “You’ve hit your limit.”

For an SEO SaaS, that moment is gold: they’ve added their 10th keyword, generated their 3rd content brief, or tried to crawl one more site. Most tools throw up a static paywall and hope for the best. This playbook turns that same moment into a coordinated nudge plus a sales assist.

The sequence at the top of this page is the whole journey, end to end. Below, we’ll walk through why it’s wired this way and how to adapt it to your own product.

To ground it, imagine “RankSignal,” a 4-person SEO SaaS doing $40k MRR. They offer a generous free tier: 10 keywords tracked, 1 domain crawl per week, 2 content briefs. Churn is fine; free-to-paid is not. People hit the cap, get annoyed, and disappear. The founder wants a system that catches those moments automatically and routes real buyers to a human before they drift off.

Why a usage cap is your sharpest sales signal

A user can say “I’m interested” in plenty of ways: visiting your pricing page, reading your docs, opening your newsletter.

But actually hitting a usage cap is different:

  • They’ve integrated your product into their workflow.

  • They’re pushing against the fence line of what “free” allows.

  • The pain is immediate and specific: “I need just a little more.”

For an SEO tool, this might be:

  • Trying to add the 11th keyword.

  • Generating another content brief for a new cluster.

  • Launching a site-wide audit on a second domain.

Most teams respond with one of two blunt instruments:

  • A generic upgrade email in a weekly broadcast.

  • A hard paywall with no follow-up at all.

Neither respects how strong that signal is or how different each account is. You want the opposite: use the detailed behavior you have on that contact to decide what to say and who should say it.

That’s exactly what this Spreeflo journey does.

What this free-to-paid handoff journey actually does

Before we go node-by-node, here’s the flow in plain language:

  1. Your app fires a “usage_cap_hit” event whenever a free user pushes past their limit.

  2. A journey listens for that Custom Event and only enrolls contacts who are on the free plan and able to receive marketing email.

  3. The journey tags them for analytics, then sends a contextual upgrade email tied to what they were doing in the product.

  4. It waits a short window to see if they self-upgrade.

  5. If they upgrade, the journey marks them as a “usage-cap conversion” and pings your team so someone can follow up like a human.

  6. If they don’t, the journey branches:

  • High-value accounts get an internal alert for a sales assist.

  • Everyone else gets one more well-timed, specific nudge.

Under the hood, this pattern reinforces two of Spreeflo’s core ideas:

  • You capture detailed behavior for every user so you can speak to each one uniquely.

  • You build the automation once, and it quietly works for you every time a free user hits the wall.

Let’s go through the sequence.

Step 1: Fire a clean usage-cap event from your app

Everything hangs on a reliable event.

When a free user tries to go past their allowance, your backend is usually where the check happens. That’s the right place to send an event into Spreeflo via the Spreeflo API.

Define a custom event name like usage_cap_hit and include properties that give context, for example:

  • plan_tier (e.g., "free")

  • limit_type (e.g., "keywords", "briefs", "audits")

  • plan_limit (e.g., 10)

  • attempted_value (e.g., 11)

  • account_size (e.g., number of projects, seats, or domains)

Because the event is tied to a contact’s email, it lands on the same unified profile as their other activity.

If some caps are enforced client-side (say, a front-end-only keyword counter), your web app can call Spreeflo.track('usage_cap_hit', {...}) through the SDK instead. Either way, the outcome is the same inside Spreeflo: a clean, structured event you can trigger from.

Step 2: Build the journey and set the Custom Event trigger

Inside Spreeflo, you build a journey — not a one-off campaign — because this needs to run continuously.

The entry node is a Custom Event trigger:

  • Event name: usage_cap_hit.

  • Add property conditions:

  • Re-enrollment: turn this on.

  • plan_tier is "free" so you don’t chase paying customers.

  • Optionally, limit_type is "keywords" if you want one journey per cap type.

Re-enrollment deserves a moment. A contact might hit the cap more than once (for a different project, or across months). With re-enrollment on, they can re-enter the journey every time the usage_cap_hit event fires, as long as they’re not already mid-journey. Spreeflo automatically prevents parallel runs for the same contact.

This is your behavioral “hook.” Everything else is response.

Step 3: Qualify who should get what with If/Else

From the trigger, the journey flows into an If/Else node to keep the rest of the flow focused on real opportunities.

You can use the segment builder in the If/Else condition to express logic like:

  • Email Subscription Status is Subscribed.

  • Current plan tier is free.

  • Contact is not tagged with no-sales-outreach.

That becomes your “then” branch: people who are both in-product and contactable. The “else” branch catches everyone else.

On the else path, you might simply apply a tag with an Add Tag action like usage_cap_uncontactable and end the path. That keeps your data clean without spamming users who opted out.

On the main (then) branch, you’re left with high-intent free users you’re allowed to email. Now the journey gets interesting.

Step 4: Tag for attribution before you pitch

Next, add an Add Tag action on the qualified branch, something like hit_usage_cap.

That one step pays off later when you want to answer questions such as:

  • “How many free users hit a cap last month?”

  • “What’s the upgrade rate for people who hit the cap vs those who didn’t?”

Tags are cheap, and they’re easy to slice by later using the segment builder. You’re capturing useful detail about the customer’s journey right at the moment it matters.

With the tag in place, you’re ready to talk to the user.

Step 5: Send a contextual upgrade email right at the wall

Now place your first Send Email node.

Configuration-wise:

  • Choose the sender identity your product emails come from.

  • Turn on “Send only once” so the same person doesn’t get this exact message repeatedly if they bounce in and out of the cap over time.

  • Draft the content in Spreeflo’s email builder, ideally as a reusable template.

The copy should tie directly to what they were doing. For RankSignal’s keyword limit, that might look like:

  • Subject: “You’ve maxed out your 10 free keywords — here’s what happens next”

  • Body themes:

  • Mirror their situation: “You tried to add the 11th keyword to Project X.”

  • Quantify value: “Sites like yours see the real uplift when they track 30–50 keywords per cluster.”

  • Clear options: “Upgrade to Pro for up to 100 keywords, or keep your current 10 and delete older ones.”

This is where Spreeflo’s philosophy on data shows up: you’re not guessing. You know exactly which cap they hit and how they use the product, so the email can speak to that specific pain.

The upsell CTA can still be self-serve (link straight to your billing page), but the journey is about to add an assisted path too.

Step 6: Wait for a self-serve upgrade with a Wait Condition

Right after the email, add a Wait Condition action. This node pauses the journey until either:

  • The user upgrades, or

  • A timeout passes.

In the Wait Condition:

  • Condition: “Custom event plan_upgraded triggered at least 1 time over all time” or “Contact attribute plan_tier is not free,” depending on how you represent upgrades.

  • Timeout: 2 days (for example), unit set to days.

Effectively you’re saying: “Give them up to 48 hours to upgrade on their own. As soon as we see that upgrade, move them forward. If we don’t, continue down the ‘not upgraded’ path.”

This node also gives you your required spacing between marketing emails. No one hits two emails back-to-back.

Step 7: Branch on who upgraded — and mark the source

After the Wait Condition, insert another If/Else:

  • Condition: same as the Wait Condition (e.g., plan_tier is not "free" or plan_upgraded event at least 1 time).

On the “then” branch (they upgraded):

  1. Use Add Tag to apply something like upgraded_after_usage_cap.

  2. Optionally use Update Contact Attribute to set a static attribute, for example upgrade_source = "usage_cap_journey".

  3. Add a Send Internal Email node to notify your team.

That internal email might be:

  • To: your shared sales or success inbox.

  • Subject: “New upgrade after hitting usage cap: {{ contact.email }}”

  • Body: include the plan they upgraded to, what limit they hit, and a link to their account in your app.

This is your assisted moment: someone on your tiny team can send a quick personal note, offer onboarding help, or probe for expansion. You didn’t have to “monitor” anything — the system did it.

On the “else” branch (no upgrade yet), the journey handles follow-through differently.

Step 8: Escalate high-value free users to sales

Not every free user is equal. Some are testing you with a side project; others are agencies adding client after client.

From the “not upgraded” branch, drop another If/Else to separate high-value accounts from the rest. Your condition might look like:

  • Contact attribute projects_count greater than 3, or

  • Custom event site_crawled triggered at least 5 times over all time, or

  • Tag agency present.

Use whatever signals your product already has to say “this account is worth a human touch.”

For the high-value “then” branch:

  1. Add a Send Internal Email node:

  2. Optionally tag them sales_outreach_started so you can avoid double-pinging and filter them out of broader nurture sequences.

  • To: whoever handles higher-touch sales.

  • Subject: “High-value free user blocked by usage cap: {{ contact.email }}”

  • Body: include account size, what limit they hit, and suggested next steps (e.g., “Offer them a shared-screen walkthrough of the Pro plan.”).

You can end the branch there or follow with a gentle marketing email later if you want a mixed approach.

For the “else” branch (everyone else):

  • Add a second Send Email node: another contextual nudge, perhaps more ROI-oriented (“Here’s how tracking more keywords actually moves your rankings”) rather than purely feature-based.

  • Keep “Send only once” enabled here too so you don’t burn them out on repeated caps.

Because they’ve already gone through the Wait Condition, this second email arrives with at least a 2-day gap from the first. You stay helpful, not spammy.

Measuring free-to-paid and sales-assisted revenue from this journey

You set this up to get more upgrades. The bonus is that you also get clean attribution.

With the tags you added (hit_usage_cap, upgraded_after_usage_cap, sales_outreach_started), you can:

  • Build a segment in the segment builder for “Contacts tagged hit_usage_cap who also have a plan_upgraded event.”

  • Compare their upgrade rate and ARPU to those who never hit a cap.

  • Slice out contacts with sales_outreach_started to estimate “sales-assisted” revenue versus pure self-serve upgrades.

Because all of that is on the same contact record as their web behavior, email activity, and custom events, you get a real view of how this one journey affects MRR — without stitching reports across tools.

Why this pattern compounds for a founder-led SEO SaaS

The real win here isn’t the cleverness of any one node. It’s that you, as a 3–5 person team, get to “be in the room” every time a free user outgrows your product, without actually being in the room.

You:

  • Capture detailed behavior at the exact moment of friction.

  • Respond with messaging tuned to that behavior.

  • Route the best accounts to a human with context.

  • Let the rest flow through a smart, respectful self-serve path.

That’s what “founder-led businesses win on leverage, not headcount” looks like in practice. You build the system once; every future usage-cap moment benefits.

If you’re already tracking product events, you have everything you need. Wire a usage_cap_hit event into the Spreeflo API, set up this journey with a Custom Event trigger, and let the sequence at the top of this page go to work.

Most SEO SaaS teams are already paying to acquire those freemium users. This is how you stop leaving their upgrade moment to chance.