If you distill these things down into simplest terms, All you need is a mode switch. So the program functions depending upon it's current state.
Eg.
Constant FreeMode = 0
Constant RetailMode = 1
Global Program_State = FreeMode
Throughout the program code, all we're doing is checking the state and reacting to it.
Say saving is disabled for free users. Then in the save routine, there would be the obligatory check and reaction. Or alternatively simply not even show the save option when in free mode.
Function Save_Stuff()
if Program_State = FreeMode
pop buy me... buy me... NAG screen ..
exiffunction
endif
; do saving or whatever
EndFunction
Now there's a few obvious problems, namely since the Free and Retail modes are all self contained within the same binary, users will eventually work out a way to switch on retail mode without paying for it. But ignoring that for the time being.
Further simplification and all we're really talking about here is an old school shareware app, that requires activation every month. Normally the customer orders the program through some 'payment portal' where there's either automated response (server level) or the manual progressing of that order data.
With 3rd party portals the order process is generally transparent to the developer, they handle the money side and send you a notification when successful orders comes in. You then send the customer a 'serial / key ' or the 'private retail build' of the application.
When the program is activated by the user, they're either typing in a serial or directing the app to a local copy of their custom user key (or whatever you want to call it). When a valid Serial/Key is present, the program can either take for granted that it's valid, or request a further match from the external server. You wouldn't send the raw 'serial.key' here, rather some mangled hash of the serial/key data. If successful, the APP flips the Program_State to retail mode.
To make this monthly, external validation feels like a better option. The program could store information locally, but then it's only a matter of time before somebody susses out what the local data files are and works out to extend the retail period. Turning the system date back is the most obvious way.
So an alternative model might be that the user orders a KEY, this key activates retail mode. When in retail mode, the program always verifies it's state by querying the server (at some interval, on startup.. or whatever). The server stores the active state of the key locally, so when a customer has paid for a month then the server is allowed to return positive response, if they haven't, it's negative. The communication here would need to be pretty tight though (ie redirection/spoofing).
Personally, I think monthly is way too frequent for any application. Every 3 months seems a little more comfortable, but not much. All comes down to what you're protecting really. I'd imagine if the software is really useful to somebody, they'd much rather purchase a yearly license.
Note: To be very clear, all of above is very crude simplification of the such mechanics.