earnrate 0.0.0-stage → 0.1.0

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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -2
  3. package/data/CHANGELOG.md +210 -0
  4. package/data/LICENSE +412 -0
  5. package/data/VERSION +1 -0
  6. package/data/cards/amex-blue-business-plus.yaml +62 -0
  7. package/data/cards/amex-blue-cash-everyday.yaml +88 -0
  8. package/data/cards/amex-blue-cash-preferred.yaml +76 -0
  9. package/data/cards/amex-gold.yaml +94 -0
  10. package/data/cards/amex-platinum.yaml +71 -0
  11. package/data/cards/bank-of-america-atmos-rewards-ascent.yaml +71 -0
  12. package/data/cards/bank-of-america-atmos-rewards-business.yaml +72 -0
  13. package/data/cards/bank-of-america-atmos-rewards-summit.yaml +70 -0
  14. package/data/cards/bilt-obsidian.yaml +91 -0
  15. package/data/cards/capital-one-kohls-card.yaml +33 -0
  16. package/data/cards/capital-one-kohls-rewards-visa.yaml +48 -0
  17. package/data/cards/capital-one-savor.yaml +89 -0
  18. package/data/cards/capital-one-venture-x.yaml +58 -0
  19. package/data/cards/capital-one-venture.yaml +57 -0
  20. package/data/cards/chase-aeroplan.yaml +101 -0
  21. package/data/cards/chase-freedom-flex.yaml +146 -0
  22. package/data/cards/chase-freedom-unlimited.yaml +69 -0
  23. package/data/cards/chase-ihg-one-rewards-business.yaml +77 -0
  24. package/data/cards/chase-ihg-one-rewards-premier-select.yaml +44 -0
  25. package/data/cards/chase-ihg-one-rewards-premier.yaml +68 -0
  26. package/data/cards/chase-ihg-one-rewards.yaml +62 -0
  27. package/data/cards/chase-ink-business-cash.yaml +97 -0
  28. package/data/cards/chase-ink-business-preferred.yaml +93 -0
  29. package/data/cards/chase-prime-visa.yaml +103 -0
  30. package/data/cards/chase-sapphire-preferred.yaml +91 -0
  31. package/data/cards/chase-sapphire-reserve.yaml +86 -0
  32. package/data/cards/chase-southwest-performance-business.yaml +81 -0
  33. package/data/cards/chase-southwest-plus.yaml +72 -0
  34. package/data/cards/chase-southwest-premier-business.yaml +69 -0
  35. package/data/cards/chase-southwest-premier.yaml +72 -0
  36. package/data/cards/chase-southwest-priority.yaml +58 -0
  37. package/data/cards/chase-united-business.yaml +82 -0
  38. package/data/cards/chase-united-club-business.yaml +54 -0
  39. package/data/cards/chase-united-club.yaml +74 -0
  40. package/data/cards/chase-united-explorer.yaml +68 -0
  41. package/data/cards/chase-united-gateway.yaml +64 -0
  42. package/data/cards/chase-united-quest.yaml +85 -0
  43. package/data/cards/citi-aadvantage-business.yaml +78 -0
  44. package/data/cards/citi-aadvantage-executive.yaml +63 -0
  45. package/data/cards/citi-aadvantage-globe.yaml +65 -0
  46. package/data/cards/citi-aadvantage-mileup.yaml +57 -0
  47. package/data/cards/citi-aadvantage-platinum-select.yaml +68 -0
  48. package/data/cards/citi-costco-anywhere-visa-business.yaml +87 -0
  49. package/data/cards/citi-costco-anywhere-visa.yaml +86 -0
  50. package/data/cards/citi-custom-cash.yaml +124 -0
  51. package/data/cards/citi-double-cash.yaml +68 -0
  52. package/data/cards/citi-my-best-buy-visa.yaml +49 -0
  53. package/data/cards/citi-strata-elite.yaml +70 -0
  54. package/data/cards/citi-strata-premier.yaml +89 -0
  55. package/data/cards/sofi-unlimited-2.yaml +29 -0
  56. package/data/cards/td-bank-nordstrom-credit-card.yaml +69 -0
  57. package/data/cards/td-bank-nordstrom-visa.yaml +105 -0
  58. package/data/cards/td-bank-target-circle-card.yaml +51 -0
  59. package/data/cards/usbank-cash-plus.yaml +102 -0
  60. package/data/cards/wells-fargo-active-cash.yaml +34 -0
  61. package/data/cards/wells-fargo-autograph.yaml +82 -0
  62. package/data/categories.yaml +121 -0
  63. package/data/currencies.yaml +145 -0
  64. package/data/merchants/overrides.yaml +247 -0
  65. package/data/merchants/seed.yaml +478 -0
  66. package/dist/brand.js +11 -0
  67. package/dist/cli/args.js +113 -0
  68. package/dist/cli/bin.js +17 -0
  69. package/dist/cli/format.js +86 -0
  70. package/dist/cli/import.js +260 -0
  71. package/dist/cli/offers.js +127 -0
  72. package/dist/cli/run.js +153 -0
  73. package/dist/data/integrity.js +229 -0
  74. package/dist/data/load.js +47 -0
  75. package/dist/data/wallet-write.js +140 -0
  76. package/dist/engine/bonus.js +66 -0
  77. package/dist/engine/evaluate.js +156 -0
  78. package/dist/engine/offers.js +67 -0
  79. package/dist/engine/periods.js +31 -0
  80. package/dist/engine/profiles.js +13 -0
  81. package/dist/engine/recommend.js +416 -0
  82. package/dist/engine/record.js +55 -0
  83. package/dist/engine/types.js +1 -0
  84. package/dist/engine/valuation.js +35 -0
  85. package/dist/engine/wallet-summary.js +70 -0
  86. package/dist/import/amex.js +73 -0
  87. package/dist/import/analyze.js +207 -0
  88. package/dist/import/chase.js +55 -0
  89. package/dist/import/csv.js +55 -0
  90. package/dist/import/statement.js +23 -0
  91. package/dist/mcp/bin.js +3 -0
  92. package/dist/mcp/schemas.js +174 -0
  93. package/dist/mcp/serve.js +29 -0
  94. package/dist/mcp/server.js +308 -0
  95. package/dist/merchants/anthropic.js +87 -0
  96. package/dist/merchants/cache.js +91 -0
  97. package/dist/merchants/classifier.js +1 -0
  98. package/dist/merchants/fallback.js +96 -0
  99. package/dist/merchants/from-env.js +36 -0
  100. package/dist/merchants/resolve.js +132 -0
  101. package/dist/schema/card.js +136 -0
  102. package/dist/schema/category.js +11 -0
  103. package/dist/schema/common.js +25 -0
  104. package/dist/schema/currency.js +15 -0
  105. package/dist/schema/merchant.js +32 -0
  106. package/dist/schema/wallet.js +49 -0
  107. package/dist/version.js +5 -0
  108. package/package.json +72 -4
  109. package/wallet.example.yaml +32 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Collin Wasley
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,217 @@
1
- # Temporary Holding Version
1
+ # earnrate
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [![CI](https://github.com/cwasley/earnrate/actions/workflows/ci.yml/badge.svg)](https://github.com/cwasley/earnrate/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/earnrate)](https://www.npmjs.com/package/earnrate)
5
+ [![Code: MIT](https://img.shields.io/badge/code-MIT-blue)](LICENSE)
6
+ [![Data: CC BY-NC 4.0](https://img.shields.io/badge/data-CC%20BY--NC%204.0-lightgrey)](data/LICENSE)
7
+
8
+ I wanted a ghost card: one card that always charges the best of my cards. The card networks won't allow one, so I built the next best thing.
9
+
10
+ **earnrate is the best-card decision layer for people and AI agents.** Give it a merchant, and it tells you which card in your wallet earns the most there, and why. It's stateful (it knows your caps and chosen categories), valuation-aware, and transparent about its assumptions. It never sees a card number.
11
+
12
+ - Runs on your machine. No account, no telemetry, no affiliate links.
13
+ - US cards and US merchants, for now.
14
+
15
+ > **Status:** early, and it works: the engine, CLI, optional Claude merchant lookup and MCP server. See [the benchmark](docs/benchmark.md) for how it compares to an existing card-picking MCP server.
16
+
17
+ ## Try it
18
+
19
+ Needs Node 24 or later.
20
+
21
+ ```sh
22
+ npm install -g earnrate
23
+ mkdir -p ~/.earnrate
24
+ curl -o ~/.earnrate/wallet.yaml https://raw.githubusercontent.com/cwasley/earnrate/main/wallet.example.yaml
25
+ earnrate whole foods 80
26
+ ```
27
+
28
+ Then edit `~/.earnrate/wallet.yaml` to list your own cards (see [Your wallet](#your-wallet)).
29
+
30
+ ```
31
+ Whole Foods Market · $80
32
+
33
+ Use Blue Cash Preferred: 6% back, about $4.80. High confidence.
34
+
35
+ 1. Blue Cash Preferred 6% $4.80
36
+ 6% cash back from its "us-supermarkets" rule. ...
37
+ 2. Prime Visa 5% $4.00
38
+ 5% cash back from its "whole-foods" rule. Online or in-store.
39
+ 3. Amex Gold 4% $3.20
40
+ 4x Amex Membership Rewards from its "us-supermarkets" rule. ...
41
+ Valued at 1¢ per point: 4% back.
42
+ + 6 more cards (--all lists them)
43
+
44
+ Amex Gold beats Blue Cash Preferred here if Amex Membership Rewards (MR) points are worth 1.5¢ or more (you value them at 1¢).
45
+
46
+ Assumes Whole Foods Market codes as supermarkets (MCC 5411).
47
+ ```
48
+
49
+ Options: `--online` or `--in-store`, `--valuation flat|points-heavy`, `--all`, `--json`, `--date`, `--country`. Run `earnrate --help` for details. To keep the wallet somewhere else, set `EARNRATE_WALLET` to its path.
50
+
51
+ ### Your wallet
52
+
53
+ The wallet is a YAML file listing your cards by ID, which is each card's file name in [`data/cards/`](data/cards). Only the cards are required:
54
+
55
+ ```yaml
56
+ valuations:
57
+ UR: 1.5 # cents per point; leave out to use earnrate's defaults
58
+ memberships: [amazon-prime] # unlocks Prime Visa's 5%
59
+ cards:
60
+ - id: chase-sapphire-preferred
61
+ - id: chase-prime-visa
62
+ - id: chase-freedom-flex
63
+ activated: [q4-2026-grocery] # rotating 5% categories you've activated
64
+ - id: usbank-cash-plus
65
+ chosen: # categories you picked for the quarter
66
+ period: 2026-Q4
67
+ picks:
68
+ five-percent: [tv-internet-streaming, movie-theaters]
69
+ two-percent: [gas-ev-charging]
70
+ ```
71
+
72
+ Rule IDs for `activated` and the choice slots for `chosen` are in each card's file. Currencies and their default values are in [`data/currencies.yaml`](data/currencies.yaml). Spending caps fill up as you record purchases from an AI agent or import a statement with `--apply`, and reset with each period.
73
+
74
+ ### Merchants earnrate doesn't know
75
+
76
+ earnrate ships with a curated list of merchants. For anything else it falls back to each card's base rate and says so. Pass `--llm` (or set `EARNRATE_LLM=on`) to have Claude guess the category instead:
77
+
78
+ - It uses your own `ANTHROPIC_API_KEY` and sends only the merchant text you typed. Amounts, cards and wallet contents never leave your machine.
79
+ - Each answer is saved in `~/.earnrate/merchant-cache.json`, so a merchant is only looked up once.
80
+ - The answer is labeled as Claude's guess, shows its reasoning, and is never higher than medium confidence.
81
+ - Curated merchants never reach Claude.
82
+
83
+ ### Welcome bonuses
84
+
85
+ When you're working toward a card's sign-up bonus, add it to that card in your wallet:
86
+
87
+ ```yaml
88
+ - id: chase-sapphire-preferred
89
+ bonus: { opened: 2026-10-01, spend: 5000, by: 2026-12-31, points: 75000 }
90
+ ```
91
+
92
+ While the bonus is open, that card wins wherever it's accepted, and the answer says how much is left, the weekly pace to finish on time, what the bonus is worth at your point values, and what using it costs compared with your best earner. Spend counts up as you record purchases from an AI agent or import a statement with `--apply`; refunds count down. Once it's met or the deadline passes, the card goes back to the normal ranking. With two open bonuses, the one needing more spend per day comes first.
93
+
94
+ `spend`, `by` and the reward (`points`, or `dollars` for cash back) default to the card's published offer once earnrate has one; set them when your offer was different.
95
+
96
+ ### Which new card?
97
+
98
+ ```sh
99
+ earnrate offers --cash
100
+ ```
101
+
102
+ Ranks the welcome offers on cards you don't have by first-year value: the bonus at your point values minus the first year's annual fee. `--points`, `--no-fee` and `--business` narrow it down. Each offer is the public one on the issuer's page, checked weekly like the earning rules, with the issuer's eligibility rules in its note. Offers can differ by person and by how you apply, and it covers only the cards earnrate knows. There are no affiliate or apply links.
103
+
104
+ ### Import a statement
105
+
106
+ See what your purchases would have earned on earnrate's picks, using your cards' activity downloads:
107
+
108
+ ```sh
109
+ earnrate import activity.csv --card amex-gold
110
+ earnrate import gold.csv:amex-gold sapphire.csv:chase-sapphire-preferred
111
+ ```
112
+
113
+ It totals what each card earned against the best card in your wallet for each purchase, lists the merchants where another card would have earned the most, and flags merchants your issuer codes differently than earnrate assumes. Name several statements, each with its card, to get one report across them. It reads Amex and Chase activity CSVs. Download the CSV rather than a PDF statement: Chase's PDFs print the full card number in the payment coupon, and earnrate never handles card numbers.
114
+
115
+ - It's a dry run unless you pass `--apply`, which records cap usage for the current period in your wallet. Refunds lower it.
116
+ - Only the date, description, amount, category and (for Chase) transaction type columns are read. The statements themselves are never stored: `--apply` writes cap totals plus a hash of each recorded purchase to `~/.earnrate/imported.json`, so importing the same file twice never counts twice.
117
+ - For a merchant earnrate doesn't know, it uses the statement's category and marks the row, since another issuer may code it differently.
118
+ - `--valuation points-heavy` values points at transfer rates instead of your wallet's values, which can change which card wins.
119
+
120
+ ## Supported cards
121
+
122
+ 56 cards, each modeled from the issuer's own terms and checked weekly against them:
123
+
124
+ - **American Express:** Gold, Platinum, Blue Cash Preferred, Blue Cash Everyday, Blue Business Plus
125
+ - **Chase:** Sapphire Preferred, Sapphire Reserve, Freedom Unlimited, Freedom Flex, Ink Business Cash, Ink Business Preferred, Prime Visa
126
+ - **Chase airline and hotel:** United Gateway, Explorer, Quest, Club, Business, Club Business; Southwest Plus, Premier, Priority, Premier Business, Performance Business; Aeroplan; IHG One Rewards, Premier, Premier Select, Business
127
+ - **Citi:** Strata Elite, Strata Premier, Double Cash, Custom Cash, My Best Buy Visa, Costco Anywhere Visa (personal and business); AAdvantage MileUp, Platinum Select, Globe, Executive, Business
128
+ - **Capital One:** Venture X, Venture, Savor, Kohl's Card, Kohl's Rewards Visa
129
+ - **Wells Fargo:** Active Cash, Autograph
130
+ - **Bank of America:** Atmos Rewards Ascent, Summit, Business
131
+ - **TD Bank:** Target Circle Card, Nordstrom card, Nordstrom Visa
132
+ - **Others:** U.S. Bank Cash+, Bilt Obsidian, SoFi Unlimited 2%
133
+
134
+ Store cards (Target, Kohl's, Nordstrom) only come up at their own stores. Airline and hotel cards count only what the card itself earns, not the points a program gives members however they pay, and their perks (bags, free nights, lounges) aren't counted.
135
+
136
+ Something the format can't express yet (Bilt's rent earning, Citi Nights) is listed as a `todo:` in that card's file rather than guessed.
137
+
138
+ Spotted a wrong rate, or want a card added? [Open an issue](https://github.com/cwasley/earnrate/issues) with a link to the issuer's own page.
139
+
140
+ ## Use it from an AI agent (MCP)
141
+
142
+ `earnrate mcp` runs earnrate as a local MCP server over stdio, with five tools:
143
+
144
+ - `best_card_for_purchase`: which card to use, with reasons
145
+ - `resolve_merchant`: how a merchant was identified
146
+ - `list_wallet`: your cards, caps left this period, chosen categories and welcome-bonus progress
147
+ - `compare_welcome_offers`: the best public sign-up offers on cards you don't have
148
+ - `record_purchase`: books a purchase against its cap and any open welcome bonus in your wallet file, keeping your comments
149
+
150
+ For a merchant earnrate doesn't know, the calling model can pass a `category` (e.g. `grocery.supermarket`). It's used only for unknown merchants and is labeled in the answer. The command line takes the same thing as `--category`.
151
+
152
+ To add it to Claude Code:
153
+
154
+ ```sh
155
+ claude mcp add --scope user earnrate -- npx -y earnrate mcp
156
+ ```
157
+
158
+ Other MCP clients take the same command in their config:
159
+
160
+ ```json
161
+ {
162
+ "mcpServers": {
163
+ "earnrate": { "command": "npx", "args": ["-y", "earnrate", "mcp"] }
164
+ }
165
+ }
166
+ ```
167
+
168
+ It reads the same wallet as the command line (`~/.earnrate/wallet.yaml`, or `EARNRATE_WALLET` set in the server's `env`).
169
+
170
+ ## How it works
171
+
172
+ ```
173
+ merchant text
174
+ → resolve category, channel, and the assumption behind them
175
+ → evaluate every rule on every card: network, dates, caps, picks, activations
176
+ → value your cents per point, with pooling
177
+ → rank winner, runner-ups, flip points, warnings, confidence
178
+ ```
179
+
180
+ - **Card terms are data, not code.** Each card is a YAML file of rules (category, rate, cap, channel, dates, activation, required membership), validated with Zod. Every rule carries a short quote from the issuer's own page, and a test fails if one is missing. The engine has no card-specific branches.
181
+ - **Merchants resolve to a category plus the assumption behind it.** "Whole Foods codes as a supermarket (MCC 5411)" is stated in the answer, and venues that can code more than one way (a restaurant inside a stadium or hotel) come back at medium confidence with the alternative spelled out. Unknown merchants fall back to base rates, or to an opt-in, cached and labeled Claude guess.
182
+ - **The engine is pure and deterministic.** Given a purchase, a date and a wallet, it checks every rule against network acceptance, the date window, caps already used (split when a purchase straddles one), quarterly picks and activations, then values points at your cents-per-point, including pooling (Freedom Unlimited points are worth Sapphire points when you hold both). Ties, the valuation at which the runner-up would win, and stale data all show up in the answer.
183
+ - **Wallet edits keep your file intact.** Recording a purchase rewrites only the numbers that changed, so comments and formatting in your YAML survive.
184
+ - **Drift detection.** A weekly GitHub Action opens each issuer page in a headless browser, checks every quote is still there, and opens an issue when terms move. It stores only hashes of issuer text.
185
+ - **Tested end to end.** Golden cases written from issuer terms, CLI snapshot tests, an MCP round trip over real stdio, an install test that packs and installs the npm package, and a check that no committed file contains a card number. CI runs all of it on every push.
186
+
187
+ The code is TypeScript run directly by Node 24 (`src/`), with the engine in `src/engine/`, merchant resolution in `src/merchants/`, and the CLI and MCP server as thin layers over them.
188
+
189
+ ## Keeping card data current
190
+
191
+ Every rule in `data/cards/` carries a short quote from the issuer's own page. In a clone of this repo, `yarn check-sources` opens each issuer page in a headless browser and reports:
192
+
193
+ - rules whose quote is no longer on the page, which usually means the rule changed
194
+ - earning lines that appeared or disappeared since the last baseline, such as a new perk
195
+
196
+ A GitHub Action runs it every Monday and opens a "Card source changes" issue when something moved. After updating a card file, run `yarn check-sources --update` to record the new baseline. Some issuers block headless browsers on shared servers; those pages are listed as "couldn't check", and running the command locally covers them. The first run needs `yarn playwright install chromium`.
197
+
198
+ ## Working on earnrate
199
+
200
+ ```sh
201
+ git clone https://github.com/cwasley/earnrate.git && cd earnrate
202
+ yarn install
203
+ yarn earnrate whole foods 80 # runs src/ directly, no build
204
+ yarn validate # typecheck, lint, format check and tests
205
+ ```
206
+
207
+ See [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.
208
+
209
+ ## Licensing
210
+
211
+ - **Code** (everything outside `data/`) is [MIT](LICENSE).
212
+ - **Data** (card rules, merchants, categories and currencies under `data/`) is [CC BY-NC 4.0](data/LICENSE). It's free for personal and non-commercial use, with attribution.
213
+ - **Commercial use of the data needs a license.** That includes serving it through your own API or MCP server, or using it in a paid product. Contact licensing@earnrate.dev.
214
+
215
+ Not legal advice; this is a good-faith structure.
216
+
217
+ earnrate isn't financial advice. Issuers change their terms, and every answer names the rule it used, so check the card's issuer page (linked in its file) before a big purchase.
@@ -0,0 +1,210 @@
1
+ # Data changelog
2
+
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
+
5
+ ## 2026.10.28.1
6
+
7
+ Collin reviewed the family-cards and offers packets and kept every value as recorded, including the open calls: no Peloton rule on Sapphire Preferred yet, My Best Buy Visa's fee at the top of Citi's $0–59 range, and Amex "as high as" offers at the public figure. All 56 cards are now `verified_by: collin`.
8
+
9
+ | Card | Field | Old → new | Source |
10
+ | ---------------------------------- | ----------- | --------------- | ------ |
11
+ | the 31 cards added in 2026.10.26.6 | verified_by | claude → collin | n/a |
12
+
13
+ ## 2026.10.27.1
14
+
15
+ Annual fees and public welcome offers, with `business: true` on the 11 business cards. Each value is backed by a quote from the card's own product page, so a changed offer fails the weekly check. Cards stay at their existing `verified_by` until Collin reviews them.
16
+
17
+ | Card | Field | Old → new | Source |
18
+ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ----------------------------------------------------------------------------- | ------------------------ |
19
+ | all cards except citi-custom-cash | annual_fee, first_year_fee | new | each card's product page |
20
+ | 48 cards | welcome_offer | new; Amex "as high as" offers recorded at the public figure | each card's product page |
21
+ | bilt-obsidian, citi-costco-anywhere-visa(-business), citi-my-best-buy-visa, sofi-unlimited-2, citi-custom-cash, capital-one-kohls-card, capital-one-kohls-rewards-visa | welcome_offer | none: no fixed public offer, or closed to new applicants (each has a `todo:`) | each card's product page |
22
+ | chase-southwest-premier-business, chase-southwest-performance-business | source_urls | adds the product pages; the existing ones are cardmember-benefits pages | creditcards.chase.com |
23
+
24
+ ## 2026.10.26.7
25
+
26
+ Collin's review of the family-cards packet, first pass.
27
+
28
+ | Card | Field | Old → new | Source |
29
+ | ------------------------------------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
30
+ | capital-one-kohls-card, capital-one-kohls-rewards-visa | unverified | removed: the 5% every Kohl's Rewards member earns is confirmed on Kohl's page (checked by hand; kohls.com blocks the weekly check) | [Kohl's Rewards](https://www.kohls.com/feature/rewards.jsp) |
31
+ | ihg (merchant) | aliases | adds Garner, Ruby and HUALUXE; the brand list is now confirmed against IHG's brands page | [IHG brands](https://www.ihg.com/content/us/en/about/brands) |
32
+
33
+ ## 2026.10.26.6
34
+
35
+ 31 new cards, all `verified_by: claude` until Collin reviews them. Every rule cites the issuer's own page in the card file's `evidence`. Co-brand cards model only the card's own earning; program member and status points and perks aren't counted.
36
+
37
+ | Card | Field | Old → new | Source |
38
+ | ----------------------------------------------------------------------------------- | ----- | ----------------------------------------- | ----------------------------------------- |
39
+ | citi-costco-anywhere-visa, citi-costco-anywhere-visa-business | new | Costco cash back cards | citi.com |
40
+ | citi-aadvantage-mileup, -platinum-select, -globe, -executive, -business | new | AAdvantage miles cards | citi.com |
41
+ | chase-united-gateway, -explorer, -quest, -club, -business, -club-business | new | United MileagePlus cards | creditcards.chase.com |
42
+ | chase-southwest-plus, -premier, -priority, -premier-business, -performance-business | new | Rapid Rewards cards | creditcards.chase.com |
43
+ | chase-aeroplan | new | Aeroplan card | creditcards.chase.com |
44
+ | chase-ihg-one-rewards, -premier, -premier-select, -business | new | IHG One Rewards cards | creditcards.chase.com |
45
+ | bank-of-america-atmos-rewards-ascent, -summit, -business | new | Atmos Rewards cards | bankofamerica.com |
46
+ | td-bank-target-circle-card, capital-one-kohls-card, td-bank-nordstrom-credit-card | new | store cards (`network: store`, `only_at`) | target.com, capitalone.com, nordstrom.com |
47
+ | capital-one-kohls-rewards-visa, td-bank-nordstrom-visa | new | the stores' Visa cards | capitalone.com, nordstrom.com |
48
+
49
+ New currencies: `united-miles`, `aadvantage-miles`, `southwest-rapid-rewards`, `aeroplan`, `atmos-points` (1¢ default) and `ihg-points` (0.5¢), none of which has a published fixed value, with TPG's October 2026 valuation as the range top; `kohls-rewards` and `nordy-club` at their stated 1¢ conversion.
50
+
51
+ New merchants: `ihg` (with brand aliases), `air-canada`, `hawaiian-airlines`, `nordstrom-rack`, `costco-travel`, `aadvantage-hotels`, `aadvantage-cars`, `renowned-hotels-chase-travel`; domains added to `nordstrom` and `kohls`.
52
+
53
+ ## 2026.10.26.5
54
+
55
+ Merchant fix found by importing Chase statements. No card rules changed.
56
+
57
+ | Merchant | Field | Old → new | Source |
58
+ | -------- | ------- | ------------------------------------------------------------------ | ------ |
59
+ | amazon | aliases | adds `amzn mktp`, how marketplace orders appear on card statements | n/a |
60
+
61
+ ## 2026.10.26.4
62
+
63
+ Merchant fixes found by importing an Amex statement. No card rules changed.
64
+
65
+ | Merchant | Field | Old → new | Source |
66
+ | ----------- | ------- | ------------------------------------------------------------------------------------------------------ | ------ |
67
+ | whole-foods | aliases | adds `wholefds`, how Whole Foods appears on card statements | n/a |
68
+ | uber-one | new | Uber One membership, category `other`, so it no longer resolves to Uber rides (Amex codes it as taxis) | n/a |
69
+
70
+ ## 2026.10.26.3
71
+
72
+ | Card | Field | Old → new | Source |
73
+ | ---------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------ |
74
+ | the 16 cards added in 2026.10.26.1 | verified_by | claude → collin. Collin reviewed the new-cards packet and its open decisions; every rule is backed by a quote found on the issuer's page | n/a |
75
+
76
+ All 25 cards are now `verified_by: collin`.
77
+
78
+ ## 2026.10.26.2
79
+
80
+ Collin's call on pooling, after checking what Chase and Citi say: all four no-fee cards pool into their family's transferable points. `pools_into` now needs an evidence quote like a rule.
81
+
82
+ | Card | Field | Old → new | Source |
83
+ | ------------------------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
84
+ | chase-freedom-unlimited, chase-freedom-flex | pools_into | now backed by Chase's own page; also pools when you hold Ink Business Preferred (and Freedom Unlimited when you hold Sapphire Reserve) | [Chase: combining points](https://www.chase.com/personal/credit-cards/education/rewards-benefits/how-to-combine-chase-credit-card-points-in-household) |
85
+ | chase-ink-business-cash | pools_into | new: into UR with Sapphire Preferred, Sapphire Reserve or Ink Business Preferred | [Chase: combining points](https://www.chase.com/personal/credit-cards/education/rewards-benefits/how-to-combine-chase-credit-card-points-in-household) |
86
+ | citi-double-cash, citi-custom-cash | pools_into | now backed by Citi's terms (combined ThankYou accounts run on one set of terms); todos removed | Citi ThankYou terms ([Double Cash](https://www.thankyou.com/dcterms), [Custom Cash](https://www.thankyou.com/ccterms)) |
87
+ | several new cards | todo | removed lines about categories, merchants and currencies that now exist; Blue Cash Everyday's todo now says Amazon earns its online-retail rate | n/a |
88
+
89
+ ## 2026.10.26.1
90
+
91
+ Sixteen popular cards, chosen for power users. Each was drafted from the issuer's own pages, every rule carries a quote found on that page, and all are `verified_by: claude` until Collin reviews them.
92
+
93
+ | Card | Field | Old → new | Source |
94
+ | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
95
+ | chase-sapphire-reserve, chase-freedom-flex, chase-ink-business-cash, chase-ink-business-preferred | new | Freedom Flex includes Q4 2026 and Q1 2027 rotating categories | each card's `source_urls` (creditcards.chase.com, Chase rewards FAQ) |
96
+ | citi-strata-elite, citi-strata-premier, citi-double-cash, citi-custom-cash | new | Custom Cash closed to new applicants on 2026-05-28; its rules come from Citi's terms on thankyou.com | citi.com, thankyou.com |
97
+ | capital-one-venture-x, capital-one-venture, capital-one-savor | new | | capitalone.com |
98
+ | bilt-obsidian | new | Bilt Card 2.0 (Column N.A.); Obsidian is the tier with category bonuses | bilt.com |
99
+ | wells-fargo-active-cash, wells-fargo-autograph | new | | creditcards.wellsfargo.com |
100
+ | amex-blue-cash-everyday, amex-blue-business-plus | new | Blue Business Plus comes from its card page; its terms page blocks automated reads | americanexpress.com |
101
+ | (currencies) | C1, TYP, WFR, BILT | new. Each defaults to the issuer's own floor value (1¢; Bilt publishes none, so 1¢ is assumed), with TPG's October 2026 valuation as the top of the range | issuer pages, [TPG](https://thepointsguy.com/loyalty-programs/monthly-valuations/) |
102
+ | (categories) | online_retail, office_supply, shipping, online_advertising | new | Amex and Chase terms |
103
+ | (merchants) | Capital One, Citi and Bilt travel sites by booking type; Capital One Entertainment; 15 streaming services; Peloton; American Red Cross; Staples, Office Depot, UPS, FedEx, USPS, Google Ads, Meta ads | new | n/a (merchant names) |
104
+ | (merchants) | amex-travel-hotels, -flights, -car-rentals, -cruises | category → `travel`: other issuers see a bank's travel site as a travel agency, not a direct hotel or airline booking | Chase rewards FAQ, Citi terms |
105
+ | (merchants) | amazon | category other → online_retail, so Blue Cash Everyday's 3% on U.S. online retail applies | Amex BCE terms |
106
+ | amex-gold, amex-platinum | flights-amex-travel | new rule, so Amex Travel flights keep their rate now that the merchant is a travel agency. Platinum's $500,000 cap is shared by both flight rules | Gold and Platinum terms |
107
+
108
+ ## 2026.10.26
109
+
110
+ | Card | Field | Old → new | Source |
111
+ | ----------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------- |
112
+ | (merchants) | stater-bros, pavilions, gelsons, bristol-farms, erewhon, food-4-less | new Southern California supermarkets, after "Stater Bros" fell through to base rates in the first MCP test | n/a (merchant names) |
113
+
114
+ ## 2026.10.24.7
115
+
116
+ | Card | Field | Old → new | Source |
117
+ | ------------------------ | --------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
118
+ | all nine cards | evidence | new: a short quote from the issuer page for every rule and base rate (55 in all), checked weekly by `yarn check-sources` | each card's `source_urls` |
119
+ | amex-blue-cash-preferred | source_urls | terms page moved to `/en-us/credit-cards/apply/terms/personal/blue-cash-preferred-credit-card/25330-10-0`; the old address 404s | [BCP terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/blue-cash-preferred-credit-card/25330-10-0#offer-terms) |
120
+ | citi-my-best-buy-visa | source_urls, evidence | dropped Best Buy's page (it times out for automated checks); evidence now quotes Citi's page | [Citi My Best Buy page](https://www.citi.com/credit-cards/citi-best-buy-credit-cards) |
121
+ | chase-prime-visa | source_urls | dropped Amazon's page (it blocks automated checks); Chase's page is the source | [Chase Prime Visa page](https://creditcards.chase.com/cash-back-credit-cards/amazon-prime-rewards) |
122
+
123
+ ## 2026.10.24.6
124
+
125
+ Prime Visa and My Best Buy Visa re-checked against the issuers' own pages (Chase and Citi); they were sourced from Amazon's and Best Buy's pages before.
126
+
127
+ | Card | Field | Old → new | Source |
128
+ | --------------------------------------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
129
+ | chase-prime-visa | amazon-without-prime | new rule: 3% at Amazon.com, Amazon Fresh, Whole Foods and Audible without Prime (was the 1% base) | [Chase Prime Visa page](https://creditcards.chase.com/cash-back-credit-cards/amazon-prime-rewards) |
130
+ | chase-prime-visa | chase-travel-without-prime | new rule: 3% on Chase Travel without Prime | [Chase Prime Visa page](https://creditcards.chase.com/cash-back-credit-cards/amazon-prime-rewards) |
131
+ | chase-prime-visa | audible | new rule: 5% at Audible.com with Prime | [Chase Prime Visa page](https://creditcards.chase.com/cash-back-credit-cards/amazon-prime-rewards) |
132
+ | chase-prime-visa | amazon.note, chase-travel.note | added the exclusions: Amazon Pay at other sites, international Amazon sites, and travel booked directly with suppliers | [Chase Prime Visa page](https://creditcards.chase.com/cash-back-credit-cards/amazon-prime-rewards) |
133
+ | (merchants) | audible, pacific-kitchen-home | new | [Chase Prime Visa page](https://creditcards.chase.com/cash-back-credit-cards/amazon-prime-rewards), [Citi My Best Buy page](https://www.citi.com/credit-cards/citi-best-buy-credit-cards) |
134
+ | citi-my-best-buy-visa | best-buy.match | adds Pacific Kitchen & Home | [Citi My Best Buy page](https://www.citi.com/credit-cards/citi-best-buy-credit-cards) |
135
+ | (currencies) | best-buy-rewards.note | 250 points = a $5 certificate, confirming 2¢ a point | [Citi My Best Buy page](https://www.citi.com/credit-cards/citi-best-buy-credit-cards) |
136
+ | chase-prime-visa, citi-my-best-buy-visa | verified_by | claude → collin | n/a |
137
+
138
+ ## 2026.10.24.5
139
+
140
+ Read from Amex's own offer terms after Collin flagged the October 22, 2026 Amex–Airbnb partnership.
141
+
142
+ | Card | Field | Old → new | Source |
143
+ | ------------------------ | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
144
+ | (merchants) | amex-travel-hotels, amex-travel-flights, airbnb-amex-travel, amex-travel-car-rentals, amex-travel-cruises | new: one merchant per Amex Travel booking type. The old Amex Travel rules required both the Amex Travel merchant and a hotel/car/cruise category, which the generic merchant never had, so they never matched | [Gold terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/gold-card/25330-10-0#offer-terms), [Platinum terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/platinum-card/25330-10-0#offer-terms) |
145
+ | (merchants) | amex-travel, airbnb | new `booked_via`: answers say when booking through Amex Travel would earn more | n/a |
146
+ | amex-gold | airbnb-amex-travel | new rule: 2x on prepaid Airbnb stays booked through Amex Travel (was a todo) | [Gold terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/gold-card/25330-10-0#offer-terms) |
147
+ | amex-gold | restaurants.exclude | new: no 4x at restaurants inside hotels, casinos or event venues (Dodger Stadium, Bellagio) or at bars (MCC 5813) | [Gold terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/gold-card/25330-10-0#offer-terms) |
148
+ | amex-gold | restaurants.note, flights.note | reworded to the terms; dropped the unsourced "other travel sites earn 1x" | [Gold terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/gold-card/25330-10-0#offer-terms) |
149
+ | amex-platinum | airbnb-amex-travel | new rule: 5x on prepaid Airbnb stays booked through Amex Travel (was a todo) | [Platinum terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/platinum-card/25330-10-0#offer-terms) |
150
+ | amex-platinum | cruises-amex-travel | new rule: 2x on cruises booked through Amex Travel | [Platinum terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/platinum-card/25330-10-0#offer-terms) |
151
+ | amex-platinum | flights.note | "scheduled" means not charter or private jet; flights in tours, cruises or packages are excluded | [Platinum terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/platinum-card/25330-10-0#offer-terms) |
152
+ | amex-gold, amex-platinum | verified_by | claude → collin, after Collin's review and the terms check above | n/a |
153
+
154
+ ## 2026.10.24.4
155
+
156
+ | Card | Field | Old → new | Source |
157
+ | --------------------------------------------------------------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
158
+ | amex-blue-cash-preferred, usbank-cash-plus, chase-sapphire-preferred, chase-freedom-unlimited, sofi-unlimited-2 | verified_by | claude → collin. Collin reviewed the flagged items from the 2026-10-24 rule-by-rule re-check; the rest were backed by quotes from the issuer pages | n/a |
159
+
160
+ Still `claude`: amex-gold and amex-platinum (Airbnb rules and "scheduled" flights wait on reading Amex's terms), chase-prime-visa and citi-my-best-buy-visa (sourced from the co-brand partner's page, not the issuer's).
161
+
162
+ ## 2026.10.24.3
163
+
164
+ From Collin's review of the yellow rows in the card re-check.
165
+
166
+ | Card | Field | Old → new | Source |
167
+ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
168
+ | (categories) | gas.grocery_store, gas.superstore | new: gas sold by grocery stores, and by superstores and warehouse clubs. "Kroger gas" or "Walmart fuel" now resolves to these instead of to the store itself | [BCP terms](https://www.americanexpress.com/us/credit-cards/card-application/apply/prospect/terms/blue-cash-preferred-credit-card/25330-10-0#offer-terms), [Cash+ sample merchants](https://cashplus.usbank.com/cash-plus/samplemerchants) |
169
+ | (merchants) | costco-gas, sams-club-gas | category gas → gas.superstore | [BCP terms](https://www.americanexpress.com/us/credit-cards/card-application/apply/prospect/terms/blue-cash-preferred-credit-card/25330-10-0#offer-terms) |
170
+ | amex-blue-cash-preferred | us-gas.exclude | Costco and Sam's Club gas → all grocery-store, superstore and warehouse-club gas | [BCP terms](https://www.americanexpress.com/us/credit-cards/card-application/apply/prospect/terms/blue-cash-preferred-credit-card/25330-10-0#offer-terms) |
171
+ | usbank-cash-plus | two-percent.exclude | Costco and Sam's Club gas → all superstore and warehouse-club gas. Grocery-store gas still counts; U.S. Bank lists Kroger Fuel Center as a sample gas merchant | [Cash+ page](https://www.usbank.com/credit-cards/cash-plus-visa-signature-credit-card.html), [Cash+ sample merchants](https://cashplus.usbank.com/cash-plus/samplemerchants) |
172
+ | usbank-cash-plus | select-clothing-stores | every clothing store → only the 13 stores U.S. Bank lists ("This category includes only the merchants listed below") | [Cash+ sample merchants](https://cashplus.usbank.com/cash-plus/samplemerchants) |
173
+ | (merchants) | aeropostale, american-eagle, ann-taylor, banana-republic, eddie-bauer, express, forever-21, j-crew, jos-a-bank, talbots, the-limited | new, for the Cash+ clothing list | [Cash+ sample merchants](https://cashplus.usbank.com/cash-plus/samplemerchants) |
174
+ | chase-sapphire-preferred | online-grocery.exclude | Costco and Sam's Club → all warehouse clubs | [CSP page](https://creditcards.chase.com/rewards-credit-cards/sapphire/preferred) |
175
+ | chase-freedom-unlimited | pools_into | kept: the card page doesn't say it, but Collin has combined these points before | Collin (cardholder) |
176
+ | chase-prime-visa | amazon-fresh.note | added: the physical stores closed or became Whole Foods in 2026 | Collin |
177
+
178
+ ## 2026.10.24.2
179
+
180
+ From a rule-by-rule re-check of every card file against its issuer's pages. Still `verified_by: claude`.
181
+
182
+ | Card | Field | Old → new | Source |
183
+ | ------------------------ | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
184
+ | chase-sapphire-preferred | vacation-homes | new rule: 3x on direct bookings with Airbnb, Vrbo/HomeAway, Vacasa, Plum Guide and Homestay.com (was a todo) | [Chase rewards FAQ](https://www.chase.com/personal/credit-cards/rewards-category-faq) |
185
+ | chase-sapphire-preferred | lyft | new rule: 5x on Lyft rides through 2027-09-30 | [CSP page](https://creditcards.chase.com/rewards-credit-cards/sapphire/preferred) |
186
+ | chase-sapphire-preferred | transit-as-travel.unverified | flag removed: Chase's travel category lists trains, buses, taxis, ferries, tolls and parking | [Chase rewards FAQ](https://www.chase.com/personal/credit-cards/rewards-category-faq) |
187
+ | chase-freedom-unlimited | lyft | new rule: 2% total on Lyft app purchases through 2027-09-30 | [CFU page](https://creditcards.chase.com/cash-back-credit-cards/freedom/unlimited) |
188
+ | (merchants) | vrbo, vacasa, plum-guide, homestay-com | new, for the vacation-homes rule | [Chase rewards FAQ](https://www.chase.com/personal/credit-cards/rewards-category-faq) |
189
+ | (currencies) | sofi-rewards.note | removed "statement-credit value isn't published": redeeming into the SoFi Credit Card account is 1¢ a point, like other SoFi accounts | [SoFi rewards terms](https://www.sofi.com/card/rewards?cardtype=c) |
190
+ | (currencies) | best-buy-rewards.note | dropped "usable only at Best Buy", which the page doesn't say | [Best Buy rewards page](https://www.bestbuy.com/site/misc/financing-rewards/pcmcat102500050032.c) |
191
+ | citi-my-best-buy-visa | best-buy.note | Plus/Total wording now matches the page: membership rewards are counted separately | [Best Buy rewards page](https://www.bestbuy.com/site/misc/financing-rewards/pcmcat102500050032.c) |
192
+
193
+ ## 2026.10.24.1
194
+
195
+ | Card | Field | Old → new | Source |
196
+ | ------------ | ------------------------------------ | ----------------------------------------------------------------------------------------- | ------------------- |
197
+ | (categories) | superstore.name, warehouse_club.name | dropped the example merchants in parentheses, which read badly inside engine explanations | n/a (display names) |
198
+
199
+ ## 2026.10.24
200
+
201
+ First release. Nine cards, each checked against its issuer's page (`verified_by: claude`, not yet reviewed by Collin): Amex Gold, Blue Cash Preferred and Platinum; Chase Sapphire Preferred, Freedom Unlimited and Prime Visa; U.S. Bank Cash+; My Best Buy Visa; SoFi Unlimited 2%. 91 merchants, 32 categories, 5 currencies.
202
+
203
+ Corrections made before release, after reading Amex's offer terms:
204
+
205
+ | Card | Field | Old → new | Source |
206
+ | ------------------------ | -------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
207
+ | amex-blue-cash-preferred | us-supermarkets.exclude | removed `specialty_food` (it came from review sites; Amex's terms don't list it) | [BCP terms](https://www.americanexpress.com/us/credit-cards/card-application/apply/prospect/terms/blue-cash-preferred-credit-card/25330-10-0#offer-terms) |
208
+ | amex-blue-cash-preferred | us-supermarkets.unverified | cap period confirmed as calendar year, flag removed | BCP terms |
209
+ | amex-gold | us-supermarkets.exclude | removed `specialty_food` | [Gold terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/gold-card/25330-10-0#offer-terms) |
210
+ | amex-gold, amex-platinum | todo | added: Airbnb via Amex Travel (2x Gold, 5x Platinum) not modeled | Gold and [Platinum terms](https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/platinum-card/25330-10-0#offer-terms) |