Most discussions of the wash-sale rule treat it as an account-level concept: "if I sell at a loss in my Schwab account and buy back within 30 days, the loss gets disallowed." That's correct, but incomplete. The rule applies to you the taxpayer, not to a single account. If you sell at a loss in Schwab and your spouse buys the same security in their Fidelity account two weeks later — the loss is disallowed. If you sell at a loss in your taxable brokerage and your IRA buys it back — the loss is disallowed and there's no basis adjustment to inherit. This is the cross-account wrinkle that catches operators with multi-brokerage portfolios every December.
This post walks through what IRS §1091 actually says, the real worked example with two brokerages, the IRA-replacement-buy permanent-loss trap, and what to do operationally if you hold positions across more than one institution.
What §1091 actually says
The statutory rule is short: 26 USC §1091(a) disallows a loss on a sale of stock or securities if, within a period beginning 30 days before the date of the sale and ending 30 days after that date — a 61-day window total — the taxpayer has acquired (by purchase or in a taxable exchange) substantially identical stock or securities. The disallowed loss is added to the basis of the replacement shares (§1091(d)).
Two phrases do the work. "The taxpayer" — not "the account." And "substantially identical" — which the IRS reads broadly enough to capture the same security in any account you control, plus mutual-fund/ETF tracking the same index in some cases.
Worked example — the cross-brokerage trap
Operator holds 200 shares of QQQ. 100 in their Schwab taxable. 100 in their spouse's Fidelity Roth IRA (joint filer; same taxpayer for §1091 purposes). Operator wants to harvest a loss in December.
Here's where it gets brutal. In a normal taxable-account wash sale, the disallowed loss adds to the basis of the replacement shares — you get the loss back when you eventually sell those replacement shares. But the replacement shares are in a Roth IRA. Roth IRAs don't have a cost basis the IRS tracks for capital gains. The disallowed loss is permanently lost. Not deferred. Lost.
This isn't a footnote — the IRS confirmed the IRA-replacement-buy permanent-loss outcome in Revenue Ruling 2008-5. If you sell at a loss in a taxable account and the replacement buy happens in your IRA (yours OR your spouse's, since you file jointly), there's no basis to inherit. The loss vanishes.
What counts as "substantially identical"
The IRS hasn't given a bright-line rule, but practitioner consensus is reliable:
- Same security, period. AAPL → AAPL is identical. SPY → SPY is identical. No question.
- Different share classes of the same fund — usually identical. VTSAX (mutual fund) and VTI (ETF) are both Vanguard Total Stock Market — generally treated as substantially identical, though Vanguard themselves declined to opine in their own guidance.
- Different funds tracking the same index — gray area. SCHB (Schwab Broad Market) and VTI (Vanguard Total Stock Market) both track US-total-market — historically not treated as substantially identical because the underlying methodologies and holdings differ. Most CPAs are comfortable with this swap.
- Different funds tracking different indexes — clearly not substantially identical. SPY (S&P 500) and VTI (total market) are different exposures.
- Same company's bonds and stock — explicitly not substantially identical per the regs.
- Same security, options replacing stock — courts have ruled this can trigger wash-sale.
The safe harvest play that respects the rule is well-established: sell VTI at a loss, immediately buy SCHB (different fund, similar exposure). Wait 31 days. Sell SCHB and rebuy VTI if you wanted to be back in. That's a clean harvest with continuous market exposure.
Where automated tools usually fail you
Even tax-software-assisted harvesting (TurboTax, H&R Block, ProConnect) typically operates on one brokerage's 1099-B at a time. The wash-sale flagging you see in the software comes from the broker's own reporting — which by definition is single-account. Cross-brokerage wash sales are not flagged at the broker level and won't be caught by the tax software unless you flag them manually.
The same is true for most consumer wealth-tracking tools. Empower, Monarch, Mint — they aggregate balances across institutions but their tax-aware features (when present) operate per-account. If you sold at a loss in Schwab and your IRA replenished from a different platform, no consumer tool flags this for you by default. The flag is your responsibility.
How to scan for cross-account wash sales operationally
Practitioners do it three ways:
- Monthly reconciliation in a spreadsheet. Pull every transaction from every brokerage for the past 60 days. For every sell-at-loss, search the same security across all accounts within ±30 days. Tedious but bulletproof.
- Year-end "cooling-off" rule. Disable auto-investing in any account for the 30 days before and after planned harvest dates. Removes most of the cross-account risk by removing the auto-buys that trigger it.
- Tool-assisted scan. Upload all your CSVs into a tool that runs the cross-account check automatically. HELM's Tax Brain does this — Wash Sale Detection scans every sell-at-loss against every other account's buys within the ±30-day window, flags the trade with the matching replacement buy, and shows the cross-account flag explicitly. Manual-first means we never log into your brokerage; you upload the CSVs and we do the cross-reference.
Whichever path you take, the principle is the same: the wash-sale rule sits at the taxpayer level, not the account level, and your monitoring needs to mirror that scope.
Three operational rules that prevent 90% of cross-account wash sales
- Audit your auto-investing. Before any planned harvest, list every account where automatic buys occur — 401(k), Roth IRA, HSA, brokerage DRIPs, robo-advisor allocation buys. Pause or redirect for the 30 days surrounding the harvest.
- Use cleanly-different replacement securities. When harvesting, swap into a tracking fund from a different fund family with a different methodology. SCHB ↔ VTI. ITOT ↔ VOO. Different vendors, different methodologies, no wash-sale risk.
- Wait the full 31 days before swapping back. The rule is 30 days "after" the sale. Day 31 is the safe minimum. Some practitioners wait 32 to remove any timezone or settlement-date ambiguity. Worst case you miss a small market move; best case you keep your loss intact.
What this is worth — the math
A typical HNW operator with $2M in taxable equities, doing 4 harvests/year averaging $5,000 in unrealized loss each, captures $20,000 of harvested loss annually. At a 32% federal marginal rate that's $6,400 of tax savings per year. Compounding: 10 years × $6,400 = $64,000, before reinvestment growth on the saved tax dollars.
The cross-account trap doesn't reduce the harvested amount; it converts some of those harvested losses into permanently disallowed losses. If 25% of your harvest activity is invalidated by an unnoticed cross-account replacement buy, that's $1,600/year of permanent tax loss. Over a decade: $16,000. Avoidable with a 30-second pre-harvest audit.
HELM scans every wash-sale ±30 days across every account you upload.
Cross-account flagging built in. CPA-export ready. Educational only — confirm any harvest move with your tax professional before executing. Founding-25 lock $79/mo for the lifetime of the subscription.
Become a founding operator →Read: why HELM has no Plaid (the aggregator problem) · Compare HELM to Empower / Monarch / Kubera →