Skip to main content

Cron jobs

Four jobs registered in etc/crontab.xml. All gated by config flags — nothing runs unless explicitly enabled.

Job nameClassScheduleDefault stateConfig flag
byte8_seosuite_ai_auto_generateCron\AutoGenerateMeta*/30 * * * *Offbyte8_seosuite/ai/cron_enabled
byte8_seosuite_index_auditCron\RunIndexAudit0 2 * * *Offbyte8_seosuite/dashboard/cron_index_audit_enabled
byte8_seosuite_hreflang_scanCron\RunHreflangScan30 2 * * *Offbyte8_seosuite/dashboard/cron_hreflang_scan_enabled
byte8_seosuite_oos_rulesCron\RunOosRules0 3 * * *Offbyte8_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 be Yes
  • byte8_seosuite/ai/cron_enabled — must be Yes
  • byte8_seosuite/ai/cron_budget_per_run — hard cap (default 25)
  • byte8_seosuite/ai/cron_entities — comma-separated list (default: product,category,cms_page)

See AI Cron auto-generation.

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 be Yes
  • byte8_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 be Yes
  • byte8_seosuite/oos/threshold_days — default 30
  • byte8_seosuite/oos/actionnoindex (default), redirect, or disable
  • byte8_seosuite/oos/redirect_to_root_if_no_category — for redirect action 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.