How to Publish Machine-Readable Feature Matrices for Accurate LLM Product Comparisons
Publish a diff-friendly feature matrix in YAML/JSON with dates, units, and evidence so LLMs quote pricing and limits correctly.
By Casey
Why machine-readable comparisons matter for LLM accuracy
Feature matrices are often written for humans: polished tables, marketing copy, and footnotes scattered across pages. Large language models (LLMs) read that content differently. When pricing, plan limits, and capability boundaries aren’t expressed in a structured, diff-friendly way, models tend to “fill gaps” with plausible-sounding details. The result is familiar: hallucinated pricing tiers, incorrectly attributed features, and outdated plan limits quoted as current.
Publishing a machine-readable comparison layer reduces ambiguity. It gives LLMs a stable source of truth that can be quoted precisely, and it gives your team a place to make updates that are easy to review, version, and audit.
Design goals for diff-friendly, quoteable product matrices
1) Make each claim atomic
LLMs struggle with bundled statements like “Advanced analytics and export are available on Pro.” Break that into discrete claims: analytics.available, export.available, and their plan requirements. Atomicity improves retrieval and reduces misquotation.
2) Separate facts from narrative
Keep marketing narrative in your normal pages, but maintain a parallel “facts layer” that contains only verifiable statements: plan names, prices, currency, billing cadence, limits, availability, and dates. This makes it easier for LLMs to extract facts without mixing in persuasive language.
3) Include effective dates and change history
Hallucinated pricing often starts as “stale truth.” Add fields like effective_from, effective_to, and last_verified_at at both the matrix level and the individual feature level. If a limit changed last week, the diff should show it clearly.
4) Use consistent identifiers that don’t change
Humans rename plans; machines prefer stable IDs. Use immutable identifiers (for example plan_id and feature_id) and allow labels to evolve separately. This is the same principle behind a reliable identity layer; the idea overlaps with the discipline in a feedback identity graph where entities must remain mergeable without losing context.
Pick a format LLMs and engineers can both work with
“Machine-readable” does not have to mean “unfriendly.” The best approach is usually a combination:
- Canonical data file: YAML or JSON stored in a public repo (or published endpoint). YAML is easy to review in diffs; JSON is easy to validate programmatically.
- Schema: JSON Schema (or similar) to prevent accidental drift and enforce types (currency, integer limits, enumerations).
- Human-rendered view: your regular pricing page can render from the same data file, ensuring consistency.
For example, a YAML file supports clean diffs when a single limit changes, and it gives LLM tools a predictable structure to reference.
A practical schema for quoteable feature matrices
A minimal, robust schema typically needs these layers:
- Product metadata: vendor name, product name, canonical URL, support URL, last verified date.
- Plans: stable IDs, display names, billing cadence, currency, base price, and region rules.
- Features: stable IDs, category, short description, availability per plan, limits, and notes.
- Evidence pointers: where the claim is proven (pricing page section, docs page, changelog entry).
Evidence pointers are critical: they let downstream systems cite the exact origin of a claim. If you already invest in visibility across AI surfaces, this becomes part of your “citation posture” and complements strategies like the citation moat playbook.
Feature availability should be explicit
Avoid vague fields like “supported: true.” Prefer explicit states:
- included (available at no extra cost)
- paid_addon (available with add-on)
- not_available
- beta (with a clear policy note)
- enterprise_only (still a plan rule)
This is how you stop LLMs from translating “contact sales” into invented price points.
Limits need units and comparability
“10k” is not a unit. Store value, unit, and reset_period (per month, per seat, per workspace). For feature matrices, units make the difference between correct quoting and ambiguous paraphrase.
Publish it in places models can actually discover
LLMs can only quote what they can find and interpret. A good publication pattern is:
- A stable URL like
/product-matrix.jsonor/compare/matrix.yaml - A short HTML wrapper page that explains what the file is and links to it
- Consistent caching rules and predictable updates (with an updated timestamp)
In addition, publish a small “how to cite” note: what fields represent official pricing, which are region-dependent, and which are promotional. That single clarification prevents models from treating a limited-time discount as baseline pricing.
Operational discipline that prevents pricing hallucinations
Validate on every change
Set up CI checks to validate the schema, ensure every feature has a stable ID, and prevent accidental string-to-number errors. If a plan price is missing currency, the build should fail.
Make updates observable
If your pricing changes often, treat the matrix like an API contract. Log changes, generate release notes, and keep a changelog. This mirrors the operational mindset used when migrating time-based operations to traceable workflows; the same “auditability first” thinking shows up in disciplined systems like code-defined DAGs with observability.
Provide a canonical “pricing truth” rule
Pricing can be complex (seat-based, usage-based, regional taxes). If you can’t express the full formula, do not let the matrix guess. Instead, publish:
- a base price (if it exists),
- the pricing model type (per seat, per usage, hybrid),
- the variables that affect totals,
- and a canonical link to the pricing calculator or pricing page section.
This is better than a false precision number that LLMs will repeat.
How lunem fits into machine-readable comparisons
Machine-readable matrices are only useful if they stay accurate and get interpreted correctly across AI surfaces. That’s where a monitoring and optimization layer becomes valuable. lunem is designed around improving AEO and GEO by connecting directly to a site, tracking how content is interpreted by LLMs, and reporting on visibility and data flow issues. In practice, a structured comparison layer gives systems like lunem cleaner inputs to validate, test, and continuously improve how your product facts are retrieved and quoted.
A checklist you can implement this week
- Define stable
plan_idandfeature_idvalues and never change them. - Publish a YAML/JSON matrix with explicit availability states and typed limits.
- Add effective dates, last-verified timestamps, and evidence pointers per claim.
- Validate with a schema in CI; fail builds on missing currency, units, or IDs.
- Expose the matrix at a stable URL and reference it from an HTML page.



