Math Solvers Schema Framework

Use conditional-logic schema generation to keep Math Solvers markup aligned with real page state and avoid stale or invalid static templates.

When To Use It

Google Search CentralMath Solvers documentation

Use on the homepage of a math problem solving site that accepts an expression and returns a solution, such as a step-by-step walkthrough or graph.

Key Implementation Documentation Highlights

  • Required: @type as ["MathSolver", "LearningResource"], url, usageInfo (your privacy policy URL) and potentialAction (SolveMathAction).
  • SolveMathAction requires target containing {math_expression_string} and mathExpression-input set to required name=math_expression_string. eduQuestionType is recommended.
  • Recommended properties: assesses, inLanguage, learningResourceType (the fixed value Math Solver).
  • eduQuestionType and assesses take values from Google's problem type list (for example Polynomial Equation, Derivative, Quadratic Equation).
  • Put the markup on the homepage, use canonical URLs if the solver lives at several URLs, and keep the solution and step-by-step walkthrough accessible to users who arrive from Google.
  • Solvers must be accurate; do not use the markup for promotional content or for pages that are not math solvers. Validate with the Rich Results Test.

Template Approach

const pageData = {
  name: "Example Math Solver",
  homepage: "https://math.example.com/",
  privacyPolicy: "https://math.example.com/privacy",
  solveUrl: "https://math.example.com/solve?q={math_expression_string}"
};

const staticTemplate = {
  "@context": "https://schema.org",
  "@type": ["MathSolver", "LearningResource"],
  "name": pageData.name,
  "url": pageData.homepage,
  "usageInfo": pageData.privacyPolicy,
  "potentialAction": {
    "@type": "SolveMathAction",
    "target": pageData.solveUrl,
    "mathExpression-input": "required name=math_expression_string"
  },
  "learningResourceType": "Math Solver"
};

Conditional-logic Framework

// Shared helpers
const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
const ISO_DATETIME = /^(\d{4}-\d{2}-\d{2})T([01]\d|2[0-3]):[0-5]\d(:[0-5]\d(\.\d+)?)?(Z|[+-](0\d|1[0-4]):[0-5]\d)$/;

function isAbsoluteUrl(value) {
  if (typeof value !== "string") return false;
  try {
    const url = new URL(value);
    return (url.protocol === "https:" || url.protocol === "http:") && url.hostname !== "";
  } catch {
    return false;
  }
}

function toIsoDate(value) {
  const match = typeof value === "string" ? ISO_DATE.exec(value) : null;
  if (!match) return null;
  const [y, m, d] = match.slice(1).map(Number);
  const date = new Date(Date.UTC(y, m - 1, d));
  return date.getUTCMonth() === m - 1 && date.getUTCDate() === d ? value : null;
}

// Keeps the original timezone offset; rejects naive or unparseable values.
function toIsoDateTime(value) {
  const match = typeof value === "string" ? ISO_DATETIME.exec(value) : null;
  return match && toIsoDate(match[1]) ? value : null;
}

// Drops null, undefined, "", [] and {} recursively.
function compact(value) {
  if (Array.isArray(value)) {
    const items = value.map(compact).filter((item) => item !== undefined);
    return items.length ? items : undefined;
  }
  if (value !== null && typeof value === "object") {
    const out = {};
    for (const [key, item] of Object.entries(value)) {
      const kept = compact(item);
      if (kept !== undefined) out[key] = kept;
    }
    return Object.keys(out).length ? out : undefined;
  }
  return value === null || value === undefined || value === "" ? undefined : value;
}

// Page gates: indexable, self-canonical, marked-up content visible.
function passesPageGates(page) {
  if (!page || page.noindex || page.robotsBlocked) return false;
  if (!isAbsoluteUrl(page.url)) return false;
  if (page.canonicalUrl && page.canonicalUrl !== page.url) return false;
  return page.contentVisible === true;
}

// Math solver helpers
// Google's problem type list (eduQuestionType and assesses), compared case-insensitively.
const PROBLEM_TYPES = [
  "Absolute Value Equation", "Algebra", "Arc Length", "Arithmetic", "Biquadratic Equation", "Calculus",
  "Characteristic Polynomial", "Circle", "Derivative", "Differential Equation", "Distance", "Eigenvalue",
  "Eigenvector", "Ellipse", "Exponential Equation", "Function", "Function Composition", "Geometry",
  "Hyperbola", "Inflection Point", "Integral", "Intercept", "Limit", "Line Equation", "Linear Algebra",
  "Linear Equation", "Linear Inequality", "Logarithmic Equation", "Logarithmic Inequality", "Matrix",
  "Midpoint", "Parabola", "Parallel", "Perpendicular", "Polynomial Equation", "Polynomial Expression",
  "Polynomial Inequality", "Quadratic Equation", "Quadratic Expression", "Quadratic Inequality",
  "Radical Equation", "Radical Inequality", "Rational Equation", "Rational Expression", "Rational Inequality",
  "Slope", "Statistics", "System of Equations", "Trigonometry"
];
const PLACEHOLDER = "{math_expression_string}";

// Map to Google's canonical spelling; drop unknown problem types.
function toProblemTypes(values) {
  const out = [];
  for (const v of values || []) {
    const match = PROBLEM_TYPES.find((t) => t.toLowerCase() === String(v).trim().toLowerCase());
    if (match && !out.includes(match)) out.push(match);
  }
  return out;
}

function isHomepage(url) {
  return new URL(url).pathname === "/";
}

function buildSolveMathAction(action) {
  if (!action || typeof action.target !== "string" || !action.target.includes(PLACEHOLDER)) return null;
  if (!isAbsoluteUrl(action.target.replace(PLACEHOLDER, "x"))) return null;
  return {
    "@type": "SolveMathAction",
    target: action.target,
    "mathExpression-input": "required name=math_expression_string",
    eduQuestionType: toProblemTypes(action.problemTypes)
  };
}

function buildMathSolverSchema(source) {
  const page = source.page;
  // Markup belongs on the solver site's homepage.
  if (!passesPageGates(page) || !isHomepage(page.url)) return null;

  // Required: url, usageInfo (privacy policy), potentialAction SolveMathAction.
  const actions = (source.actions || []).map(buildSolveMathAction).filter(Boolean);
  if (!isAbsoluteUrl(source.privacyPolicyUrl) || !actions.length) return null;

  return compact({
    "@context": "https://schema.org",
    "@type": ["MathSolver", "LearningResource"], // both types, always
    name: source.name,
    url: page.url,
    usageInfo: source.privacyPolicyUrl,
    inLanguage: (source.languages || []).filter((l) => /^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(l)),
    potentialAction: actions,
    learningResourceType: "Math Solver",
    assesses: toProblemTypes(source.assesses)
  }) ?? null;
}

// Usage:
// const source = {
//   "page": {
//     "url": "https://math.example.com/",
//     "canonicalUrl": "https://math.example.com/",
//     "noindex": false,
//     "contentVisible": true
//   },
//   "name": "Example Math Solver",
//   "privacyPolicyUrl": "https://math.example.com/privacy",
//   "languages": [
//     "en",
//     "es"
//   ],
//   "actions": [
//     {
//       "target": "https://math.example.com/solve?q={math_expression_string}",
//       "problemTypes": [
//         "polynomial equation",
//         "Derivative",
//         "Quadratic Equation",
//         "Matrix multiplication"
//       ]
//     }
//   ],
//   "assesses": [
//     "Polynomial Equation",
//     "Derivative",
//     "Quadratic Equation"
//   ]
// };
// const schema = buildMathSolverSchema(source);

Why Conditional Logic Is Better Than Static Templates

  • Prevents emitting empty, null, or stale fields that frequently trigger rich result warnings.
  • Supports multiple page states (for example: no rating yet, no image yet, no offers yet) without duplicate templates.
  • Lets engineering teams centralize schema policy checks and validation in reusable code paths.
  • Makes large-scale schema maintenance safer when content models evolve over time.

Property Reference

What Google's Math solver documentation requires and recommends, property by property. These are the same rules the SchemaCDN validator checks. Each name links to its schema.org definition.

Math solver properties in Google's documentation
PropertyGoogleExpectsNotes
@typeRequiredText, can repeat@type must be ["MathSolver", "LearningResource"]. One of: MathSolver, LearningResource.
potentialActionRequiredSolveMathAction, can repeatThe action that leads to a mathematical explanation (for example, a step-by-step solution or graph) of a math expression.
potentialAction.mathExpression-inputRequiredTextMathExpression-input must be 'required name=math_expression_string'. One of: required name=math_expression_string.
potentialAction.targetRequiredEntryPoint or URLTarget must be a URL template containing {math_expression_string}.
potentialAction.eduQuestionTypeRecommendedText, can repeatEduQuestionType values must come from Google's math problem type list. One of: Absolute Value Equation, Algebra, Arc Length, Arithmetic, Biquadratic Equation, Calculus, and 43 more.
urlRequiredURLThe URL of the math solver.
usageInfoRequiredURLThe URL of your privacy policy.
assessesRecommendedText, can repeatProblem types solved (from Google's problem type list)
inLanguageRecommendedText, can repeatLanguages supported by the solver.
learningResourceTypeRecommendedTextLearningResourceType should be 'Math Solver'. One of: Math Solver.

Explore Other Schema Framework Pages

Merchant Listing Use on pages where a product can be bought, with price, availability, shipping and return details. Product Open Limited Movie Use for movie detail pages with canonical film information and transparent metadata attribution. Movie Open Organization Use for official organization pages to clarify brand identity and authoritative entity signals. Organization Open Retired Practice Problems Use for educational practice content that presents solvable problems and answer validation structure. Quiz Open Product Snippet Use for product pages where pricing, availability, and product identity are visible to users. Product Open Product Variants Use when one product comes in variants such as size or color, grouped with ProductGroup. ProductGroup Open Profile Page Use for creator or contributor profile pages where identity attributes and ownership are explicit. ProfilePage Open Q&A Use for pages where users submit questions and community or editorial answers are displayed. QAPage Open Recipe Use for recipe pages with complete ingredients, instructions, and preparation details. Recipe Open Return Policy Use to publish a merchant return policy once at the organization level, with offer-level overrides. MerchantReturnPolicy Open Review Snippet Use when a page publishes genuine reviews tied to a clearly identified product, service, or entity. Review Open Shipping Policy Use to publish shipping rates, delivery times and destinations once at the organization level. ShippingService Open Site Name Use on the home page so Google shows the preferred site name in search results. WebSite Open Retired Sitelinks Search Box Use on sites with a functioning internal search endpoint that can accept URL query parameters. WebSite Open Software App (Beta) Use for software product pages that describe platform support and application category clearly. SoftwareApplication Open Limited Speakable Use for news-style pages where specific text segments are appropriate for text-to-speech playback. SpeakableSpecification Open Subscription and Paywalled Content Use for pages with restricted sections so Google can distinguish free previews from protected content. CreativeWork Open Limited Vacation Rental Use for rental property detail pages where booking-relevant amenities and location signals are explicit. VacationRental Open Retired Vehicle Listing Use for inventory pages selling vehicles with standardized listing fields and offer information. Car Open Video Use for pages where a primary video is embedded and key media metadata is visible on-page. VideoObject Open Article Use for editorial pages where the visible content is a complete article with a clear byline and publication timestamps. Article Open Limited Book Actions Use when your page helps users read, preview, or purchase books through clearly described actions. Book Open Breadcrumb Use on pages that belong to a clear hierarchy and display navigational trail links users can follow. BreadcrumbList Open Carousel Use when a page lists multiple related entities in a scannable sequence that can be surfaced as cards. ItemList Open Course Use for educational offerings where curriculum details, provider identity, and delivery context are explicit. Course Open Dataset Use for dataset landing pages so datasets are discoverable in Google Dataset Search with license, creator and download details. Dataset Open Discussion Forum Use for forum and community threads where a primary post and subsequent replies are publicly visible. DiscussionForumPosting Open Limited Education Q&A Use for educational question-answer pages where a single canonical answer and supporting context are visible. Quiz Open Employer Aggregate Rating Use on pages that publish employer rating aggregates from a clear and policy-compliant review source. EmployerAggregateRating Open Retired Estimated Salary Use for compensation insight pages that present transparent salary ranges for specific occupations and locations. Occupation Open Event Use for upcoming events with a real-world or virtual occurrence, schedule, and location context. Event Open Retired Fact Check Use for fact-checking pages that evaluate a specific claim with a transparent rating methodology. ClaimReview Open Retired Home Activities Use for virtual classes and activities where participation details and timing are clearly listed. Event Open Retired How-To Use for instructional content that teaches a process through ordered steps and actionable detail. HowTo Open Image Metadata Use on image pages and image hosts that expose ownership and licensing information to search engines. ImageObject Open Job Posting Use for active job listings that include role details, hiring entity, and location/salary context. JobPosting Open Retired Learning Video Use for educational videos where the learning objective and pedagogical structure are explicit. LearningResource Open Local Business Use for physical businesses serving local customers with publicly verifiable contact and location details. LocalBusiness Open Loyalty Program Use to publish a loyalty program and its tiers once at the organization level, so member prices and member shipping can reference them. MemberProgram Open

Implement Math Solvers Schema Frameworks Correctly

Get implementation support for conditional schema architecture, validation, and deployment governance.