How the score is calculated
A domain starts at 100. Every finding that is a real fault subtracts points; nothing else changes the number. There is no ceiling, no banding and no rounding to a grade — two domains with different findings essentially never land on the same score by coincidence.
The formula
score = max(0, 100 − Σ weight(check) × (1 − credit(check.severity)))
Each check that grades a real fault (kind: "defect") has a weight — how many points it costs on a full fail. A warn on the same check costs half that; a pass costs nothing. A lame delegation and a missing DMARC record are not the same finding, so they do not cost the same — the table below is every weight, in one place, exactly as the code reads it.
The exemption belongs to a finding, not to a check. A result graded kind: "hardening" — see "defect or hardening" on the full catalogue — never costs anything and can only be pass, info, unknown or not_applicable: no DNSSEC, no CAA and no security.txt are each exactly that — absent, not broken. The same check can still grade defect when the feature is deployed but broken, and that does cost points: a DNSSEC chain with a DS record and no DNSKEY, or a security.txt published with no Contact field, are findings about something that exists and is wrong, not about something missing.
info, unknown and not_applicable also cost nothing — see severity on the full catalogue for what each of those means. unknown in particular is our own gap, most often a blocked outbound port on the machine running the scan, and marking a domain down for it would be a false accusation about somebody else’s infrastructure.
A worked example
A domain with one failing check and one warning, and nothing else wrong:
ns.open-recursion fails → −16 points (full weight) mailauth.spf-all warns → −4 points (half of 8) everything else passes → −0 points score = 100 − 16 − 4 = 80
Fix the warning without touching the failure and the score moves to 84. Fix both and it is 100. Nothing about either change depends on what else is passing, and adding a third problem always costs more, never less.
Every weight
Points deducted on a full fail. A check that can grade a real fault and has no row here would fall back to 8 rather than deduct nothing, so a newly added check is never accidentally free — a dedicated test refuses to let that fallback cover for a check nobody has actually reviewed and weighted on purpose. 5 checks are intentionally absent below — each of those can only grade pass, info, unknown or not_applicable, so a weight for it would be dead code.
| Check | Category | Weight |
|---|---|---|
| Nameservers respond over UDP ns.udp | Nameservers | 20 |
| Domain registration expiry registration.expiry | Registration | 20 |
| Registry status registration.status | Registration | 20 |
| Domain registration registration.exists | Registration | 20 |
| Domain is delegated delegation.exists | Delegation | 20 |
| HTTPS certificate web.https | Web & TLS | 18 |
| Blacklist status reputation.summary | Reputation | 18 |
| Nameservers are not open resolvers ns.open-recursion | Nameservers | 16 |
| Zone transfers are not open to the world ns.zone-transfer | Nameservers | 16 |
| Parent returns a referral delegation.parent-refers | Delegation | 14 |
| Registry and zone agree on the nameservers delegation.ns-match | Delegation | 14 |
| Glue records delegation.glue | Delegation | 14 |
| Nameservers agree on the SOA serial ns.serial-agreement | Nameservers | 14 |
| Every nameserver is authoritative ns.authoritative | Nameservers | 14 |
| Apex address records web.apex-address | Web & TLS | 14 |
| Nameservers agree on the NS set ns.set-agreement | Nameservers | 12 |
| DNSSEC delegation.dnssec | Delegation | 12 |
| Nameservers are independent of each other ns.diversity | Nameservers | 12 |
| MX hosts resolve to public addresses mail.mx-resolves | Mail delivery | 12 |
| DMARC record mailauth.dmarc-present | Mail authentication | 12 |
| SPF record mailauth.spf-present | Mail authentication | 12 |
| SMTP connectivity smtp.connect | Mail delivery | 12 |
| Nameserver hostnames are valid ns.hostnames | Nameservers | 10 |
| MX targets are hostnames with address records mail.mx-targets | Mail delivery | 10 |
| At least two nameservers ns.count | Nameservers | 10 |
| MX records mail.mx-present | Mail delivery | 10 |
| STARTTLS offered smtp.starttls | Mail delivery | 10 |
| Apex is not a CNAME web.apex-cname | Web & TLS | 10 |
| SOA record soa.present | SOA | 10 |
| Registry servers delegation.registry-responded | Delegation | 8 |
| Nameservers respond over TCP ns.tcp | Nameservers | 8 |
| Reverse DNS for mail servers mail.mx-ptr | Mail delivery | 8 |
| SPF ends with an all-mechanism mailauth.spf-all | Mail authentication | 8 |
| SPF stays within the 10-lookup limit mailauth.spf-lookups | Mail authentication | 8 |
| DKIM selectors mailauth.dkim-probe | Mail authentication | 8 |
| MTA-STS policy file mailauth.mta-sts-policy | Mail authentication | 8 |
| Mail server TLS certificate smtp.tls-certificate | Mail delivery | 8 |
| Transfer lock registration.transfer-lock | Registration | 8 |
| Wildcard records web.wildcard | Web & TLS | 8 |
| MTA-STS mailauth.mta-sts | Mail authentication | 6 |
| SOA timers are sensible soa.timers | SOA | 6 |
| security.txt web.security-txt | Web & TLS | 5 |
| SPF avoids the `ptr` mechanism mailauth.spf-ptr | Mail authentication | 4 |
| Primary nameserver is listed soa.mname-listed | SOA | 4 |
| Contact address is well-formed soa.rname-valid | SOA | 4 |
| Serial number format soa.serial-format | SOA | 4 |
| www hostname web.www | Web & TLS | 4 |
| SMTP capabilities smtp.capabilities | Mail delivery | 4 |
| MX records are distinct mail.mx-duplicates | Mail delivery | 4 |
When there is no score at all
A domain that was never meaningfully present in DNS gets no score — not a low one. A low score is still a real measurement; a domain with nothing behind it has nothing to measure, and 0 would read as a graded result rather than an absent one. The report shows No score and names the reason:
not_delegated- The registry has no delegation for this name — never registered, expired and deleted, or registered with no nameservers set.
registry_unreachable- No server for the registry could be found or answered, so nothing below that point could be compared against it either.
no_nameservers_responded- Every nameserver the registry lists failed to answer — over UDP and over TCP.
This is different from a domain that resolves fine but has no registration record on file, or carries a registry hold or pending-deletion status — those score 0 outright, because the domain really was measured and really is unreachable above the DNS layer.
Looking for what a specific check does, rather than how it is weighted? The full catalogue lists every one, with the reasoning behind it.