BlogFindings
ContactPoint schema: 119 of the 191 home pages with a clickable phone number named no telephone in their markup
Lantad requested the robots.txt and then the home page of all 1,419 hostnames in this repository's two committed corpus seed files on 30 September 2026 as LantadBot, following redirects and executing no JavaScript. 1,074 answered HTTP 200 with an HTML content type. 191 of those offered a visitor a clickable tel: link and 119 of the 191 carried no telephone property anywhere in their JSON-LD. 512 pages declared a node of an organization type and 251 of those attached no telephone, no email and no contactPoint to it.
This run counted which of the two each home page shipped. The question matters for an AI crawler in a narrow way that is worth stating before any figure: an answer engine asked how to contact an organisation has to produce a string, and the cheapest reliable place to get one is a labelled field rather than a guess at which of the numbers scattered through a footer is the main line. Lantad requested the robots.txt and then the home page of all 1,419 hostnames in this repository's two committed corpus seed files on 30 September 2026, sent as its own declared crawler user agent, with redirects followed, a twenty second timeout, one attempt per URL, from one network location, and no JavaScript executed. 14 hostnames served a robots.txt that disallows this scanner at the site root and a further 52 answered that request with a 5xx status, which RFC 9309 treats as an unavailable file a crawler should read as disallowing everything, so 66 hostnames were dropped unread. 1,074 of the remaining 1,353 answered HTTP 200 with an HTML content type, and those 1,074 are the denominator throughout.
In short
- Lantad read 1,074 home pages on 30 September 2026 with no JavaScript executed. 191 of them offered a visitor a clickable tel: link, and 119 of those 191 declared no telephone property anywhere in their JSON-LD, with 115 of the 119 carrying no telephone or email in microdata either.
- ContactPoint schema is free text in the field that classifies it. The 288 ContactPoint nodes on 165 home pages carried 54 distinct contactType spellings, 46 of which were used exactly once, and the two most common split one idea in two: 114 nodes said customer support and 76 said customer service.
- 512 of the 1,074 pages declared a node of an organization type and 251 of those 512 attached none of telephone, email or contactPoint to it, so the markup named the organisation and then declined to say how to reach it.
- 72 pages declared both a clickable number and a number in their markup, and on 7 of the 72 the two named different numbers, including nami.org, whose markup gives 703-524-7600 while the page links tel:+18009506264, and grandstreetdental.com, whose markup gives (917) 257-9006 while all three of its links give 718-942-9942.
- Google's Organization structured data documentation, carrying Last updated 2026-09-08 UTC, lists telephone, email, address and contactPoint as recommended and states that there are no required properties, so none of the absences counted here is a defect against any published rule.
| Stage | Count | What happened |
|---|---|---|
| Hostnames requested | 1,419 | The committed corpus, an editorial frame rather than a random draw |
| robots.txt disallowed this scanner at the root | 14 | Home page not requested for these |
| robots.txt answered 5xx, read as disallow per RFC 9309 | 52 | Home page not requested for these either |
| Answered 200 with an HTML content type | 1,074 | The denominator for every figure below |
| Carried at least one ld+json block that parsed | 615 | 622 carried a block; on 7 none of them parsed |
| Declared a node of an organization type | 512 | 47.7 percent of the pages read |
| Offered a clickable tel: link | 191 | 17.8 percent of the pages read |
| Declared a telephone property in JSON-LD | 182 | 17.0 percent of the pages read |
| Had a tel: link and no telephone in JSON-LD | 119 | 62.3 percent of the 191 |
| Had neither a tel: link nor a telephone property | 773 | 72.0 percent of the pages read |
What is ContactPoint schema, and what actually reads it?
The definition is one sentence long. The schema.org page for ContactPoint calls it a contact point, for example a Customer Complaints department, and defines nine properties on it: areaServed, availableLanguage, contactOption, contactType, email, faxNumber, hoursAvailable, productSupported and telephone. It is used on Organization, Person and a handful of other types, so the normal shape is an Organization node with one or more contact points hanging off it, each one classified by what it is for.
The classification is the part that matters for anything trying to extract a main number, and the specification is deliberately loose about it. The expected type of contactType is Text. Its description says that a person or organization can have different contact points, for different purposes, gives a sales contact point and a PR contact point as examples, and says the property is used to specify the kind of contact point. There is no enumerated list of permitted values anywhere on that page. Whatever an author types is valid, which is the root of the count in a later section.
Google is the one operator that publishes a position detailed enough to quote. Google's documentation on Organization structured data, carrying Last updated 2026-09-08 UTC, lists telephone, email, address and contactPoint among the properties it supports, describes contactPoint as the best way for a user to contact your business, if applicable, and asks for the country code and area code on a phone number meant to be the primary contact method. It also says, in its own words, that there are no required properties, and that an author should instead add the properties that apply to their organization. That sentence is load bearing for everything below: not one of the absences counted in this post is a defect against a published rule.
The honest frame follows from that, and it is the same frame as the canonical tag run earlier the same day. No crawler was observed reading a contact point here, because no crawler was observed reading anything. This run fetched pages. It held no server logs, inspected nobody's retrieval pipeline, and made no request from any address other than its own. Google's own stated use is knowledge panels rather than AI answers, and no vendor documentation read in this run says whether an answer engine prefers a labelled telephone property to a number it finds in prose. So the consequence of the gap below is undocumented rather than known, and a post that told you a missing telephone property costs you citations would be inventing the part that is missing.
- ContactPoint defines a contact channel and its purpose schema.org/ContactPoint, read 30 September 2026. Nine properties, among them contactType, telephone, email, areaServed and availableLanguage.
- contactType is free text Its expected type is Text and the page enumerates no permitted values, giving only a sales and a PR contact point as examples.
- Google supports telephone, email, address and contactPoint Google's Organization documentation, Last updated 2026-09-08 UTC. All are listed as recommended and the page states there are no required properties.
- Any of it is required Neither source requires a contact channel. A page that omits one is not in breach of anything, which is why this post counts absences rather than errors.
- An AI answer engine prefers a labelled telephone to one in prose No vendor documentation read in this run addresses it. Google's stated use is knowledge panels, not AI answers. Undocumented, not disproved.
- This run observed a crawler reading a contact point It did not. Two GETs per host from one network location, no server logs held, no retrieval pipeline inspected.
119 of 191 home pages with a clickable phone number named no telephone
191 of the 1,074 pages carried at least one anchor whose href begins with tel:, which is the ordinary way a site makes a number tappable on a phone. 182 declared a telephone property somewhere in their JSON-LD. Those two numbers are close enough to look like the same set of sites, and they are not. Only 72 pages did both.
Split four ways, the 1,074 pages divide into 72 that shipped a number in both places, 119 that gave a visitor a clickable number and a machine nothing, 110 that did the reverse, and 773 that carried neither. The 119 is the figure worth carrying away. On each of those pages a person can tap a number that the site clearly considers its number, and anything extracting without rendering has to find it in the footer text and decide for itself whether it is the switchboard, a regional office or a fax line. 115 of the 119 carried no telephone or email in microdata either, so this is not a syntax choice: those pages express the number once, to a human, and nowhere else.
The absence is not explained by sites having no structured data. 37 of the 119 had markup naming an organisation and left the phone number out of it, which is the version of the finding that is hardest to read as an oversight of scale. salesforce.com declares one Organization node, no telephone property anywhere, and links tel:18006649073. aig.com declares fifteen Organization nodes and one PostalAddress across two ld+json blocks, no telephone property in any of them, and links tel:8002255244. Others in that set are clevelandclinic.org, kaiserpermanente.org, plannedparenthood.org, eurostar.com, travelers.com, hdfcbank.com, lemonade.com and mcgill.ca.
The 110 pages that did the reverse are worth a line, because they show the same split from the other side rather than a better practice. nike.com is the extreme case: its home page declares 51 ContactPoint nodes carrying 51 telephone properties, one per market, and offers no tel: link at all. A machine reading that page is better served than a visitor on a phone. That is the mirror of the 119 and it comes from the same cause, which is that the two surfaces are maintained separately. The pattern is the one the 141 of 382 home pages with no structured data in the raw HTML and the 70 of 146 markup values that were not on the page both describe: the markup and the page are two documents, and only one of them has a reader who notices.
| Where the number appears | Pages | Share of 1,074 | What it means for an extractor |
|---|---|---|---|
| Both a tel: link and a telephone property | 72 | 6.7 percent | Readable either way, though 7 of the 72 disagree |
| A tel: link only | 119 | 11.1 percent | A person can tap it, a machine must guess |
| A telephone property only | 110 | 10.2 percent | A machine can read it, a visitor cannot tap it |
| Neither | 773 | 72.0 percent | No phone number offered on the home page at all |
251 of 512 organization nodes carried no contact channel at all
622 of the 1,074 pages carried at least one application/ld+json block and on 615 of them at least one block parsed as JSON, a ratio consistent with the 117 of 612 home pages whose JSON-LD carried a defect measured earlier on this corpus. 512 of the 1,074 declared at least one node of an organization type, counting Organization and the business, government, education, medical and media subtypes but not Place or its subtypes.
Of those 512, exactly 251 attached none of telephone, email or contactPoint to the organization node. That is the quietest finding in this run and probably the most general. The markup answers who this is, which is the job the 103 of 385 pages with JSON-LD that named no organization run was about, and then stops short of how to reach them, even though the same specification offers three separate ways to say it and Google's documentation recommends all three. Identity is the property entity confidence turns on, and the organisation fields that do get filled tend to be the ones a template can fill without asking a person: a logo URL, which on 44 of 433 declared URLs returned no image at all, and a sameAs reference, which 310 of 317 organisations pointed at a social profile. A telephone number is the field that needs somebody to decide which number is the right one to publish, and on 251 pages nobody did.
Where the gap sits is more interesting than its size, and it does not sit where the earlier structured data runs found their absences. Those tracked the platform: a site builder emits markup and a hand built content management system does not. This one tracks the sector, and specifically whether an organisation's phone number is a thing people are meant to use. Healthcare is the worst case by a distance: 42 of its 94 readable pages offered a clickable number, the highest rate of any stratum, and only 21 declared one in markup, leaving 30 pages in the gap. That is a third of the entire finding from one stratum, and it is the stratum where a phone number is most likely to be the point of the page. dana-farber.org, nyulangone.org, chop.edu, charite.de, hse.ie and dkfz.de are all in it.
At the other end, static-docs and spa-startups produced no gap at all, for the plain reason that 0 of their 75 readable pages offered a phone number to anybody. A documentation site and a single page application startup do not publish a switchboard, so there is nothing to be inconsistent about. The small business strata sit in the middle and lean the other way: wix-squarespace declared more numbers in markup (25) than it made clickable (14), which is what a site builder template filled in from a settings form looks like, and matches what the 2 of 172 home pages carrying machine readable opening hours run found about which fields a template fills and which it leaves.
| Stratum | Pages read | tel: link | telephone in markup | Gap |
|---|---|---|---|---|
| healthcare | 94 | 42 | 21 | 30 |
| finance | 93 | 21 | 20 | 15 |
| education | 103 | 15 | 10 | 12 |
| wordpress-smb | 37 | 29 | 18 | 12 |
| government | 85 | 8 | 4 | 8 |
| saas | 115 | 15 | 24 | 7 |
| webflow | 42 | 10 | 4 | 6 |
| media-local | 30 | 9 | 4 | 6 |
| travel | 79 | 7 | 11 | 5 |
| wix-squarespace | 54 | 14 | 25 | 4 |
| framer | 31 | 5 | 2 | 3 |
| bubble-nocode | 42 | 3 | 2 | 3 |
| saas-marketing | 37 | 4 | 3 | 3 |
| ecommerce | 65 | 5 | 18 | 2 |
| shopify-dtc | 34 | 2 | 3 | 2 |
| news | 58 | 2 | 12 | 1 |
| spa-startups | 44 | 0 | 1 | 0 |
| static-docs | 31 | 0 | 0 | 0 |
54 spellings of contactType, and 46 of them used exactly once
165 of the 1,074 pages declared at least one ContactPoint node and there were 288 nodes in total, so the type is present on a sixth of the pages read. On the evidence of this corpus authors take the contactType property seriously: only 7 of the 288 nodes omitted it. What they do not do, because nothing asks them to, is agree on what to write in it.
The 281 nodes that declared a contactType used 54 distinct values after normalising whitespace and case. 46 of the 54 were used exactly once. The two most common are the same idea spelled two ways: 114 nodes say customer support and 76 say customer service, and nothing in the specification prefers either, because as the section above establishes there is no enumerated list to prefer from. Then sales at 31 and technical support at 6, and after that a long tail of one-offs: general inquiries, membership and general enquiries, corporate office, public records, package tracking, news desk, investor relations, claims, reservations, tax consultation scheduling.
Several of the singletons are not English at all, which is the case that makes the design problem concrete rather than pedantic. Swiss and Turkish sites in the corpus shipped sanitat, tox-zentrum, telefonzentrale fur notfallmassige uberweisungen and musteri hizmetleri as contactType values. Each is a perfectly good description of what the number is for. None is a token any extractor could have a rule for. A consumer that wants the main switchboard from one of these pages has to fall back to guessing from the order the nodes appear in, which is exactly the position it was in on the 119 pages that declared no telephone property at all. The field is populated and still not usable as a key, in the way an @id that two different things reuse is populated and not usable as an identifier.
Two smaller counts belong with this. 8 of the 288 nodes declared a contactType and then carried no telephone, no email and no url: wur.nl, mistral.ai, evolvehealing.net, leapingai.com, carecycle.ai, optainhealth.com, techwolf.ai and highlandscurrent.com each ship a contact point that names a purpose and offers no way to make contact. And the distribution of nodes per page is lopsided in a way worth knowing before quoting the 288: 124 pages declared one, 24 declared two, and a single page, nike.com, declared 51, so a fifth of every ContactPoint node in this run came from one home page.
| contactType value | Nodes | Note |
|---|---|---|
| customer support | 114 | The most common value, and not the specification's example |
| customer service | 76 | The same idea as the row above, spelled differently |
| sales | 31 | One of the two examples schema.org gives |
| technical support | 6 | The only other value reaching six nodes |
| newsroom contact | 2 | Two news sites, independently |
| public engagement | 2 | Two government sites, independently |
| credit card support | 2 | Product specific, on one banking group |
| careers | 2 | A recruitment channel rather than a customer one |
| 46 further values, each used once | 46 | Including four that are not in English |
| No contactType declared | 7 | The node exists and says nothing about its purpose |
When the markup and the link name different numbers
On the 72 pages carrying a number in both places, the two agreed on 65 and disagreed on 7. Agreement here was tested loosely, matching on the last seven digits after stripping punctuation and leading zeros, so 7 is a floor on the disagreements rather than a strict count of formatting differences.
Some of the 7 are plainly deliberate and it would be dishonest to file them as errors. nami.org, the National Alliance on Mental Illness, declares 703-524-7600 in its markup, which is its national office, and links tel:+18009506264 and tel:988, which are its HelpLine and the national crisis line. A human reading that page would say the links are the numbers you want and the markup names the organisation's switchboard, and both statements are true. What is still worth noting is the consequence rather than the intent: an extractor taking the labelled field gets the number the page itself does not invite you to call.
Others are harder to read as a choice. grandstreetdental.com declares (917) 257-9006 in its markup while all three of its tel: links give the same different number, 718-942-9942, in three spellings. gardencityplumbing.com declares +1-406-481-3591 against a link to 4064813548. hypesilverlake.com declares 2137994669 against a link to 2137994694, a difference of one digit in the last position, which is the signature of a number typed twice rather than referenced once. webnames.ca and fibilaw.com complete the set.
There is a related class of defect on the human side of the page, and it is the one place this run found something unambiguously broken rather than merely absent. 20 of the tel: href values across the corpus cannot be dialled as delivered. mountsinai.org served 24 distinct tel: hrefs, no telephone property anywhere in its JSON-LD, and one href reading tel:{{this.primaryPhone}}, an unrendered template expression that reached production; that host answered HTTP 200 during this run and refused a later hand check with HTTP 403, so it is reported from the captured response rather than from a re-fetch. eleos.health links tel:+1, a country code and nothing else. stanfordhealthcare.org links tel://650-498-9000, td.com links a plus sign as the HTML entity +, and mediclinic.co.za, langhamhotels.com, okta.com and icicibank.com all ship percent-encoded spaces inside the number. It is the same failure shape as the 340 sitemap lastmod values that disagreed with the server's own header and the 370 of 948 home pages missing a required Open Graph property: a field nothing renders, so nothing checks it. You can see what this scanner sees on your own site with what GPTBot sees, and the methodology page states what each run does and does not fetch.
| Host | telephone in markup | tel: href on the page | Reading |
|---|---|---|---|
| nami.org | 703-524-7600 | +18009506264, 988 | Plausibly deliberate: office against helpline |
| grandstreetdental.com | (917) 257-9006 | +1-718-942-9942 | Three links agree with each other, not the markup |
| hypesilverlake.com | 2137994669 | 2137994694 | One digit apart in the last position |
| gardencityplumbing.com | +1-406-481-3591 | 4064813548 | Different last four digits |
| webnames.ca | +1-866-221-7878 | +18669769835 | Different number entirely |
| fibilaw.com | +1-718-618-5995 | 18333424529 | Different area code |
| parthenonplumbing.com | +1 629-276-5129 | %20615-298-2995 | Different number and an encoded leading space |
| mountsinai.org | none declared | {{this.primaryPhone}} | Unrendered template expression, one of 24 tel: hrefs |
| eleos.health | none declared | +1 | A country code and no number |
| stanfordhealthcare.org | none declared | //650-498-9000 | Protocol-relative slashes inside a tel: value |
| td.com | none declared | +18887519000 | The plus sign left as an HTML entity |
Lantad
Published .
A phone number on a web page usually exists twice. Once as something a person can see and tap, which on a modern site means an anchor whose href begins with tel:, and once as something a machine can lift without reading the page, which means a telephone property inside the structured data in the head. The two are written by different people at different times for different reasons, and nothing on the page complains when only one of them is there.
Common questions
What is ContactPoint schema?
ContactPoint is a schema.org type for a contact channel and its purpose. The schema.org page defines nine properties on it, among them contactType, telephone, email, areaServed and availableLanguage, and it normally hangs off an Organization or Person node. Google's Organization documentation, Last updated 2026-09-08 UTC, lists contactPoint as recommended and describes it as the best way for a user to contact your business. Nothing about it is required.
Does a missing telephone property hurt AI visibility?
Nothing measured here shows that it does, and this post does not claim it. No crawler was observed reading a contact point during this run, no server logs were held, and no vendor documentation read in this run says whether an answer engine prefers a labelled telephone property to a number it finds in prose. What can be said is narrower: on the 119 pages with a clickable number and no telephone property, anything extracting without rendering has to pick a number out of the page text and decide for itself which one is the main line.
Why measure home pages rather than contact pages?
Because one page per hostname was requested and it was always the home page, which is the main limit on every figure here. A site may well declare a full ContactPoint block on a dedicated contact page that this run never asked for, so the 119 counts home pages that link a number without marking it up, not organisations whose contact details are unreadable by machines anywhere. Reading contact pages would need a discovery step this run did not perform.
How were the numbers on each page counted?
A visitor facing number means at least one anchor in the delivered HTML whose href begins with tel:. A machine readable number means a telephone property inside an application/ld+json block that parsed as JSON. No JavaScript was executed and no stylesheet was fetched, so a number injected after load is recorded as absent and the 119 is a floor rather than an estimate. The corpus is an editorial sampling frame, so every rate supports a statement about these 1,419 hostnames and nothing wider.
See what AI can read on your site
Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.