WP-Cron is switched off and nothing replaced it
The cause more often than all the others combined
Someone — a host, a speed-optimisation guide, a previous developer — added a line
to wp-config.php that disables WordPress’s built-in scheduler, and
never set up the real server cron job that was supposed to replace it. The store
works fine. Nothing background does.
Search wp-config.php for this line:
define( 'DISABLE_WP_CRON', true );
Either delete that line, or — better on a busy store — keep it and add a real cron job in your hosting panel, so the queue runs on a schedule you control:
*/5 * * * * curl -s https://your-site.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1