I would suggest dividing the circuit into two parts:
TABLE: users user_id (PK) email_address password_hash .... TABLE: user_status user_status_id (PK) user_id (FK) status_date status_value
The current status of this account matches the current status. When a user subscribes to a "free" account, you insert the account into user_status with the status "new_free_status"; when the account expires, you insert an entry with the status "free_account_expired". You use the status to check if the user can log in or not; if you want people to register at least one month after the expiration of the free account, you check the user status record to see when their account was closed.
You can, of course, create another lookup table called "status" and join the table with "account_type" - this way your data will become more self-describing.
The key point in this project is that you want to separate the user profile from the current state and keep track of this status over time. This allows you to answer questions such as "how many people signed up for a paid account after a trial version?", "How long do people renew between signing up for a free account?", "How many users return for another test?" and etc.
source share