← All projects / AwardReserve
Pre-beta · deploying

AwardReserve

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.

Claude API Hand-curated data Next.js 52 verified hotels

Try the live preview ↗ temporary URL while I move it to its real domain

What is this?

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.

Who it's for

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.

Role
Solo, product, code, data
Stage
Pre-beta, sophisticated branch in prod
Target
$1K MRR by month 6
Niche
~1-2M sophisticated US users
52
Verified hotels
3
Knowledge tiers
12
Loyalty currencies
$1K
MRR target · m6
~1-2M
US sophisticated TAM
Walk through the build

How it came together, step by step

Step 1 of 5
notion.so/audits-tracker-v0
Audit tracker · v0
Q1 · pre-code
Audits
10
Revenue
$250
Avg time
42 min
Sarah · 248K MRApr 03Free
Marcus · 412K URApr 09Free
Liam · 180K MRApr 14Free
Priya · 96K HyattApr 21$50
Devon · 320K MRApr 26$50
Step 1 · Validate before building

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.

Services-first PDF reports
awardreserve.app/chat · v0.1
Redemption Advisor · pure-LLM prototype
Claude · system-prompt only
YOU
How many points for Grand Hyatt Kauai?
ADVISOR
Grand Hyatt Kauai is Category 3, about 12,000 points/night. A solid sweet spot for the resort.
⚠ Hallucinated Real category: 6 · ~25K/night
Step 2 · Naive AI prototype

Just Claude with a system prompt

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.

Claude API Hallucinations
awardreserve.app/admin/cache
Curated knowledge cache
7 provenance fields required
Entries
157
Verified <30d
142
Stale
15
Grand Hyatt KauaiCat 6Verified 04/25
Park Hyatt TokyoCat 7Verified 04/22
Andaz MauiCat 6Verified 04/18
Hyatt Regency MauiCat 5Stale 60d
Step 3 · The 3-tier knowledge cache

Static facts → cache → web search

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.

TypeScript Provenance
awardreserve.app/chat · v1.0 · grounded
Redemption Advisor · grounded
Cache-first · 3 CRITICAL guardrails
YOU
How many points for Grand Hyatt Kauai?
ADVISOR · GROUNDED
Category 6, 25,000 to 29,000 points/night, depending on season. Sweet spot: off-peak weekday at 25K.
✓ Cache-verified Tier 2 · 2026-04-25
Step 4 · Lock in guardrails

The model has to look things up

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.

System prompt Verified
awardreserve.com · sophisticated
Tokyo + Kyoto · J class
Best move
Transfer 240K MR → ANA via Aeroplan
J class JFK→NRT · 85K each way
Cash equiv
$8.4K
Cents/pt
4.9¢
Confidence
High
Cached availability · verified 3d ago
Step 5 · Pivot & ship

Sophisticated-pivot to production

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.

Next.js 16 Live

The goal

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.

AwardReserve a glimpse
Your Balances
Amex MR312,400
Chase UR187,200
Cap1 Miles94,000
Hyatt62,500
YOU

Honeymoon Tokyo + Kyoto in October, business class. What should I do?

REDEMPTION ADVISOR · CLAUDE SONNET 4.6

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

The process

Phase 1 · Validate before building

Manual audits, no software

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.

Phase 2 · Naive AI prototype

"Just ask Claude with a system prompt"

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.

Phase 3 · The 3-tier knowledge architecture

Static facts → cache → web search

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.

Phase 4 · Anti-hallucination guardrails

Force the model to look things up

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).

Phase 5 · Pivot to sophisticated

Two flows → one focused flow

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.

Hiccups (and what I learned)

Hiccup #1 · The Grand Hyatt Kauai incident

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.

Hiccup #2 · Hyatt blocks scrapers

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.

Hiccup #3 · Marriott / Hilton / IHG don't have categories

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.

Hiccup #4 · Lambda fs is read-only

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.

Hiccup #5 · Fake testimonials + fake affiliate links

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.

How I iterated

v0, Manual audits

PDF reports, no app

5 free + 5 paid audits. Validated the wedge. Generated $250 and 10 conversations before writing a line of product code.

v0.5, Pure-AI MVP

Chat + system prompt

Worked for tone. Failed for facts. The Grand Hyatt Kauai incident killed this version.

v1, 3-tier data architecture

Static + cache + (deferred) web search

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.

v1.1, Sophisticated pivot

Single focused flow, in production now

Shipped sophisticated-pivot branch as production. Casual flow archived. Revenue-plumbing sprint defined.

Tools used

Next.js 16
app shell
Claude Sonnet 4.6
advisor model
Anthropic SDK
chat + tools
TypeScript
typed knowledge layer
Netlify Functions
edge API + cron
Netlify Blobs
cache storage (planned)
seats.aero
availability provider
Frequent Miler
verification source
Claude Code
build agent
localStorage
pre-auth state

Roadmap


← Back to all projects