I haven't looked at the mod, but here are my thoughts anyway.
There are basically two approaches you could choose: 1) Write the "archived" entries to the same database file than the other ones, but mark them (e.g. by adding a select field "archived" with "yes", "no", "pending" and "disabled"), 2) use a different database file.
I'll start out with the first approach.
I would suggest adding two fields to the database, if they aren't there already, and then performing actions depending on what they contain: First, a field for the date when the record was added, second, a field called "archived" with values "yes", "no", "pending" and "disabled". "Disabled" means these are regular database entries, "yes" means they are the ones that users already tried to add in the past, "no" means they're added recently and the user hasn't paid yet, "pending" means you already sent a warning email "pay or the record will not be added" to the user, but they haven't replied yet.
I'm assuming users login with a username, and not as "default", and I also assume that the database contains a field with a user id.
So you'd have to do the following things:
1) If a user adds a record: Check whether the database contains records where "archive" = "yes" where the field "userid" (or whatever it's called) = current user id, and whether it is significantly similar to the one the user tries to add. By "significantly similar", I mean you'd have to decide based on what fields you check a new record against existing ones - you'd probably want to use fields which are obligatory and where chances of variation are next to zero (postal codes, names of towns, countries, people - comment fields would be a bad idea). Full identity in all fields might be a problem, because simply throwing in a typo here and there would result in the record not being rejected. This is perhaps the trickiest part of the whole routine. Are you sure that "userid", "mail" and "state" are specific enough?
Anyway, if your standards for significant similarity are met, then the record is not added: The user gets an error screen saying "You have already tried to add a record with the values X, Y and Z in the fields A, B, and C. Please report to the administrator if the record you're presently trying to add is indeed different from that one." (for politeness - it might turn out not to be the same record after all.)
I'd code this as a separate subroutine, called from add_record in db.cgi.
2) Whenever dbman starts up: Check all records where "archive" = "no". If their "date added" field has a date more than 30 days back, send a message to the user that contains the record (I reckon their mail address is in the database as well) and asks them whether they'd like to pay the membership fee.
At the same time, set "archive" to "pending" and update the "file added" date to the current one. That way you make sure dbman doesn't send warning messages to users more than once, and you can also check how long it takes until users reply.
In the same routine, you can check: If there's a record with "archive" = "pending" for longer than XX days, set "archive" to "yes". This has the benefit that you'd only have to "de-archive" records manually - like, when the user pays their fees and sends you a mail, you'd have to change the value of "archive" to "disabled" (you can code a link to that routine in your admin interface to make that easier). When they don't, the record will automatically be moved from "pending" to "yes" after a certain amount of time.
This would be a separate subroutine, checked whenever dbman starts up (e.g right after auth_cleanup in db.cgi).
How does that sound?
kellner