DEV Community

疏影
疏影

Posted on

A cheap-onboarding trick that works for tiny SaaS: the free-tier cap

For my $5.50 lifetime ScsDriver WebDAV mount tool, I have a 7-day free trial. The trial converts at 14% to paid. After 8 months I tried a tiny change — adding a "trial features used: 3 of 3" cap visible to the user.

Result: trial-to-paid conversion jumped from 14% to 22%. +57% lift. Zero other changes.

The setup

ScsDriver trial gives full access for 7 days. Three feature areas: mount, sync, automation. Before the cap, users could do whatever they wanted during the trial. After the cap, users see:

Trial features used: 3 / 3
Upgrade to use unlimited
Enter fullscreen mode Exit fullscreen mode

Three features. Three caps. After three uses of any feature, you have to upgrade to use more.

What changed

I added a counter on the dashboard showing "trial features used: 3 / 3". When the count hits 3, the user can no longer trigger any feature without upgrading. The counter increments per-feature, not globally.

What I learned

  1. Visible usage creates urgency. Users who can see "3/3" want to keep using. Users who don't see usage drift through the trial and forget about it.

  2. Per-feature caps are friendlier than global caps. A global "3 actions total" feels punitive. A per-feature "you've used the trial for Mount 3 times" feels informational.

  3. Countdown timers don't work. Usage counters do. "Trial ends in 3 days" is abstract. "You've used 3 of 3 trial mounts" is concrete.

  4. The cap should be small. 3 is the sweet spot for a single-feature product. For multi-feature products, 3 per feature works.

  5. Reset the counter on upgrade. When the user pays, the counter goes away. They never see it again. The cap is purely a trial-state signal.

Why this works

Behavioral economics: users are loss-averse. "You've used 3 of 3" triggers loss aversion — they don't want to lose access. Without the counter, they don't know they're approaching a wall.

The counter is also informative without being aggressive. It doesn't say "upgrade now!" It says "you've used 3 of 3". The user can do the math themselves.

What I tried that didn't work

  • Trial countdown timer: 7% lift (too abstract)
  • Email reminders at day 5: 4% lift (too late)
  • Upgrade button on every page: -2% lift (annoying)
  • "Premium features" lock screen: 8% lift (users thought it was a bug)
  • Visible usage counter (this!): 57% lift

The visible counter wins by a huge margin.

The implementation

class TrialUsageCounter:
    def __init__(self, user):
        self.user = user
        self.feature_caps = {'mount': 3, 'sync': 3, 'automation': 3}

    def get_count(self, feature):
        return self.user.trial_usage.get(feature, 0)

    def can_use(self, feature):
        if self.user.is_paid:
            return True
        return self.get_count(feature) < self.feature_caps[feature]

    def increment(self, feature):
        if self.user.is_paid:
            return
        self.user.trial_usage[feature] = self.get_count(feature) + 1

    def visible_message(self, feature):
        if self.user.is_paid:
            return None
        used = self.get_count(feature)
        cap = self.feature_caps[feature]
        return f"Trial features used: {used} / {cap}"
Enter fullscreen mode Exit fullscreen mode

The visible message is shown on the dashboard. After 3 uses of any feature, the feature is locked until upgrade.

What I'd add if I had more data

  • Personalized caps based on usage pattern. Some users need 5 mounts to evaluate, others need 1.
  • Per-feature upgrade prompts when the user is locked out of one specific feature.
  • A "trial summary" at the end showing what they used and what they didn't.

The takeaway

Visible usage counters > countdown timers > email reminders > aggressive upgrade prompts.

The cheapest onboarding trick I ever shipped was a single counter on the dashboard. Cost: 30 lines of code. Reward: +57% conversion.

For tiny SaaS products, this is one of the highest-ROI changes you can make. Most products have it backwards — they hide usage information, then wonder why trials don't convert.

The information asymmetry between the user and the product is the problem. Close it. Show usage. Show it cleanly. Conversion follows.

Top comments (0)