A sale that ended in June doesn't quietly delete itself off your website in July. Neither does a job posting for a role you already filled, or a "join us this Saturday" event that happened three Saturdays ago. Someone has to log in and take it down, and on a lot of small business sites, nobody ever does.
Every post on Cantrip now has its own expiration date, right next to the one that sets when it goes live. Pick a date, and the post stops showing up on its own. Nothing to circle back for.
The date works the way you'd actually describe the thing to a person, not the way a database would. Set a post to expire on the 15th and it stays up for all of the 15th, then disappears once the 16th starts. "The sale ends the 15th" means the 15th still counts, so that's how Cantrip treats it, instead of cutting the post at midnight the morning of.
This isn't the same mechanism as the date that makes a post go live in the first place. That one only holds a post back if the collection itself is set up to pay attention to dates, a setting that's easy to leave off without noticing. Expiration doesn't share that dependency. Set an end date on a post and it's honored no matter what the rest of the collection is configured to do.
It's built for anything that already has a real end baked in: a spring discount code, a pop-up event, a class session, a job listing, a fundraiser with a deadline. Type it up once, set the date it stops mattering, and get on with your week instead of putting a reminder on your own calendar to come back and clean up your own website.
When a post expires, it doesn't just quietly drop off the collection page and leave the rest alone. It stops answering at its own direct link, disappears from the sitemap, and drops out of the RSS feed if you've got one turned on. Gone everywhere at once, not tucked out of sight in one corner while the old link still works for anyone who bookmarked it.