Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Cash vs points trip cost comparison. Factors in transfer ratios, taxes, fees, CPP valuations, and opportunity cost to recommend the best redemption strategy for flights and hotels.
.claude/skills/borski-trip-calculator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 242% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 219% | 0% |
| case-05 | ✓→✗ | ▼ Worse | 227% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 60% | 0% |
"Should I pay cash or use points?" answered with math.
Compares the true cost of booking with cash versus each available points currency, accounting for transfer ratios, taxes/fees, and the opportunity cost of burning your points.
No API key needed. Uses local JSON data files plus flight/hotel search results.
| File | Purpose | |------|---------| | data/points-valuations.json | CPP valuations per program (floor/ceiling) | | data/transfer-partners.json | Credit card → loyalty program transfer ratios |
The value you're getting per point when redeeming:
cpp = (cash_price - taxes_on_award) / points_needed × 100A CPP above the floor valuation from points-valuations.json means you're getting above-average value. Below floor = poor redemption.
Points have value even when unspent. Burning 100K Chase UR at 1.7 cpp (floor) means you're "spending" $1,700 in future travel flexibility:
opportunity_cost = points_needed × floor_cpp / 100If the cash price is lower than the opportunity cost, pay cash. If higher, use points.
IF cash_price < opportunity_cost → PAY CASH (points are worth more saved)
IF cash_price > opportunity_cost → USE POINTS (good redemption)
IF cash_price ≈ opportunity_cost → PAY CASH (preserve flexibility)The tie goes to cash because points maintain optionality.
Cash prices (use one or more sources):
Duffel API → exact bookable fares
Ignav API → fast comparison prices
Google Flights → browser-based, includes SouthwestAward prices (use seats.aero):
Seats.aero API → cached availability across 25+ programs
Seats.aero web → live search (local Patchright only)For each award option with a corresponding cash price:
cpp = (cash_price_usd - award_taxes_usd) / award_miles × 100Award taxes come from seats.aero trip details (TotalTaxes field, in cents) or estimate $5.60 per segment for domestic US, $50-$200 for international (varies wildly by carrier and routing).
If using transferable points (Chase UR, Amex MR, etc.), the effective points cost changes:
effective_points = award_miles / transfer_ratio
effective_cpp = (cash_price - award_taxes) / effective_points × 100Example: Flying Blue award at 50,000 miles via Capital One (1:1):
Contrast: a separate Emirates award at 72,500 Skywards miles via Capital One (4:3 ratio, the worst Cap One transfer rate):
Important: pick the best currency for the destination program. Emirates Skywards has a 1:1 transfer from Bilt Rewards (no fee, instant). For the same Emirates redemption, 72,500 Bilt = 72,500 Skywards = ($1,200 - $100) / 72,500 × 100 = 1.52 cpp. Always check data/transfer-partners.json for every transferable currency the user holds before recommending a transfer — Bilt's 1:1 to Emirates beats Capital One's 4:3 by a wide margin. The skill enforces this in Step 0 (load transfer-partners first to enumerate every viable path).
Load valuations from points-valuations.json:
bashjq -r '.credit_card_points.chase_ultimate_rewards | "Chase UR: floor \(.floor)cpp, ceiling \(.ceiling)cpp"' data/points-valuations.json
| Rating | CPP vs Floor | Meaning | |--------|-------------|---------| | Excellent | > ceiling | Exceptional redemption. Book it. | | Good | > floor | Above average. Solid use of points. | | Fair | 0.8× to 1× floor | Mediocre. Consider cash instead. | | Poor | < 0.8× floor | Bad deal. Pay cash. |
Always use markdown tables.
| Option | Program | Miles/Points | Taxes | Cash Equiv | CPP | Rating | |--------|---------|-------------|-------|------------|-----|--------| | Cash | — | — | — | $4,200 | — | — | | United via Chase UR | United | 88,000 UR | $45 | $1,496 | 4.72 | Excellent | | Aeroplan via Chase UR | Aeroplan | 75,000 UR | $120 | $1,275 | 5.44 | Excellent | | Alaska via Bilt | Alaska | 55,000 Bilt | $30 | $935 | 7.58 | Excellent | | Virgin Atlantic → ANA via Chase UR | VA | 52,500 UR | $200 | $893 | 7.62 | Excellent |
Recommendation:
For round trips, calculate each direction separately. Award pricing is usually one-way, cash pricing is often round-trip. Make sure you're comparing apples to apples:
If cash = round-trip $4,200:
Compare against: outbound award + return award
e.g., 75K out + 75K return = 150K total vs $4,200 cash
CPP = ($4,200 - $240 taxes) / 150,000 = 2.64 cppbashjq -r '.credit_card_points.chase_ultimate_rewards.floor' data/points-valuations.json
bash# 75,000 Chase UR points POINTS=75000 FLOOR=$(jq -r '.credit_card_points.chase_ultimate_rewards.floor' data/points-valuations.json) echo "$POINTS points × $FLOOR cpp = \$$(echo "$POINTS * $FLOOR / 100" | bc) opportunity cost"
bash# Cash: $4200 round trip. Award: 75000 Aeroplan each way, $120 taxes each way. CASH=4200 MILES_ONEWAY=75000 TAXES_ONEWAY=120 TOTAL_MILES=$((MILES_ONEWAY * 2)) TOTAL_TAXES=$((TAXES_ONEWAY * 2)) echo "Cash: \$$CASH" echo "Award: $TOTAL_MILES miles + \$$TOTAL_TAXES taxes" echo "CPP: $(echo "scale=2; ($CASH - $TOTAL_TAXES) / $TOTAL_MILES * 100" | bc)" # Opportunity cost at floor valuation FLOOR=$(jq -r '.credit_card_points.chase_ultimate_rewards.floor' data/points-valuations.json) echo "Opportunity cost: \$$(echo "scale=0; $TOTAL_MILES * $FLOOR / 100" | bc)"
The same framework works for hotels:
hotel_cpp = (cash_rate_per_night × nights) / total_points × 100Hotel redemptions vary more than flights. Use points-valuations.json hotel section:
For premium hotel programs (FHR, THC, Chase Edit), factor in the additional benefits (breakfast, upgrade, credit, late checkout) when comparing cash vs points. A $500/night FHR rate with $100 breakfast credit and potential suite upgrade might be worth more than the sticker price.
Chase Sapphire Reserve uses dynamic Points Boost pricing in the Chase travel portal: roughly 1.5-2.0 cpp on select bookings, but not a guaranteed floor on every booking. The historical 1.5 cpp fixed multiplier is gone — current redemptions vary by route, date, and inventory. Always check the actual portal price before assuming a rate.
Rough decision rule, with the caveat that you must verify the actual portal quote:
If actual portal CPP > award CPP → portal wins
If award CPP > actual portal CPP → transfer to partner winsSapphire Preferred is similar (1.5-1.75 cpp typical via Points Boost). Amex portal is ~1.0 cpp for flights (1 cent per MR point). Capital One portal is ~0.75-1.0 cpp.
Always pull the real portal quote via the chase-travel or amex-travel skills before making a points-vs-portal recommendation. Don't assume the headline rate applies to your specific booking.
points-valuations.json is the most defensible number.Other measured skills in the registry, with their headline benchmark lift.