Yeah I had the same thing three days ago, but forgot to bring this up here:
A while ago, I replaced a certificate with a different one (forgot one name initially, then added it later) and I only received one expiry email which was for the ~1 day remainder, stating:
[...] Your certificate (or certificates) for the names listed below will expire in 0 days (on 12 Sep 21 17:03 +0000). [...]
[Email date header stated email was send on Sun, 12 Sep 2021 08:03:02 +0000, received about two seconds later]
The email for twenty days and ten days was never received on my end. I double checked all logs, all mailservers were fully operational and no related email was blocked.
We had also another report recently, suggesting that they had similar behaviour.
It does look like something weird is going on with the expiry mailer.
Hmm. I don't know as it's particularly helpful for me to bring it up, but if you want another data point: When I've gotten reminder emails (for when I've added/removed names or no longer needed a server name), I've only ever (that I can still find in my inbox at least) received a 20-day and a 10-day reminder, but no 1- or 0-day reminders. My most recent (production) emails were from February, though, so perhaps things have changed since then.
It doesn't look like I've ever had a 1- or 0-day reminder from the staging environment, either (most recently I got a 20- and 10-day reminder in July), but it's possible that the staging environment is intentionally configured differently so I don't know as that's a useful thing to look at.
It's also worth checking your own email systems spam filtering policy. Many services auto-reject email IPs which have been marked as spam, which is extremely common for services like mandrill or sendgrid. The IPs are generally shared and eventually an IP will be reported for spam which is then distributed to various email spam blockers and your emails will be variously rejected.
LE probably see a significant percentage of emails rejected in this way and all they can really do is wait for the IP to be moved out of production in the pool of mandrill servers. They can pay for dedicated IPs but each IP needs to be "warmed up" to not get blocked by default, then of course someone can come along an report it as spam the you're back to square one.
This is why some ACME clients (such as the one I develop) can report to a status reporting API which in turn can also send notifications and log to a dashboard, you can also set webhooks etc to call for failures etc. Likewise with certbot has post validation hooks but I don't know much about those.
The other method is to periodically check your renewals manually.