Testing update (s2member, WP Email Log and default theme only)
I delete the 5 test users and re-import them, each has a different EOT time set to trigger each of the 5 EOT reminders. I trigger the cron and all 5 reminders get sent.
I re-enable all plugins and the theme, repeat above and all the reminders also get sent, same result.
...all the emails are logged and everything looks good. But there still must be some difference that is happening in the live site.
UPDATE: Oct 8
Digging through S2 code to better understand how reminders are generated I found some clues in reminders.inc.php
$user_ids_to_exclude = '
SELECT DISTINCT `user_id` AS `ID` FROM `'.$wpdb->usermeta.'`
(`meta_key` = \''.$wpdb->prefix.'s2member_last_reminder_scan\' AND `meta_value` >= \''.esc_sql($scan_time).'\')
OR (`meta_key` = \''.$wpdb->prefix.'s2member_reminders_enable\' AND `meta_value` = \'0\')
$scan_time = apply_filters('ws_plugin__s2member_pro_eot_reminders_scan_time', strtotime('-1 day', self::$now), get_defined_vars());
The meta key, wpqa_s2member_last_reminder_scan, looks like it is supposed to get set with the scan time value and then be re-scanned each 24 hours (-1 day). When I look through the database I see 100's of users who have a last scan time from last year. So clearly they are not being re-scanned and so no emails are being generated.
I'm now curious now why they wouldn't be scanned? I'm going to guess that the ones that have been scanned recently are the ones that have received notifications.