All field notes

Tutorial

SimpleFIN Troubleshooting: Missing Transactions, Stale Balances and 403s

Diagnose SimpleFIN setup-token failures, 403s, quotas, stale balances, missing history and duplicates.

By BankSync12 min read
A mechanic checking the stages of a SimpleFIN data flow

Most bank-sync problems are misclassified, not mysterious. A missing transaction might be absent at the bank connector, present in the SimpleFIN response but outside the requested range, mapped to another local account, or rejected by deduplication.

Record four timestamps

Capture last provider refresh, last successful SimpleFIN fetch, newest transaction returned and newest transaction written locally. Also record the requested start and end dates. A single “synced” timestamp hides the first useful clue.

Do not expect unlimited history. The Bridge guide caps requested windows at 90 days and available history varies by institution. For older backfill, a bank export may be more reliable. For ongoing sync, overlap recent days so late-posting and pending-to-posted changes are caught.

A mechanic checking the stages of a SimpleFIN data flow
A mechanic checking the stages of a SimpleFIN data flow

Credential failures

A setup token is single-use. If claim succeeded but the app failed before storing the access URL, retrying the same setup token will not recreate it—generate a fresh one. If the app offers a supported reset path, use it rather than editing its database.

The access URL includes credentials. Partial copying, incorrect decoding or unsafe string concatenation can cause authorization errors. Keep it intact and build the /accounts request with a URL library.

Quotas and schedules

The Bridge guide expects no more than about 24 requests per day and recommends spreading work away from the top of the hour. Add jitter. On throttling or transient network errors, back off; regenerating credentials will not fix a quota problem.

Diagnostic sequence

  1. Check the provider connection

    Can it see the institution and a recent refresh, or does it request reauthorisation?

  2. Check credential metadata

    Confirm the secret exists without printing it.

  3. Run one bounded fetch

    Request a recent window for one account and save a redacted fixture.

  4. Read structured errors

    Inspect v2 `errlist` before scanning transactions.

  5. Verify account mapping

    Match remote IDs to the intended local accounts.

  6. Trace one missing record

    Follow its provider ID through normalize and upsert.

  7. Reconcile counts and balances

    HTTP 200 alone is not proof of correctness.

Missing, stale and duplicate records

If a transaction appears remotely but not locally, inspect date boundaries, time zones, currency conversion, account filters and duplicate keys. If two legitimate recurring charges collapse, replace fuzzy matching with stable provider IDs. If pending and posted versions duplicate, upsert inside an overlap window.

Stale balances with fresh transactions can indicate that balance handling and transaction handling follow different code paths. Compare provider freshness, returned balance fields and the application’s reconciliation logic.

App-specific reset paths

Actual Budget documents a credential reset from the Add Account menu. Sparky Budget may require removing its stored access_url.txt, generating a new setup token, updating configuration and restarting Docker. Firefly III uses the separate Data Importer, so review its configuration and logs rather than only the main app.

Repair safely

ProblemSafe actionAvoid
Claim lost before saveGenerate a new setup tokenRetry consumed token forever
One institution needs attentionReauthorise that connectionDelete all accounts
Older history absentUse file backfillUnbounded repeated requests
Pending/posted duplicateUpsert stable ID with overlapFuzzy merchant matching
Stale data with errorShow stale state and errorGreen sync badge
Quota responseBack off with jitterCredential rotation

Choose the narrowest corrective action.

When to escalate

Escalate with a redacted diagnostic bundle: provider name, protocol version, remote account ID suffix, request window, timestamps, HTTP status, structured error code and record counts. Never include the full access URL, setup token or raw unrelated transactions.

Frequently asked questions

Primary sources