My Tool Studio
Schema Markup·3 min read

Contact Page Structured Data: ContactPage Guide

Your SaaS support page already lists a phone number, a support email and the hours someone answers. ContactPage markup restates those facts in a form machines can read without guessing: the page labeled as a ContactPage, linked to your Organization and its contact points. It won't change how your listing looks in Google, but it keeps your official contact details consistent and machine-readable. Here's how the markup fits together, a worked example for a fictional support page, and the traps that make it less useful.

{"@type": "ContactPage","name": "…","url": "…"}RICH RESULTContactPage

Where ContactPage markup earns its keep

Take Relaymail, a fictional email API company. Its customers are developers in the middle of an incident who search for Relaymail support and want a human fast. Plain contact text gets scraped too, but scrapers pick up stale numbers from old press releases just as happily. Structured markup on your own contact page states the current, official channels in one place.

ContactPage, like its sibling types, descends from WebPage. The useful part is the second layer: an Organization carrying a contactPoint list. In the Contact Page Schema Generator's Recommended mode, the two sit in an @graph linked by @id, so one script declares both the page and the ways to reach the company behind it.

A worked ContactPage and ContactPoint example

A SaaS support page, start to finish.

Relaymail's page sits at https://relaymail.io/contact. With the organization details and two departments filled in, the Organization node in the output reads: {"@type":"Organization","@id":"https://relaymail.io/#organization","name":"Relaymail","url":"https://relaymail.io","contactPoint":[{"@type":"ContactPoint","contactType":"sales","telephone":"+1-415-555-0114","email":"sales@relaymail.io"},{"@type":"ContactPoint","contactType":"technical support","email":"help@relaymail.io"}]}. The ContactPage node beside it points at that @id.

Two things stand out. contactPoint is a list, one entry per department, added with Add contact point. And a ContactPoint can carry just an email, as the support line does here. The SaaS company example in the tool loads this same shape, alongside Small business and Multi-department examples.

ContactPoint fields, one at a time

The Contact type dropdown offers six common values: customer support, sales, technical support, billing, media and general inquiry. The telephone field wants international format with a country code, +1-415-555-0114, not (415) 555-0114, because a bare national number is ambiguous to anyone outside that country.

The email should be a monitored inbox, and only the address, without a mailto: prefix. Languages can be typed separated by commas, such as English, Spanish; one language is written as text and several as an array. Area served takes the regions each department covers, which matters for companies with country-specific support lines.

ContactPage and local SEO: what it won't do

Contact markup and local search are neighbors, not twins. ContactPage itself carries no address, no coordinates and no opening hours, so it does nothing for map pack placement by itself. The Contact Page Schema Generator can add an address and hours to the linked organization, or switch it to LocalBusiness, but a dentist or restaurant still wants full LocalBusiness markup with coordinates, built with the Local Business Schema Generator.

Where ContactPage helps locally is consistency. The phone number in your markup, on your page and in your business profiles should be identical, since mismatched details make it harder to tell which is current. A SaaS company with no premises, like Relaymail, loses nothing by skipping LocalBusiness entirely.

ContactPage mistakes that undermine the markup

The recurring failures are less about syntax and more about accuracy:

  • A national-format phone number without a country code.
  • Listing an unmonitored marketing inbox as the support email, so the markup routes frustrated users nowhere.
  • Using Recommended mode on a site whose homepage already publishes a different Organization block, creating two competing descriptions. Page only mode exists for that case, or reuse the same @id.
  • Pasting the ContactPage block into a global header so every URL on the site claims to be the contact page.
  • Leaving a retired phone line in the markup long after the page was updated.

Getting more out of the Contact Page Schema Generator

Use Auto-fill from URL as a mini audit. The tool takes the first phone and email from tel: and mailto: links, so if it comes back empty, your contact details exist only as plain text. Adding proper links helps visitors on phones anyway.

Second, update on change, not on a schedule. The block is static, so tie updating it to your process for changing support channels. Third, clear the Validation panel before copying, then test the block with Test in Google Rich Results Test or Validate at validator.schema.org.

ContactPage next to the other entity tools

The Organization Schema Generator creates the full company entity for the homepage, with logo, identifiers, profiles and contact points; give it the same @id your ContactPage points to. The Local Business Schema Generator is the right choice when there's a physical location, since it adds address, coordinates and opening hours.

For the page that tells your story rather than answering tickets, the About Page Schema Generator uses the same @id linking pattern with the AboutPage type.

Try it now

Open Contact Page Schema Generator

The tool is one click away. No sign up, no upload, no payment.

Open Contact Page Schema Generator