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.
Files changed (62) hide show
  1. package/README.md +5 -5
  2. package/data/CHANGELOG.md +39 -0
  3. package/data/VERSION +1 -1
  4. package/data/cards/amex-gold.yaml +4 -0
  5. package/data/cards/bank-of-america-atmos-rewards-ascent.yaml +5 -1
  6. package/data/cards/bank-of-america-atmos-rewards-business.yaml +5 -1
  7. package/data/cards/bank-of-america-atmos-rewards-summit.yaml +5 -1
  8. package/data/cards/chase-freedom-flex.yaml +1 -1
  9. package/data/cards/chase-ihg-one-rewards-premier.yaml +4 -0
  10. package/data/cards/chase-ihg-one-rewards.yaml +7 -0
  11. package/data/cards/chase-united-club.yaml +1 -1
  12. package/data/cards/citi-costco-anywhere-visa-business.yaml +1 -7
  13. package/data/cards/citi-costco-anywhere-visa.yaml +1 -7
  14. package/data/cards/td-bank-nordstrom-credit-card.yaml +4 -0
  15. package/data/cards/td-bank-nordstrom-visa.yaml +4 -0
  16. package/data/categories.yaml +12 -0
  17. package/data/currencies.yaml +2 -0
  18. package/data/memberships.yaml +33 -0
  19. package/data/merchants/overrides.yaml +25 -0
  20. package/dist/cli/cheatsheet.js +2 -2
  21. package/dist/cli/explore.js +11 -10
  22. package/dist/cli/import.js +9 -9
  23. package/dist/cli/offers.js +2 -1
  24. package/dist/cli/run.js +17 -3
  25. package/dist/cli/wallet.js +42 -0
  26. package/dist/data/file-store.js +5 -2
  27. package/dist/data/integrity.js +18 -2
  28. package/dist/data/load.js +10 -2
  29. package/dist/data/store.js +8 -1
  30. package/dist/data/wallet-edit.js +75 -0
  31. package/dist/engine/cheat-sheet.js +14 -17
  32. package/dist/engine/compare.js +8 -0
  33. package/dist/engine/explore.js +10 -21
  34. package/dist/engine/memberships.js +41 -15
  35. package/dist/engine/offers.js +16 -4
  36. package/dist/engine/profiles.js +8 -0
  37. package/dist/engine/recommend.js +10 -23
  38. package/dist/engine/setup.js +14 -16
  39. package/dist/engine/simulate.js +5 -5
  40. package/dist/engine/text.js +36 -22
  41. package/dist/engine/valuation.js +1 -1
  42. package/dist/engine/wallet-change.js +17 -0
  43. package/dist/engine/wallet-summary.js +24 -6
  44. package/dist/format/card-text.js +15 -19
  45. package/dist/format/cards.js +3 -3
  46. package/dist/format/explore.js +14 -15
  47. package/dist/format/offers.js +10 -15
  48. package/dist/format/recommendation.js +5 -5
  49. package/dist/format/wallet.js +4 -1
  50. package/dist/mcp/context.js +31 -4
  51. package/dist/mcp/inputs.js +15 -6
  52. package/dist/mcp/schemas.js +8 -0
  53. package/dist/mcp/server.js +1 -0
  54. package/dist/mcp/tools/account.js +1 -1
  55. package/dist/mcp/tools/answers.js +28 -12
  56. package/dist/mcp/tools/wallet.js +58 -5
  57. package/dist/schema/card.js +4 -11
  58. package/dist/schema/category.js +4 -0
  59. package/dist/schema/currency.js +2 -0
  60. package/dist/schema/membership.js +15 -0
  61. package/dist/schema/merchant.js +4 -0
  62. 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 `memberships` write it for you and keep your comments, or you can edit it by hand. Only the cards are required:
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`, the choice slots for `chosen` and the membership IDs that unlock bonuses (such as `bofa-rewards-premier` for a BofA Rewards tier) are in each card's file. 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.
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 13 tools (the connector has the same ones, plus `export_wallet`, `import_wallet`, `delete_wallet` and `switch_wallet` for its saved wallets):
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 and welcome-bonus progress
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 `set_memberships`: set up the wallet in conversation
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.3
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
- - '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".'
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 shows 5% 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.
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: '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.'
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
- # Gold Star, the basic tier. Executive ($130) pays some of its cost back as
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
- # Gold Star, the basic tier. Executive ($130) pays some of its cost back as
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'
@@ -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]
@@ -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,
@@ -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`