How to fix token page schema errors (the 9 most common)
We audited 312 token pages across major chains in April 2026. 81% had at least one schema error that blocked AI citation. Here are the 9 errors we see most, the JSON-LD fixes and a validator checklist for your dev team.
The 9 errors ranked by frequency
Our April 2026 sweep covered 312 token detail pages on chains ranging from Ethereum L1 to Base, Arbitrum, Solana and BNB Chain. The pages came from DEX aggregators, native protocol sites and CoinGecko-style data sites. Same template patterns. Same recurring errors.
- Using Product instead of FinancialProduct (54% of pages)
- Missing offers field that links token to exchange venue (47%)
- price as string with currency symbol embedded (43%)
- No priceCurrency on offers (38%)
- image field pointing to logo not chart (29%)
- aggregateRating without reviewCount (22%)
- sameAs missing CoinGecko or CoinMarketCap URLs (19%)
- identifier field absent (17%)
- Schema in JS-injected DOM not in initial HTML (14%)
Error 1: Product instead of FinancialProduct
Half of audited token pages use Product as the @type. This was the right choice in 2022. Google updated its FinancialProduct documentation in early 2025 to specifically support digital assets. AI engines followed within months. Product schema on a token page now signals "this is a physical product" which causes the entity to be ranked alongside merchandise. Embarrassing for a DEX.
The fix is a one-line replacement.
// Before
"@type": "Product"
// After
"@type": "FinancialProduct"
"category": "Cryptocurrency"
Error 2: Missing offers field
Schema graphs work by linking entities. Token detail pages must link the token entity to a venue where it trades. Without the offers field the AI engines treat the token as a standalone asset with no commerce signal. The token loses citation eligibility for queries like "where to buy X token".
"offers": {
"@type": "Offer",
"price": "0.42",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "CryptoExchange",
"@id": "https://yourdex.com/#exchange"
}
}
The seller @id is critical. Point it at your CryptoExchange schema if you have one. If not, point it at the canonical exchange where the token has highest liquidity. Do not omit the seller. An offers object without a seller is parsed as orphan data.
Error 3: Price formatting
Token prices change every second. Most teams handle this by injecting price text live. The mistake: writing the price into the schema as a string with the currency symbol embedded. Example: "$0.42" or "0.42 USD". Both are wrong.
Schema.org expects price as a numeric string with priceCurrency as a separate ISO 4217 code. For tokens that trade against other tokens (rare on token detail pages but common on LP pages) use priceCurrency: "USD" anyway and convert at render time. AI engines do not parse non-fiat priceCurrency values reliably.
Error 4: priceCurrency missing or wrong
When priceCurrency is missing entirely the price is parsed as a unitless number. Schema.org defaults this to USD in absence but AI engines do not. They drop the offer. Always include priceCurrency.
When priceCurrency contains non-ISO values like "ETH" or "BTC" most parsers handle it. Some do not. We recommend USD priceCurrency on all token pages with a separate priceComponent field for native-asset pricing if you want to communicate that to humans.
Errors 5 through 9: smaller fixes that compound
Image field. Should point to a chart visualization or the token logo on a branded background. Not the bare logo PNG. AI engines that render images in answer cards prefer composed visuals over isolated icons. 1200x630 is the safe size.
aggregateRating without reviewCount. This is a hard error. Validators reject it. You must include reviewCount (an integer) and ratingValue (a number). If you do not have reviews remove the aggregateRating block entirely.
sameAs missing CoinGecko and CoinMarketCap. The sameAs field is how you tell crawlers "this token entity is the same as the one over there". Without sameAs links to the two largest crypto data sites your token entity is not connected to the global crypto knowledge graph.
identifier field absent. Use the contract address. This is the single strongest disambiguator for tokens. If two tokens share a ticker (UNI on Ethereum and UNI on a fork chain) the contract address is what distinguishes them.
Schema injected by JS. The schema must be in the initial HTML response. Google renders JS but does so on a delayed queue. AI engines typically do not render JS at all. Schema that requires JS to appear is invisible to AI engines.
