July 4, 2026 · 7 min read
2-Card vs 5-Card Wallets: A Four-Profile Solver Report
We ran the live solver across four stated spending profiles at a 2-card limit and a 5-card limit, then reported the modeled net-value difference.
Original research
Questions tested with the constraint solver and the card data as of each report's stated date.
Methods, assumptions, and verification dates are documented in each report.
These studies compare modeled portfolios under stated spending profiles and eligibility assumptions. They are evidence about the tested profiles—not universal prescriptions.
Read our model methodology before interpreting the results.
July 4, 2026 · 7 min read
We ran the live solver across four stated spending profiles at a 2-card limit and a 5-card limit, then reported the modeled net-value difference.
July 12, 2026 · 8 min read
Four profiles solved twice — full catalog vs $0-fee cards only. Fee cards won by $50.45/year on average; the lightest spender’s optimal fee was $0.
July 12, 2026 · 7 min read
We solved a couple’s cards separately and together. Pooling spend at the same card count earned $98/year more — but merging onto fewer cards lost money.
October 7, 2026 · 9 min read
We solved 252 synthetic households at 2 and 5 cards. Citi Double Cash was in 56% of optimal 2-card wallets; 5 cards added a median $241.20/yr.
Open data
The aggregates behind Which Cards Show Up in Optimal Wallets? A 252-Household Solver Report (Q4 2026), as plain files. They hold counts, shares and profile definitions only, never an individual household’s spending or result. Card catalog as of October 10, 2026.
Free to cite with a link to the source.
Cards in optimal wallets. How often each of the most common cards appeared in the solver's optimal wallets: overall and within each archetype, for the 2-card cash, 5-card cash and 2-card travel runs. One row per scenario, card and group.
CSV · 240 rows
Most common 2-card pairs. The ten pairs of cards that were optimal for the most profiles in the 2-card cash run.
CSV · 10 rows
Household archetypes. The seven archetypes the 252 synthetic households were drawn from, with their monthly spend.
CSV · 8 rows
Results by archetype. Modeled net value at 2 and 5 cards, the gain from the extra cards, how often a fee card was optimal, and how close the best $0-fee pair came. Cash mode.
CSV · 8 rows
Profile definitions. The monthly spending ranges each archetype's households were drawn from. A category that is not listed for an archetype is always $0.
CSV · 111 rows
What happens without a card or its credits. Follow-up solves for the wallets that included a card: re-solved with the card's credits valued at $0, or with the card excluded.
CSV · 7 rows
All tables in one file. Every table above plus the method notes, limitations, license and this data dictionary.
JSON
| Column | Type | Meaning |
|---|---|---|
| scenario | text | cash_2_cards (free tier, cash mode), cash_5_cards (5-card limit, cash mode) or travel_2_cards (2-card limit, travel mode). |
| card_key | text | OptimalCardSetup card id; the card page is /cards/<card_key>. |
| card_name | text | Card name as shown on the site. |
| annual_fee_usd | usd | Annual fee in dollars at the snapshot date. |
| group | text | all (every profile) or an archetype id from the archetypes file. |
| wallets | integer | Profiles whose optimal wallet included this card. |
| group_profiles | integer | Profiles in the group: 252 for all, 36 for each archetype. |
| share_pct | percent | wallets divided by group_profiles, in percent. |
| Column | Type | Meaning |
|---|---|---|
| scenario | text | Always cash_2_cards. |
| rank | integer | 1 is the pair that was optimal for the most profiles. |
| card_1_key | text | First card id (alphabetical by id). |
| card_1_name | text | First card name. |
| card_2_key | text | Second card id. |
| card_2_name | text | Second card name. |
| wallets | integer | Profiles for which this pair was the optimal wallet. |
| share_pct | percent | wallets divided by 252, in percent. |
| Column | Type | Meaning |
|---|---|---|
| archetype | text | Archetype id, or all for every profile. |
| label | text | Display name. |
| description | text | One-line description of the archetype. |
| profiles | integer | Synthetic households in the group. |
| median_monthly_spend_excl_rent_usd | usd | Median total monthly card spend across the group's profiles, excluding rent. |
| min_monthly_spend_excl_rent_usd | usd | Lowest monthly spend of any profile in the group, excluding rent. |
| max_monthly_spend_excl_rent_usd | usd | Highest monthly spend of any profile in the group, excluding rent. |
| median_monthly_rent_usd | usd | Median monthly rent for archetypes that pay rent on a card; blank otherwise. Rent earned nothing in these runs. |
| Column | Type | Meaning |
|---|---|---|
| group | text | Archetype id, or all for every profile. |
| label | text | Display name. |
| profiles | integer | Synthetic households in the group. |
| median_net_value_2_cards_usd | usd | Median annual net value of the optimal 2-card wallet: modeled rewards minus annual fees after conservative credit values. Blank for all. |
| median_net_value_5_cards_usd | usd | Same for the optimal 5-card wallet. Blank for all. |
| median_gain_usd | usd | Median per-profile difference between the 5-card and 2-card net value, per year. |
| mean_gain_usd | usd | Mean of that difference. |
| min_gain_usd | usd | Smallest difference in the group. |
| max_gain_usd | usd | Largest difference in the group. |
| median_gain_pct | percent | Median per-profile gain as a percentage of the 2-card net value. |
| wallets_with_fee_card | integer | Optimal 2-card wallets that included at least one card with an annual fee. |
| share_with_fee_card_pct | percent | wallets_with_fee_card divided by profiles, in percent. |
| zero_fee_within_25_profiles | integer | Profiles whose best 2-card wallet of $0-fee cards was within $25 a year of the overall best 2-card wallet. |
| zero_fee_within_25_pct | percent | zero_fee_within_25_profiles divided by profiles, in percent. |
| zero_fee_median_shortfall_usd | usd | Median yearly value given up by using $0-fee cards only. |
| Column | Type | Meaning |
|---|---|---|
| archetype | text | Archetype id from the archetypes file. |
| spend_category | text | Optimizer spend-category id, for example dining or groceries_instore. |
| monthly_low_usd | integer | Low end of the monthly range in dollars. |
| monthly_high_usd | integer | High end of the monthly range in dollars. |
| probability_present | fraction | Probability that a household has any spend in the category (1 means always). The amount is uniform between low and high, rounded to the nearest $5. |
| Column | Type | Meaning |
|---|---|---|
| test | text | credits_valued_at_zero (every credit on the card set to $0, a Premium setting) or card_excluded (the card removed from the candidates). |
| scenario | text | cash_2_cards or travel_2_cards. |
| card_key | text | OptimalCardSetup card id. |
| card_name | text | Card name. |
| annual_fee_usd | usd | Annual fee in dollars at the snapshot date. |
| wallets_tested | integer | Profiles whose optimal wallet had included the card. |
| wallets_still_selected | integer | Of those, wallets that still included the card after its credits were set to $0. Blank for card_excluded. |
| median_value_lost_usd | usd | Median yearly value of the new best wallet below the original optimum. |
| max_value_lost_usd | usd | Largest such difference. Blank for credits_valued_at_zero. |
| replacement_cards | text | Cards that entered the new best wallet in place of the original, each with the number of profiles in which it entered (a profile can add more than one card), separated by semicolons. |
Blank cells mean the value does not apply. usd columns are dollars per year unless the name says monthly; percent columns run from 0 to 100 and fraction columns from 0 to 1. Files are UTF-8 with a header row. The JSON file holds the same tables plus the method notes and limitations.
Cite and reuse
Free to cite with a link to the source.
Quote the figures, reuse the tables, and download the data files. Name OptimalCardSetup, link to the report you used, and give its date: card terms change, and each report states the catalog date it was run on. Open a report below for a ready-made citation and link.
Suggested citation
OptimalCardSetup. (2026, October 7). 2-Card vs 5-Card Wallets: A Four-Profile Solver Report. https://optimalcardsetup.com/blog/q3-2026-two-card-wallet-report
Link to this report (HTML)
<a href="https://optimalcardsetup.com/blog/q3-2026-two-card-wallet-report">2-Card vs 5-Card Wallets: A Four-Profile Solver Report</a> by OptimalCardSetupSuggested citation
OptimalCardSetup. (2026, July 12). Do Annual-Fee Cards Actually Out-Earn Free Wallets? We Made the Solver Choose. https://optimalcardsetup.com/blog/annual-fees-optimal-wallet-report
Link to this report (HTML)
<a href="https://optimalcardsetup.com/blog/annual-fees-optimal-wallet-report">Do Annual-Fee Cards Actually Out-Earn Free Wallets? We Made the Solver Choose</a> by OptimalCardSetupSuggested citation
OptimalCardSetup. (2026, October 10). Which Cards Show Up in Optimal Wallets? A 252-Household Solver Report (Q4 2026). https://optimalcardsetup.com/blog/q4-2026-optimal-wallet-report
Link to this report (HTML)
<a href="https://optimalcardsetup.com/blog/q4-2026-optimal-wallet-report">Which Cards Show Up in Optimal Wallets? A 252-Household Solver Report (Q4 2026)</a> by OptimalCardSetupRun your own profile
Your spending, existing cards, fee tolerance, and reward valuations can produce a different portfolio.