Manual audits, no software
Ran free points audits for 5 friends, then $50 audits for 5 more. Goal: revenue and signal before code. Confirmed sophisticated users will pay for redemption strategy when it's specific to their stack.
An AI assistant for travelers who collect credit-card points and want to spend them wisely, grounded in real, verified data so it doesn't make things up.
Try the live preview ↗ temporary URL while I move it to its real domain
A friendly chat-style assistant that looks at the credit-card points you've accumulated (Amex, Chase, Capital One, hotel and airline miles) and tells you the smartest way to redeem them, which transfer partner, which route, which hotel. The AI looks things up before answering instead of guessing.
People who already collect points and want a calm, accurate second opinion before booking. Not for total beginners (yet), for the traveler who knows the basics but doesn't want to spend 90 minutes per trip on a forum thread.
Ran free points audits for 5 friends, then $50 audits for 5 more. Goal: revenue and signal before code. Confirmed sophisticated users will pay for redemption strategy when it's specific to their stack.
First version was a pure-LLM chat with a points-expert system prompt. Worked beautifully for tone, completely failed for facts. Claude confidently fabricated a Hyatt category. That mistake triggered everything below.
Rebuilt the data layer in three tiers. Tier 1 is hand-curated TypeScript. Tier 2 is a JSON cache with URLs, verification dates, and supersedes-pointers that override Tier 1 when something changes. Tier 3, web search, is deferred behind a paid gate.
Three CRITICAL blocks added to the chat system prompt: hotel queries MUST hit the data layer, flight routes MUST consult cached availability, defer to on-screen state over training data. Verified end-to-end.
Briefly built a casual flow. After a strategy audit
confirmed launch channels were already the
sophisticated audience, I shipped the
sophisticated-pivot branch and archived
the casual flow on its own branch.
Every credit-card rewards app on the market today is built for casuals, Kudos, MaxRewards, AwardWallet at the basic tier. They tell you which card to swipe at checkout. None of them can answer the question that actually matters once you've already collected the cards: "I have 312K Amex MR, where should I redeem them right now?"
AwardReserve is built for that question. It serves the niche Kudos can't, sophisticated points users who already understand transfer partners and just want a calmer, AI-powered redemption brain. The market is small (~1-2M US users) but $20K MRR only requires 0.03% of it, and several tools coexist profitably here already.
| Amex MR | 312,400 |
| Chase UR | 187,200 |
| Cap1 Miles | 94,000 |
| Hyatt | 62,500 |
Honeymoon Tokyo + Kyoto in October, business class. What should I do?
Best move with your stack: transfer 240K Amex MR to ANA via Aeroplan partner award (J class JFK→NRT, 85K each way). Cached availability seen 3 days ago on this route, verify on award search before booking.
Source: Tier-2 cache · Frequent Miler · verified 2026-04-25
Followed my own services-first rule: ran free points audits for 5 friends, then $50 audits for 5 more. Goal was revenue + signal before code. Confirmed that sophisticated users will pay for redemption strategy when it's specific to their stack.
First version was a pure-LLM chat with a points-expert system prompt. Worked beautifully for tone, completely failed at facts, Claude would confidently tell users award rates that hadn't been correct in 3 years, or fabricate Hyatt categories that don't exist.
Rebuilt the data layer as three tiers. Tier 1: hand-curated TypeScript data (cards, currencies, sweet spots, hotel categories). Tier 2: a JSON knowledge cache with provenance, source URLs, verification dates, and supersedes-pointers that override Tier 1 when something changes. Tier 3 (deferred): Claude's web_search tool as last resort.
Added 3 CRITICAL blocks to the chat system prompt: hotel lookups MUST hit the data layer, flight route queries MUST consult cached availability, defer to on-screen card data over training-data recall. Verified end-to-end: Grand Hyatt Kauai now correctly returns Cat 6 / 25K-29K (was previously fabricated as Cat 3 / 12K).
Briefly built a second "casual" flow on main
to broaden appeal. After a strategy audit confirmed launch
channels were already the sophisticated audience, I shipped
the sophisticated-pivot branch as production
and killed the casual flow. The casual UX is preserved on
its own branch in case a broader-market product spins up
later.
The chat advisor confidently described Grand Hyatt Kauai as a Category 3 / 12K-point property. It's actually Category 6 / 25K-29K. That's a real-money mistake, a user could try to book and get burned.
This was the trigger for the entire knowledge cache architecture. Durable rule now baked in: AI-generated hotel/program facts are draft inputs only, never canonical user-facing data. Required fields: source URL, source tier, effective date, verification timestamp, confidence, pricing model.
I tried to auto-verify Hyatt categories per-property against world.hyatt.com. The site loads fine for humans but 403s every WebFetch. No third-party site has a comprehensive scrapeable per-property list.
Chose Option B: strip unverified-by-source claims, add an explicit "verify on hyatt.com" disclaimer, defer per-property reconciliation to post-beta. The 6 properties verified against Frequent Miler keep their verified flag. This is the realistic answer when the source of truth is intentionally not machine-readable, be honest about what you actually know.
Initial design used "Category 1-8" labels for every hotel chain. That works for Hyatt and Accor, but Marriott, Hilton, and IHG are fully dynamic. The label looked official but was a lie.
Switched dynamic-pricing chains to observed/estimated point ranges (e.g. "typically 35K-65K") with explicit "dynamic pricing, verify before booking" notes. Trust comes from accurate uncertainty, not fake precision.
The knowledge cache was working great in local dev, node:fs/promises reading and writing cache.json. Then I remembered: Netlify Functions are AWS Lambda under the hood, and Lambda fs is read-only. The whole thing would crash on first cache-write in production.
Storage abstracted behind an interface. Currently JSON file in dev; Netlify Blobs is the production adapter, queued before launch. The cache schema was already designed for swap, so this is a 30-min change rather than a rebuild.
An audit caught two FTC-risk landmines on the deployed site: testimonials sourced from invented Reddit handles, and "anchor bonus" claims I hadn't verified. Both were placeholder content I'd forgotten to remove before deploy.
Defined a 2-week revenue-plumbing sprint. Week 1: kill fake testimonials, apply to real affiliate programs (CardRatings, Bankrate), email seats.aero for written commercial-use permission, verify every anchor claim, add explicit FTC disclosures next to every card recommendation. The lesson: launch checklists need a "is anything on this page a fabrication" gate.
5 free + 5 paid audits. Validated the wedge. Generated $250 and 10 conversations before writing a line of product code.
Worked for tone. Failed for facts. The Grand Hyatt Kauai incident killed this version.
Knowledge cache shipped with provenance + supersedes semantics. Admin UI for CRUD with token auth. Settings page for local-first data export/import. Anti-hallucination guardrails verified.
Shipped sophisticated-pivot branch as production.
Casual flow archived. Revenue-plumbing sprint defined.
Kill fake testimonials. Apply to CardRatings + Bankrate. Email seats.aero for written commercial-use permission. Add PostHog + ConvertKit. Inline FTC disclosures on every card.
Supabase magic-link auth. Move balances off localStorage. Stripe Checkout. Enforce 3-question/month free quota in the chat route. Real affiliate URLs replacing every placeholder.
Production-blocker. Storage adapter swap is already designed for it; this just flips the interface implementation.
Frequent Miler, Doctor of Credit, View From The Wing. Articles match curated keywords → drop into cache as drafts → admin reviews and promotes to verified.
Every permitted lookup compounds into route-level intelligence. Saved trips create repeated observations. The advisor consumes cached signals instead of guessing. Cached space is a signal, never a guarantee.
Anthropic's web_search tool when cache miss + no Tier 1 match. Adds cost and latency, so it stays gated behind paid tier and explicit triggers.
$75/audit, ~1/week ongoing. Generates direct revenue while building a moat of real-user data the LLM can't get anywhere else.