I want to share a practical, low-touch workflow I use for tax-loss harvesting across multiple taxable accounts using only free tools. If you're like me — juggling brokerage accounts, ETFs, and a full-time job — it helps to automate the repetitive parts, keep clear records, and only intervene when a real opportunity appears. Below I walk through the process I set up, the tools I rely on, how I avoid wash sales, and a simple logging template you can copy into Google Sheets and adapt to your situation.
Why a low-touch approach?
Tax-loss harvesting works best when it's systematic: you identify losses, realize them at logical thresholds, and maintain documentation. But constantly logging into every broker, checking lots of positions, and manually recording trades is a time sink. My goal was to create a workflow that alerts me only when action is needed and captures the trade history for tax-time without paid software. Free tools like Google Sheets, broker account notifications, and a few lightweight scripts are surprisingly effective.
Overview of the workflow
The workflow has three pillars: monitoring, decision rules, and recordkeeping. Here’s the high-level flow I use:
Free tools I use
Here are the main free pieces I rely on:
All of the above can be used without paying for third-party tax-harvesting platforms.
Step 1 — Build a central inventory
I keep a master Google Sheet with one tab per account and a consolidated tab. Minimum columns I track:
| Account | Symbol | Shares | Cost Basis | Market Price | Unrealized P/L | Tax Lot Date | Wash Sale Flag | Notes |
|---|---|---|---|---|---|---|---|---|
| Broker A | VTI | 120 | $185 | $170 | -$1,800 | 2021-06-15 | No |
I import CSVs from each broker into the per-account tabs monthly and run a small Apps Script that copies the current price via the GOOGLEFINANCE function or a free API and updates the consolidated tab.
Step 2 — Simple harvesting rules
I keep the rules intentionally conservative so I don't trade too often. My typical filters:
These are just my defaults — tweak by account size, tax bracket, and portfolio turnover tolerance.
Step 3 — Replacement security rules
One of the hardest parts is choosing replacements that avoid wash sales but retain market exposure. I typically use these approaches:
Document the replacement rationale in the sheet’s Notes column. This is invaluable if the IRS questions the trade or you reconstruct your decisions months later.
Step 4 — Alerts and low-touch execution
I aim for alerts only. Here’s how I automate them:
If you prefer not to run scripts, you can use conditional formatted cells in Sheets and set a filter view — it’s manual but still centralizes the information.
Step 5 — Record the realized loss and manage wash-sale windows
After executing a harvest, immediately update the sheet with:
Reporting and tax prep
At year-end I use the sheet to cross-check broker 1099-Bs. The key advantages of this system:
Common pitfalls and how I avoid them
Here are practical issues I’ve run into and the fixes I use:
If you want, I can share a starter Google Sheets template with the columns and a simple Apps Script snippet I use to send alerts. It will get you from zero to a low-touch harvesting workflow in a couple of hours.
One last practical note: I am not a tax professional. Tax rules change and individual situations differ, so use this workflow as a practical system and consult your CPA for specifics on your tax-return reporting and strategy optimization.