Short answer: let the cron-like scheduler create a small, idempotent sweep command, and let a worker queue own the long-running report job. Keep reservation expiry separate from report rendering. The important boundary is not the timer; it is the retry contract. A repeated trigger must enqueue equivalent work, a repeated worker delivery must not send a second email, and a delayed report must never extend a reservation that has already crossed its fixed hold window.
For a B2B SaaS daily report email, I would set the report's schedule and the reservation's expiry policy independently. A 24-hour hold is a business rule, not a queue timeout. The scheduler can wake every 5 minutes, discover due work, and enqueue a stable job key. Workers can then spend minutes on report generation without making the scheduler wait.…