Skip to content
Business
Skill

/transfer-bonuses

Active credit card transfer bonuses from Amex, Chase, Capital One, Citi, Bilt, and Rove. Weekly-refreshed data with confidence markers. Use when pricing an award booking that involves a points transfer or deciding whether to wait for a better bonus.

BOOST
From plugin
travel-hacker
69748 skills1 agent6 MCP
Install
$ npx -y skills add borski/travel-hacking-toolkit --skill transfer-bonuses --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/transfer-bonuses

Context preview

The summary Claude sees to decide when to auto-load this skill.

Active credit card transfer bonuses from Amex, Chase, Capital One, Citi, Bilt, and Rove. Weekly-refreshed data with confidence markers. Use when pricing an award booking that involves a points transfer or deciding whether to wait for a better bonus.

SKILL.md

transfer-bonuses.SKILL.md
name: transfer-bonuses
description: Active credit card transfer bonuses from Amex, Chase, Capital One, Citi, Bilt, and Rove. Weekly-refreshed data with confidence markers. Use when pricing an award booking that involves a points transfer or deciding whether to wait for a better bonus.
category: reference
summary: Active credit card transfer bonuses with primary-source citations. Tells the agent the real effective ratio when transferring points during a promotion.

Transfer Bonuses Skill

Authoritative reference for current credit card transfer bonuses. Reads from `data/transfer-bonuses.json`, which is refreshed weekly by `scripts/refresh-transfer-bonuses.py` (run automatically every Monday via `.github/workflows/refresh-data.yml`, and manually any time). The script scrapes Frequent Miler (canonical) and cross-checks each bonus against AwardWallet. Each active bonus carries a confidence marker (`VERIFIED` if both FM and AwardWallet agree, `LIKELY` if only FM, `UNVERIFIED` if single weak source) per the toolkit's Research Integrity Protocol. TPG is sometimes consulted manually as a sanity check but is NOT scraped programmatically — TPG often shows expired bonuses as active.

The Expiry Gate (run this BEFORE citing any bonus)

The data file is a snapshot; bonuses commonly end on month-end dates between refreshes. On 2026-07-07 the file listed 7 "active" bonuses of which 5 had ended a week earlier — an agent quoting the file raw would have priced a Chase→Marriott transfer at 1.55x when the real ratio was 1.0. So, mechanically, every time:

1. Get today's date. 2. For each bonus you're about to cite, compare `end_date_inclusive` to today. **Past-dated = expired, regardless of which array it sits in.** Never present an expired bonus as available. 3. If any `active_bonuses` entry is past-dated, or `_meta.last_updated` is more than 7 days old, refresh first: `python3 scripts/refresh-transfer-bonuses.py` (use `--dry-run` to preview). Then re-read the file. 4. If the refresh fails (source layout changed, offline), present the bonus WITH its end date and staleness caveat: "the file shows +30% through 2026-07-14, last verified <date> — confirm on the issuer's transfer page before moving points."

When to Use

  • **Pricing an award booking that involves a transfer.** A 30% bonus to JAL changes the real cost of a oneworld booking through JAL by 23%. The math has to factor in the bonus.
  • **Deciding whether to transfer now or wait.** If a bonus is expected to recur (see `frequent_recurring_bonuses_to_watch`), it may be worth waiting.
  • **Sanity-checking whether a "good bonus" actually wins.** Hotel bonuses especially (Chase UR to IHG 70%, Chase UR to Marriott 50-70%) often look great in headlines but lose to the Chase Travel portal (dynamic Points Boost on CSR/CSP, ~1.5-2.0 cpp on select bookings; not a guaranteed floor). Always pull the actual portal quote and run the math against it, not against an assumed rate.
  • **Identifying stackable bonuses.** Aeroplan Visa cardholders stack a 10% cardholder bonus on top of any Chase UR to Aeroplan promotion.

When NOT to Use

  • Transfer ratios in general (without an active bonus). Use [transfer-partners](../transfer-partners/SKILL.md) for the standard ratios.
  • Points valuations (cpp by program). Use [points-valuations](../points-valuations/SKILL.md).
  • Award flight availability. Use [seats-aero](../seats-aero/SKILL.md).
  • Booking guidance and the hold-before-transfer rule. Use [booking-guidance](../booking-guidance/SKILL.md).

Data File

`data/transfer-bonuses.json`. Schema (relevant fields):

| Field | Description | |-------|-------------| | `_meta.last_updated` | ISO date, last refresh | | `_meta.staleness_days` | TTL in days; integrated with `scripts/check-data-freshness.sh` | | `_meta.primary_sources` | Frequent Miler, AwardWallet (TPG consulted manually only) | | `active_bonuses[].bonus_pct` | The bonus percentage (e.g., 30 for 30%) | | `active_bonuses[].ratio` | Multiplier on standard ratio (1.30 = 30% bonus) | | `active_bonuses[].standard_ratio` | Baseline transfer ratio (1.0 = 1:1, 0.75 = 4:3) | | `active_bonuses[].effective_ratio` | Final ratio after bonus (`standard_ratio * ratio`) | | `active_bonuses[].end_date_inclusive` | Last day the bonus is active | | `active_bonuses[].confidence` | VERIFIED, LIKELY, or UNVERIFIED | | `active_bonuses[].sources[]` | Direct URLs to primary source posts | | `active_bonuses[].notes` | Strategic context, including "but you shouldn't" warnings | | `expired_recently[]` | Bonuses that ended in the last 30 days. Useful for noticing TPG/AW staleness. | | `frequent_recurring_bonuses_to_watch{}` | Bonuses that historically recur, with typical % and frequency. Use for "should I wait?" decisions. | | `decision_rules{}` | Six concrete rules for how to factor bonuses into a transfer decision. |

Refreshing the Data

Run weekly (or on-demand) via:

python3 scripts/refresh-transfer-bonuses.py

The script:

1. Scrapes Frequent Miler's current point transfer bonuses page (canonical source). 2. Cross-checks each bonus against AwardWallet. 3. Sets confidence based on cross-check results: VERIFIED if 2+ sources agree, LIKELY if only Frequent Miler. 4. Moves expired bonuses to `expired_recently[]`. 5. Updates `_meta.last_updated`.

`scripts/check-data-freshness.sh` flags this file as stale after 7 days.

If the script fails (Frequent Miler's HTML changed, network issue, etc.), fall back to manual update by visiting the two primary sources (Frequent Miler, AwardWallet) and editing the JSON by hand. TPG can be consulted as a sanity check but is not authoritative because it frequently shows expired bonuses as active. **NEVER fabricate a bonus**. Per the Research Integrity Protocol, if you cannot verify a bonus from a primary source, do not include it.

Quick Reference Output Format

When the user asks "what bonuses are active right now?", read `data/transfer-bonuses.json` and produce a markdown tabl

Read more
Ships withtravel-hacker

AI-powered travel hacking with points, miles, and award flights. Drop-in skills and MCP servers for OpenCode, Claude Code, and Codex. Ask your AI to find you a 60,000-mile business class flight to Tokyo.

Get the whole plugin

Other skills on travel-hacker.