dotvitals

Loading the list of pages…

↑↓ to moveEnter to openEsc to close

Rule catalogue

The 301 checks a dotvitals scan runs. Each one states a condition, what it costs your score when it is true, why it matters and how to put it right.

Ruleset 2026.10.12.32 ·how the score is calculated

Filter

Email authentication (41)

  • BIMI is published but DMARC is not enforcing

    You have a BIMI record, but your DMARC policy is not strict enough for it to be used.

    email.bimi.dmarc-not-enforcing

    Medium−6
  • BIMI logo is not a valid SVG Tiny Portable/Secure file

    Your logo is not in the restricted SVG format BIMI requires. Mailbox providers reject anything else, so the logo is not shown.

    email.bimi.logo-not-svg-tiny-ps

    Medium−5
  • BIMI logo URL cannot be fetched

    The logo your BIMI record points at could not be downloaded. Mailbox providers that cannot fetch it simply show no logo.

    email.bimi.logo-unreachable

    Medium−5
  • BIMI record has no mark certificate

    Your BIMI record points at a logo but not at a mark certificate. Gmail, Apple Mail and Yahoo will not show the logo without one, so most recipients see…

    email.bimi.no-mark-certificate

    Infonot scored
  • No BIMI record published

    You have not published a BIMI record, so your logo does not appear next to your messages in the inboxes that support it.

    email.bimi.no-record

    Infonot scored
  • BIMI record has a syntax error

    A BIMI record is published but cannot be read, so no inbox will show your logo. The setup looks complete from the DNS side and does nothing.

    email.bimi.syntax-invalid

    Medium−5
  • DKIM key is only 1024 bits

    Your signing key still works, but it is at the minimum size the standard allows. Larger keys are now the norm and some receivers treat 1024-bit signatures as…

    email.dkim.key-1024-bit

    Low−5
  • DKIM record has an empty p= tag (key revoked)

    The DKIM record for this selector exists but contains no key. An empty key means revoked, so every message signed with this selector is rejected outright.

    email.dkim.key-revoked

    Critical−25
  • DKIM key is shorter than 1024 bits

    The signing key published for your domain is too small to be trusted. Receiving servers are told to reject keys this short, so your signature may be treated…

    email.dkim.key-too-short

    High−15
  • No DKIM key found at the selectors checked

    We didn't find a DKIM key under the selector names we checked: the ones mail providers normally use, or the one you entered.

    email.dkim.no-selector-found

    High−25
  • DKIM record cannot be parsed

    The record published for this selector is not a valid DKIM key record, so receivers cannot verify signatures made with it.

    email.dkim.syntax-invalid

    High−18
  • DKIM record is in testing mode (t=y)

    Your DKIM record tells receivers to ignore any failures because you are still testing. Left in place, it means a genuine signature failure is never acted on.

    email.dkim.testing-flag-set

    Low−4
  • DKIM key uses an algorithm receivers reject

    Your key is published with a signing algorithm that receiving servers no longer accept, so signatures made with it are not verified.

    email.dkim.unsupported-algorithm

    Medium−10
  • DMARC reports are sent to an unauthorised external domain

    Your reports are addressed to a mailbox on a different domain, and that domain has not published the record that says it agrees to receive them.

    email.dmarc.external-rua-unauthorised

    Medium−8
  • DMARC requests forensic reports (ruf)

    Your record asks receivers to send you copies of individual failing messages. Few receivers do this, and the ones that do may send you other people's…

    email.dmarc.forensic-reporting-enabled

    Infonot scored
  • Subdomain has no DMARC record and inherits the parent policy

    This subdomain publishes no DMARC record of its own, so receivers apply the policy from your main domain. That is normal and usually what you want.

    email.dmarc.inherited-from-parent

    Infonot scored
  • More than one DMARC record published

    Two or more DMARC records exist at the same name. The rules tell receivers to ignore all of them, so your domain effectively has no DMARC policy.

    email.dmarc.multiple-records

    High−20
  • No DMARC record published

    Your domain does not publish a DMARC policy, so receiving mail servers have no instruction about what to do with mail that fails your other checks.

    email.dmarc.no-record

    Critical−25
  • DMARC record requests no aggregate reports

    Your DMARC record has no address for receivers to send reports to, so you have no way of finding out who is sending mail as your domain or whether it passes.

    email.dmarc.no-rua

    Low−4
  • DMARC record still carries a pct tag

    Your policy is enforcing, but it still carries the old `pct` tag asking receivers to apply it to only some messages.

    email.dmarc.pct-below-100

    Medium−6
  • DMARC policy is p=none (monitor only)

    Your domain publishes a DMARC record, but it tells receivers to take no action on messages that fail authentication.

    email.dmarc.policy-none

    High−15
  • Subdomains are exempt from an enforcing DMARC policy

    Your main domain is protected, but the record explicitly exempts every subdomain. Attackers routinely spoof a subdomain that was never used for mail, because…

    email.dmarc.subdomain-policy-none

    Medium−10
  • DMARC record has a syntax error

    The record at _dmarc cannot be read as a valid DMARC policy, so receivers discard it and treat your domain as having no policy.

    email.dmarc.syntax-invalid

    High−20
  • DMARC is in test mode, so the policy is not applied

    Your record states a policy and then, with `t=y`, asks receiving mail servers not to act on it.

    email.dmarc.test-mode

    High−14
  • SPF authorises the whole internet through an address range

    Your SPF record authorises an address range so wide that it covers the internet itself.

    email.spf.catch-all-range

    Critical−35
  • SPF record lists the same sender twice

    The same entry appears more than once in your SPF record. It has no extra effect, and if it is one that costs a DNS lookup it brings you closer to the limit…

    email.spf.duplicate-mechanism

    Low−3
  • SPF include chain contains a loop

    One of the records your SPF policy pulls in eventually points back at a record already in the chain.

    email.spf.include-loop

    High−20
  • SPF include target has no SPF record

    Your SPF record refers to another domain that does not publish an SPF record of its own.

    email.spf.include-unresolvable

    High−15
  • SPF is close to the 10 DNS lookup limit

    Your SPF record still works, but it is close to the maximum number of DNS lookups allowed.

    email.spf.lookups-near-limit

    Medium−8
  • More than one SPF record published

    Two or more SPF records exist for your domain. The rules say a receiver must treat this as an error, so in practice none of them is applied and your SPF is…

    email.spf.multiple-records

    High−25
  • SPF record has no all mechanism

    Your SPF record lists authorised senders but never says what to do about everyone else.

    email.spf.no-all

    Medium−10
  • No SPF record published

    Your domain does not tell receiving mail servers which computers are allowed to send email for it.

    email.spf.no-record

    High−25
  • SPF authorises a very large block of addresses

    Your SPF record authorises a huge range of internet addresses to send mail as you.

    email.spf.overly-broad-range

    Medium−6
  • SPF ends in +all — anyone may send as your domain

    Your SPF record explicitly authorises every server on the internet to send mail as your domain.

    email.spf.plus-all

    Critical−35
  • SPF uses the deprecated ptr mechanism

    Your SPF record uses a mechanism the standard tells people not to use. It is slow, it puts load on other people's DNS servers, and some receivers ignore it…

    email.spf.ptr-mechanism

    Low−4
  • SPF ends in ?all (neutral)

    Your SPF record ends by telling receivers to form no opinion about servers that are not on your list.

    email.spf.question-all

    Medium−10
  • SPF has both redirect= and an all mechanism

    Your record contains a redirect to another domain's policy and also its own closing rule.

    email.spf.redirect-with-all

    Medium−6
  • SPF record has a syntax error

    Your SPF record cannot be read by receiving mail servers. Because it is unreadable, the whole check fails with an error and none of your listed senders is…

    email.spf.syntax-invalid

    High−20
  • SPF has terms after the all mechanism, where nothing is evaluated

    Your record has terms after its closing rule. Receivers stop at the closing rule, so nothing after it is evaluated: a sender listed there is not authorised,…

    email.spf.terms-after-all

    Medium−8
  • SPF needs more than 10 DNS lookups

    Evaluating your SPF record requires more DNS lookups than the standard allows. Receiving servers stop early and return an error, so your SPF check does not…

    email.spf.too-many-lookups

    High−20
  • SPF exceeds the void DNS lookup limit

    Too many of the lookups in your SPF record point at names that do not exist or return nothing.

    email.spf.void-lookups-exceeded

    Medium−10

Email transport (33)

Email reputation (5)

  • Listed on a source we show but do not score

    A mail server address is on a blocklist we show but do not score, because that list often covers whole network ranges for a neighbour's behaviour.

    email.blocklists.advisory-listing

    Infonot scored
  • Which blocklists we check, and which we do not

    Which DNS blocklists this check queries and which it does not. Spamhaus is not queried: its free feed is licensed for non-commercial use only.

    email.blocklists.coverage-limited

    Infonot scored
  • Domain is listed on a domain reputation blocklist

    Your domain name itself appears on a reputation blocklist. Unlike an address listing, this follows the domain everywhere — changing servers does not clear it.

    email.blocklists.domain-listed

    Critical−40
  • A blocklist did not answer, so it is not counted as clean

    A blocklist gave no usable answer, so it is reported as unknown rather than clean, and the result is scoped to the lists that did answer.

    email.blocklists.list-unavailable

    Infonot scored
  • Mail server address is listed on a blocklist

    One of your mail server addresses is on a DNS blocklist. Receivers that consult it reject or quarantine its mail until the cause is fixed and it is delisted.

    email.blocklists.mx-ip-listed

    Critical−40

DNS (38)

DNSSEC (14)

Domain registration (12)

  • The domain registration has expired

    The registry's expiry date for this domain is in the past. Depending on how long ago, the domain may already have stopped resolving, and after a grace period…

    domain.rdap.expired

    Critical−90
  • The domain registration expires within 30 days

    The registry's expiry date for this domain is under a month away. This is normal for a domain that auto-renews — it is worth one check that the renewal will…

    domain.rdap.expiring-lt-30d

    High−30
  • The domain registration expires within 7 days

    The registry's expiry date for this domain is less than a week away. If the automatic renewal does not go through, the domain starts down the deletion path…

    domain.rdap.expiring-lt-7d

    Critical−70
  • The domain registration expires within 90 days

    The registry's expiry date is roughly a quarter away. This is a note, not a problem: it is the normal state of a domain approaching its renewal, and it…

    domain.rdap.expiring-lt-90d

    Infonot scored
  • No transfer lock is set on the domain

    The registry shows no `clientTransferProhibited` status, so nothing at your registrar has to be unlocked before a transfer request to another registrar can…

    domain.rdap.no-registrar-lock

    High−25
  • No update lock is set on the domain

    The registry shows no `clientUpdateProhibited` status, so the domain's nameservers and contact details can be changed from inside the registrar account with…

    domain.rdap.no-update-lock

    Medium−10
  • The domain is suspended by the registrar or registry

    A `clientHold` or `serverHold` status means the domain has been pulled from the zone deliberately.

    domain.rdap.on-hold

    Critical−90
  • The domain is scheduled for deletion

    The redemption window has closed and the registry has queued the domain for release — usually about five days.

    domain.rdap.pending-delete

    Critical−90
  • The domain is in the redemption period

    The domain expired, was deleted, and is in the roughly 30-day window in which the previous owner can still get it back — by asking the registrar for a…

    domain.rdap.redemption-period

    Critical−80
  • The registrant contact details are not published

    The registry does not publish who holds this domain. That is the normal, expected state for an individual registrant, it is not a misconfiguration, and it…

    domain.rdap.registrant-redacted

    Infonot scored
  • The registration data could not be read

    We could not get a registration record for this domain, so nothing in this section was checked.

    domain.rdap.registration-data-unavailable

    Infonot scored
  • The registration is current and locked

    The registry shows a comfortable expiry date, a transfer lock in place, and no suspension or deletion status. This is what a well-kept domain looks like.

    domain.rdap.registration-healthy

    Infonot scored

TLS (26)

  • Certificate chain is missing an intermediate

    The server sent its own certificate but not the linking certificates above it. Some visitors see the site fine and others get a security warning, seemingly…

    tls.certificate.chain-incomplete

    High−25
  • Certificate chain is not in the required order

    The linking certificates are present but sent in the wrong order, or one is repeated. Modern clients cope; older and stricter ones do not.

    tls.certificate.chain-out-of-order

    Low−5
  • TLS certificate has expired

    The certificate's end date has passed. Every browser now shows a full-page security warning instead of your site, and most visitors will not click through it.

    tls.certificate.expired

    Critical−60
  • TLS certificate expires in under 30 days

    The certificate still works, but it runs out within the month. This is the point where automatic renewal should already have replaced it.

    tls.certificate.expiring-lt-30d

    Medium−10
  • TLS certificate expires in under 7 days

    The certificate is about to run out. If renewal has not already succeeded, your site goes down within the week.

    tls.certificate.expiring-lt-7d

    High−25
  • Certificate does not cover the hostname

    The certificate is for a different name than the one visitors type. Browsers show a security warning and refuse to continue without an explicit override.

    tls.certificate.hostname-mismatch

    Critical−60
  • Certificate has no Subject Alternative Name

    The certificate lists its hostname only in the old Common Name field, which browsers stopped reading in 2017.

    tls.certificate.no-san

    Medium−10
  • TLS certificate is not valid yet

    The certificate's start date is in the future, so browsers reject it exactly as they would reject an expired one.

    tls.certificate.not-yet-valid

    High−30
  • Certificate is self-signed

    The certificate vouches for itself. Nobody else has confirmed the site is who it says it is, so browsers treat it as untrusted.

    tls.certificate.self-signed

    Critical−55
  • Certificate could not be parsed

    The server sent something in place of a certificate that could not be read as one. No client can validate what it cannot decode.

    tls.certificate.unreadable

    Medium−20
  • Certificate does not chain to a trusted root

    The certificate cannot be traced back to an authority browsers trust, so it is rejected the same way an expired or mismatched one is.

    tls.certificate.untrusted-root

    Critical−60
  • Certificate is valid for longer than a public CA may issue

    The certificate's lifetime is longer than any publicly trusted authority is allowed to grant, which means it did not come from one.

    tls.certificate.validity-too-long

    Low−5
  • Certificate uses a key that is too small

    The certificate's key is smaller than the current minimum, so the encryption protecting the site is weaker than it should be.

    tls.certificate.weak-key

    High−25
  • Certificate is signed with a broken hash algorithm

    The certificate is signed using an outdated method that can be forged. Browsers have rejected these since 2017.

    tls.certificate.weak-signature-algorithm

    High−30
  • Certificate uses an unusually broad wildcard

    The certificate covers a very wide range of names. If its private key ever leaks, the damage extends far beyond this one site.

    tls.certificate.wildcard-too-broad

    Low−4
  • Server accepts a broken cipher suite

    One of the encryption methods the server agrees to is broken — it can be read, forged, or provides no protection at all.

    tls.protocols.insecure-cipher

    High−30
  • Some connections have no forward secrecy

    For some connections the server uses a method where one leak of its private key would expose every past conversation that anyone recorded.

    tls.protocols.no-forward-secrecy

    Medium−15
  • Neither TLS 1.2 nor TLS 1.3 is supported

    The server offers only versions of TLS that browsers have already removed. Most visitors cannot connect at all.

    tls.protocols.no-tls12

    High−40
  • TLS 1.3 is not supported

    The server does not offer the current version of TLS. Connections still work over the older version, but they are slower to set up and lack its safety…

    tls.protocols.no-tls13

    Medium−8
  • Protocol and cipher support could not be tested

    We could not run the handshakes needed to find out which TLS versions this server accepts, so this part of the report is missing rather than clear.

    tls.protocols.probe-unavailable

    Infonot scored
  • SSL 2.0 is enabled

    The server still accepts a protocol from 1995 that is completely broken. Its presence weakens the modern connections too.

    tls.protocols.sslv2-enabled

    Critical−60
  • SSL 3.0 is enabled

    The server accepts SSL 3.0, which has been formally prohibited since 2015 and can be attacked to reveal parts of an encrypted session.

    tls.protocols.sslv3-enabled

    Critical−50
  • TLS 1.0 is enabled

    The server still accepts TLS 1.0, a version from 1999 that browsers removed in 2020. Keeping it available lets a connection be pushed down to it.

    tls.protocols.tls10-enabled

    High−25
  • TLS 1.1 is enabled

    The server accepts TLS 1.1, which browsers removed alongside TLS 1.0 in 2020. It offers nothing TLS 1.2 does not.

    tls.protocols.tls11-enabled

    High−20
  • Some protocol versions could not be tested by this scanner

    Some SSL or TLS versions could not be tested on this scan, so the report does not say whether the server accepts them, and does not count them as disabled.

    tls.protocols.version-untestable

    Infonot scored
  • Server accepts a weak cipher suite

    One of the encryption methods on offer is outdated. It is not trivially broken, but it has known weaknesses and nothing current needs it.

    tls.protocols.weak-cipher

    Medium−10

HTTP (26)

Web security (43)

Network (6)

  • A database port is reachable from the internet

    A database port such as MySQL, PostgreSQL, Redis or MongoDB accepts connections from the whole internet. It should only be reachable from your own servers.

    net.ports.database-exposed

    Critical−40
  • FTP is reachable from the internet

    Port 21 on ‹host› accepts connections. FTP sends the username, the password and the file contents in clear text, so anyone able to observe the connection…

    net.ports.ftp-exposed

    Medium−12
  • Ports reachable from the internet

    We test well-known TCP ports on your host and list each one that answers, with what normally listens there and whether public exposure is expected for it.

    net.ports.open

    Infonot scored
  • No port could be tested

    We were not able to run the port check on ‹host›, so this section reports nothing at all rather than reporting that everything is closed.

    net.ports.probe-unavailable

    Infonot scored
  • A remote desktop service is reachable from the internet

    A remote desktop port, RDP or VNC, accepts connections from anywhere on the internet: a full interactive session on the machine, guarded by one password.

    net.ports.remote-admin-exposed

    High−30
  • SSH is reachable from the internet

    Port 22 on ‹host› accepts connections. This is normal — it is how most servers are administered — and it is worth knowing, because it guarantees a continuous…

    net.ports.ssh-exposed

    Infonot scored

Performance (23)

SEO (33)

  • The page declares more than one canonical URL

    This page names ‹count› different canonical URLs. When a page gives conflicting answers, search engines disregard all of them and decide for themselves.

    seo.canonical.conflicting

    Medium−15
  • The canonical URL cannot be used

    The page declares a canonical, but the value is not a usable web address, so search engines have nothing to act on.

    seo.canonical.invalid

    Medium−10
  • The page declares no canonical URL

    There is no `<link rel="canonical">` on this page. Search engines will choose which version of the URL to show, and their choice may not be the one you would…

    seo.canonical.missing

    Low−6
  • The canonical URL points at a different page

    This page tells search engines that a different URL is the one to index. That is often exactly right — it is how duplicate versions of a page are…

    seo.canonical.points-elsewhere

    Infonot scored
  • The page has no h1 heading

    There is no `<h1>` in the served HTML. The top-level heading is how both readers and assistive technology identify what the page is about.

    seo.headings.h1-missing

    Low−8
  • The heading levels skip a level

    The page jumps from one heading level to a level more than one below it — an `<h4>` directly under an `<h2>`, for example.

    seo.headings.hierarchy-skipped

    Low−4
  • The page has more than one h1

    This page uses ‹count› `<h1>` elements. HTML5 permits this and search engines handle it, so it is reported for you to consider rather than as a fault.

    seo.headings.multiple-h1

    Infonot scored
  • An hreflang annotation is not valid

    Some of the page's hreflang links are malformed. Search engines discard an annotation set they cannot parse, so the other language versions are not connected.

    seo.hreflang.invalid

    Low−6
  • The hreflang set does not include this page

    The page lists alternate language versions but does not list itself. Google's documentation requires every page in a set to reference every page in the set,…

    seo.hreflang.missing-self-reference

    Low−4
  • The page's declared language is not a well-formed language tag

    `<html lang="‹lang›">` is not the shape BCP 47 defines for a language tag. A tag that cannot be parsed is discarded, which leaves the page in the same…

    seo.html-lang.invalid

    Low−4
  • The page does not declare what language it is written in

    The `<html>` element carries no `lang` attribute, so nothing in the markup says what language the page is written in.

    seo.html-lang.missing

    Low−5
  • Images on the page have no alt attribute

    Some images on the page have no alt attribute at all, so screen reader users get nothing useful in their place and image search has no text to work from.

    seo.images.missing-alt

    Low−6
  • robots.txt blocks this page from being crawled

    Your robots.txt tells crawlers not to fetch this page. They will not read it, so its content cannot be used in search results.

    seo.indexability.blocked-by-robots-txt

    High−30
  • The page tells crawlers not to follow its links

    A `nofollow` directive applies to every link on this page. Crawlers will still read the page, but they will not use its links to find anything else.

    seo.indexability.nofollow

    Medium−10
  • The page asks search engines not to index it

    This page carries a `noindex` directive, which tells search engines to leave it out of their results entirely.

    seo.indexability.noindex

    High−35
  • A noindex directive is unreachable behind a robots.txt block

    This page carries a `noindex` directive and is also blocked in robots.txt. Because crawlers never fetch the page, they never see the directive — so the page…

    seo.indexability.noindex-blocked-by-robots

    High−20
  • The meta description is likely to be truncated or is very short

    The page's meta description is long enough to be cut off in search results, or very short. This is about how much of it is displayed, not about ranking.

    seo.meta-description.length-outside-guidance

    Low−3
  • The page has no meta description

    There is no meta description on this page. Search engines will write the snippet under your result themselves, using text they pick from the page.

    seo.meta-description.missing

    Low−6
  • The page declares the same metadata more than once

    This page carries more than one ‹field›, with different values. Which one is used is decided by the consumer, and different consumers decide differently.

    seo.meta.duplicate-tags

    Low−5
  • The title and the meta description are identical

    The description repeats the title word for word. A search result then shows the same sentence twice, which wastes the only two lines you get.

    seo.meta.title-matches-description

    Low−3
  • Open Graph metadata is missing required properties

    When this page is shared on a social platform or in a chat app, the preview is assembled from Open Graph tags.

    seo.opengraph.incomplete

    Low−5
  • No robots.txt is published

    There is no robots.txt at the site root. This is not a fault — RFC 9309 says a crawler that gets a 404 may access everything — and it is worth knowing…

    seo.robots-txt.missing

    Infonot scored
  • The robots.txt at the site root was not readable as directives

    `/robots.txt` did not return a file a crawler can read: an HTML error page served with a success status, a refusal, a redirect this scan does not follow, or…

    seo.robots-txt.unreadable

    Low−5
  • No XML sitemap could be found

    Neither robots.txt nor the conventional `/sitemap.xml` location produced a sitemap.

    seo.sitemap.missing

    Low−8
  • The sitemap is not declared in robots.txt

    A sitemap was found at the conventional location, but robots.txt does not mention it. Crawlers that do not guess that location will not find it.

    seo.sitemap.not-declared

    Low−3
  • The sitemap URL does not return XML

    Something answers at `‹sitemap url›`, but it is not an XML sitemap. Crawlers will discard it, so the sitemap is effectively missing while appearing to be…

    seo.sitemap.not-xml

    Low−6
  • The page carries no JSON-LD structured data

    No JSON-LD was found. Structured data is optional — it makes a page eligible for enhanced result formats, and its absence costs nothing beyond that…

    seo.structured-data.absent

    Infonot scored
  • A JSON-LD block on the page does not parse

    A JSON-LD block on the page is not valid JSON, so search engines discard it entirely: the markup is present and is doing nothing for the page.

    seo.structured-data.invalid

    Low−8
  • Structured data is missing a documented required property

    The page's ‹type› markup is missing ‹property›, which Google's documentation lists as required.

    seo.structured-data.missing-required-property

    Low−5
  • Structured data uses a type that no longer produces a rich result

    The page marks up ‹types›, which Google no longer shows as an enhanced result. The markup is still valid and harmless — it just no longer earns anything in…

    seo.structured-data.retired-type

    Infonot scored
  • The title is likely to be truncated or is very short

    The page title is long enough to be cut off in search results, or very short. A display guideline, not a ranking factor: a long title is cut, not penalised.

    seo.title.length-outside-guidance

    Low−4
  • The page has no title

    There is no `<title>` on this page, or it is empty. The title is the clickable line in a search result and the text in the browser tab, so search engines…

    seo.title.missing

    Medium−12
  • No Twitter card type is declared

    The page declares no `twitter:card`. Most platforms fall back to the Open Graph tags, so a page with good Open Graph metadata usually previews correctly…

    seo.twitter-card.missing

    Infonot scored

Technology (1)

  • Technologies identified from the response

    The software, frameworks and services this site's response and page source suggest it is built with, each with how sure we are. An observation, not a problem.

    web.technology.detected

    Infonot scored