Ir al contenido

Puntuación SEO: transparente, versionada y propia de Pro ​

El scan de Pro asigna a cada página una puntuación SEO de 0 a 100. Es un indicador familiar para quien viene de Rank Math o Yoast, pero completamente auditable: cada punto descontado corresponde a un problema del scan, y el mismo conjunto de problemas produce el mismo número.

score = 100 − Σ penalty(issue) for each scored issue   (floored at 0)

Un número con un único responsable

La puntuación numérica pertenece a Pro y se guarda en seo_scan_results, nunca en seo_meta del núcleo. La antigua columna seo_score se eliminó en Core 3. La auditoría gratuita seo:audit muestra pass / warn / fail por página sin número.

Reglas de puntuación ​

Se calcula con unas reglas publicadas y versionadas, Rankbeam\Seo\Pro\Scanning\ScoreRubric: una lista explícita de códigos que cuentan y una penalización fija por gravedad.

GravedadPenalizaciónSignificado
critical−40Hallazgo de impacto alto según estas reglas
warning−15Hallazgo que conviene investigar pronto
notice−5Mejora secundaria

La gravedad se lee directamente del registro de problemas, sin volver a calcularla. Cada código tiene una sola gravedad para mantener el determinismo.

Qué cuenta ​

Son comprobaciones deterministas seleccionadas por Rankbeam, incluidas heurísticas que requieren interpretación editorial. Critical resta 40, warning 15 y notice 5. El resultado no predice el rendimiento en búsquedas.

CódigoGravedadPenalización
missing_titlecritical−40
missing_descriptionwarning−15
missing_og_imagenotice−5
duplicate_titlewarning−15
duplicate_descriptionwarning−15
title_too_longwarning−15
title_too_shortnotice−5
description_too_longwarning−15
description_too_shortnotice−5
robots_conflict_indexingcritical−40
robots_conflict_followingwarning−15
noindex_warningwarning−15
invalid_canonicalcritical−40
cross_domain_canonicalwarning−15
shared_canonicalnotice−5
insecure_canonicalwarning−15
http_errorcritical−40
empty_responsecritical−40
missing_canonicalnotice−5
missing_h1notice−5
missing_image_altwarning−15
thin_contentnotice−5
mixed_contentwarning−15
canonical_target_brokencritical−40
canonical_target_redirectwarning−15
canonical_target_noindexwarning−15

Las comprobaciones de metadatos se realizan en scans de modelo; las de HTML y red, solo en scans de URL, según las clases de ejecución. Por eso, un modelo puntúa sus metadatos y una URL su página renderizada. Un 100 en el modelo significa que no se detectaron defectos de metadatos, no que la página renderizada sea perfecta; analiza también la URL.

Qué se excluye deliberadamente ​

Los siguientes códigos del registro no cuentan. Una prueba verifica que cada código del registro esté puntuado o incluido en esta lista:

CódigoMotivo de exclusión
missing_focus_keywordOrientativo. Depende del flujo opcional seo.keywords.enabled. No usar palabras clave objetivo no debe reducir la puntuación ni hacer que dependa de una opción.
noindex_pageInformativo. noindex puede ser deliberado. La heurística noindex con canonical propio se puntúa mediante noindex_warning.
multiple_h1Informativo. Google admite varios H1; no hay penalización por ello.
blocked_urlFalta de evidencia. SsrfGuard rechazó la petición y la página no se comprobó; no demuestra un defecto de la página.
canonical_target_blockedFalta de evidencia. No se pudo verificar el destino canonical.
hreflang_invalid_code, hreflang_missing_self_reference, hreflang_duplicate_code, hreflang_missing_x_defaultOrientativos por ahora. Son códigos hreflang de Pro; la auditoría gratuita tiene sus propios códigos. No alteran la puntuación; incluirlos exigiría cambiar VERSION.
html_lang_missing, html_lang_invalid, html_lang_mismatchOrientativos. Las comprobaciones de idioma quedan fuera de estas reglas.
hreflang_not_reciprocalOrientativo. Comprobación opcional de reciprocidad sin puntuación.
hreflang_target_unverifiedFalta de evidencia. No se pudo verificar la reciprocidad.
aeo_missing_author, aeo_article_missing_dateOrientativos. Señales de preparación para respuestas: artículo sin autor o fecha. Aparecen en el scan y la auditoría gratuita, pero puntuarlas exigiría cambiar VERSION.

La densidad de palabras clave, las palabras persuasivas y el resto de la lista de comprobación de página tampoco intervienen. Son comprobaciones orientativas pass/warn/fail separadas, no códigos del registro.

Versionado: las puntuaciones históricas no cambian silenciosamente ​

Cada puntuación guarda la ScoreRubric::VERSION que la produjo en rubric_version:

  • Un código nuevo no puntúa hasta que se añade expresamente a la lista. Publicar una comprobación no cambia retroactivamente resultados guardados. Cambiar la lista o los pesos exige una nueva versión de las reglas.
  • La puntuación se guarda y no se recalcula al leerla. El número de la semana pasada se conserva junto con la versión que lo explica.

Dónde se guarda ​

Cada scan inserta o actualiza una fila por objetivo en seo_scan_results:

ColumnaContenido
scannable_type / scannable_idModelo puntuado; null para objetivos URL
urlURL puntuada
scoreNúmero de 0 a 100
rubric_versionVersión de las reglas
penalty_totalSuma de penalizaciones antes de aplicar el mínimo de cero
scored_issuesNúmero de problemas que alteraron la puntuación
breakdownTraza completa: [{code, severity, penalty}, …]
keywords_enabledEstado de seo.keywords.enabled durante el scan; se registra por transparencia y no afecta al número
scan_run_idEjecución que lo calculó; se pone en null al limpiar la ejecución, sin eliminar el resultado, que representa el estado actual
scored_atMomento del cálculo

Consultar la puntuación ​

Sin panel, último resultado de un modelo:

php
use Rankbeam\Seo\Pro\Facades\SeoPro;

$result = SeoPro::resultFor($post);

$result?->score;     // e.g. 85
$result?->grade();   // 'A'..'F'
$result?->breakdown; // [['code' => 'cross_domain_canonical', 'severity' => 'warning', 'penalty' => 15]]

php artisan seo-pro:scan-status muestra la media del sitio. El panel Filament la presenta como «Avg. SEO score», con color según la categoría.

Categorías ​

La letra es una representación visual derivada del número; el contrato es el número:

PuntuaciónCategoría
90-100A
75-89B
50-74C
25-49D
0-24F

Señal que revisar antes de publicar: noindex_warning ​

noindex_warning se activa al combinar noindex con un canonical propio, que apunta a la URL de la misma página. Rankbeam lo considera una señal que conviene revisar. Un canonical propio no demuestra intención de indexar: la combinación puede ser deliberada. Un canonical entre dominios no activa esta heurística. El problema incluye context.shipping_signal, por ejemplo self_canonical, y los valores comparados canonical y page_url.

Ambos escáneres aplican la comprobación. PageScanner compara el canonical guardado con la URL del modelo. UrlScanner convierte un noindex_page informativo en noindex_warning puntuado si el canonical es propio. Por eso noindex_page queda excluido: el posible conflicto se trata con noindex_warning en ambas vías. Revisa la intención real de la página antes de cambiar robots.

Configuración ​

php
// config/seo-pro.php → 'scan'
'score' => [
    'enabled' => true, // turn the scoring pass + its persistence on/off
],

La lista de códigos y los pesos no son configurables. Una misma rubric_version debe ser determinista en todas las instalaciones; cambiar el cálculo exige modificar las reglas en el código, no una opción.

rankbeam/laravel-seo se distribuye bajo la licencia MIT.