TR

transactionsyncing

Automated ingestion and syncing of Fidelity transaction CSVs to Google Sheets.

Install

mkdir -p .claude/skills/transactionsyncing && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/3257" && unzip -o skill.zip -d .claude/skills/transactionsyncing && rm skill.zip

Installs to .claude/skills/transactionsyncing

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Import and manage Fidelity transaction history CSVs. Two workflows - IngestTransactions (local rolling archive from Downloads) and SyncTransactions (Google Sheets push). USE WHEN user mentions "sync transactions", "import transactions", "ingest transactions", "transaction history", OR wants to import Fidelity History CSV.
323 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Intermediate

Key capabilities

  • →Ingest CSV files from local Downloads folder
  • →Archive Fidelity transaction history locally
  • →Automate routing of debit card purchases to Expense Tracker
  • →Synchronize transaction audit trails to Google Sheets
  • →Identify duplicate entries based on date and amount

How it works

Uses a hybrid architecture where a local rolling archive triggers a sync script to parse CSV data, categorize line items, and push updates to Sheets.

Inputs & outputs

You give it
Fidelity transaction CSV file
You get back
Categorized entries in Google Sheets and local audit files

When to use transactionsyncing

  • →Import Fidelity transactions
  • →Sync CSV data to spreadsheet
  • →Categorize debit card expenses

About this skill

TransactionSyncing

Refresh financial activity into family_office.db: investment activities (transactions table) and card/bank spending (bank_transactions table), auto-categorized for budget review.

family_office.db is the system of record. The Google Sheets export was retired 2026-07-31.

Step 0: Refresh (sync-first, mandatory)

Both halves read from the local DB, refreshed FIRST so nothing is stale. Follow the shared Sync-First + DB-Read pattern. This skill needs two sources:

uv run python -m src.integrations.snaptrade.sync_transactions_db          # investment activities -> transactions
uv run python -m src.integrations.simplefin.sync_expenses_db --months 3   # card/bank spending -> bank_transactions
# or refresh everything at once:
uv run python -m src.integrations.refresh_all --months 3

Completion criterion: both sync commands report success. Do not gate on MAX(synced_at) advancing: both layers are idempotent and only stamp rows they actually write, so a run with no new activity leaves the timestamp untouched. Read the command output instead (N inserted, M updated, K skipped).

⚠️ The two feeds do not run at the same speed

bank_transactions (SimpleFIN) is generally fresher than transactions (SnapTrade), which lags by days, but freshness is per account: a connected card can go silent for months (see Stale connections below), so check the account's own MAX(date) before trusting its cash leg. Verified 2026-08-04: the positions table showed PLTR and TSLA puts opened on 2026-08-03, while transactions had no row for either buy and its latest activity date was still 2026-07-31. SnapTrade updated holdings before it published the activity that created them.

Consequence: never conclude "X did not happen" from an absence in transactions. A missing row means "not published yet" at least as often as it means "did not occur". To answer whether something executed:

  1. Check positions for a holdings change (fastest signal).
  2. Check bank_transactions for the cash leg, which is current.
  3. Only then read transactions, and treat the tail few days as incomplete.

The same applies to month-boundary reporting: the last several days of any period may still be missing from the investment side.

Direction and sign

bank_transactions.direction is resolved by resolve_direction() in src/integrations/simplefin/sync_expenses_db.py. Explicit feed wording wins over amount sign, because Fidelity's CMA reports inbound payroll with the same negative sign it uses for outflows. amount is signed to match direction, so SUM(amount) is real cash flow: credits positive, debits negative.

⚠️ Household spending lives in THREE streams, in two different tables

A spending review that reads only bank_transactions is wrong. Measured for July 2026: that table showed well under two thirds of personal spend. The missing 41% was in the other two streams.

StreamTableJuly 2026
1. Bank and card accounts (SimpleFIN)bank_transactions59%
2. Brokerage direct debits (SnapTrade)transactions36%
3. Cards paid but not connectedneither, infer from the bill5%

Stream 2 is the one that gets forgotten. The Fidelity brokerage pays the mortgage, insurance, utilities, phone, tuition, and has a debit card used for groceries. Those rows are type='WITHDRAWAL' in transactions, not in bank_transactions at all.

sqlite3 family_office.db \
  "SELECT date, description, -amount FROM transactions
   WHERE type = 'WITHDRAWAL' AND date LIKE '2026-07%' ORDER BY -amount DESC;"

Categorize those rows with the same categorize_expense(), then separate:

  • Household consumption: mortgage, insurance, groceries, utilities, tuition.
  • Not consumption: MARGIN INTEREST (financing cost, report separately), card bill payments, and JOURNALED internal moves.

Check for double counting across the two tables by matching amount and date within a couple of days. In July exactly one pair collided ($50 on 7/24) and inspection showed two genuinely separate payments, not a duplicate. Inspect; do not assume either way.

Income totals have the mirror-image problem. Credits into bank_transactions include transfers between the principal's own accounts, so summing them overstates income. Net internal movement out before quoting a surplus.

Spending reviews: count purchases, exclude bill payments, then AUDIT COVERAGE

Count card purchases. Exclude card bill payments. Both are debits, but a purchase and the payment of that same purchase are one dollar of spending, not two. Exclude the categories in NON_SPEND_CATEGORIES, and exclude BUSINESS_CATEGORIES plus the business accounts when the question is household spending.

That exclusion is only valid if every card that receives a payment also reports its purchases. When a card is paid but not connected, its purchases are invisible and its payment was excluded, so the spending vanishes entirely. Run this before quoting any total:

uv run python -c "
import sqlite3
c = sqlite3.connect('family_office.db')
print('Cards receiving payments:')
for r in c.execute(\"SELECT DISTINCT COALESCE(payee,description) FROM bank_transactions WHERE category='Credit Card Payment'\"):
    print('  ', r[0])
print('Card accounts reporting purchases (with last activity):')
for r in c.execute(\"SELECT account_name, MAX(date), COUNT(*) FROM bank_transactions WHERE LOWER(COALESCE(org,'')) LIKE '%credit%' OR LOWER(COALESCE(org,'')) LIKE '%express%' GROUP BY account_id\"):
    print(f'   {r[0]:<38} last {r[1]}  ({r[2]} rows)')
"

Two failure modes, both found 2026-08-04:

  1. Paid but not connected. An Apple Card bill cleared on 2026-08-03 with zero Apple purchases anywhere in the feed. That understated July household spending by roughly 8%. Backfill from the bill amount and say so, or connect the account.
  2. Connected but stale. Chase Sapphire Preferred stopped reporting on 2026-07-17 and an older card had produced nothing since 2026-04-21. A stale connection looks identical to genuinely low spending. Treat any card whose last activity is more than about a week old as suspect.

Always state the coverage caveat alongside the total. A household number carrying an unquantified gap is worse than one carrying a stated one.

Workflow Routing

WorkflowTriggerFile
IngestTransactions"ingest transactions", "import history", user points to a Downloads CSVworkflows/IngestTransactions.md

CSV ingest is an archive and fallback path. The primary flow is the Step 0 refresh above.

Examples

Example 1: Sync after downloading Fidelity transaction history

User: "sync transactions"
-> Reads History_for_Account_{account_id}.csv from imports/transactions/
-> Creates/updates Transactions tab with full Fidelity data
-> Routes DEBIT CARD PURCHASE entries to Expense Tracker
-> Auto-categorizes expenses (H-E-B -> Groceries, Tesla -> Auto & Transport)
-> Reports: "Added 45 transactions, 12 expenses categorized"

Example 2: Import new transaction export

User: "import the transaction history"
-> Invokes SyncTransactions workflow
-> Detects duplicates by date + action + amount
-> Skips existing entries, adds only new ones
-> Flags uncategorized expenses for manual review

Example 3: Check recent transactions

User: "import fidelity transactions and update expense tracker"
-> Full sync with expense routing
-> Generates summary of dividends received, purchases, margin interest

Architecture Overview

Data Flow

SnapTrade activities            SimpleFIN dump (bun run src/dump.ts)
        |                                |
        v                                v
  sync_transactions_db            sync_expenses_db (categorize.py)
        |                                |
        v                                v
+------------------+           +--------------------+
| transactions     |           | bank_transactions  |  <- categorized, upserted
| table (DB)       |           | table (DB)         |
+------------------+           +--------------------+

family_office.db is the terminus. Query the tables directly for review; there is no downstream export.

Transaction Types Handled

Fidelity ActionTableCategory
DIVIDEND RECEIVEDtransactionsDIVIDEND
REINVESTMENTtransactionsREINVESTMENT
DEBIT CARD PURCHASEbank_transactionsAuto-categorized
MARGIN INTERESTtransactionsMARGIN_INTEREST
DIRECT DEPOSITbank_transactions (credit)INCOME
LONG-TERM CAP GAINtransactionsCAP_GAIN
JOURNALEDtransactionsINTERNAL_TRANSFER

Smart Categorization

Categorization is executable and runs inside the expense adapter, so the category column arrives pre-filled on every bank_transactions row. Household merchants (local businesses, the daycare, the church) are private and live in the instance as merchant-rules.yaml, merged into the public table at sync time; the public table holds national brands only. The rules live in code at src/integrations/simplefin/categorize.py (categorize_expense(text, amount)), which is the source of truth mirroring the human-readable CategoryRules.md. Keep the two in sync when adding patterns.

Sample patterns:

  • H-E-B, KROGER, COSTCO, WAL-MART -> Groceries
  • Tesla, SUPERCHA -> Auto & Transport
  • BENIHANA, GOLDEN CORRAL, PAPA JOHN -> Dining Out
  • CVS, PHARMACY -> Health & Wellness
  • amount < $1.00 or verification text -> Exempt; no match -> Uncategorized

Input Sources: the local DB (primary)

Half A: Investment activities (transactions table)

After Step 0's refresh, read investment activity from the DB:

sqlite3 family_office.db \
  "SELECT date, ty

---

*Content truncated.*

When not to use it

  • →Syncing non-Fidelity financial data
  • →Executing real-time stock trading orders

Prerequisites

Fidelity account with exported CSV accessGoogle Sheets API access

Limitations

  • →Requires consistent Fidelity CSV export format
  • →Limited to predefined expense categories

How it compares

It automates the manual spreadsheet updates and categorization logic specifically for Fidelity formats rather than requiring manual copy-pasting.

Compared to similar skills

transactionsyncing side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
transactionsyncing (this skill)16moNo flagsIntermediate
portfoliosyncing36moNo flagsIntermediate
retirement-syncing17moNo flagsBeginner
bewerbungs-tracker04moNo flagsBeginner

Try saying

Example prompts that trigger this skill in your AI assistant.

More by AojdevStudio

View all by AojdevStudio →

financereport

AojdevStudio

Generate institutional-quality PDF analysis reports for stocks and ETFs. USE WHEN user mentions generate report, create pdf, stock analysis, ticker report, watchlist analysis, OR regenerate reports. Includes VGT-style headers, embedded charts, portfolio sizing, and Perplexity sentiment integration.

636

portfoliosyncing

AojdevStudio

Import and sync broker CSV portfolio data to Google Sheets DataHub. Supports multiple brokers (Fidelity, Schwab, Vanguard, etc.). USE WHEN user mentions import broker data OR sync portfolio OR update positions OR CSV import OR portfolio-sync OR working with Portfolio_Positions CSVs. Handles position updates, SPAXX/margin validation, safety checks, and formula protection.

333

formula-protection

AojdevStudio

Prevent accidental modification of sacred spreadsheet formulas in Google Sheets Portfolio Tracker. Blocks edits to GOOGLEFINANCE formulas, calculated columns, and total rows. Allows only IFERROR wrappers, fixing broken references, and expanding ranges. Triggers on update formula, modify column, fix errors, or any attempt to edit formula-based cells.

14

margin-management

AojdevStudio

Update Margin Dashboard with Fidelity balance data and calculate margin-living strategy metrics. Monitors margin balance, interest costs, coverage ratios, and scaling thresholds. Triggers safety alerts for large draws and provides time-based scaling recommendations. Use when updating margin, balances, coverage ratio, or margin strategy analysis.

17

montecarlo

AojdevStudio

Run Monte Carlo simulations for Finance Guru portfolio strategy. USE WHEN user mentions monte carlo OR run simulation OR stress test portfolio OR probability analysis OR income projections OR margin safety analysis. Supports 4-layer portfolio (Growth, Income, Hedge, GOOGL) with auto-detection of current values from Fidelity CSV.

15

retirement-syncing

AojdevStudio

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.

15

You might also like

portfoliosyncing

AojdevStudio

Import and sync broker CSV portfolio data to Google Sheets DataHub. Supports multiple brokers (Fidelity, Schwab, Vanguard, etc.). USE WHEN user mentions import broker data OR sync portfolio OR update positions OR CSV import OR portfolio-sync OR working with Portfolio_Positions CSVs. Handles position updates, SPAXX/margin validation, safety checks, and formula protection.

333

retirement-syncing

AojdevStudio

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.

15

bewerbungs-tracker

Flissel

Bewerbungs-Tracker mit Status-Pipeline (Sichtung -> Interview -> Angebot/Absage),

00

xlsx

anthropics

Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work with spreadsheets (.xlsx, .xlsm, .csv, .tsv, etc) for: (1) Creating new spreadsheets with formulas and formatting, (2) Reading or analyzing data, (3) Modify existing spreadsheets while preserving formulas, (4) Data analysis and visualization in spreadsheets, or (5) Recalculating formulas

87191

analyzing-financial-statements

anthropics

This skill calculates key financial ratios and metrics from financial statement data for investment analysis

32134

financial-document-parser

OneWave-AI

Extract and analyze data from invoices, receipts, bank statements, and financial documents. Categorize expenses, track recurring charges, and generate expense reports. Use when user provides financial PDFs or images.

20139

Search skills

Search the agent skills registry