7 answers
Workflow is your best bet to do this! It can do Time Dependent Workflow Actions that will schedule in the future before a date (date determined by any date field on your object). This will require some form of update to happen at some point between record creation and that date, but that can simply be when your "Bill Date" is filled in.
https://help.salesforce.com/articleView?id=000005245&type=1
The nice thing about time dependent workflows vs. using process builder is that if your bill date ever changes on a record, the workflow will re-evaluate itself and adjust itself to send X months before the new date, rather than holding onto that original date for the message.
Your other option is writing apex code to do this and scheduling the code to run on a daily interval, see what messages need to go out, and then send them. But using code to do something you can do with clicks isn't best practise, unless some aspect of using workflow won't work in your use case.