---
title: "Discussion on \"Lemon Squeezy subscription statuses: who should keep access, and the two bugs I shipped\" | Hashnode"
description: "Discussion on \"Lemon Squeezy subscription statuses: who should keep access, and the two bugs I shipped\". Expired subscribers kept Pro forever and a failed payment cut access. Which Lemon Squeezy statuses grant access, and the one function that decides it."
url: "https://hashnode.com/posts/lemon-squeezy-subscription-status-access/6af41de49b97a11545ad9202"
---

[Feed](https://hashnode.com/feed) /

Discussion

# [Lemon Squeezy subscription statuses: who should keep access, and the two bugs I shipped](https://mohamedgado.hashnode.dev/lemon-squeezy-subscription-status-access?utm_source=hashnode&utm_medium=feed)

Expired subscribers kept Pro forever and a failed payment cut access. Which Lemon Squeezy statuses grant access, and the one function that decides it.

1d ago · 5 min read · mohamedgado.hashnode.dev  
Read the article

-   [#saas](https://hashnode.com/tag/saas)
-   [#typescript](https://hashnode.com/tag/typescript)
-   [#nextjs](https://hashnode.com/tag/nextjs)
-   [#webdev](https://hashnode.com/tag/webdev)

## Written by

[Mohamed Gado](https://hashnode.com/@mohamedgado)

@mohamedgado · Tanta, Egypt

  
[View profile](https://hashnode.com/@mohamedgado)

Senior Software Engineer · React, Next.js, React Native · Building Masareef & Rafiq

Senior Software Engineer with 6+ years building web and mobile products in React, Next.js and React Native. I build and ship Masareef and Rafiq on my own. Originals live at mohamedgado.com/writing.

## Responses 1

Markdown supported · ⌘↵ to post

[OneLifeVibe](https://hashnode.com/@onelifevibe)

[23h ago](https://hashnode.com/posts/lemon-squeezy-subscription-status-access/6af41de49b97a11545ad9202/comment/6af4325f197d9d1475c89eca)

This is a really clear write-up of a trap that is easy to fall into. The part that stood out to me is that the two bugs pointed in opposite directions at the same time — expired subscribers quietly keeping unlimited Pro while a customer with a failed card lost access on the first retry. That asymmetry is exactly why billing bugs are so hard to notice from the outside. Making one pure function decide entitlement with the clock passed in is a neat fix, and the test that walks every Lemon Squeezy status so the two lists cannot drift apart again is the part I will be borrowing. Thanks for laying out the status table so plainly — the cancelled-until-ends\_at distinction alone is worth remembering.
