Short answer: AI can only quote a price it can read. Write every price as plain text in the page’s HTML, with the plan name, the amount, the billing period and one sentence on what is included. Link the pricing page from your main menu. Make the homepage, the pricing page and your structured data show the same numbers. If your pricing is custom, publish a starting price or a typical range. Unvibe checks all of this on your live site and shows the exact text it found.
Why prices matter more than you think
Price is a filter before it is a detail. Buyers ask AI for “the cheapest invoicing tool for freelancers”, “is there a free plan?” or “how much does it cost per month?”. An assistant that can’t find your price has two options: say pricing isn’t listed, or guess. Either way you are less likely to land on a shortlist built around price.
Price is also the first place where a site contradicts itself. Pages get edited at different times, and nobody remembers to update all of them. A buyer might spot the mismatch. A machine reads every copy and has to choose.
Five ways prices become unreadable
1. The price is drawn by JavaScript
Many AI crawlers read the raw HTML and don’t run JavaScript. If your pricing cards are built in the browser from a script or an API call, the HTML a crawler receives has an empty container where the prices should be. It looks fine to you, because your browser runs the script. We explain the mechanism in Why ChatGPT can’t see your vibe-coded app.
The 30-second test: open your pricing page, view the page source (not “Inspect”, which shows the page after JavaScript has run), and search for one of your prices. If the number isn’t in the source, a crawler won’t find it either.
2. The price is in an image or a pop-up
A screenshot of a pricing table, a PDF price list, or a plan comparison that only opens in a modal: all of these are invisible to a crawler reading text. Unvibe’s check wants pricing written as text on the page, not only in a pop-up.
3. “Contact us” with no number
Custom pricing is legitimate. But “Contact sales” on its own tells a buyer nothing, and tells an AI nothing to quote. Unvibe treats a page that mentions contacting sales or a free option without ever stating a number as only partly passing. Even if every deal is different, give a starting price or a typical range and say what moves it: “From $X a month for up to 3 users. Larger teams are quoted individually.”
4. Nobody can find the pricing page
A pricing page that exists but isn’t linked from the homepage can only be found by guessing the address. A link that goes to an error page, or to a login screen, is worse than no link. Put “Pricing” in your main menu or footer, and open it in a private window to be sure it loads without an account.
5. The numbers disagree
This is the most common one, and the easiest to miss. Typical versions:
- The homepage says “from $9 a month” and the cheapest plan on the pricing page is $12.
- The homepage says “free” and the pricing page lists no free plan.
- The structured data says the price is one number and the page shows another.
That last one matters because structured data is a block that states a fact for machines. When it disagrees with the visible page, AI has two answers and may quote the wrong one.
A before and after
A made-up example: an invoicing tool called Tallyleaf, for freelancers. Tallyleaf is not a real product.
| Where | Before | After |
|---|---|---|
| Homepage | Plans from $9 a month | Plans from $12 a month, billed monthly. The same number as the pricing page. |
| Pricing page | Cards drawn by a script. In the HTML: an empty <div id="plans"> | “Solo: $12 a month. 1 user, unlimited invoices.” “Team: $29 a month. Up to 5 users, shared client list.” As text in the HTML. |
| Custom plan | “Contact us” | “Studio: from $79 a month for 10 or more users. Quoted individually above that.” |
| Main menu | No pricing link | A real “Pricing” link |
| Structured data | price 9 | price 12, matching the cheapest price on the page |
The structured data for the “after” version is small. It states the entry price, and the number must match the page:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Tallyleaf",
"applicationCategory": "BusinessApplication",
"description": "Invoicing software for freelancers.",
"offers": {
"@type": "Offer",
"price": "12",
"priceCurrency": "USD"
}
}
</script>
For a shop, the same idea applies per product: a Product with an Offer that has a price, a priceCurrency and an availability, on the product page, matching the price shown there.
Six steps you can do today
1. List every place a price appears
Homepage, pricing page, product pages, footer offers, structured data. Write the number each one shows. If two differ, decide which is right.
2. Check the number is in the source
View source, search for the price. No match means JavaScript draws it. Ask your builder or coding agent to render the pricing section into the HTML at build time.
3. Write each price as text
Plan name, price, period, one sentence on what’s included. If you have a free plan or trial, list it in the same place.
4. Link it and make sure it loads
“Pricing” in the header or footer, and a page that opens without logging in.
5. Make everything agree
If both numbers are right (monthly vs annual billing, say), write that next to each one. Better, keep prices in one place in your code and render them everywhere, so they can’t drift apart.
6. Ask an AI
Paste only the text of your homepage and pricing page into an assistant and ask: “How much does this cost, and is there a free plan?” If it hedges or gets it wrong, so would a crawler. Fix the page and ask again.
Where Unvibe fits
You can do all six steps by hand. This is what Unvibe checks for you, and keeps checking.
Prices AI can read and trust
- Price on the page: one of the 17 checks in the score. It passes when pricing is written as text, not only in a pop-up.
- Prices link: another check. It looks for a link to prices, the menu or products in the main menu.
- Structured data: checks the JSON-LD describes the business, its offer and its price. For shops, a product page needs Product data with a price.
- Contradictions: the audit flags prices or claims that disagree between pages, or between a page and its structured data, quoting both places side by side. These findings aren’t part of the 17 checks: fixing them shows up as verified work rather than a higher score.
- Every finding says what it saw, why it matters, the exact fix and how it will verify it, and the next checkup re-reads the live site to confirm.
If you use a coding agent, connect it over MCP and ask it to “use Unvibe to get my fixes and apply them”. How the checks work, and their limits, are in the checkup docs and the methodology. A readable price doesn’t guarantee that any assistant recommends you; it removes one reason it can’t.
Questions
What if my pricing is custom?
Still publish a starting price or a typical range, and say what changes it. A page that only says “contact us” gives AI no number to quote.
Do I need the price in structured data if it is on the page?
The price should be on the page as text first. Structured data states the same fact in a form machines can read without guessing, but it must match the page exactly.
Does an Unvibe checkup change my prices?
No. Unvibe only reads your public pages. You or your coding agent make the changes, and the next checkup confirms them on the live site.