Structured data on this site
Which schema.org JSON-LD types this site emits, on which pages, and the rules that keep the structured data honest about pricing.
Every page on gabegiro.com carries schema.org JSON-LD in its head. This page says what to expect where, so you do not have to crawl the whole site to find out.
Types by page
| Page | JSON-LD types |
|---|---|
| Homepage | Person, WebSite, Organization, ProfessionalService, FAQPage |
| Service pages | Service with offers, FAQPage |
| Pricing | ProfessionalService, OfferCatalog, FAQPage |
| About, Privacy, Accessibility, Case study index | Person, WebSite |
| Security | ProfessionalService, FAQPage |
| Blog posts | BlogPosting |
| Case studies | Article |
| Documentation hub, Portfolio | CollectionPage |
| Documentation pages | TechArticle |
| Glossary | DefinedTermSet with a DefinedTerm per entry |
| Guide landing pages | DigitalDocument |
| Product pages | SoftwareApplication, Service, FAQPage |
| Comparison and audience pages | FAQPage |
Notes for anyone parsing it
Service carries real offers. Every priced tier appears as an Offer with a currency and an amount, and monthly retainers carry a reference quantity so a recurring price is distinguishable from a one-time one. Ranged prices use a minimum and maximum rather than a single figure.
Offer prices are always the list price. When a seasonal discount is running, the visible page shows the promotional figure and the JSON-LD still shows the standing one. This is intentional. A model that snapshots this site in a discount month should not go on quoting a discounted price for the following year. See Discounts and billing.
dateModified is only emitted when a revision genuinely happened. Blog posts carry a published date always, and a modified date only when the post was actually revised. It is never defaulted to the publication date, because that would advertise a revision that never took place.
FAQPage answers are the same text a human reads. The FAQ blocks are rendered from one source, so the structured data cannot disagree with the visible page.
Three stable identifiers tie the graph together. https://gabegiro.com/#person, /#website and /#business are the canonical ids for the person, the site and the practice. Every author, publisher, provider and seller reference points at one of them, so a crawler stitching several pages together sees one person and one business rather than a new anonymous node per page.
No block is thinner than five properties. A schema block carrying only a type and a name is not worth parsing, so every block is required to carry at least five populated properties. A build-time guard enforces the floor and the build fails if a new block falls under it.
Nothing here is padding. Depth is only ever added with facts the site already states elsewhere. There is no aggregateRating, no review, no award and no employee count, because there is no honest source for any of them on a solo practice.
Why this matters more than it used to
Structured data used to be a search-engine tactic. It is now the substrate the llms.txt files are built from, which means an inaccuracy in the JSON-LD propagates into every machine-readable artifact this site publishes. That is why prices live in one configuration file that feeds both the visible tier card and the Offer data, rather than being typed twice and drifting.
If you find an error
Structured data errors are worth reporting and I will fix them. The contact page reaches me. Include the URL and the field.
Last updated .