earnrate 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/data/CHANGELOG.md +39 -0
- package/data/VERSION +1 -1
- package/data/cards/amex-gold.yaml +4 -0
- package/data/cards/bank-of-america-atmos-rewards-ascent.yaml +5 -1
- package/data/cards/bank-of-america-atmos-rewards-business.yaml +5 -1
- package/data/cards/bank-of-america-atmos-rewards-summit.yaml +5 -1
- package/data/cards/chase-freedom-flex.yaml +1 -1
- package/data/cards/chase-ihg-one-rewards-premier.yaml +4 -0
- package/data/cards/chase-ihg-one-rewards.yaml +7 -0
- package/data/cards/chase-united-club.yaml +1 -1
- package/data/cards/citi-costco-anywhere-visa-business.yaml +1 -7
- package/data/cards/citi-costco-anywhere-visa.yaml +1 -7
- package/data/cards/td-bank-nordstrom-credit-card.yaml +4 -0
- package/data/cards/td-bank-nordstrom-visa.yaml +4 -0
- package/data/categories.yaml +12 -0
- package/data/currencies.yaml +2 -0
- package/data/memberships.yaml +33 -0
- package/data/merchants/overrides.yaml +25 -0
- package/dist/cli/cheatsheet.js +2 -2
- package/dist/cli/explore.js +11 -10
- package/dist/cli/import.js +9 -9
- package/dist/cli/offers.js +2 -1
- package/dist/cli/run.js +17 -3
- package/dist/cli/wallet.js +42 -0
- package/dist/data/file-store.js +5 -2
- package/dist/data/integrity.js +18 -2
- package/dist/data/load.js +10 -2
- package/dist/data/store.js +8 -1
- package/dist/data/wallet-edit.js +75 -0
- package/dist/engine/cheat-sheet.js +14 -17
- package/dist/engine/compare.js +8 -0
- package/dist/engine/explore.js +10 -21
- package/dist/engine/memberships.js +41 -15
- package/dist/engine/offers.js +16 -4
- package/dist/engine/profiles.js +8 -0
- package/dist/engine/recommend.js +10 -23
- package/dist/engine/setup.js +14 -16
- package/dist/engine/simulate.js +5 -5
- package/dist/engine/text.js +36 -22
- package/dist/engine/valuation.js +1 -1
- package/dist/engine/wallet-change.js +17 -0
- package/dist/engine/wallet-summary.js +24 -6
- package/dist/format/card-text.js +15 -19
- package/dist/format/cards.js +3 -3
- package/dist/format/explore.js +14 -15
- package/dist/format/offers.js +10 -15
- package/dist/format/recommendation.js +5 -5
- package/dist/format/wallet.js +4 -1
- package/dist/mcp/context.js +31 -4
- package/dist/mcp/inputs.js +15 -6
- package/dist/mcp/schemas.js +8 -0
- package/dist/mcp/server.js +1 -0
- package/dist/mcp/tools/account.js +1 -1
- package/dist/mcp/tools/answers.js +28 -12
- package/dist/mcp/tools/wallet.js +58 -5
- package/dist/schema/card.js +4 -11
- package/dist/schema/category.js +4 -0
- package/dist/schema/currency.js +2 -0
- package/dist/schema/membership.js +15 -0
- package/dist/schema/merchant.js +4 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -62,7 +62,7 @@ Options: `--online` or `--in-store`, `--valuation flat|points-heavy`, `--all`, `
|
|
|
62
62
|
|
|
63
63
|
### Your wallet
|
|
64
64
|
|
|
65
|
-
The wallet is a YAML file (`~/.earnrate/wallet.yaml`) listing your cards by ID, which is each card's file name in [`data/cards/`](data/cards). `earnrate add`, `update`, `remove` and `
|
|
65
|
+
The wallet is a YAML file (`~/.earnrate/wallet.yaml`) listing your cards by ID, which is each card's file name in [`data/cards/`](data/cards). `earnrate add`, `update`, `remove`, `memberships` and `values` write it for you and keep your comments, or you can edit it by hand. Only the cards are required:
|
|
66
66
|
|
|
67
67
|
```yaml
|
|
68
68
|
version: 1 # the file's format; earnrate writes it
|
|
@@ -82,7 +82,7 @@ cards:
|
|
|
82
82
|
two-percent: [gas-ev-charging]
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
Rule IDs for `activated
|
|
85
|
+
Rule IDs for `activated` and the choice slots for `chosen` are in each card's file; membership IDs (such as `bofa-rewards-premier` for a BofA Rewards tier) are in [`data/memberships.yaml`](data/memberships.yaml), and `earnrate memberships` lists them. `earnrate values UR=1.5` saves what a program's points are worth to you; every answer uses it. Add `costco` if you have a Costco membership: Costco Anywhere needs one, and spending answers count its $65 a year unless you have it, hold the card or spend at Costco. Currencies and their default values are in [`data/currencies.yaml`](data/currencies.yaml). Spending caps fill up as you record purchases from an AI assistant or import a statement with `--apply`, and reset with each period.
|
|
86
86
|
|
|
87
87
|
### Merchants earnrate doesn't know
|
|
88
88
|
|
|
@@ -176,16 +176,16 @@ claude mcp add --transport http earnrate https://mcp.earnrate.dev
|
|
|
176
176
|
|
|
177
177
|
Or install it as a Claude Code plugin, which connects Claude Code and Cowork to the same server: `/plugin marketplace add cwasley/earnrate`, then `/plugin install earnrate@earnrate`.
|
|
178
178
|
|
|
179
|
-
**Or run it on your computer:** `earnrate mcp` runs earnrate as a local MCP server over stdio, with
|
|
179
|
+
**Or run it on your computer:** `earnrate mcp` runs earnrate as a local MCP server over stdio, with 14 tools (the connector has the same ones, plus `export_wallet`, `import_wallet`, `delete_wallet` and `switch_wallet` for its saved wallets):
|
|
180
180
|
|
|
181
181
|
- `best_card_for_purchase`: which card to use, with reasons
|
|
182
182
|
- `best_cards_for` and `simulate_spending`: compare every card earnrate knows, for one purchase or a year of spending, with no wallet needed
|
|
183
183
|
- `resolve_merchant`: how a merchant was identified
|
|
184
|
-
- `list_wallet`: your cards, caps left this period, chosen categories
|
|
184
|
+
- `list_wallet`: your cards, caps left this period, chosen categories, welcome-bonus progress and the point values you've set
|
|
185
185
|
- `cheat_sheet`: the card to use for each everyday kind of purchase this quarter
|
|
186
186
|
- `compare_welcome_offers`: the best public sign-up offers on cards you don't have
|
|
187
187
|
- `record_purchase`: books a purchase against its cap and any open welcome bonus in your wallet file, keeping your comments
|
|
188
|
-
- `search_cards`, `add_card`, `update_card`, `remove_card` and `
|
|
188
|
+
- `search_cards`, `add_card`, `update_card`, `remove_card`, `set_memberships` and `set_point_values`: set up the wallet in conversation, including what your points are worth
|
|
189
189
|
|
|
190
190
|
Saving cards is optional: name them in the conversation for one answer, or ask the assistant to save them, and it finds them, adds them, and asks about anything a card needs, like this quarter's Cash+ picks.
|
|
191
191
|
|
package/data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
Every change to card rules, merchants, categories or currencies under `data/`. Bump `data/VERSION` (`YYYY.MM.DD`, plus `.N` for a second release on the same day) and add a section here in the same commit. Each row cites the issuer page the new value came from.
|
|
4
4
|
|
|
5
|
+
## 2026.11.01.7
|
|
6
|
+
|
|
7
|
+
Currencies can name how a redemption reads (`redemption_names`), so a wallet valuing SoFi points by redeeming into a SoFi account says so. No rates changed.
|
|
8
|
+
|
|
9
|
+
| Currency | Field | Old → new | Source |
|
|
10
|
+
| ------------ | ---------------- | ----------------------------------- | ------ |
|
|
11
|
+
| sofi-rewards | redemption_names | sofi-account: "into a SoFi account" | n/a |
|
|
12
|
+
|
|
13
|
+
## 2026.11.01.6
|
|
14
|
+
|
|
15
|
+
Freedom Flex's dining note says 5x rather than 5%, since its points can pool into Ultimate Rewards worth more than 1¢. No rates changed.
|
|
16
|
+
|
|
17
|
+
| Card | Field | Old → new | Source |
|
|
18
|
+
| ------------------ | ------------------- | ---------------------- | ------------------------------------------------------------------------------ |
|
|
19
|
+
| chase-freedom-flex | q4-2026-dining.note | "5x (5% as cash back)" | [card page](https://creditcards.chase.com/cash-back-credit-cards/freedom/flex) |
|
|
20
|
+
|
|
21
|
+
## 2026.11.01.5
|
|
22
|
+
|
|
23
|
+
Offers the issuer rules out for holders of another card, and Bank of America's terms for the Atmos account bonus. No rates changed.
|
|
24
|
+
|
|
25
|
+
| Card | Field | Old → new | Source |
|
|
26
|
+
| -------------------------------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
27
|
+
| td-bank-nordstrom-credit-card, td-bank-nordstrom-visa | welcome_offer.not_with | each other | [offer terms](https://www.nordstrom.com/becomecardmember) |
|
|
28
|
+
| chase-ihg-one-rewards, chase-ihg-one-rewards-premier | welcome_offer.not_with | the other personal IHG cards | [One Rewards](https://creditcards.chase.com/travel-credit-cards/ihg-rewards-club/one-rewards), [Premier](https://creditcards.chase.com/travel-credit-cards/ihg-rewards-club/premier) |
|
|
29
|
+
| amex-gold | welcome_offer.not_with | amex-platinum | [offer terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/gold-card/25330-10-0#offer-terms) |
|
|
30
|
+
| bank-of-america-atmos-rewards-ascent, -summit, -business | evidence | the qualifying account, from each card's terms | [Ascent](https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4081060&productoffercode=RS&locale=en_US), [Summit](https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4081112&productoffercode=S2&locale=en_US), [Business](https://www.bankofamerica.com/smallbusiness/credit-cards/terms-and-conditions/?campaignid=4080500&productoffercode=CX&locale=en_US) |
|
|
31
|
+
| chase-united-club | welcome_offer.note | says the business card isn't clearly covered | [card page](https://creditcards.chase.com/travel-credit-cards/united/united-club) |
|
|
32
|
+
| chase-ihg-one-rewards | todo | the $15,000 spend milestone isn't modeled | [card page](https://creditcards.chase.com/travel-credit-cards/ihg-rewards-club/one-rewards) |
|
|
33
|
+
| categories.yaml, merchants/overrides.yaml | preposition, slug, kind | categories bought as a service read "on"; travel sites and bookings through them are marked | n/a |
|
|
34
|
+
|
|
35
|
+
## 2026.11.01.4
|
|
36
|
+
|
|
37
|
+
Memberships move to `data/memberships.yaml`: each one's name, the site's checkbox label (`ask`) for the common ones, the Costco membership's fee and the stores that imply it, and the BofA Preferred Rewards tiers as one group. Cards name the membership they need by id (`requires_membership: costco`). No rates changed.
|
|
38
|
+
|
|
39
|
+
| File | Field | Old → new | Source |
|
|
40
|
+
| ------------------------------------ | ------------------- | ---------------------------------------- | ------ |
|
|
41
|
+
| memberships.yaml | (new) | names, Costco fee and stores, BofA tiers | n/a |
|
|
42
|
+
| citi-costco-anywhere-visa, -business | requires_membership | inline block → `costco` | n/a |
|
|
43
|
+
|
|
5
44
|
## 2026.11.01.3
|
|
6
45
|
|
|
7
46
|
Welcome offers can name other cards whose holders the issuer rules out (`welcome_offer.not_with`), so offer comparisons mark them and list them last for a wallet holding one. No rates changed.
|
package/data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2026.11.01.
|
|
1
|
+
2026.11.01.7
|
|
@@ -15,6 +15,7 @@ welcome_offer:
|
|
|
15
15
|
spend: 8000
|
|
16
16
|
months: 6
|
|
17
17
|
varies: true
|
|
18
|
+
not_with: [amex-platinum]
|
|
18
19
|
note: 'The public offer is "as high as" 100,000 points; Amex shows the exact amount (which may be lower, or no offer) after you apply and before you accept. Not available if you have or have had this Card, the Premier Rewards Gold Card, the Platinum Card (including the Schwab and Morgan Stanley versions) or previous versions of these Cards; Amex may also decline based on your card history.'
|
|
19
20
|
rules:
|
|
20
21
|
- id: restaurants
|
|
@@ -93,3 +94,6 @@ evidence:
|
|
|
93
94
|
- rule: welcome_offer
|
|
94
95
|
url: https://www.americanexpress.com/us/credit-cards/card/gold-card/
|
|
95
96
|
quote: 'after you spend $8,000 in purchases on your new Card within the first 6 months'
|
|
97
|
+
- rule: not_with
|
|
98
|
+
url: https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/gold-card/25330-10-0#offer-terms
|
|
99
|
+
quote: 'if you have or have had this Card, the Premier Rewards Gold Card, the Platinum Card'
|
|
@@ -7,6 +7,7 @@ last_verified: 2026-10-31
|
|
|
7
7
|
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.bankofamerica.com/credit-cards/products/alaska-airlines-credit-card/
|
|
10
|
+
- https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4081060&productoffercode=RS&locale=en_US
|
|
10
11
|
base_rate: 1
|
|
11
12
|
annual_fee: 95
|
|
12
13
|
welcome_offer:
|
|
@@ -66,6 +67,9 @@ evidence:
|
|
|
66
67
|
- rule: welcome_offer
|
|
67
68
|
url: https://www.bankofamerica.com/credit-cards/products/alaska-airlines-credit-card/
|
|
68
69
|
quote: 'spend $2,500 or more on purchases within the first 90 days of opening your account'
|
|
70
|
+
- rule: alaska-and-hawaiian-with-boa-account
|
|
71
|
+
url: https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4081060&productoffercode=RS&locale=en_US
|
|
72
|
+
quote: 'An active Qualifying Account is an open consumer (non-business) checking or savings account with Bank of America N.A.'
|
|
69
73
|
todo:
|
|
70
|
-
- 'The 10% rewards bonus rules use a proposed membership id, bank-of-america-account. Bank of America does not say on this page which accounts are "eligible".'
|
|
71
74
|
- 20% back on Alaska and Hawaiian inflight purchases is a rebate, not points, and isn't modeled.
|
|
75
|
+
- "BofA's rewards page lists Atmos Rewards cards as not eligible for the BofA Rewards tier bonus (in a popup the source check can't read), so the 10% account bonus stands alone."
|
|
@@ -7,6 +7,7 @@ last_verified: 2026-10-26
|
|
|
7
7
|
verified_by: collin
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.bankofamerica.com/smallbusiness/credit-cards/products/alaska-airlines-business-credit-card/
|
|
10
|
+
- https://www.bankofamerica.com/smallbusiness/credit-cards/terms-and-conditions/?campaignid=4080500&productoffercode=CX&locale=en_US
|
|
10
11
|
base_rate: 1
|
|
11
12
|
business: true
|
|
12
13
|
annual_fee: 70
|
|
@@ -67,6 +68,9 @@ evidence:
|
|
|
67
68
|
- rule: welcome_offer
|
|
68
69
|
url: https://www.bankofamerica.com/smallbusiness/credit-cards/products/alaska-airlines-business-credit-card/
|
|
69
70
|
quote: 'after you make $4,000 or more in purchases within the first 90 days of opening your account'
|
|
71
|
+
- rule: alaska-and-hawaiian-with-boa-account
|
|
72
|
+
url: https://www.bankofamerica.com/smallbusiness/credit-cards/terms-and-conditions/?campaignid=4080500&productoffercode=CX&locale=en_US
|
|
73
|
+
quote: 'open small business (non-consumer) checking or savings account with Bank of America, N.A.'
|
|
70
74
|
todo:
|
|
71
|
-
- 'The 10% rewards bonus rules use a proposed membership id, bank-of-america-small-business-account. Bank of America does not say on this page which accounts are "eligible".'
|
|
72
75
|
- 'annual_fee is the $70 per-company fee. Each card also costs $25 a year, which the schema has no field for.'
|
|
76
|
+
- "BofA's rewards page lists Atmos Rewards cards as not eligible for the BofA Rewards tier bonus (in a popup the source check can't read), so the 10% account bonus stands alone."
|
|
@@ -7,6 +7,7 @@ last_verified: 2026-10-31
|
|
|
7
7
|
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.bankofamerica.com/credit-cards/products/alaska-airlines-infinite-credit-card/
|
|
10
|
+
- https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4081112&productoffercode=S2&locale=en_US
|
|
10
11
|
base_rate: 1
|
|
11
12
|
annual_fee: 395
|
|
12
13
|
welcome_offer:
|
|
@@ -65,6 +66,9 @@ evidence:
|
|
|
65
66
|
- rule: welcome_offer
|
|
66
67
|
url: https://www.bankofamerica.com/credit-cards/products/alaska-airlines-infinite-credit-card/
|
|
67
68
|
quote: '$4,000 or more on purchases within the first 90 days of opening your account'
|
|
69
|
+
- rule: alaska-and-hawaiian-with-boa-account
|
|
70
|
+
url: https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4081112&productoffercode=S2&locale=en_US
|
|
71
|
+
quote: 'open consumer (non-business) checking, savings or CD account with Bank of America N.A. or an investment account with Merrill'
|
|
68
72
|
todo:
|
|
69
73
|
- '3x on "foreign transaction" purchases (anything charged in a foreign currency or processed abroad) is not modeled: rules have no foreign-only geography. It would make this card the pick for most purchases abroad.'
|
|
70
|
-
- '
|
|
74
|
+
- "BofA's rewards page lists Atmos Rewards cards as not eligible for the BofA Rewards tier bonus (in a popup the source check can't read), so the 10% account bonus stands alone."
|
|
@@ -66,7 +66,7 @@ rules:
|
|
|
66
66
|
requires: { activation: true }
|
|
67
67
|
valid_from: 2026-10-01
|
|
68
68
|
valid_to: 2026-12-31
|
|
69
|
-
note: Chase's terms say activated categories earn "5% Cash Back rewards total" (4% on top of the 1% base), so earnrate
|
|
69
|
+
note: Chase's terms say activated categories earn "5% Cash Back rewards total" (4% on top of the 1% base), so earnrate counts 5x (5% as cash back) until the $1,500 quarterly cap. Some blogs report 7% for dining (the 3% dining rate plus the 4% bonus); Chase's own terms don't say that.
|
|
70
70
|
- id: q4-2026-american-red-cross
|
|
71
71
|
match: { merchants: [american-red-cross] }
|
|
72
72
|
rate: 5
|
|
@@ -14,6 +14,7 @@ welcome_offer:
|
|
|
14
14
|
points: 180000
|
|
15
15
|
spend: 3000
|
|
16
16
|
months: 3
|
|
17
|
+
not_with: [chase-ihg-one-rewards, chase-ihg-one-rewards-premier-select]
|
|
17
18
|
note: 'Labeled a launch offer; no end date given. Plus 10,000 points after adding an authorized user in the first 3 months. No free night in the welcome offer; the yearly Anniversary Free Night is a separate perk. Chase: "available to you if you do not have any personal IHG One Rewards Credit Cards and have not received a new Cardmember bonus within the last 24 months. This does not apply to Business Card Credit Card products."'
|
|
18
19
|
rules:
|
|
19
20
|
- id: ihg-hotels
|
|
@@ -64,5 +65,8 @@ evidence:
|
|
|
64
65
|
- rule: welcome_offer
|
|
65
66
|
url: https://creditcards.chase.com/travel-credit-cards/ihg-rewards-club/premier
|
|
66
67
|
quote: 'Earn 180,000 Bonus Points after you spend $3,000 on purchases in the first 3 months from account opening'
|
|
68
|
+
- rule: not_with
|
|
69
|
+
url: https://creditcards.chase.com/travel-credit-cards/ihg-rewards-club/premier
|
|
70
|
+
quote: 'not available to either (i) current cardmembers of any personal IHG One Rewards Credit Card'
|
|
67
71
|
todo:
|
|
68
72
|
- The $100 airline statement credit (after $250 on flights bought directly each calendar year, through 12/31/27) isn't modeled.
|
|
@@ -14,6 +14,8 @@ welcome_offer:
|
|
|
14
14
|
points: 125000
|
|
15
15
|
spend: 2000
|
|
16
16
|
months: 3
|
|
17
|
+
not_with:
|
|
18
|
+
[chase-ihg-one-rewards-premier, chase-ihg-one-rewards-premier-select]
|
|
17
19
|
note: 'Labeled a launch offer; no end date given. Plus 10,000 points after adding an authorized user in the first 3 months. Chase: "available to you if you do not have any personal IHG One Rewards Credit Cards and have not received a new Cardmember bonus within the last 24 months. This does not apply to Business Card Credit Card products."'
|
|
18
20
|
rules:
|
|
19
21
|
- id: ihg-hotels
|
|
@@ -60,3 +62,8 @@ evidence:
|
|
|
60
62
|
- rule: welcome_offer
|
|
61
63
|
url: https://creditcards.chase.com/travel-credit-cards/ihg-rewards-club/one-rewards
|
|
62
64
|
quote: 'Earn 125,000 Bonus Points after you spend $2,000 on purchases in the first 3 months from account opening'
|
|
65
|
+
- rule: not_with
|
|
66
|
+
url: https://creditcards.chase.com/travel-credit-cards/ihg-rewards-club/one-rewards
|
|
67
|
+
quote: 'available to you if you do not have any personal IHG One Rewards Credit Cards'
|
|
68
|
+
todo:
|
|
69
|
+
- 'Not modeled: 10,000 bonus points after $15,000 in purchases each calendar year (a spend milestone, not a rate).'
|
|
@@ -13,7 +13,7 @@ welcome_offer:
|
|
|
13
13
|
points: 90000
|
|
14
14
|
spend: 5000
|
|
15
15
|
months: 3
|
|
16
|
-
note:
|
|
16
|
+
note: "Up to 100,000 in total: plus 10,000 bonus miles after adding an authorized user in the first 3 months. Not available to current cardmembers of any United Club credit card, or previous cardmembers of any United Club credit card who received a new Cardmember bonus for this card within the last 24 months. Chase doesn't say whether that includes the business card, and the page's summary only rules out holders of this card."
|
|
17
17
|
rules:
|
|
18
18
|
- id: united
|
|
19
19
|
match: { merchants: [united] }
|
|
@@ -13,13 +13,7 @@ source_urls:
|
|
|
13
13
|
base_rate: 1
|
|
14
14
|
business: true
|
|
15
15
|
annual_fee: 0
|
|
16
|
-
#
|
|
17
|
-
# Costco's own 2% reward, which earnrate doesn't model.
|
|
18
|
-
requires_membership:
|
|
19
|
-
id: costco
|
|
20
|
-
name: a Costco membership
|
|
21
|
-
annual_fee: 65
|
|
22
|
-
members_shop_at: [costco, costco-gas, costco-travel]
|
|
16
|
+
requires_membership: costco # its fee is in data/memberships.yaml
|
|
23
17
|
caps:
|
|
24
18
|
# Costco gas, other gas and EV charging share one $7,000 cap. Rewards run on
|
|
25
19
|
# January–December billing statements.
|
|
@@ -12,13 +12,7 @@ source_urls:
|
|
|
12
12
|
# redeemable for cash or merchandise at a U.S. Costco warehouse.
|
|
13
13
|
base_rate: 1
|
|
14
14
|
annual_fee: 0
|
|
15
|
-
#
|
|
16
|
-
# Costco's own 2% reward, which earnrate doesn't model.
|
|
17
|
-
requires_membership:
|
|
18
|
-
id: costco
|
|
19
|
-
name: a Costco membership
|
|
20
|
-
annual_fee: 65
|
|
21
|
-
members_shop_at: [costco, costco-gas, costco-travel]
|
|
15
|
+
requires_membership: costco # its fee is in data/memberships.yaml
|
|
22
16
|
caps:
|
|
23
17
|
# Costco gas, other gas and EV charging share one $7,000 cap. Rewards run on
|
|
24
18
|
# January–December billing statements.
|
|
@@ -21,6 +21,7 @@ welcome_offer:
|
|
|
21
21
|
spend: 0
|
|
22
22
|
months: 1
|
|
23
23
|
valid_to: 2026-12-01
|
|
24
|
+
not_with: [td-bank-nordstrom-visa]
|
|
24
25
|
note: A $60 Nordstrom Note, not a statement credit, for applying and getting approved for a new Nordstrom credit card between October 12 and December 1, 2026 (the terms say 9pm PT October 11 to 9pm PT December 1). No purchase is required; the Note posts to the Nordy Club account 7-10 business days after approval, so months is only a placeholder. Current and previous Nordstrom credit cardmembers and Nordstrom employees are not eligible.
|
|
25
26
|
rules:
|
|
26
27
|
- id: nordstrom
|
|
@@ -67,3 +68,6 @@ evidence:
|
|
|
67
68
|
- rule: welcome_offer
|
|
68
69
|
url: https://www.nordstrom.com/becomecardmember
|
|
69
70
|
quote: 'approved for a new Nordstrom credit card October 12 - December 1'
|
|
71
|
+
- rule: not_with
|
|
72
|
+
url: https://www.nordstrom.com/becomecardmember
|
|
73
|
+
quote: 'Current and previous Nordstrom credit cardmembers and Nordstrom employees are not eligible for this offer'
|
|
@@ -19,6 +19,7 @@ welcome_offer:
|
|
|
19
19
|
spend: 0
|
|
20
20
|
months: 1
|
|
21
21
|
valid_to: 2026-12-01
|
|
22
|
+
not_with: [td-bank-nordstrom-credit-card]
|
|
22
23
|
note: A $60 Nordstrom Note, not a statement credit, for applying and getting approved for a new Nordstrom credit card between October 12 and December 1, 2026 (the terms say 9pm PT October 11 to 9pm PT December 1). No purchase is required; the Note posts to the Nordy Club account 7-10 business days after approval, so months is only a placeholder. Current and previous Nordstrom credit cardmembers and Nordstrom employees are not eligible.
|
|
23
24
|
rules:
|
|
24
25
|
- id: nordstrom
|
|
@@ -103,3 +104,6 @@ evidence:
|
|
|
103
104
|
- rule: welcome_offer
|
|
104
105
|
url: https://www.nordstrom.com/becomecardmember
|
|
105
106
|
quote: 'approved for a new Nordstrom credit card October 12 - December 1'
|
|
107
|
+
- rule: not_with
|
|
108
|
+
url: https://www.nordstrom.com/becomecardmember
|
|
109
|
+
quote: 'Current and previous Nordstrom credit cardmembers and Nordstrom employees are not eligible for this offer'
|
package/data/categories.yaml
CHANGED
|
@@ -58,11 +58,13 @@
|
|
|
58
58
|
- id: gas.superstore
|
|
59
59
|
name: Gas at superstores and warehouse clubs
|
|
60
60
|
- id: ev_charging
|
|
61
|
+
preposition: on
|
|
61
62
|
name: EV charging
|
|
62
63
|
aliases: [ev, charging]
|
|
63
64
|
mccs: [5552]
|
|
64
65
|
|
|
65
66
|
- id: transit
|
|
67
|
+
preposition: on
|
|
66
68
|
name: Transit
|
|
67
69
|
aliases: [public transit, train, trains, bus, commuting]
|
|
68
70
|
mccs: [4111, 4112, 4131, 4784, 7523]
|
|
@@ -72,6 +74,7 @@
|
|
|
72
74
|
mccs: [4121]
|
|
73
75
|
|
|
74
76
|
- id: travel
|
|
77
|
+
preposition: on
|
|
75
78
|
name: Travel
|
|
76
79
|
mccs: [4722]
|
|
77
80
|
- id: travel.flights
|
|
@@ -92,18 +95,22 @@
|
|
|
92
95
|
mccs: [4411]
|
|
93
96
|
|
|
94
97
|
- id: streaming
|
|
98
|
+
preposition: on
|
|
95
99
|
name: Streaming services
|
|
96
100
|
aliases: [streaming, subscriptions]
|
|
97
101
|
mccs: [4899, 5815]
|
|
98
102
|
- id: tv_internet
|
|
103
|
+
preposition: on
|
|
99
104
|
name: TV and internet service
|
|
100
105
|
aliases: [internet, cable]
|
|
101
106
|
mccs: [4899]
|
|
102
107
|
- id: phone
|
|
108
|
+
preposition: on
|
|
103
109
|
name: Cell phone service
|
|
104
110
|
aliases: [phone, cell phone, wireless]
|
|
105
111
|
mccs: [4814]
|
|
106
112
|
- id: utilities
|
|
113
|
+
preposition: on
|
|
107
114
|
name: Home utilities
|
|
108
115
|
aliases: [utilities, electric, electricity]
|
|
109
116
|
mccs: [4900]
|
|
@@ -117,6 +124,7 @@
|
|
|
117
124
|
aliases: [movies, movie theater]
|
|
118
125
|
mccs: [7832]
|
|
119
126
|
- id: entertainment
|
|
127
|
+
preposition: on
|
|
120
128
|
name: Live entertainment and events
|
|
121
129
|
aliases: [concerts, events, tickets]
|
|
122
130
|
mccs: [7922, 7941]
|
|
@@ -146,15 +154,19 @@
|
|
|
146
154
|
mccs: [5712]
|
|
147
155
|
|
|
148
156
|
- id: online_retail
|
|
157
|
+
preposition: on
|
|
149
158
|
name: Online retail
|
|
150
159
|
aliases: [online shopping, shopping online, online]
|
|
151
160
|
- id: office_supply
|
|
152
161
|
name: Office supply stores
|
|
153
162
|
- id: shipping
|
|
163
|
+
preposition: on
|
|
154
164
|
name: Shipping and couriers
|
|
155
165
|
- id: online_advertising
|
|
166
|
+
preposition: on
|
|
156
167
|
name: Social media and search advertising
|
|
157
168
|
|
|
158
169
|
- id: other
|
|
170
|
+
slug: everyday-spending
|
|
159
171
|
name: Everything else
|
|
160
172
|
aliases: [everything, everything else, other]
|
package/data/currencies.yaml
CHANGED
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
value_cents: 1.0
|
|
28
28
|
redemptions:
|
|
29
29
|
sofi-account: 1.0 # SoFi Checking, Savings, Invest, the SoFi Credit Card account, loans, or SoFi Travel
|
|
30
|
+
redemption_names:
|
|
31
|
+
sofi-account: into a SoFi account
|
|
30
32
|
sources:
|
|
31
33
|
- https://www.sofi.com/credit-card/unlimited/
|
|
32
34
|
- https://www.sofi.com/card/rewards?cardtype=c
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Memberships that raise a card's rates (a rule's `requires.membership`) or
|
|
2
|
+
# that a card can't be had without (a card's `requires_membership`). The
|
|
3
|
+
# fee for one a card needs is quoted in that card's evidence.
|
|
4
|
+
|
|
5
|
+
- id: amazon-prime
|
|
6
|
+
name: Amazon Prime
|
|
7
|
+
ask: I have Amazon Prime
|
|
8
|
+
- id: costco
|
|
9
|
+
name: Costco membership
|
|
10
|
+
ask: I have a Costco membership
|
|
11
|
+
# Gold Star, the basic tier. Executive ($130) pays some of its cost back
|
|
12
|
+
# as Costco's own 2% reward, which earnrate doesn't model.
|
|
13
|
+
annual_fee: 65
|
|
14
|
+
members_shop_at: [costco, costco-gas, costco-travel]
|
|
15
|
+
- id: bank-of-america-account
|
|
16
|
+
name: Bank of America checking or savings
|
|
17
|
+
ask: I bank with Bank of America
|
|
18
|
+
- id: bank-of-america-small-business-account
|
|
19
|
+
name: Bank of America small business checking or savings
|
|
20
|
+
- id: bofa-rewards-member
|
|
21
|
+
name: BofA Rewards Member
|
|
22
|
+
group: bofa-preferred-rewards
|
|
23
|
+
- id: bofa-rewards-preferred-plus
|
|
24
|
+
name: BofA Rewards Preferred Plus
|
|
25
|
+
group: bofa-preferred-rewards
|
|
26
|
+
- id: bofa-rewards-preferred-honors
|
|
27
|
+
name: BofA Rewards Preferred Honors
|
|
28
|
+
group: bofa-preferred-rewards
|
|
29
|
+
- id: bofa-rewards-premier
|
|
30
|
+
name: BofA Rewards Premier
|
|
31
|
+
group: bofa-preferred-rewards
|
|
32
|
+
- id: nordy-club-ambassador
|
|
33
|
+
name: Nordy Club Ambassador
|
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
# Issuer travel portals. Each issuer's own bonuses match them by id.
|
|
4
4
|
- id: chase-travel
|
|
5
|
+
kind: portal
|
|
5
6
|
name: Chase Travel
|
|
6
7
|
domains: [travelsecure.chase.com]
|
|
7
8
|
category: travel
|
|
8
9
|
- id: renowned-hotels-chase-travel
|
|
10
|
+
kind: booking
|
|
9
11
|
name: Renowned Hotels and Resorts (Chase Travel)
|
|
10
12
|
aliases: [renowned hotels, renowned hotels and resorts]
|
|
11
13
|
category: travel
|
|
12
14
|
note: Prepaid stays in the Renowned Hotels and Resorts collection for United cardmembers on Chase Travel.
|
|
13
15
|
- id: costco-travel
|
|
16
|
+
kind: portal
|
|
14
17
|
name: Costco Travel
|
|
15
18
|
domains: [costcotravel.com]
|
|
16
19
|
category: travel
|
|
@@ -25,6 +28,7 @@
|
|
|
25
28
|
domains: [aadvantagecars.com]
|
|
26
29
|
category: travel
|
|
27
30
|
- id: amex-travel
|
|
31
|
+
kind: portal
|
|
28
32
|
name: American Express Travel
|
|
29
33
|
aliases: [amex travel]
|
|
30
34
|
domains: [amextravel.com]
|
|
@@ -42,15 +46,18 @@
|
|
|
42
46
|
# bank's own bonuses match these merchants by id. Bonuses that depend on what's
|
|
43
47
|
# booked get one merchant per booking type.
|
|
44
48
|
- id: amex-travel-hotels
|
|
49
|
+
kind: booking
|
|
45
50
|
name: Hotel through Amex Travel
|
|
46
51
|
aliases: [amex travel hotel, amex travel hotels, hotel amex travel]
|
|
47
52
|
category: travel
|
|
48
53
|
note: Prepaid hotels only for the Amex bonuses.
|
|
49
54
|
- id: amex-travel-flights
|
|
55
|
+
kind: booking
|
|
50
56
|
name: Flight through Amex Travel
|
|
51
57
|
aliases: [amex travel flight, amex travel flights, flight amex travel]
|
|
52
58
|
category: travel
|
|
53
59
|
- id: airbnb-amex-travel
|
|
60
|
+
kind: booking
|
|
54
61
|
name: Airbnb through Amex Travel
|
|
55
62
|
aliases:
|
|
56
63
|
[
|
|
@@ -62,18 +69,22 @@
|
|
|
62
69
|
category: travel
|
|
63
70
|
note: Prepaid Airbnb stays booked in AmexTravel.com or the Amex Travel app, with your Airbnb account linked to Amex.
|
|
64
71
|
- id: amex-travel-car-rentals
|
|
72
|
+
kind: booking
|
|
65
73
|
name: Car rental through Amex Travel
|
|
66
74
|
aliases: [amex travel car rental, amex travel car]
|
|
67
75
|
category: travel
|
|
68
76
|
- id: amex-travel-cruises
|
|
77
|
+
kind: booking
|
|
69
78
|
name: Cruise through Amex Travel
|
|
70
79
|
aliases: [amex travel cruise]
|
|
71
80
|
category: travel
|
|
72
81
|
- id: usbank-travel-center
|
|
82
|
+
kind: portal
|
|
73
83
|
name: U.S. Bank Travel Center
|
|
74
84
|
aliases: [us bank travel center]
|
|
75
85
|
category: travel
|
|
76
86
|
- id: sofi-travel
|
|
87
|
+
kind: portal
|
|
77
88
|
name: SoFi Travel
|
|
78
89
|
category: travel
|
|
79
90
|
|
|
@@ -177,38 +188,45 @@
|
|
|
177
188
|
# Card issuers' travel and ticketing sites (see the Amex Travel note above).
|
|
178
189
|
- {
|
|
179
190
|
id: capital-one-travel,
|
|
191
|
+
kind: portal,
|
|
180
192
|
name: Capital One Travel,
|
|
181
193
|
aliases: [capital one travel],
|
|
182
194
|
category: travel,
|
|
183
195
|
}
|
|
184
196
|
- {
|
|
185
197
|
id: capital-one-travel-hotels,
|
|
198
|
+
kind: booking,
|
|
186
199
|
name: Hotel through Capital One Travel,
|
|
187
200
|
aliases: [capital one travel hotel],
|
|
188
201
|
category: travel,
|
|
189
202
|
}
|
|
190
203
|
- id: capital-one-travel-vacation-rentals
|
|
204
|
+
kind: booking
|
|
191
205
|
name: Vacation rental through Capital One Travel
|
|
192
206
|
aliases: [capital one travel vacation rental]
|
|
193
207
|
category: travel
|
|
194
208
|
- {
|
|
195
209
|
id: capital-one-travel-car-rentals,
|
|
210
|
+
kind: booking,
|
|
196
211
|
name: Car rental through Capital One Travel,
|
|
197
212
|
aliases: [capital one travel car rental],
|
|
198
213
|
category: travel,
|
|
199
214
|
}
|
|
200
215
|
- {
|
|
201
216
|
id: capital-one-travel-flights,
|
|
217
|
+
kind: booking,
|
|
202
218
|
name: Flight through Capital One Travel,
|
|
203
219
|
aliases: [capital one travel flight],
|
|
204
220
|
category: travel,
|
|
205
221
|
}
|
|
206
222
|
- id: capital-one-entertainment
|
|
223
|
+
kind: portal
|
|
207
224
|
name: Capital One Entertainment
|
|
208
225
|
aliases: [capital one entertainment tickets]
|
|
209
226
|
category: entertainment
|
|
210
227
|
- {
|
|
211
228
|
id: citi-travel,
|
|
229
|
+
kind: portal,
|
|
212
230
|
name: Citi Travel,
|
|
213
231
|
aliases: [citi travel],
|
|
214
232
|
domains: [cititravel.com],
|
|
@@ -216,42 +234,49 @@
|
|
|
216
234
|
}
|
|
217
235
|
- {
|
|
218
236
|
id: citi-travel-hotels,
|
|
237
|
+
kind: booking,
|
|
219
238
|
name: Hotel through Citi Travel,
|
|
220
239
|
aliases: [citi travel hotel],
|
|
221
240
|
category: travel,
|
|
222
241
|
}
|
|
223
242
|
- {
|
|
224
243
|
id: citi-travel-car-rentals,
|
|
244
|
+
kind: booking,
|
|
225
245
|
name: Car rental through Citi Travel,
|
|
226
246
|
aliases: [citi travel car rental],
|
|
227
247
|
category: travel,
|
|
228
248
|
}
|
|
229
249
|
- {
|
|
230
250
|
id: citi-travel-attractions,
|
|
251
|
+
kind: booking,
|
|
231
252
|
name: Attraction through Citi Travel,
|
|
232
253
|
aliases: [citi travel attraction],
|
|
233
254
|
category: travel,
|
|
234
255
|
}
|
|
235
256
|
- {
|
|
236
257
|
id: citi-travel-flights,
|
|
258
|
+
kind: booking,
|
|
237
259
|
name: Flight through Citi Travel,
|
|
238
260
|
aliases: [citi travel flight],
|
|
239
261
|
category: travel,
|
|
240
262
|
}
|
|
241
263
|
- {
|
|
242
264
|
id: bilt-travel,
|
|
265
|
+
kind: portal,
|
|
243
266
|
name: Bilt Travel,
|
|
244
267
|
aliases: [bilt travel],
|
|
245
268
|
category: travel,
|
|
246
269
|
}
|
|
247
270
|
- {
|
|
248
271
|
id: bilt-travel-hotels,
|
|
272
|
+
kind: booking,
|
|
249
273
|
name: Hotel through Bilt Travel,
|
|
250
274
|
aliases: [bilt travel hotel],
|
|
251
275
|
category: travel,
|
|
252
276
|
}
|
|
253
277
|
- {
|
|
254
278
|
id: bilt-travel-flights,
|
|
279
|
+
kind: booking,
|
|
255
280
|
name: Flight through Bilt Travel,
|
|
256
281
|
aliases: [bilt travel flight],
|
|
257
282
|
category: travel,
|
package/dist/cli/cheatsheet.js
CHANGED
|
@@ -6,7 +6,7 @@ import { ALL_PERSONAL_CARDS } from "../engine/explore.js";
|
|
|
6
6
|
import { isValuationProfile, VALUATION_PROFILES, withValuationProfile, } from "../engine/profiles.js";
|
|
7
7
|
import { formatCheatSheet } from "../format/cheat-sheet.js";
|
|
8
8
|
import { cardList, dateProblem, valuationProblem } from "./args.js";
|
|
9
|
-
import { cardsToUse, NO_WALLET_HINT, RUNTIME_ERROR, USAGE_ERROR, } from "./run.js";
|
|
9
|
+
import { cardsToUse, NO_WALLET_HINT, RUNTIME_ERROR, savedSettings, USAGE_ERROR, } from "./run.js";
|
|
10
10
|
const CHEATSHEET_HELP = `Usage: ${CLI_NAME} cheatsheet [options]
|
|
11
11
|
|
|
12
12
|
The card to use for each everyday kind of purchase this quarter: from your
|
|
@@ -64,7 +64,7 @@ export async function runCheatSheet(argv, io) {
|
|
|
64
64
|
memberships: values.member ?? [],
|
|
65
65
|
valuations: values.valuation !== undefined && isValuationProfile(values.valuation)
|
|
66
66
|
? VALUATION_PROFILES[values.valuation]
|
|
67
|
-
:
|
|
67
|
+
: (await savedSettings(io)).valuations,
|
|
68
68
|
});
|
|
69
69
|
io.stdout(values.json
|
|
70
70
|
? `${JSON.stringify(sheet, null, 2)}\n`
|