Skip to main content
Migrate Already selling? Move your customers to Keylight without re-issuing a single key.
Keylight
Blog
macos trials pricing

From Trial to Paid: Conversion for Mac Apps

3 min read Nicolas Demanez — Founder

A free trial is a sales funnel disguised as a feature. Most Mac developers set a trial length, ship it, and never tune it again — leaving conversions on the table. This post is about treating trial-to-paid as something you can actually design.

Trial length is a real decision

The first lever is how long the trial runs. There is no universal answer, but there is a way to reason about it.

Short trials (7 days) create urgency. The customer knows the clock is loud, so they make a decision instead of letting the app drift into the “I’ll get to it” pile. Short trials suit apps whose value is obvious within a session or two — a utility, a focused tool.

Long trials (30 days) suit apps a customer has to genuinely adopt before they can judge them — something that has to earn a place in a real workflow, sync with real data, survive a real project. Cut that trial short and the customer never reaches the moment the app proves itself.

14 days is the common default because it splits the difference: long enough to adopt, short enough to still feel a deadline.

The mistake is not picking the “wrong” number — it is never revisiting it. Trial length is testable. If most conversions happen on day 3, a 30-day trial is just adding 27 days of indecision. If conversions cluster on the last two days, your trial might be too short and people are deciding under pressure without having really used the app.

Reminder timing: present, not annoying

A trial the customer forgets is a trial that expires unconverted. But an app that nags loses goodwill. The balance is to scale your presence with the clock.

  • From day one: a quiet, persistent indicator — “12 days left in trial” in a corner or a menu. Always visible, never modal. It sets the expectation without interrupting anything.
  • The final stretch (last 2-3 days): step up to a clear, dismissible prompt at a natural break — app launch, not mid-task. This is when the customer has the most information and the deadline is real.
  • On expiry: a full, honest purchase screen. Not a guilt trip — a clear “here is what continues, here is the price, here is the button.”

The rule of thumb: never interrupt work to ask for money. Interrupt the gaps — launch, an idle moment, a completed task — and the prompt feels like timing rather than nagging.

The expiry moment

Expiry is the highest-leverage moment in the whole funnel, and it is easy to get wrong.

Do not let the app simply stop with a curt “trial expired.” The customer just spent two weeks with your software — that is the warmest they will ever be. Meet that moment with a screen that respects it: a short reminder of what they would keep, the price stated plainly, and a single obvious path to buy. If your app has tiers, this is where to show them. If there is a launch discount, this is where it lands.

And handle the “not yet” case gracefully. A customer who is not ready should not feel punished — let them reach a clearly limited free mode, or extend once if that fits your product. A customer who leaves on a bad feeling does not come back; one who leaves on a neutral one sometimes does.

Licensing is the machinery underneath

Every part of this — the countdown, the day-12 indicator, the final-stretch prompt, the clean unlock when they pay — is a licensing state. Conversion design only works if the licensing underneath is reliable.

With a signed-key SDK, the trial is not a separate system you build; it is one of the states the SDK already reports:

await licensing.checkOnLaunch()

switch licensing.state {
case .trial(let daysLeft):
    enablePaidFeatures()                 // show the real product
    updateTrialIndicator(daysLeft)       // your countdown UI
    if daysLeft <= 3 { showConversionPrompt() }
case .expired:
    showPurchaseScreen()                 // the high-leverage moment
case .licensed:
    enablePaidFeatures()                 // converted — no prompts
case .invalid:
    showActivationSheet()
}

daysLeft drives every reminder decision. When the customer buys, Stripe issues the license and the state flips to .licensed — the prompts vanish, the app just works. Because the trial and the paid license are the same system, conversion is a clean transition, not a migration.

Trial length, reminder timing, and the expiry screen are all worth deliberate attention — and worth measuring. If you have conversion data or a tactic worth a follow-up post, send us your feedback.

Frequently asked

How long should a Mac app free trial be?+

Most Mac apps use 7 to 30 days. Shorter trials create urgency and convert evaluators faster; longer trials suit apps a customer must fold into a real workflow before they can judge them. 14 days is a common default.

When should a trial app show a purchase reminder?+

Sparingly early, then more present as the trial nears its end. A countdown in the corner from the start, a clear prompt in the final days, and a purchase screen on expiry works well without nagging.

Does trial-to-paid conversion depend on licensing infrastructure?+

Yes. The trial, the countdown, and the moment of conversion are all licensing states. Reliable licensing is what lets the app show the right prompt at the right time and unlock cleanly on payment.

Ready to ship?

Create your account and start licensing your apps in under a minute. Free forever tier included.

Start Free