View Categories

SEO Reports and Site Scans

RackHelm can produce AI-written SEO reports for a customer’s hosted website: a scan of the live site, a short review step where the customer confirms their brand details, and then a generated report they can read in the portal or download as a PDF. Operators watch every scan from the admin area; customers run them from their own site. This article covers both.

Before you start #

Note: Viewing scans in the admin area needs view_seo_reports; deleting one needs the separate manage_seo_reports permission, so a read-only role cannot remove records. Both are held by the built-in Administrator role.

SEO reporting is a licensed integration. Configure it under Integrations → AI SEO Reporting: switch Enable AI SEO Feature on and enter your AI SEO License Key. The SEO tab only appears on a customer’s website dashboard when both are in place. The scan itself also needs the site to have a domain — a website service with no domain recorded returns “Domain not found for this site.”

Settings that control who may scan #

Field What it does
Enable AI SEO Feature Master switch for the integration. With it off, the SEO tab is not shown to customers.
AI SEO License Key Authenticates you with the SEO service. Stored write-only — the field shows dots once a key is saved and stays blank on load; leave it blank to keep the current key.
Default Paid Scans Allowed Allowance for customers who hold the AI SEO add-on. -1 means unlimited — the shipped default. 0 means no scans at all. An individual add-on, or a selected add-on option, can override it.
Default Paid Reset Period (Days) Rolling window for the paid allowance. 0 means the allowance is for the lifetime of the service.
Enable Freemium Mode Lets customers who do not hold the AI SEO add-on run a limited number of scans. Off means only add-on holders may scan at all.
Free Scans Allowed How many scans a non-add-on customer gets per site. Ships as 1. A role can override it.
Reset Period (Days) Rolling window for the free allowance; 0 means lifetime.
Allow Users to Delete Scans Lets customers remove their own scan records. Deleting a scan never resets the freemium counter, whatever this is set to.
Freemium Paywall Message The wording shown when a customer runs out of free scans — up to 500 characters.
Enable PDF Export Controls whether a completed report is also rendered as a downloadable PDF.

Warning: 0 and -1 are not interchangeable. -1 is the “unlimited” sentinel; 0 denies scanning entirely.

Warning: Every switch on this screen reads as off until the form has been saved at least once, even where the wording suggests otherwise — an unsaved setting has no stored value and is treated as off. Open the screen, set each switch deliberately and save, rather than assuming a default.

What the customer does #

From their website’s dashboard the customer opens the SEO section at /sites/{site}/seo:

  1. Start an analysis. The scan is created and the site is submitted to the SEO service. Only one analysis per site can be in flight at a time.
  2. Review the brand details. When the service reports back, the scan moves to a review step where the customer checks the brand information that was extracted from their site and picks a language.
  3. Generate the report. That confirmation triggers the report itself.
  4. Read or download it. When the report lands, it is viewable in the portal, and downloadable as a PDF if Enable PDF Export is on.

Scans and allowances belong to the account, not the individual login, so sub-accounts share the primary account’s quota. Failed scans do not burn an allowance; deleted ones do.

The admin view #

Open Reports → SEO Reports. The screen shows counters for total, completed and pending/running scans plus the average run time, with filters for status and for a single customer.

The admin SEO Reports list with summary cards, a status filter and a table of scans
Every scan on the system, with the customer, the website URL, when it was requested and how long it ran.

Select a row to read the stored report and the brand details captured for it. Deleting a scan from here is permanent from the operator’s point of view and requires manage_seo_reports.

A per-customer view of the same data is available on the client record, under Clients → (customer) → SEO Reports.

Scan states #

State Meaning
Pending analysis Submitted to the SEO service; waiting for it to call back.
Waiting user confirmation The analysis returned. The customer must review the brand details before a report can be produced.
Generating report Report generation has been requested and is running.
Completed The report is stored and readable.
Failed The service rejected the request or reported an error. Does not count against the allowance.

Results arrive by webhook. Each callback URL is signed and expires 24 hours after it is issued, and the review step is issued a fresh signature of its own rather than reusing the first one.

Troubleshooting #

Symptom Cause and fix
“AI SEO is not enabled for this package” Freemium is off and the customer does not hold the AI SEO add-on.
The customer sees the free-scan limit message They have used their allowance for that site. Raise Free Scans Allowed, set a reset window, or sell them the add-on.
“Domain not found for this site” The service has no domain recorded in its variables or provisioning metadata. Fix the service’s domain first.
“An analysis is already in progress for this domain” One scan per site at a time. Wait for it to complete or fail.
A scan sits at pending for a long time The callback never arrived. Check that your portal URL is reachable from the internet and that the signed webhook has not passed its 24-hour window; the customer can start a fresh scan.
“Report is not ready yet” The report is still generating, or the scan failed. Check the scan’s status in the admin list.
“PDF is not available or still generating” No PDF file is stored for that scan yet, or Enable PDF Export is off in the integration settings.
Setting the paid allowance to 0 gave unlimited scans Older installs treated 0 as unlimited. Use -1 for unlimited and 0 to deny.
A sub-account cannot get a fresh allowance Correct — quotas are counted per account, not per login.
The Pending/Running counter and the Pending status filter always show nothing They look for a scan whose status is literally pending, which is never written. In-flight scans are stored as pending_analysis, waiting_user_confirmation or generating_report. Read the Status column in the table instead.