This is a reference page rather than an argument. Each block below is valid JSON-LD, uses types defined at Schema.org, and is written the way it should appear on a clinic site. Replace the example values, delete any property you cannot state truthfully, and check the result against the visible page before publishing.
One rule governs everything here: the markup describes the page. Google's general structured data guidelines require it, and beyond compliance it is the only version that is useful, because markup that disagrees with the page is a contradiction you published about yourself.
The organisation block
Publish this once, ideally on the homepage, with a stable @id that every other block
references. This prevents forty independent copies of your organisation details drifting apart.
{
"@context": "https://schema.org",
"@type": "MedicalClinic",
"@id": "https://example.co.uk/#clinic",
"name": "Example Clinic",
"legalName": "Example Clinic Limited",
"url": "https://example.co.uk/",
"logo": "https://example.co.uk/logo.png",
"telephone": "+44 20 7946 0000",
"email": "hello@example.co.uk",
"foundingDate": "2014",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Example Street",
"addressLocality": "London",
"postalCode": "W1A 1AA",
"addressCountry": "GB"
},
"medicalSpecialty": "Dermatology",
"sameAs": [
"https://www.cqc.org.uk/location/REPLACE_ID",
"https://www.linkedin.com/company/example-clinic"
]
}Notes. legalName should match Companies House if you use one. Every
sameAs URL should be a record you maintain and that agrees with these details. Delete
medicalSpecialty if it does not describe the clinic accurately.
A location block per site
Each physical site gets its own block on its own location page, connected to the parent organisation. Google documents the local business properties it reads.
{
"@context": "https://schema.org",
"@type": "MedicalClinic",
"@id": "https://example.co.uk/locations/manchester#clinic",
"name": "Example Clinic, Manchester",
"parentOrganization": {
"@id": "https://example.co.uk/#clinic"
},
"url": "https://example.co.uk/locations/manchester",
"telephone": "+44 161 496 0000",
"address": {
"@type": "PostalAddress",
"streetAddress": "4 Sample Road",
"addressLocality": "Manchester",
"postalCode": "M1 1AA",
"addressCountry": "GB"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 53.4795,
"longitude": -2.2452
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "09:00",
"closes": "13:00"
}
],
"hasMap": "https://www.google.com/maps/place/?q=place_id:REPLACE_PLACE_ID",
"isAcceptingNewPatients": true
}Notes. Coordinates disambiguate a location in dense areas. parentOrganization states
the group relationship explicitly. The branchCode is optional and useful only if you use
internal site codes consistently elsewhere.
A clinical page block
Treatment and condition pages are clinical content, and MedicalWebPage is the accurate type.
{
"@context": "https://schema.org",
"@type": "MedicalWebPage",
"@id": "https://example.co.uk/treatments/rosacea#page",
"url": "https://example.co.uk/treatments/rosacea",
"name": "Rosacea treatment: assessment, options and what to expect",
"description": "How rosacea is assessed, the treatment options available and what recovery involves.",
"inLanguage": "en-GB",
"datePublished": "2026-01-18",
"dateModified": "2026-07-22",
"lastReviewed": "2026-07-22",
"about": {
"@type": "MedicalCondition",
"name": "Rosacea"
},
"medicalAudience": {
"@type": "MedicalAudience",
"audienceType": "Patient"
},
"specialty": "https://schema.org/Dermatologic",
"publisher": {
"@id": "https://example.co.uk/#clinic"
},
"reviewedBy": {
"@id": "https://example.co.uk/team/dr-example#person"
}
}Notes. lastReviewed and reviewedBy should only be present if a named
clinician genuinely reviewed the page on that date. Both are verifiable claims about a real person.
A practitioner block
Practitioners are separate entities. Publish only what appears on a public register or that you can otherwise evidence.
{
"@context": "https://schema.org",
"@type": "Physician",
"@id": "https://example.co.uk/team/dr-example#person",
"name": "Dr Example Surname",
"url": "https://example.co.uk/team/dr-example",
"jobTitle": "Consultant Dermatologist",
"medicalSpecialty": "https://schema.org/Dermatologic",
"worksFor": {
"@id": "https://example.co.uk/#clinic"
},
"identifier": {
"@type": "PropertyValue",
"propertyID": "GMC reference number",
"value": "0000000"
},
"alumniOf": {
"@type": "CollegeOrUniversity",
"name": "University of Example"
},
"sameAs": [
"https://www.gmc-uk.org/doctors/REPLACE_REFERENCE"
]
}Notes. Link sameAs to the register entry where the register publishes stable URLs.
Registration numbers are already public on the relevant register, and publishing them makes your
claims checkable.
FAQ markup, where questions are visible
FAQPage markup is only permitted where the questions and answers appear on the page for users. Google's FAQ documentation sets the conditions, and eligibility for display has been narrowed over time, so treat this as clarification of page structure rather than as a display technique.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How long does a consultation take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A first consultation is 30 minutes and includes an assessment, a discussion of options and a written treatment plan."
}
},
{
"@type": "Question",
"name": "Do I need a referral?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No referral is required for a private consultation. If a GP letter exists, bringing it helps but is not necessary."
}
}
]
}Breadcrumbs
Cheap, useful and often missing. It states hierarchy explicitly and can change how the URL is presented in results.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.co.uk/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Treatments",
"item": "https://example.co.uk/treatments"
},
{
"@type": "ListItem",
"position": 3,
"name": "Rosacea",
"item": "https://example.co.uk/treatments/rosacea"
}
]
}Your own website
HIGH CONTROL- Every byte a crawler receives, and the speed it arrives at
- The entity claims: name, address, identifiers, sameAs, service list
- Canonical URLs, hreflang if used, and the internal link graph
- Whether the page answers the question it was built to answer
- How the answer is displayed once it leaves your server
- Whether a third party republishes an outdated version of your facts
- Crawl the whole site and compare the URL list against the sitemap
- Validate every JSON-LD block against the Rich Results Test
- Measure field data, not only lab scores, for Core Web Vitals
Assembling the graph
Rather than publishing several disconnected script blocks, put related items in a single
@graph and reference shared entities by @id. The
JSON-LD specification defines the
mechanics, and the practical benefit is that your organisation is declared once and referenced
everywhere, which is exactly the entity consolidation you are trying to express.
Properties to leave out
aggregateRatingunless the reviews are genuinely about the entity and shown on the page in a way the guidelines permit.priceRangeif you would not commit to it in writing to a patient.awardfor anything self-declared or bought.- Any
sameAsURL you do not control or actively maintain. - Any property whose value you cannot check today.
Checking before publishing
- Parse the JSON. A trailing comma removes the entire block silently.
- Run the page through the Rich Results Test and the Schema Markup Validator.
- Read the block as a set of sentences and confirm each is true.
- Compare each value against the Business Profile and the canonical facts document.
- Recheck after any theme or plugin update, since these frequently inject a second, conflicting block.
Two blocks describing the same page differently is a common and avoidable state, and it is invisible unless someone looks at the source.
