Skip to main content

Index Budget Audit

Magento has a long list of ways it'll waste a search engine's crawl budget by default. The Index Budget Audit detects the worst offenders, persists them to a grid, and offers per-row Apply-Fix actions on the auto-fixable ones.

Why crawl budget matters​

Google assigns each site a finite crawl budget — how many URLs Googlebot will fetch from your domain per day. If you waste it on:

  • Disabled products that still resolve at their old URL
  • Filtered category URLs (?color=red&size=10) that produce thousands of permutations
  • Out-of-stock products you'll never restock
  • Layered-nav explosion from too many filterable attributes

…then Googlebot never gets around to your important pages. The Index Budget Audit is about reclaiming that budget.

What ships​

Five auditors out of the box, all independently togglable:

CodeSeverityWhat it detectsAuto-fix?
out_of_stock_indexablewarningEnabled products that are OOS but not noindex'd✅ Set meta_robots=noindex,follow
disabled_url_rewritewarningDisabled products that still have url_rewrite rows✅ Delete the orphaned rows
layered_nav_explosionwarning/errorToo many filterable attributes producing combinatorial URL explosion— (config recommendation)
canonical_configwarning/errorMagento's catalog/seo/*_canonical_tag configs are off— (config recommendation)
cms_missing_metainfoActive CMS pages with empty meta_title or meta_description— (links to AI Meta Generator)

Plus per-row Generate AI Meta action on cms_missing_meta findings when AI is configured.

Running​

Once:

bin/magento seosuite:index:audit

Or click Run Audit in the Marketing → SEO Suite → Index Budget Audit toolbar.

Nightly:

Stores → Configuration → SEO Suite → Admin Dashboard → Enable nightly Index Budget audit (cron) = Yes

The cron job byte8_seosuite_index_audit runs at 0 2 * * * daily. With notify_on_errors = Yes, errors post to the admin bell-icon inbox.

Output format​

+------------+--------+-------------+-----------+--------+----------------+----------------------+
| Severity | Code | Auditor | Entity | Store | Target / URL | Message |
+------------+--------+-------------+-----------+--------+----------------+----------------------+
| warning | … | out_of_stock_indexable | product | 1 | 1234 / /awp.html | Product "AWP-001" is out of stock but still indexable. |
+ recommendation: Set Meta Robots to "noindex,follow" until restocked, or 301 to a category if the SKU is permanently gone. +

Every finding includes:

  • severity (error / warning / info)
  • code — programmatic identifier
  • auditor — which auditor produced it
  • entity_type + target_id + store_id for grid filtering
  • url — the affected URL where applicable
  • message — human description
  • recommendation — one-line suggested fix

How findings are persisted​

Each scan is tagged with a fresh scan_id (scan-YYYYMMDD-HHMMSS). Old scans are purged so the grid only ever shows the latest state — no historical drift, no growing tables.

CLI options​

bin/magento seosuite:index:audit
[-l <limit>] # Cap entities scanned per auditor
[-a <codes>] # Comma-separated auditor codes (default: all)
[-f json|table] # Output format

Run a single auditor:

bin/magento seosuite:index:audit -a out_of_stock_indexable

JSON for CI:

bin/magento seosuite:index:audit --format json

Exit code is 1 if any errors found.

Resolving findings​

Three resolution paths:

  • Apply Fix (per row, on out_of_stock_indexable and disabled_url_rewrite only) — runs the deterministic fixer
  • Generate AI Meta (per row, on cms_missing_meta) — calls Claude and queues a suggestion
  • Mass Dismiss — bulk mark resolved without action (for findings that are intentional/known-acceptable)

A row marked resolved stays in the table but won't show per-row actions. The next scan re-evaluates and either re-creates the finding (if the underlying issue persists) or leaves it absent.

Next​

  • Auditors — what each auditor checks, in detail
  • Extending — write your own AuditorInterface