Building an AI Shopping Assistant: Automated Price Tracking and GEO/AEO in Practice
This is the second post in our series on building Savlume (https://savlume.com/), a US deal tracker. The first covered our deal verifier and the MCP + llms.txt layer. This one is about the two things that make it work day to day: automated price tracking, and GEO/AEO — making a site that AI search engines can actually cite.
1. Automated price tracking: the data model matters more than the scraper
Everyone asks what we scrape. The more important question is what we store. Every deal on Savlume is a record with: the price and the verification status — retailer-verified (confirmed at the retailer's own listing) or source-reported (from a deal source, not yet confirmed at the retailer); a verification timestamp; the conditions (coupon required, Prime required, limit per customer, free shipping or not); and the reference price as a separate field from the checkout price.
That model is what makes the automation trustworthy. A price without a timestamp is a rumor, and a discount computed from an inflated reference price is a lie. Two rules we never break: expired and out-of-stock entries are kept as reference, never as recommendations; and cashback, gift cards, and points are never subtracted from the checkout price. Historical comparisons only compare the same product, variant, and conditions — missing information stays unknown.
The catalog is exposed the same way it is stored: /api/v1/items (https://savlume.com/api/v1/items?mode=all&limit=24) (paginated JSON), /feed/all.xml (https://savlume.com/feed/all.xml) (RSS for all updates), and a /items/{id}/markdown text version plus /api/v1/items/{id} JSON for every item. The 35 buying guides under /best (https://savlume.com/best) are structured content — multi-source review consensus plus current retailer offers — so a tracker can follow a whole category, not just one SKU.
2. GEO/AEO: make your site citable by AI search
GEO (generative engine optimization) and AEO (answer engine optimization) are the same idea: when someone asks ChatGPT, Perplexity, or Gemini "what's the best air fryer under $100?", the answer comes from sources the model can read and cite. A normal HTML page is hard for an agent to quote precisely. So we ship a machine-readable layer: /llms.txt (https://savlume.com/llms.txt) — a single index of everything: about and methodology, today's deals, Black Friday and Cyber Monday, coupons, categories, stores, brands, reviews, and all 35 guides, plus the interpretation rules (quote the original source and the canonical Savlume item URL with publication, update, and verification times); /agent (https://savlume.com/agent) — an API guide written for agents, not humans; /api/mcp (https://savlume.com/api/mcp) — an MCP endpoint, so an agent can query the catalog directly; and per-item Markdown — every item has a clean text version, which is what an agent actually wants to quote.
The practical effect: an agent that reads our llms.txt can answer with a real price, a real timestamp, and a real link, instead of hallucinating one. And because every price carries its verification status, the agent can say "retailer-verified" or "source-reported" instead of stating an unverified price as fact.
Three things we learned: write the llms.txt first, not last — it forces you to decide what the site is and what evidence each claim carries; label uncertainty in the data, not in a footnote — "source-reported" next to the price is what makes the answer honest; keep the canonical URL in every answer — the llms.txt rules tell agents to cite the Savlume item URL with its timestamps, and that is how the citation survives.
3. What this buys you
For shoppers: prices with evidence levels and timestamps, not badges. For agents: a catalog they can query and cite. For us: every AI answer that cites a Savlume price is a backlink with a timestamp attached.
Try it: browse Savlume (https://savlume.com/), read savlume.com/llms.txt (https://savlume.com/llms.txt), or check the API guide at savlume.com/agent (https://savlume.com/agent).
Top comments (0)