code, a severity, an importance, and — where a generic fix is possible — a snippet you can paste.
Issue codes are a public contract. New codes get added; existing ones are not renamed or removed without a deprecation. Branch on
code, never on title or description, which are prose and may be reworded.Severity
Importance
required tags every page needs, recommended tags most pages benefit from, optional refinements. Importance is about the tag; severity is about your page.
Score weight
Only some issues move the score, and they move it by different amounts — a missingog:image costs more than a missing og:locale because one of them decides whether anybody clicks. Issues listed below as “no score impact” are advice, not deductions.
Core HTML
missing_title
Missing title — warning, required, costs 10 points.
This page has no <title>. It is the single most important piece of metadata, used by search engines and as the fallback for most social previews.
Meta::title('Your page title');
empty_title
Empty title — warning, required, no score impact.
A <title> tag is present but contains no text.
Meta::title('Your page title');
title_too_long
Title may be truncated — tip, recommended, no score impact.
Your title is N characters. Some platforms may truncate titles longer than about 60.
No generic fix: this one depends on your own content, so
fix is null.title_too_short
Title is quite short — tip, recommended, no score impact.
Your title is N characters. Titles under about 30 often leave useful space unused.
No generic fix: this one depends on your own content, so
fix is null.missing_description
Missing description — warning, recommended, costs 10 points.
This page has no meta description. Search engines and social platforms fall back to guessing at page content without one.
Meta::description('A short summary of the page.');
description_too_long
Description may be truncated — tip, recommended, no score impact.
Your description is N characters. Some platforms may truncate longer descriptions.
No generic fix: this one depends on your own content, so
fix is null.description_too_short
Description is quite short — tip, recommended, no score impact.
Your description is N characters. Descriptions under about 70 often under-use the available space.
No generic fix: this one depends on your own content, so
fix is null.missing_canonical
Missing canonical URL — warning, recommended, costs 5 points.
No canonical URL is declared. Without one, duplicate or parameterised versions of this page may be treated as separate pages.
Meta::canonical(url()->current());
malformed_canonical
Malformed canonical URL — error, required, no score impact.
The canonical URL is not an absolute http(s) URL. Canonical URLs must be absolute to be understood correctly.
Meta::canonical(url()->current());
duplicate_canonical
More than one canonical URL — error, required, no score impact.
This page declares 0 canonical URLs. Search engines may ignore all of them.
No generic fix: this one depends on your own content, so
fix is null.missing_favicon
Missing favicon — warning, recommended, costs 5 points.
No favicon link was found. Browsers will fall back to /favicon.ico, which may not exist.
Meta::favicon('/favicon.ico');
missing_og_title
Missing og:title — warning, recommended, costs 7 points.
Without og:title, social platforms fall back to the page title, which may not be the wording you want when shared.
Meta::openGraph()->title('Your page title');
missing_og_description
Missing og:description — warning, recommended, costs 7 points.
Without og:description, shared links fall back to the meta description or to nothing at all.
Meta::openGraph()->description('A short summary of the page.');
Open Graph
missing_og_url
Missing og:url — warning, recommended, costs 5 points.
og:url tells platforms the canonical address of this page, so shares of parameterised URLs consolidate correctly.
Meta::canonical(url()->current());
missing_og_type
Missing og:type — tip, recommended, costs 4 points.
og:type describes what this page is. Most pages are “website”; articles benefit from “article”.
Meta::type('website');
missing_og_image
Missing og:image — warning, recommended, costs 10 points.
Without og:image, shared links appear as plain text with no thumbnail, which markedly reduces engagement.
Meta::image(asset('og.png'), width: 1200, height: 630, alt: 'Description');
missing_og_image_dimensions
Missing image dimensions — tip, recommended, costs 4 points.
og:image:width and og:image:height let platforms reserve layout space before the image loads, avoiding a reflow in the preview.
Meta::image(asset('og.png'), width: 1200, height: 630);
missing_og_image_alt
Missing og:image:alt — tip, optional, costs 3 points.
Alt text describes the preview image to people using screen readers. Optional, but a small accessibility win.
Meta::image(asset('og.png'), alt: 'Description of the image');
missing_og_site_name
Missing og:site_name — tip, optional, costs 2 points.
og:site_name lets platforms show your site name alongside the shared link. Optional.
Meta::siteName('Your Site');
missing_og_locale
Missing og:locale — tip, optional, costs 2 points.
og:locale declares the language and region of this content, such as en_US. Optional.
Meta::locale('en_US');
Twitter Cards
missing_twitter_card
Missing twitter:card — warning, recommended, costs 5 points.
Without twitter:card, X may render a smaller preview or none at all. “summary_large_image” gives the full-width image card.
Meta::twitter()->card('summary_large_image');
missing_twitter_title
Missing twitter:title — tip, optional, costs 4 points.
X falls back to og:title when twitter:title is absent, so this only matters if you want different wording there.
Meta::twitter()->title('Your title');
missing_twitter_description
Missing twitter:description — tip, optional, costs 4 points.
X falls back to og:description when twitter:description is absent.
Meta::twitter()->description('A short summary.');
missing_twitter_image
Missing twitter:image — tip, optional, costs 5 points.
X falls back to og:image when twitter:image is absent.
Meta::twitter()->image(asset('og.png'));
missing_twitter_site
Missing twitter:site — tip, optional, costs 2 points.
twitter:site attributes the content to your account handle. Optional.
Meta::twitter()->site('@yourhandle');
Images
image_inaccessible
Social image could not be loaded — error, required, costs 2 points.
The image at null could not be loaded (unreachable). Platforms will show your link without a thumbnail.
No generic fix: this one depends on your own content, so
fix is null.image_too_small
Social image is small — tip, recommended, no score impact.
Your image is N by N. Platforms commonly render large cards at around 1200 by 630, and smaller images may be shown as a thumbnail instead.
No generic fix: this one depends on your own content, so
fix is null.image_dimensions_mismatch
Declared image dimensions do not match the file — warning, recommended, no score impact.
The page declares N by N, but the file is N by N. Platforms that trust the declared size may lay the preview out incorrectly.
Meta::image(asset('og.png'), width: 600, height: 315);
og_image_too_heavy
Social image is heavy — tip, recommended, no score impact.
Your social image is N KB. Nothing will refuse it — the platform limits are several megabytes — but every service that unfurls your link refetches this file, and a 1200 by 630 image usually compresses to well under 500 KB with no visible loss.
Only raised when the image was actually fetched and measured; a declared size proves nothing about the file.
No generic fix: re-exporting or recompressing is specific to your image, so
fix is null.Consistency and URLs
metadata_url_not_absolute
Metadata URL is not absolute — error, required, costs 3 points.
One or more metadata URLs are relative. Social platforms do not resolve relative URLs and will treat them as missing.
No generic fix: this one depends on your own content, so
fix is null.insecure_metadata_url
Metadata URL uses http on an https page — tip, recommended, no score impact.
This page is served over https but references metadata URLs over http. Some platforms decline to load mixed content.
No generic fix: this one depends on your own content, so
fix is null.metadata_inconsistent
Title and og:title differ — tip, optional, costs 3 points.
Your <title> and og:title differ. That is often deliberate, but worth confirming it is intentional.
No generic fix: this one depends on your own content, so
fix is null.