Balise
Try the live demo ↗
An AI-readiness scanner that exposes the data debt of refurbished-goods merchants.
Type
Case study
Timeframe
1 day
Toolkit
Lovable · Claude (API) · Supabase Edge Functions
Year
2026
Problem
Agentic commerce went live in 2026 — Shopify feeds catalogs into ChatGPT and Copilot, and OpenAI publishes rejection reasons like marketing language and price mismatches. For refurbished goods the stakes are acute: purchase decisions rest on the three worst-structured attributes — condition, battery, warranty.
Solution
Balise scores a listing's AI-readability out of 14 from a pasted URL: deterministic HTML checks cross-referenced with an LLM constrained to cite exact excerpts, recomputed and capped server-side. The server is always the source of truth, never the model.
Balise: an AI-readiness scanner that exposes the data debt of refurbished-goods merchants
Role: solo Product Designer and builder — Duration: 4 day (full cycle, from framing to field calibration) — Year: 2026 — Stack: Lovable · Claude (API) · Supabase Edge Functions.
Designed, built, and calibrated in one day. Of the 8 stores analyzed, 7 product listings contain a contradiction an AI can relay to a buyer.
Context
Deliverable: a public tool. The merchant pastes a product page URL and receives an AI-readability score out of 14 with their 3 priority findings.
Balise extends Finch, my buyer-loyal shopping agent, by switching sides of the counter: after building the agent that reads product listings, I built the tool that measures whether those listings are readable.
The problem
Agentic commerce became operational in 2026: Shopify pushes catalogs into ChatGPT and Copilot, and OpenAI published a product feed specification along with its rejection reasons. Two of them define the problem: "marketing language instead of factual descriptions" and "price mismatch between the feed and the site."
For refurbished goods, the stakes are acute: the purchase decision rests on three attributes (condition, battery, warranty) that are precisely the worst structured. My 15 years at Apple supporting buyers taught me that these three answers make or break trust. I made them the core of the scoring rubric.
The 3 structuring decisions
1. Refusing the fake per-engine score. Displaying "ChatGPT score: 4/10" would have been catchy — and methodologically bogus: I have no access to the engines' pipelines. Balise displays an honest data-readability score, defensible line by line. Real engine-by-engine testing remains the territory of the paid human audit: the limit of the free tier structures the offer.
2. A public scorer rather than a Shopify app. The app would have required 6 weeks of OAuth, billing, and review. The URL scorer asks zero friction from the merchant, shares as a single link, and works as a lead magnet: free score and 3 findings, the full 7-criteria breakdown in exchange for an email, complete audit as the upper tier.
3. The server is the source of truth, never the LLM. The architecture crosses two engines: deterministic checks on the HTML (JSON-LD Product, price consistency, content trapped inside images, AI-crawler robots.txt) and an LLM constrained by a strict rubric where every grade must cite an exact excerpt from the page. The score is recomputed server-side, caps are enforced in code, and page content is treated as data, never as instructions (prompt-injection protection).
Calibration as a method
The first real scan tested the tool as much as the listing. Balise flagged a price inconsistency: "€200–300" in the spec sheet, €399 displayed. I first suspected my extractor. Manual check: the stale field really existed. And on that same scan, the LLM's grading matched my manual grading on 7 out of 7 criteria.
That calibration produced three fixes I'm prouder of than the first draft:
A locked rule: I was classifying price contradictions as "minor inconsistencies." A real case showed that an AI can relay the wrong price to a buyer. Any price contradiction is now major, scored 0.
A product guardrail: a non-product URL (homepage, category page) returned an absurd score that was stored in cache. The case is now intercepted before storage, with a dedicated error message.
A UX error state: Back Market and two other stores block automated analysis. Rather than a raw technical error, the tool now identifies anti-bot blocking and explains it in merchant language.
Results
Across 11 French stores tested (3 blocked, 8 analyzed):
7 out of 8 listings contain at least one internal contradiction: 240 vs 256 GB of SSD, USB-C 2.0 vs 3.0, 12 vs 24-month warranty, JSON-LD price differing from the displayed price, "DDR4" on an M1 MacBook.
Battery information, the buyer's #1 criterion, is missing or unverifiable almost everywhere.
Grades are named but rarely defined, leaving the AI free to interpret them.
The size pattern holds: market leaders score between 11 and 12/14, small stores between 6 and 8. Data debt hits hardest those who have no team to see it.
These findings feed a Medium article, an outreach sequence for the full audit, and the product roadmap.

Limitations
The score measures a listing's readability, not an engine's actual answer. The calibration sample remains modest: 8 stores, one listing each, on a given day. And a site that blocks my scanner is not invisible to official crawlers, which benefit from dedicated authorizations. Balise is a thermometer, not a verdict.
What's next
Open up the scanner to go from 8 to 50 listings and publish what the data says. Add the channel layer (robots.txt, feeds, indexing) as a badge distinct from the score. Convert scans into full audits — the one deliverable the machine cannot produce.


