Renewal Sync: Only charge the customer 3 times if they choose a 3-month long subscription, rather than 4 times if not in the Grace period
In the WooCommerce Subscriptions settings, you can choose to Synchronise Renewals by ticking a box that says "Align Subscription Renewal Day". You can then choose different "Prorating First Payment" options, one of them being "Charge full amount at sign-up", and optionally you can add a Grace period, as described in their documentation here: https://docs.woocommerce.com/document/subscriptions/renewal-synchronisation/#charge-full-amount-at-signup
This link gives an example for physical products like subscription boxes, which is exactly what my business does. Before the 15th of the month the customer pays for the box of the current month, and then the payment renews on the 1st of the next month, etc.
The problem arises if you set an expiry date to the subscription (via the Expires after field). In my case I set the subscription to expire after 3 months.
In that case the customer pays for the current month AND the next 3 months, so a total of 4 months... but the customer selected an option saying "3 months"... On the product page it says "Pay $XX today, and then on the 1st of the month for 3 months". It is confusing to them (and to me).
Within the set Grace period (i.e. after the 15th of the month) the customer doesn't pay anything at sign-up, and starts paying on the 1st of the next month for 3 months, which makes sense. (Although as I'm writing this, even this function doesn't work).
I've contacted support and apparently this is a default normal behaviour, which I find quite illogical. If the customer is expecting to pay for 3 months, they should be charged only 3 times.
A simple tick box saying "Skip the last payment" or "Customers makes 3 payments in total" should do the trick. Ticking that box would enable a feature that would go more or less like this:
Automatically change the number of months in the “ Expires after" field to + or - 1 month depending on the time of the month, i.e. I create a subscription with the "Expires after" field to 3 months. When a customer visits the site, and the date is before the 15th of the month, then change the Expiry date field to its Default value minus 1 (in other words, to 2 months). If the date is after the 15th of the month, then do nothing.
The customer would see "Pay $XX now, and then on the 1st of the month for 2 months" before the 15th, and "Pay $XX on the 1st of the month for 3 months" after the 15th.
As simple as that.
At the moment my workaround is to manually do what I said above, i.e. change the "Expiry date" of my subscription to 2 months on the 1st of the month, and then change it to 3 months on the 15th. Believe me, it isn't efficient.