Anyone selling a desktop app on subscription? stuck on something dumb
Windows desktop app, electron, everything saved locally in sqlite. no accounts, no cloud. sold monthly/yearly through lemon squeezy, they do the license keys too. Spent an hour in their sandbox yesterday and found something I wasn't expecting. when I validate…
Windows desktop app, electron, everything saved locally in sqlite. no accounts, no cloud. sold monthly/yearly through lemon squeezy, they do the license keys too. Spent an hour in their sandbox yesterday and found something I wasn't expecting. when I validate a license key for someone who's happily paying, the response says active and expires_at is null. no renewal date, nothing. the date only shows up once they cancel. so if someone's card fails on renewal, lemon squeezy retries it 4 times over about two weeks, and the whole time my app sees "active" and can't tell them apart from a paying customer. two weeks of free use I can't see. the renewal date does exist but it's behind their subscriptions endpoint which needs a store-wide api key. not putting that in a binary sitting on someone's laptop. obvious fix is a small serverless thing that holds the key and hands my app back a signed token. I get it, it's correct. but right now my app depends on nothing I own and that would change. it's just me, no ops experience, nobody to call at 3am if it falls over. so I guess what I'm asking is did you build the gateway or just live with it? and if you lived with it did anyone actually take advantage or did it stay theoretical if you built it, what broke that you didn't expect and the one I keep going back and forth on, for an offline desktop app is subscription just the wrong model. lifetime + paid upgrades makes this whole thing disappear. anyone switched either way and regretted it. not looking for "use stripe", no license keys and not a merchant of record so it's more work plus vat becomes my problem. lemon squeezy is fine otherwise.
已收录讨论
This is not an accidental gap. Lemon Squeezy documents four payment retries over two weeks and says the subscription stays active during recovery. Its licensing documentation also says a subscription license stays active until the subscription expires, which happens only after payment can no longer be retried. So the validation endpoint is reporting the intended entitlement state, not real time billing health. I would not put a store key in the binary or build a gateway just to remove that grace period. Treat the license key as the entitlement, cache a successful validation for a short, documented interval, and let Lemon Squeezy own recovery. The gateway only becomes necessary if you need a product policy that differs from Lemon Squeezy, such as immediately restricting features when an invoice first fails. Then it needs to be a tiny, boring service with a narrow signed response, key rotation, monitoring, and a failure policy you are willing to own. For a fully local app, subscription is still reasonable when updates or ongoing service create recurring value. Lifetime plus paid upgrades is simpler operationally, but it moves the same decision to release eligibility rather than eliminating it.