I use taskwarrior for this. For example:
task add recur:monthly due:eom wait:due-3weeks clean mesh filter
task add recur:quarterly due:eoq wait:due-3weeks replace charcoal filter
There are quite a few web frontends to it too, although I haven't tried these out so not sure which to recommend.