Sync retirement account data from Vanguard and Fidelity CSV exports to Google Sheets DataHub. Handles multiple accounts, aggregates holdings by ticker, and updates quantities in retirement section (rows 46-62). Triggers on sync retirement, update retirement, vanguard sync, 401k update, IRA sync, or working with notebooks/retirement-accounts/ files.
Safely import Vanguard and Fidelity retirement account CSV exports into the Google Sheets DataHub retirement section, updating only quantities (Column B).
Use this skill when:
notebooks/retirement-accounts/notebooks/retirement-accounts/ directoryLocation: notebooks/retirement-accounts/
| File | Source | Contents |
|---|---|---|
OfxDownload.csv | Vanguard IRAs | Account 39321600 & 35407271 holdings |
OfxDownload (1).csv | Vanguard Brokerage | Account 53527429 & 50580939 holdings |
Portfolio_Positions_*.csv | Fidelity 401(k) | {employer_name} 401(k) Plan holdings |
Account Number,Investment Name,Symbol,Shares,Share Price,Total Value,
39321600,VANGUARD S&P 500 INDEX ETF,VOO,18.1817,629.3,11441.74,
Key Fields:
Account Number,Account Name,Symbol,Description,Quantity,Last Price,...
86689,{employer_name} 401(K) PLAN,FGCKX,FID GROWTH CO K,4.447,$50.04,...
Key Fields:
Spreadsheet ID: Read from fin-guru/data/user-profile.yaml
Retirement Section: Rows 46-62 (after the "RETIREMENT ACCOUNTS (VANGUARD)" header at row 45)
| Row | Ticker | Description |
|---|---|---|
| 46 | VOO | Vanguard S&P 500 ETF |
| 47 | VUG | Vanguard Growth ETF |
| 48 | VTSAX | Vanguard Total Stock Market |
| 49 | SCHG | Schwab US Large-Cap Growth |
| 50 | PLTR | Palantir |
| 51 | NVDA | NVIDIA |
| 52 | TSLA | Tesla |
| 53 | VB | Vanguard Small-Cap ETF |
| 54 | ARKK | ARK Innovation |
| 55 | VMFXX | Vanguard Money Market |
| 56 | FGCKX | Fidelity Growth Company K |
| 57 | FXAIX | Fidelity 500 Index |
| 58-62 | Reserved | Future holdings |
# Read Vanguard files
vanguard_1 = read_csv("notebooks/retirement-accounts/OfxDownload.csv")
vanguard_2 = read_csv("notebooks/retirement-accounts/OfxDownload (1).csv")
# Read latest Fidelity file (by date in filename)
fidelity = read_csv("notebooks/retirement-accounts/Portfolio_Positions_*.csv")
Since the same ticker can appear in multiple accounts, SUM all quantities:
holdings = {}
for file in [vanguard_1, vanguard_2, fidelity]:
for row in file:
ticker = row['Symbol']
shares = float(row['Shares'] or row['Quantity'])
holdings[ticker] = holdings.get(ticker, 0) + shares
Expected Aggregations:
WRITABLE: Column B (Quantity) only
DO NOT TOUCH:
// Update VOO quantity (Row 46)
mcp__gdrive__sheets(operation: "updateCells", params: {
spreadsheetId: SPREADSHEET_ID,
range: "DataHub!B46:B46",
values: [["214.7947"]] // Aggregated quantity
})
Loop through each retirement ticker and update Column B:
| Ticker | Range | Aggregation |
|---|---|---|
| VOO | B46 | 18.1817 + 196.613 = 214.7947 |
| VUG | B47 | 10.9488 + 2.1164 = 13.0652 |
| VTSAX | B48 | 126.336 + 102.126 = 228.462 |
| SCHG | B49 | 100 + 6 = 106 |
| PLTR | B50 | 25 + 42 = 67 |
| NVDA | B51 | 150 |
| TSLA | B52 | 58 |
| VB | B53 | 20 |
| ARKK | B54 | 16.13 |
| VMFXX | B55 | 2.94 + 0.57 + 179.92 + 428.42 = 611.85 |
| FGCKX | B56 | 4.447 |
| FXAIX | B57 | 3.705 |
Before updating:
notebooks/retirement-accounts/Large Change Warning (>20%):
// Step 1: Read CSVs and aggregate
const holdings = aggregateFromCSVs();
// Step 2: Update each ticker's quantity
const updates = [
{ range: "DataHub!B46:B46", values: [[holdings.VOO.toFixed(4)]] },
{ range: "DataHub!B47:B47", values: [[holdings.VUG.toFixed(4)]] },
{ range: "DataHub!B48:B48", values: [[holdings.VTSAX.toFixed(3)]] },
// ... etc
];
for (const update of updates) {
mcp__gdrive__sheets(operation: "updateCells", params: {
spreadsheetId: SPREADSHEET_ID,
...update
});
}
// Step 3: Log summary
console.log("Updated 12 retirement positions");
Verify:
Log Summary:
Updated 12 retirement positions:
- VOO: 214.7947 shares
- VUG: 13.0652 shares
- VTSAX: 228.462 shares
...
Total Retirement Value: ~$387,806
Retirement section starts at row 46 (after header at row 45). Rows 46-62 are reserved for retirement holdings.
Skill Type: Domain (workflow guidance) Enforcement: SUGGEST Priority: Medium Line Count: < 200