Cron jobs
Four jobs registered in etc/crontab.xml. All gated by config flags — nothing runs unless explicitly enabled.
| Job name | Class | Schedule | Default state | Config flag |
|---|---|---|---|---|
byte8_seosuite_ai_auto_generate | Cron\AutoGenerateMeta | */30 * * * * | Off | byte8_seosuite/ai/cron_enabled |
byte8_seosuite_index_audit | Cron\RunIndexAudit | 0 2 * * * | Off | byte8_seosuite/dashboard/cron_index_audit_enabled |
byte8_seosuite_hreflang_scan | Cron\RunHreflangScan | 30 2 * * * | Off | byte8_seosuite/dashboard/cron_hreflang_scan_enabled |
byte8_seosuite_oos_rules | Cron\RunOosRules | 0 3 * * * | Off | byte8_seosuite/oos/is_active |
byte8_seosuite_ai_auto_generate
Scans every store for entities (product, category, cms_page) with empty meta_title and no existing suggestion in the queue, then generates suggestions until the per-run budget is reached.
Class: Byte8\SeoSuite\Cron\AutoGenerateMeta
Schedule: every 30 minutes
Idempotent: Yes — re-running won't re-queue entities that already have a suggestion (any status)
Per-store config:
byte8_seosuite/ai/is_active— must beYesbyte8_seosuite/ai/cron_enabled— must beYesbyte8_seosuite/ai/cron_budget_per_run— hard cap (default 25)byte8_seosuite/ai/cron_entities— comma-separated list (default:product,category,cms_page)
byte8_seosuite_index_audit
Runs every registered AuditorInterface, persists findings to byte8_seosuite_index_issue, purges previous scans. Posts to admin notification inbox if errors detected and notify_on_errors = Yes.
Class: Byte8\SeoSuite\Cron\RunIndexAudit
Schedule: daily 02:00
Notification: via Magento\Framework\Notification\NotifierInterface::addMajor() when errors > 0
Config:
byte8_seosuite/dashboard/cron_index_audit_enabled— must beYesbyte8_seosuite/dashboard/notify_on_errors— controls bell-icon notification
byte8_seosuite_hreflang_scan
Runs the hreflang validator and persists results to byte8_seosuite_hreflang_issue. Same notification behaviour as the index audit.
Class: Byte8\SeoSuite\Cron\RunHreflangScan
Schedule: daily 02:30
Config: byte8_seosuite/dashboard/cron_hreflang_scan_enabled
byte8_seosuite_oos_rules
The Out-of-Stock Rules Engine. Per store: tracks newly OOS products, untracks restocked ones (reverting noindex), applies the configured action to rows past the threshold.
Class: Byte8\SeoSuite\Cron\RunOosRules
Schedule: daily 03:00
Per-store config:
byte8_seosuite/oos/is_active— must beYesbyte8_seosuite/oos/threshold_days— default 30byte8_seosuite/oos/action—noindex(default),redirect, ordisablebyte8_seosuite/oos/redirect_to_root_if_no_category— forredirectaction only
See OOS Rules Engine.
Verifying
bin/magento cron:status
Look for the four byte8_seosuite_* rows. If they're missing, run bin/magento cache:flush config to reload etc/crontab.xml.
bin/magento cron:run --group=default
Forces a one-shot cron pass. The audits will run (if enabled) and you should see new rows in their respective tables.
Logs
All four jobs log to var/log/system.log via Psr\Log\LoggerInterface. Grep:
tail -f var/log/system.log | grep "SEO Suite"
Successful runs log a one-line summary; failures log the exception message + stack trace.
Disabling without unscheduling
Set the config flag to No. The job still ticks at its schedule but exits immediately when it sees the flag is off. No cron unregistration needed.
To fully unschedule (e.g. you want zero overhead from this module's cron entries), override etc/crontab.xml in your project layer with empty <job> elements bearing the same names.
Adjusting schedules
Override the schedule in app/etc/cron_groups.xml or via magento_cron_schedule overrides at the project layer. Or edit etc/crontab.xml in your fork. We chose 02:00 / 02:30 / 03:00 to spread load and avoid overlapping with Magento's own indexer reschedule jobs.
If you have a high-traffic store that doesn't quiesce overnight, consider moving them to whatever your lowest-traffic window is.