Search engines rank pages. Answer engines such as ChatGPT, Claude, Perplexity and Google's AI answers read them and quote facts from them. Both work best on a store whose facts are explicit: typed specifications, prices with and without VAT, stock, identifiers and classifications. Crystallize holds those facts. This section shows how to publish them as structured data, Markdown and crawlable pages.
GEO (generative engine optimisation) is SEO for answer engines. An answer engine fetches your pages (often without running JavaScript), extracts facts, and quotes them with a link. It needs the same things as a search engine, plus plain-text versions it can read cheaply and facts it can trust.
Every fact a storefront publishes comes from Crystallize, and nothing is claimed that the data doesn't hold:
aggregateRating rather than inventing one.availability out.false, so a storefront can't tell "no" from "not stated". Publish false only for booleans you know were set.Answer engines compare sources. A store whose structured data, Markdown and visible page say the same thing, from the same data, is the one they quote.
Page | In | Structured data | Also |
|---|---|---|---|
Front page | Title, description, canonical, hreflang, |
| Link to the Markdown version |
Category | Title, description, canonical without filter parameters, hreflang |
| Filter links as plain URLs |
Product | Title, description, canonical, hreflang, |
| Markdown version from the same data |
Brand, platform, collection | Title, description, canonical, hreflang |
| |
Article, guide | Title, description, canonical, hreflang |
| |
Search results | Static title, | None | Crawlable, but not indexed |
Cart, account, checkout |
| None | Disallowed in robots.txt |
og:description and JSON-LD descriptions are plain text. Request format: plainText from Discovery, or use a plain-text SEO field.nb for Norwegian Bokmål, even if the tenant language is no.noindex. Allow search results and mark them noindex.<title>, the canonical and hreflang are in <head> of the HTML each crawler gets (see Next.js App Router).@type and property must exist in schema.org and fit its type. isConsumableFor, leaseLength and inCodeSet are easy to put on the wrong type. Validate against the schema.org vocabulary file in CI..md page with each crawler's user agent, and check the status, the content type and what is in <head>.<head>.Tools Universe publishes all of this on a live demo store: Product and ProductGroup JSON-LD with typed specs and UN/CEFACT unit codes, llms.txt, llms-full.txt, and a Markdown version of every page (for example the front page). Photo Store does the same for a camera catalogue.