<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chetan Sanghani</title>
    <description>The latest articles on DEV Community by Chetan Sanghani (@chetansanghani).</description>
    <link>https://dev.to/chetansanghani</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4012473%2Fd0f9b093-7be7-4801-be6e-1e88a0198457.JPG</url>
      <title>DEV Community: Chetan Sanghani</title>
      <link>https://dev.to/chetansanghani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chetansanghani"/>
    <language>en</language>
    <item>
      <title>Google's MathSolver JSON-LD validator is stricter than schema.org. I learned that the hard way over 4 rounds of fixes.</title>
      <dc:creator>Chetan Sanghani</dc:creator>
      <pubDate>Thu, 02 Jul 2026 16:10:46 +0000</pubDate>
      <link>https://dev.to/chetansanghani/googles-mathsolver-json-ld-validator-is-stricter-than-schemaorg-i-learned-that-the-hard-way-over-3eb0</link>
      <guid>https://dev.to/chetansanghani/googles-mathsolver-json-ld-validator-is-stricter-than-schemaorg-i-learned-that-the-hard-way-over-3eb0</guid>
      <description>&lt;p&gt;Last week, Google Search Console flagged 10 pages on my Indian tax calculator suite with structured-data errors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing field &lt;code&gt;usageInfo&lt;/code&gt; — 10 items&lt;/li&gt;
&lt;li&gt;Invalid value in field &lt;code&gt;itemtype&lt;/code&gt; — 10 items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pages all had &lt;code&gt;MathSolver&lt;/code&gt; JSON-LD blocks. I had 38 similar blocks across the site. The natural assumption: I made a schema mistake once, and it propagated to all 38 tools.&lt;/p&gt;

&lt;p&gt;Four commits and 76 files later, I discovered the real problem — and it wasn't a schema mistake at all.&lt;/p&gt;

&lt;p&gt;Here's the full journey, with commit hashes, so you can skip the six hours I spent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup: what the schema looked like
&lt;/h2&gt;

&lt;p&gt;For context, &lt;a href="https://smarttaxcalc.in" rel="noopener noreferrer"&gt;SmartTaxCalc.in&lt;/a&gt; is a suite of 38 free Indian tax calculators (HRA, Advance Tax, NRI residency, DTAA, RSU vesting, etc.). Every tool page had a &lt;code&gt;MathSolver&lt;/code&gt; JSON-LD block that looked roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MathSolver"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fixed Deposit (FD) Calculator"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://smarttaxcalc.in/tools/fd-calculator/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mathExpression"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maturity = principal * (1 + rate/(4*100))^(4*tenure_years)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isAccessibleForFree"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inLanguage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en-IN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mainEntityOfPage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://smarttaxcalc.in/tools/fd-calculator/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publisher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Organization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SmartTaxCalc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://smarttaxcalc.in"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reviewedBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Person"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CA Ankitkumar Italiya"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"identifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ICAI:644575"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://smarttaxcalc.in/reviewer/ankitkumar-italiya/"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"citation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Legislation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Section 80C and Section 194A of the Income Tax Act, 1961"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"legislationJurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Country"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"India"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"additionalProperty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PropertyValue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Applicable Regime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Both regimes"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PropertyValue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Applicable AYs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"All AYs"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every field maps to a valid schema.org property. &lt;code&gt;citation&lt;/code&gt; on &lt;code&gt;CreativeWork&lt;/code&gt; (which &lt;code&gt;MathSolver&lt;/code&gt; inherits from) legitimately accepts &lt;code&gt;Legislation&lt;/code&gt; or &lt;code&gt;CreativeWork&lt;/code&gt;. &lt;code&gt;additionalProperty&lt;/code&gt; is &lt;code&gt;PropertyValue&lt;/code&gt;. &lt;code&gt;spatialCoverage&lt;/code&gt;/&lt;code&gt;legislationJurisdiction&lt;/code&gt; on &lt;code&gt;Country&lt;/code&gt; — all valid per &lt;a href="https://schema.org/MathSolver" rel="noopener noreferrer"&gt;schema.org's own docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But Google's validator disagreed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 1: Fix the obvious (commit &lt;code&gt;32d1a24&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: The GSC error strings gave me two things to fix.&lt;/p&gt;

&lt;p&gt;For "Missing field usageInfo" — Google's &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/math-solvers" rel="noopener noreferrer"&gt;MathSolver docs&lt;/a&gt; mark &lt;code&gt;usageInfo&lt;/code&gt; as required. I hadn't included it. Easy fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;+  "usageInfo": "https://smarttaxcalc.in/methodology/",
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For "Invalid value in field itemtype" — I assumed the &lt;code&gt;citation.@type: Legislation&lt;/code&gt; was the problem. &lt;code&gt;Legislation&lt;/code&gt; is more specific than &lt;code&gt;CreativeWork&lt;/code&gt;; maybe Google's rich-result validator only accepts the broader type in citation slots.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;   "citation": {
&lt;span class="gd"&gt;-    "@type": "Legislation",
&lt;/span&gt;&lt;span class="gi"&gt;+    "@type": "CreativeWork",
&lt;/span&gt;     "name": "Section 80C and Section 194A of the Income Tax Act, 1961",
&lt;span class="gd"&gt;-    "legislationJurisdiction": {
&lt;/span&gt;&lt;span class="gi"&gt;+    "spatialCoverage": {
&lt;/span&gt;       "@type": "Country",
       "name": "India"
     }
   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Applied to all 38 razor files + 38 static HTML mirrors. 76 files, one commit. Deployed. &lt;strong&gt;Rich Results Test result: still "1 invalid item detected."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reasonable step, wrong root cause. Time to peel the next layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 2: Strip the "obviously invalid on MathSolver" properties (commit &lt;code&gt;6311067&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Second hypothesis: some of the fields I kept aren't valid on &lt;code&gt;MathSolver&lt;/code&gt; at all, even though they were valid schema.org somewhere.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;additionalProperty&lt;/code&gt; — checking schema.org more carefully — is defined on &lt;code&gt;Place&lt;/code&gt;, &lt;code&gt;Product&lt;/code&gt;, &lt;code&gt;QualitativeValue&lt;/code&gt;, &lt;code&gt;QuantitativeValue&lt;/code&gt;, and &lt;code&gt;StatisticalPopulation&lt;/code&gt;. &lt;strong&gt;Not &lt;code&gt;CreativeWork&lt;/code&gt;.&lt;/strong&gt; So &lt;code&gt;MathSolver&lt;/code&gt; (which extends &lt;code&gt;CreativeWork&lt;/code&gt;) shouldn't have &lt;code&gt;additionalProperty&lt;/code&gt; even if I want it there.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;citation.spatialCoverage: Country&lt;/code&gt; — the &lt;code&gt;Country&lt;/code&gt; subtype felt exotic; Google's stricter validator might reject it in favor of the plain &lt;code&gt;Place&lt;/code&gt; type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-  "additionalProperty": [
-    { "@type": "PropertyValue", "name": "Applicable Regime", "value": "Both regimes" },
-    { "@type": "PropertyValue", "name": "Applicable AYs", "value": "All AYs" }
-  ]
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;   "citation": {
     "@type": "CreativeWork",
     "name": "...",
&lt;span class="gd"&gt;-    "spatialCoverage": {
-      "@type": "Country",
-      "name": "India"
-    }
&lt;/span&gt;   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;76 files again. Deploy. &lt;strong&gt;Rich Results Test result: still "1 invalid item detected."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At this point I was staring at a &lt;code&gt;MathSolver&lt;/code&gt; block with only &lt;code&gt;publisher.Organization&lt;/code&gt;, &lt;code&gt;reviewedBy.Person&lt;/code&gt;, and &lt;code&gt;citation.CreativeWork&lt;/code&gt; as nested types. The same page had a &lt;code&gt;WebApplication&lt;/code&gt; block validating fine with &lt;code&gt;Organization&lt;/code&gt; + &lt;code&gt;Offer&lt;/code&gt; nested. So &lt;code&gt;Organization&lt;/code&gt;/&lt;code&gt;Person&lt;/code&gt; clearly weren't the problem.&lt;/p&gt;

&lt;p&gt;By elimination, the offender had to be &lt;code&gt;CreativeWork&lt;/code&gt; in citation. Or the &lt;code&gt;MathSolver&lt;/code&gt; @type itself. But I hadn't proven the latter yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 3: Make citation a plain text string (commit &lt;code&gt;e642939&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Third hypothesis: any nested &lt;code&gt;@type&lt;/code&gt; at all inside &lt;code&gt;MathSolver&lt;/code&gt;'s &lt;code&gt;citation&lt;/code&gt; gets rejected. schema.org allows &lt;code&gt;citation&lt;/code&gt; to accept &lt;code&gt;Text&lt;/code&gt; OR &lt;code&gt;CreativeWork&lt;/code&gt; — switching to Text kills the last nested @type without losing information.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-  "citation": {
-    "@type": "CreativeWork",
-    "name": "Section 80C and Section 194A of the Income Tax Act, 1961",
-    "alternateName": "..."
-  }
&lt;/span&gt;&lt;span class="gi"&gt;+  "citation": "Section 80C and Section 194A of the Income Tax Act, 1961"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy. Rich Results Test. &lt;strong&gt;Same error. "Invalid value in field itemtype."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now the parsed MathSolver had only &lt;code&gt;publisher.Organization&lt;/code&gt; + &lt;code&gt;reviewedBy.Person&lt;/code&gt; as nested types — both of which validated fine on the same page's &lt;code&gt;WebApplication&lt;/code&gt; block, and both of which are standard &lt;code&gt;CreativeWork&lt;/code&gt;-inherited properties.&lt;/p&gt;

&lt;p&gt;If a completely spec-clean &lt;code&gt;MathSolver&lt;/code&gt; with only unambiguous nested types still fails validation, the problem isn't the schema. It's the &lt;code&gt;MathSolver&lt;/code&gt; type itself in this context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 4: Remove MathSolver entirely (commit &lt;code&gt;64a86db&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;I re-read Google's MathSolver documentation with fresh eyes. The doc opens with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Math solver structured data helps users find math solver services in Google Search results."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And later:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Math solvers help users solve math problems by generating step-by-step solutions..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Google MathSolver is a feature-gated schema. It's for &lt;a href="https://www.wolframalpha.com/" rel="noopener noreferrer"&gt;Wolfram Alpha&lt;/a&gt;, &lt;a href="https://photomath.com/" rel="noopener noreferrer"&gt;Photomath&lt;/a&gt;, &lt;a href="https://www.symbolab.com/" rel="noopener noreferrer"&gt;Symbolab&lt;/a&gt; — educational platforms that solve math problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A tax calculator suite is not a math solver, no matter how many equations we run.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google's validator wasn't rejecting a specific field. It was rejecting the eligibility of the entire schema for our use case. The "Invalid value in field itemtype" error was Google's way of saying "this schema doesn't apply here, please stop." I was fighting a feature gate, not a validation bug.&lt;/p&gt;

&lt;p&gt;Removed the &lt;code&gt;MathSolver&lt;/code&gt; block from all 38 tool razors and 38 static mirrors. 1,861 lines deleted across 76 files.&lt;/p&gt;

&lt;p&gt;Rich Results Test result: 0 MathSolver items detected. No error. WebApplication + BreadcrumbList + HowTo all still valid, still eligible for their respective rich results.&lt;/p&gt;

&lt;p&gt;The GSC error will clear as Google re-crawls the pages over the next 3-7 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson that would have saved me 6 hours
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Read the target audience paragraph of any Google structured-data doc before rolling it out at scale.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google's structured-data docs almost always open with a "who this is for" statement. For MathSolver:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Math solver structured data helps users find math solver services in Google Search results."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not "math-related content." Not "sites that display formulas." &lt;strong&gt;Math solver &lt;em&gt;services&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I skipped that sentence because I was building tax calculators — of course they involve math. Six hours later I learned that Google's definition of "math solver" is narrower than mine, and its validator enforces the definition rigidly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two practical takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Feature-gated schemas exist. Detect them early.
&lt;/h3&gt;

&lt;p&gt;Not every schema Google documents is available to every publisher. &lt;code&gt;MathSolver&lt;/code&gt;, &lt;code&gt;EmployerAggregateRating&lt;/code&gt;, &lt;code&gt;JobPosting&lt;/code&gt;, &lt;code&gt;DatasetProperty&lt;/code&gt; — these get feature-gated to specific verticals. Even a valid schema fails validation if you're the wrong publisher.&lt;/p&gt;

&lt;p&gt;Look for these signals BEFORE implementing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs open with "helps users find [specific type of service]"&lt;/li&gt;
&lt;li&gt;Named examples in the docs are all one narrow vertical&lt;/li&gt;
&lt;li&gt;Google's rich result gallery for that type shows only 3-5 major players&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of those signal apply, validate ONE page in Rich Results Test &lt;strong&gt;before&lt;/strong&gt; rolling out the schema to your entire site.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. "Invalid value in field itemtype" is Google's catch-all rejection.
&lt;/h3&gt;

&lt;p&gt;The error name suggests something specific — a particular &lt;code&gt;@type&lt;/code&gt; value in a particular slot. In practice, Google throws this error whenever &lt;em&gt;anything&lt;/em&gt; about your schema doesn't match its narrower-than-schema.org expectation.&lt;/p&gt;

&lt;p&gt;If you see this error and you're SURE your schema is spec-clean, the answer isn't more schema polish. The answer is: are you using this schema type in a context Google intended it for?&lt;/p&gt;

&lt;h2&gt;
  
  
  Post-mortem: what I'd change
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Locked into a guideline doc&lt;/strong&gt; (&lt;a href="https://smarttaxcalc.in/" rel="noopener noreferrer"&gt;&lt;code&gt;docs/guidelines/content-and-integrity.md&lt;/code&gt;&lt;/a&gt; in my repo) — never add MathSolver JSON-LD on this site again. Also captured the anti-pattern for future contributors: validate ONE test page in Rich Results Test before rolling any new schema type across all 38 tools.&lt;/p&gt;

&lt;p&gt;If you're implementing structured data for a niche use case, budget the "test one page first" step. It's the difference between one file changed and 76 files changed four times in a row.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm &lt;a href="https://smarttaxcalc.in/about/" rel="noopener noreferrer"&gt;Chetan Sanghani&lt;/a&gt;, building &lt;a href="https://smarttaxcalc.in" rel="noopener noreferrer"&gt;SmartTaxCalc.in&lt;/a&gt; — 38 free Indian tax calculators, editorially reviewed by CA Ankitkumar Italiya (ICAI M-644575). Feedback welcome — especially if you've hit similar feature-gate walls with other Google structured data types.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>google</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
