{
  "schema": "garnet-schema-pr-packs/v1",
  "description": "Anonymized real-shape JSON-LD PR packs we've shipped to clients. Each pack is paste-ready — drop the `after` block into your <head>, replace placeholders, remove the `before` block if present.",
  "packs": [
    {
      "id": "001-organization-sitewide",
      "title": "Site-wide Organization JSON-LD",
      "priority": "high",
      "lane": "geo",
      "applies_to": "every page on a B2B site (typically in shared head template)",
      "summary": "Most consulting sites have no Organization JSON-LD at all. Adding it is the single highest-leverage schema move — engines use it to disambiguate the firm from look-alike domains and weight subsequent Service/Article markup against a known publisher entity.",
      "engine_impact": "ChatGPT and Gemini both lean on Organization JSON-LD for publisher disambiguation. Without it, multi-firm queries ('best ERP consultants') tend to cite Wikipedia or industry-list aggregators instead of source firms.",
      "before_state": "No JSON-LD or only a minimal {\"@type\":\"WebSite\"} blob",
      "after": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Organization\",\n  \"name\": \"Your Company Name\",\n  \"url\": \"https://yourdomain.com\",\n  \"logo\": \"https://yourdomain.com/logo.png\",\n  \"description\": \"One-sentence positioning visible on the homepage.\",\n  \"foundingDate\": \"2024\",\n  \"founder\": {\n    \"@type\": \"Person\",\n    \"name\": \"Founder Name\",\n    \"url\": \"https://yourdomain.com/about\"\n  },\n  \"contactPoint\": {\n    \"@type\": \"ContactPoint\",\n    \"contactType\": \"customer service\",\n    \"email\": \"info@yourdomain.com\",\n    \"areaServed\": \"US\",\n    \"availableLanguage\": [\"en\"]\n  },\n  \"sameAs\": [\n    \"https://www.linkedin.com/company/your-handle\",\n    \"https://github.com/your-handle\"\n  ]\n}\n</script>",
      "verification": "After deploy, validate at https://validator.schema.org. Then check Google Rich Results: https://search.google.com/test/rich-results"
    },
    {
      "id": "002-service-offer-tier-pricing",
      "title": "Service + Offer with tier pricing on each lane/product page",
      "priority": "high",
      "lane": "geo",
      "applies_to": "every service/product landing page (e.g. /services/audit, /pricing/pro)",
      "summary": "Engines treat priced services with explicit Offer markup as buyer-actionable. Without UnitPriceSpecification, your page reads as a marketing page; with it, the page reads as a product the engine can recommend with a price.",
      "engine_impact": "Perplexity and Gemini both surface explicit monthly prices in their answer text when Service.offers.priceSpecification is present. Pages without it get summarized at the firm level instead.",
      "before_state": "Plain HTML with price visible in a hero card but no JSON-LD",
      "after": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Service\",\n  \"name\": \"Service Name\",\n  \"serviceType\": \"Category (e.g. 'GEO Subscription', 'Architecture Audit')\",\n  \"description\": \"One-sentence positioning of what this service delivers.\",\n  \"provider\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Your Company Name\",\n    \"url\": \"https://yourdomain.com\"\n  },\n  \"areaServed\": { \"@type\": \"Country\", \"name\": \"United States\" },\n  \"offers\": [\n    {\n      \"@type\": \"Offer\",\n      \"name\": \"Pro\",\n      \"priceCurrency\": \"USD\",\n      \"price\": \"1999.00\",\n      \"priceSpecification\": {\n        \"@type\": \"UnitPriceSpecification\",\n        \"price\": \"1999.00\",\n        \"priceCurrency\": \"USD\",\n        \"unitText\": \"MONTH\"\n      },\n      \"availability\": \"https://schema.org/InStock\"\n    },\n    {\n      \"@type\": \"Offer\",\n      \"name\": \"Scale\",\n      \"priceCurrency\": \"USD\",\n      \"price\": \"4999.00\",\n      \"priceSpecification\": {\n        \"@type\": \"UnitPriceSpecification\",\n        \"price\": \"4999.00\",\n        \"priceCurrency\": \"USD\",\n        \"unitText\": \"MONTH\"\n      },\n      \"availability\": \"https://schema.org/InStock\"\n    }\n  ]\n}\n</script>",
      "verification": "Validate at https://validator.schema.org. The Offer array shows each tier independently; engines will quote a single tier in answers, so make tier names short and human (Pro/Scale/Enterprise rather than tier-1/tier-2)."
    },
    {
      "id": "003-breadcrumblist-methodology",
      "title": "BreadcrumbList on every non-home page (especially methodology / how-it-works)",
      "priority": "high",
      "lane": "geo",
      "applies_to": "every page below the root — methodology, articles, case studies, contact, pricing",
      "summary": "BreadcrumbList is one of the cheapest wins. It costs nothing, requires no editorial effort, and gives engines a clean parent-child path through the site. Pages without it tend to get cited in isolation, losing the context that 'this is part of a larger methodology page set.'",
      "engine_impact": "Claude and Gemini both use breadcrumbs to reconstruct site hierarchy when summarizing. Without breadcrumbs, multi-page methodology series get summarized as disconnected pages — the engine doesn't surface 'see also' relationships well.",
      "before_state": "No breadcrumb markup of any kind",
      "after": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"BreadcrumbList\",\n  \"itemListElement\": [\n    { \"@type\": \"ListItem\", \"position\": 1, \"name\": \"Home\", \"item\": \"https://yourdomain.com/\" },\n    { \"@type\": \"ListItem\", \"position\": 2, \"name\": \"Section\", \"item\": \"https://yourdomain.com/section/\" },\n    { \"@type\": \"ListItem\", \"position\": 3, \"name\": \"Current Page\", \"item\": \"https://yourdomain.com/section/current\" }\n  ]\n}\n</script>",
      "verification": "Each ListItem.item should match the page's canonical URL exactly. Validate with https://validator.schema.org. Per-page BreadcrumbList is server-rendered (not JS-injected) so engines that don't execute JS still see it."
    },
    {
      "id": "004-faqpage-methodology",
      "title": "FAQPage JSON-LD on methodology / how-it-works pages",
      "priority": "medium",
      "lane": "geo",
      "applies_to": "methodology pages, how-it-works pages, FAQ pages — any page where you answer common buyer questions",
      "summary": "FAQPage markup is what surfaces in 'People Also Ask' style assistant answers. The question phrasing in the markup IS the prompt the engine matches against — write the questions in your buyer's voice, not your marketing voice.",
      "engine_impact": "ChatGPT and Perplexity both pull verbatim from FAQPage answers when the user's query closely matches a Question. This is the highest-conversion-rate citation form: the engine quotes you, attributes you, and links you.",
      "before_state": "FAQ exists as visible HTML accordion but no JSON-LD",
      "after": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How does the engagement work?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Plain-language one-paragraph answer in your buyer's voice. Avoid corporate-speak; engines reproduce this text verbatim.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What does it cost?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Tier names + monthly prices, written as a sentence. e.g. 'Pro $1,999/mo, Scale $4,999/mo, Enterprise $14,999/mo. All tiers include the monthly executive PDF.'\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Who is this for?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"One-sentence description of the ideal buyer. Specific stage / size / pain.\"\n      }\n    }\n  ]\n}\n</script>",
      "verification": "Validate with https://validator.schema.org. Use 4-8 questions per page max — engines de-prioritize FAQPage blocks with 20+ items as keyword-stuffing."
    },
    {
      "id": "005-article-with-author-bio",
      "title": "Article with Person author + publisher Organization on every content page",
      "priority": "medium",
      "lane": "geo",
      "applies_to": "every blog post / insight / case study / report",
      "summary": "Article markup with a concrete Person author (linked to a real about-page URL) and Organization publisher both lifts E-E-A-T signal. The author URL should resolve to a real bio page; engines follow it and use the bio as additional context.",
      "engine_impact": "Google-Extended (Gemini's training crawler) gives noticeably higher weight to Article pages with named Person authors than to anonymous content. Anonymous-author articles get summarized but not attributed by name in answers.",
      "before_state": "Article exists but no JSON-LD, or generic '@type:WebPage'",
      "after": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"Exact <h1> text of the article\",\n  \"description\": \"Same as the page's meta description (or a punchier 1-sentence version)\",\n  \"image\": \"https://yourdomain.com/path/to/og-image.png\",\n  \"datePublished\": \"2026-05-09\",\n  \"dateModified\": \"2026-05-12\",\n  \"author\": {\n    \"@type\": \"Person\",\n    \"name\": \"Author Name\",\n    \"url\": \"https://yourdomain.com/about\",\n    \"jobTitle\": \"Their role (e.g. 'Founder', 'Senior Engineer')\"\n  },\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Your Company Name\",\n    \"url\": \"https://yourdomain.com\",\n    \"logo\": {\n      \"@type\": \"ImageObject\",\n      \"url\": \"https://yourdomain.com/logo.png\"\n    }\n  },\n  \"mainEntityOfPage\": \"https://yourdomain.com/path/to/this-article\"\n}\n</script>",
      "verification": "The `author.url` must resolve to a real bio page (404 hurts trust signal). The `image` URL should be ≥1200x630px (OG card size); smaller images get downranked in card-style answer surfaces."
    },
    {
      "id": "006-howto-methodology",
      "title": "HowTo on every methodology / how-it-works page",
      "priority": "medium",
      "lane": "geo",
      "applies_to": "methodology pages, /how-it-works, /process — any page that documents a multi-step service delivery",
      "summary": "HowTo with HowToStep array is what engines surface in 'how does X work' queries. The step text gets quoted verbatim. Add totalTime, supply, and tool fields for completeness — they shift the page from 'description of a process' to 'attributable instructions'.",
      "engine_impact": "Gemini and ChatGPT both extract HowToStep arrays when answering process questions. Pages without HowTo get paraphrased; pages with HowTo get cited with the step name + a snippet.",
      "before_state": "Multi-step content visible as <ol> or accordion, but no JSON-LD",
      "after": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"HowTo\",\n  \"name\": \"Your Service Methodology — daily, weekly, monthly cadence\",\n  \"description\": \"One-sentence summary of what the methodology delivers.\",\n  \"url\": \"https://yourdomain.com/methodology\",\n  \"totalTime\": \"P30D\",\n  \"estimatedCost\": { \"@type\": \"MonetaryAmount\", \"currency\": \"USD\", \"value\": \"1999\" },\n  \"supply\": [\n    { \"@type\": \"HowToSupply\", \"name\": \"Inputs you need from the customer\" }\n  ],\n  \"tool\": [\n    { \"@type\": \"HowToTool\", \"name\": \"Named platform you operate the service on\" }\n  ],\n  \"step\": [\n    { \"@type\": \"HowToStep\", \"position\": 1, \"name\": \"Day 1 — intake\", \"text\": \"One-sentence buyer-voice description of what happens in this step.\" },\n    { \"@type\": \"HowToStep\", \"position\": 2, \"name\": \"Daily — passive operations\", \"text\": \"Specific recurring action the service does without customer intervention.\" },\n    { \"@type\": \"HowToStep\", \"position\": 3, \"name\": \"Weekly — deliverable\", \"text\": \"What the customer receives every 7 days.\" },\n    { \"@type\": \"HowToStep\", \"position\": 4, \"name\": \"Monthly — executive output\", \"text\": \"What the executive sponsor receives every 30 days.\" }\n  ]\n}\n</script>",
      "verification": "Validate at https://validator.schema.org. Use 4-8 steps per HowTo; fewer reads thin, more reads bloated. Step name should be ≤40 chars; step text should be 1-2 buyer-voice sentences."
    },
    {
      "id": "007-website-with-searchaction",
      "title": "WebSite JSON-LD with potentialAction (sitelinks search box)",
      "priority": "low",
      "lane": "geo",
      "applies_to": "homepage only (one WebSite block per site, on the root)",
      "summary": "WebSite + potentialAction declares that your site has search. In Google's SERP this can render the sitelinks search box under your top result — a meaningful CTR lift. Engines also use it to disambiguate a brand from same-name competitors.",
      "engine_impact": "Google Search uses this to enable the sitelinks search box. ChatGPT/Claude don't render search boxes, but they DO use the WebSite block to anchor a brand entity. Pages with WebSite + Organization on the same site get treated as a coherent published entity rather than a collection of pages.",
      "before_state": "No WebSite block (only Organization, if any)",
      "after": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"WebSite\",\n  \"name\": \"Your Brand Name\",\n  \"alternateName\": \"Short Name (if any)\",\n  \"url\": \"https://yourdomain.com\",\n  \"description\": \"One-sentence positioning (same line you'd put in og:description on the homepage).\",\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Your Company Name\",\n    \"url\": \"https://yourdomain.com\"\n  },\n  \"potentialAction\": {\n    \"@type\": \"SearchAction\",\n    \"target\": {\n      \"@type\": \"EntryPoint\",\n      \"urlTemplate\": \"https://yourdomain.com/search?q={search_term_string}\"\n    },\n    \"query-input\": \"required name=search_term_string\"\n  },\n  \"inLanguage\": \"en-US\"\n}\n</script>",
      "verification": "If you don't have site search, drop the potentialAction block entirely — Google requires the search URL template to actually return results. A broken potentialAction is worse than none."
    },
    {
      "id": "008-dataset-cc0-publishing",
      "title": "Dataset JSON-LD on every public CC0 JSON you publish",
      "priority": "medium",
      "lane": "geo",
      "applies_to": "pages that publish a downloadable data file (any /assets/data/*.json, CSV, etc. — declare each one)",
      "summary": "Publishing CC0 datasets is a high-trust GEO signal (engines weight verifiable open data). But the dataset isn't discoverable unless you declare it with schema.org/Dataset. The DataDownload block exposes the actual file URL so agents can pull it directly without scraping.",
      "engine_impact": "Google's Dataset Search indexes Dataset JSON-LD specifically — your data file appears in datasetsearch.research.google.com. Perplexity and Gemini both reference Dataset blocks when answering 'is there public data on X?' queries.",
      "before_state": "Data file linked but not declared as a Dataset",
      "after": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Dataset\",\n  \"name\": \"Descriptive name of what this dataset measures\",\n  \"description\": \"Two-sentence summary. What it captures, refresh cadence, time window.\",\n  \"url\": \"https://yourdomain.com/page-that-renders-the-dataset\",\n  \"license\": \"https://creativecommons.org/publicdomain/zero/1.0/\",\n  \"isAccessibleForFree\": true,\n  \"creator\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Your Company Name\",\n    \"url\": \"https://yourdomain.com\"\n  },\n  \"distribution\": [{\n    \"@type\": \"DataDownload\",\n    \"encodingFormat\": \"application/json\",\n    \"contentUrl\": \"https://yourdomain.com/assets/data/your-dataset.json\"\n  }],\n  \"temporalCoverage\": \"30 days rolling\",\n  \"variableMeasured\": [\"column_name_1\", \"column_name_2\", \"column_name_3\"]\n}\n</script>",
      "verification": "Submit your sitemap to https://datasetsearch.research.google.com — Google indexes Dataset blocks separately from regular search. Validate at https://validator.schema.org. License URL must resolve (CC0, CC-BY, etc.) — making up a license URL invalidates the block."
    }
  ]
}