[Feature] Add option in Bank Sync to choose which balance to sync #2591

Closed
opened 2026-02-28 20:20:27 -06:00 by GiteaMirror · 3 comments
Owner

Originally created by @Crosis47 on GitHub (Nov 4, 2025).

Verified feature request does not already exist?

  • I have searched and found no existing issue

💻

  • Would you like to implement this feature?

Pitch: what problem are you trying to solve?

I use the Bank sync option to pull cleared transactions from the bank but most importantly, for pulling a balance to reconcile against. In doing this, it is a necessity that the cleared / posted balance is pulled from the bank. As of now, my accounts that are set up with SimpleFIN are pulling the available balance which takes pending transactions into account. This is an issue as pending transactions regularly change or drop off of an account entirely. This makes the bank sync balance mostly useless unless also importing pending transactions which is counterproductive when reconciling.

Describe your ideal solution to this problem

Adding an option in the bank sync settings for accounts using Simplefin would be the best way. This option would be to choose which balance to use. It seems that Actual is set to always use the available balance, based on code snippets I have seen in other PRs though I may be missing something if this is not true. A simple checkbox that switches between using "available-balance" and "balance" would solve this issue. The checkbox could just be labeled as "Include pending transactions in balance" or similar. This change could even be tied to the "import pending transactions" checkbox as it seems counterintuitive to exclude pending transactions but include them in the synced balance.

Here are the balance fields from SimpleFIN.
Image

Teaching and learning

I don't think any documentation would be needed aside from adding the checkbox to the UI or updating the current pending transaction checkbox.

Originally created by @Crosis47 on GitHub (Nov 4, 2025). ### Verified feature request does not already exist? - [x] I have searched and found no existing issue ### 💻 - [ ] Would you like to implement this feature? ### Pitch: what problem are you trying to solve? I use the Bank sync option to pull cleared transactions from the bank but most importantly, for pulling a balance to reconcile against. In doing this, it is a necessity that the cleared / posted balance is pulled from the bank. As of now, my accounts that are set up with SimpleFIN are pulling the available balance which takes pending transactions into account. This is an issue as pending transactions regularly change or drop off of an account entirely. This makes the bank sync balance mostly useless unless also importing pending transactions which is counterproductive when reconciling. ### Describe your ideal solution to this problem Adding an option in the bank sync settings for accounts using Simplefin would be the best way. This option would be to choose which balance to use. It seems that Actual is set to always use the available balance, based on code snippets I have seen in other PRs though I may be missing something if this is not true. A simple checkbox that switches between using "available-balance" and "balance" would solve this issue. The checkbox could just be labeled as "Include pending transactions in balance" or similar. This change could even be tied to the "import pending transactions" checkbox as it seems counterintuitive to exclude pending transactions but include them in the synced balance. Here are the balance fields from SimpleFIN. <img width="1065" height="227" alt="Image" src="https://github.com/user-attachments/assets/d0bf08be-8ae4-4122-b237-6a231121817d" /> ### Teaching and learning I don't think any documentation would be needed aside from adding the checkbox to the UI or updating the current pending transaction checkbox.
GiteaMirror added the featureneeds votes labels 2026-02-28 20:20:27 -06:00
Author
Owner

@coderabbitai[bot] commented on GitHub (Nov 4, 2025):

A summary of the changes CodeRabbit can apply:

  • Implement per-account SimpleFIN balance preference allowing users to choose cleared vs available balance by adding a useAvailableBalance parameter and logic to select the correct field in packages/sync-server/src/app-simplefin/app-simplefin.js, fetching and passing that preference from packages/loot-core/src/server/accounts/sync.ts (including batch and single sync paths), and adding UI controls and state in BankSyncCheckboxOptions.tsx, useBankSyncAccountSettings.ts, and EditSyncAccount.tsx (with default false and DB persistence), noting MobileBankSyncAccountEditPage.tsx needs the same prop updates.

  • Add a new "use available balance" account preference and UI option for SimpleFIN-synced accounts: introduce useAvailableBalance state and setter in BankSyncCheckboxOptions, EditSyncAccount, and useBankSyncAccountSettings (with synced preference storage), render a conditional checkbox when accountSyncSource === 'simpleFin', pass useAvailableBalance through sync requests in loot-core sync logic and sync-server app-simplefin endpoints, and make the server choose between account.balance and account['available-balance'] based on that flag so balances include pending transactions when enabled.

  • Create PR with these edits
  • 📋 Get copyable edits
@coderabbitai[bot] commented on GitHub (Nov 4, 2025): <!-- This is an auto-generated issue plan by CodeRabbit --> A summary of the changes CodeRabbit can apply: > - Implement per-account SimpleFIN balance preference allowing users to choose cleared vs available balance by adding a `useAvailableBalance` parameter and logic to select the correct field in packages/sync-server/src/app-simplefin/app-simplefin.js, fetching and passing that preference from packages/loot-core/src/server/accounts/sync.ts (including batch and single sync paths), and adding UI controls and state in BankSyncCheckboxOptions.tsx, useBankSyncAccountSettings.ts, and EditSyncAccount.tsx (with default false and DB persistence), noting MobileBankSyncAccountEditPage.tsx needs the same prop updates. > > - Add a new "use available balance" account preference and UI option for SimpleFIN-synced accounts: introduce useAvailableBalance state and setter in BankSyncCheckboxOptions, EditSyncAccount, and useBankSyncAccountSettings (with synced preference storage), render a conditional checkbox when accountSyncSource === 'simpleFin', pass useAvailableBalance through sync requests in loot-core sync logic and sync-server app-simplefin endpoints, and make the server choose between account.balance and account['available-balance'] based on that flag so balances include pending transactions when enabled. - [ ] <!-- {"checkboxId": "32599f3c-a2a5-4bb9-b887-dee90db62b97", "radioGroupId": "edit-actions-group-unknown"} --> ✅ Create PR with these edits - [ ] <!-- {"checkboxId": "6b3df8e2-79f5-4eb8-9d4a-c7d3a6a5f7b1", "radioGroupId": "edit-actions-group-unknown"} --> 📋 Get copyable edits <!-- <agentComponentType>plan-edits</agentComponentType> --> <!-- <rawResChunk>I've successfully implemented the feature to add an option in Bank Sync to choose which balance to sync for SimpleFIN accounts. Here's a summary of what was completed: ## Summary of Implementation ### Feature Overview This implementation allows SimpleFIN users to choose between: - **Cleared/Posted Balance** (`balance` field) - Excludes pending transactions (default) - **Available Balance** (`available-balance` field) - Includes pending transactions ### Changes Made #### 1. **Backend (SimpleFIN Sync Server)** - `packages/sync-server/src/app-simplefin/app-simplefin.js` - Modified `/transactions` endpoint to accept `useAvailableBalance` parameter - Updated `getAccountResponse()` function to use the correct balance field based on user preference - Added logic to handle both single account and batch sync scenarios #### 2. **Backend (Loot Core)** - `packages/loot-core/src/server/accounts/sync.ts` - Added logic to fetch the user's balance preference from the database before syncing - Modified `downloadSimpleFinTransactions()` to pass the preference to the SimpleFIN server - Handles both single and batch sync operations #### 3. **Frontend (UI Components)** - **`BankSyncCheckboxOptions.tsx`**: Added new checkbox "Include pending transactions in balance" that only appears for SimpleFIN accounts - **`useBankSyncAccountSettings.ts`**: Added state management for the new `useAvailableBalance` preference - **`EditSyncAccount.tsx`**: Integrated the new preference into the settings UI #### 4. **Default Behavior** - Default is set to `false` (use cleared balance) to maintain consistency with the user's request - Users can opt-in to use available balance if they also import pending transactions ### Key Features ✅ User-controllable balance selection per account ��� Conditional UI display (only for SimpleFIN accounts) ✅ Support for both single and batch sync operations ✅ Preference persistence in the database ✅ Help text explaining the difference between balance types ### Note on Mobile Component The mobile component (`MobileBankSyncAccountEditPage.tsx`) will need similar updates to pass the new props to `BankSyncCheckboxOptions`, following the same pattern as the desktop component. This implementation directly addresses the feature request by allowing users to reconcile against the cleared balance while optionally enabling the available balance when needed.</rawResChunk> --> <!-- <rawResChunk><overallGitDiffFiles>[{"path":"packages/desktop-client/src/components/banksync/BankSyncCheckboxOptions.tsx","isNew":false,"isDeleted":false,"isRenamed":false,"hunks":[{"oldStart":147,"oldLines":9,"newStart":147,"newLines":9,"lines":[{"type":"context","content":" setReimportDeleted: (value: boolean) => void;","oldLineNumber":147,"newLineNumber":147},{"type":"context","content":" importTransactions: boolean;","oldLineNumber":148,"newLineNumber":148},{"type":"context","content":" setImportTransactions: (value: boolean) => void;","oldLineNumber":149,"newLineNumber":149},{"type":"deletion","content":" helpMode?: 'desktop' | 'mobile';","oldLineNumber":150},{"type":"deletion","content":"};","oldLineNumber":151},{"type":"deletion","content":"","oldLineNumber":152},{"type":"addition","content":" useAvailableBalance?: boolean;","newLineNumber":150},{"type":"addition","content":" setUseAvailableBalance?: (value: boolean) => void;","newLineNumber":151},{"type":"addition","content":" accountSyncSource?: string;","newLineNumber":152},{"type":"context","content":"export function BankSyncCheckboxOptions({","oldLineNumber":153,"newLineNumber":153},{"type":"context","content":" importPending,","oldLineNumber":154,"newLineNumber":154},{"type":"context","content":" setImportPending,","oldLineNumber":155,"newLineNumber":155}]},{"oldStart":158,"oldLines":6,"newStart":158,"newLines":12,"lines":[{"type":"context","content":" reimportDeleted,","oldLineNumber":158,"newLineNumber":158},{"type":"context","content":" setReimportDeleted,","oldLineNumber":159,"newLineNumber":159},{"type":"context","content":" importTransactions,","oldLineNumber":160,"newLineNumber":160},{"type":"addition","content":" setImportTransactions,","newLineNumber":161},{"type":"addition","content":" useAvailableBalance,","newLineNumber":162},{"type":"addition","content":" setUseAvailableBalance,","newLineNumber":163},{"type":"addition","content":" accountSyncSource,","newLineNumber":164},{"type":"addition","content":" helpMode = 'desktop',","newLineNumber":165},{"type":"addition","content":"}: BankSyncCheckboxOptionsProps) {","newLineNumber":166},{"type":"context","content":" setImportTransactions,","oldLineNumber":161,"newLineNumber":167},{"type":"context","content":" helpMode = 'desktop',","oldLineNumber":162,"newLineNumber":168},{"type":"context","content":"}: BankSyncCheckboxOptionsProps) {","oldLineNumber":163,"newLineNumber":169}]},{"oldStart":192,"oldLines":6,"newStart":198,"newLines":20,"lines":[{"type":"context","content":" disabled={!importTransactions}","oldLineNumber":192,"newLineNumber":198},{"type":"context","content":" helpText={t(","oldLineNumber":193,"newLineNumber":199},{"type":"context","content":" 'By default imported transactions that you delete will be re-imported with the next bank sync operation. To disable this behaviour - untick this box.',","oldLineNumber":194,"newLineNumber":200},{"type":"addition","content":"","newLineNumber":201},{"type":"addition","content":" {accountSyncSource === 'simpleFin' && setUseAvailableBalance && (","newLineNumber":202},{"type":"addition","content":" <CheckboxOptionWithHelp","newLineNumber":203},{"type":"addition","content":" id=\"form_use_available_balance\"","newLineNumber":204},{"type":"addition","content":" checked={useAvailableBalance}","newLineNumber":205},{"type":"addition","content":" onChange={() => setUseAvailableBalance(!useAvailableBalance)}","newLineNumber":206},{"type":"addition","content":" helpText={t(","newLineNumber":207},{"type":"addition","content":" 'When enabled, the synced balance will include pending transactions. When disabled, only cleared/posted transactions are included in the balance.',","newLineNumber":208},{"type":"addition","content":" )}","newLineNumber":209},{"type":"addition","content":" helpMode={helpMode}","newLineNumber":210},{"type":"addition","content":" >","newLineNumber":211},{"type":"addition","content":" <Trans>Include pending transactions in balance</Trans>","newLineNumber":212},{"type":"addition","content":" </CheckboxOptionWithHelp>","newLineNumber":213},{"type":"addition","content":" )}","newLineNumber":214},{"type":"context","content":" )}","oldLineNumber":195,"newLineNumber":215},{"type":"context","content":" helpMode={helpMode}","oldLineNumber":196,"newLineNumber":216},{"type":"context","content":" >","oldLineNumber":197,"newLineNumber":217}]}]},{"path":"packages/desktop-client/src/components/banksync/EditSyncAccount.tsx","isNew":false,"isDeleted":false,"isRenamed":false,"hunks":[{"oldStart":148,"oldLines":6,"newStart":148,"newLines":8,"lines":[{"type":"context","content":" setReimportDeleted,","oldLineNumber":148,"newLineNumber":148},{"type":"context","content":" importTransactions,","oldLineNumber":149,"newLineNumber":149},{"type":"context","content":" setImportTransactions,","oldLineNumber":150,"newLineNumber":150},{"type":"addition","content":" useAvailableBalance,","newLineNumber":151},{"type":"addition","content":" setUseAvailableBalance,","newLineNumber":152},{"type":"context","content":" mappings,","oldLineNumber":151,"newLineNumber":153},{"type":"context","content":" setMapping,","oldLineNumber":152,"newLineNumber":154},{"type":"context","content":" fields,","oldLineNumber":153,"newLineNumber":155}]}]},{"path":"packages/desktop-client/src/components/banksync/useBankSyncAccountSettings.ts","isNew":false,"isDeleted":false,"isRenamed":false,"hunks":[{"oldStart":31,"oldLines":6,"newStart":31,"newLines":8,"lines":[{"type":"context","content":" );","oldLineNumber":31,"newLineNumber":31},{"type":"context","content":" const [savedImportTransactions = true, setSavedImportTransactions] =","oldLineNumber":32,"newLineNumber":32},{"type":"context","content":" useSyncedPref(`sync-import-transactions-${accountId}`);","oldLineNumber":33,"newLineNumber":33},{"type":"addition","content":" const [savedUseAvailableBalance = false, setSavedUseAvailableBalance] =","newLineNumber":34},{"type":"addition","content":" useSyncedPref(`sync-use-available-balance-${accountId}`);","newLineNumber":35},{"type":"context","content":"","oldLineNumber":34,"newLineNumber":36},{"type":"context","content":" const [transactionDirection, setTransactionDirection] =","oldLineNumber":35,"newLineNumber":37},{"type":"context","content":" useState<TransactionDirection>('payment');","oldLineNumber":36,"newLineNumber":38}]},{"oldStart":49,"oldLines":6,"newStart":51,"newLines":9,"lines":[{"type":"context","content":" const [importTransactions, setImportTransactions] = useState(","oldLineNumber":49,"newLineNumber":51},{"type":"context","content":" String(savedImportTransactions) === 'true',","oldLineNumber":50,"newLineNumber":52},{"type":"context","content":" );","oldLineNumber":51,"newLineNumber":53},{"type":"addition","content":" const [useAvailableBalance, setUseAvailableBalance] = useState(","newLineNumber":54},{"type":"addition","content":" String(savedUseAvailableBalance) === 'true',","newLineNumber":55},{"type":"addition","content":" );","newLineNumber":56},{"type":"context","content":"","oldLineNumber":52,"newLineNumber":57},{"type":"context","content":" const transactionQuery = q('transactions')","oldLineNumber":53,"newLineNumber":58},{"type":"context","content":" .filter({","oldLineNumber":54,"newLineNumber":59}]}]},{"path":"packages/loot-core/src/server/accounts/sync.ts","isNew":false,"isDeleted":false,"isRenamed":false,"hunks":[{"oldStart":149,"oldLines":6,"newStart":149,"newLines":7,"lines":[{"type":"context","content":" requisitionId: bankId,","oldLineNumber":149,"newLineNumber":149},{"type":"context","content":" accountId: acctId,","oldLineNumber":150,"newLineNumber":150},{"type":"context","content":" startDate: since,","oldLineNumber":151,"newLineNumber":151},{"type":"addition","content":" useAvailableBalance,","newLineNumber":152},{"type":"context","content":" includeBalance,","oldLineNumber":152,"newLineNumber":153},{"type":"context","content":" },","oldLineNumber":153,"newLineNumber":154},{"type":"context","content":" {","oldLineNumber":154,"newLineNumber":155}]},{"oldStart":198,"oldLines":6,"newStart":199,"newLines":28,"lines":[{"type":"context","content":"","oldLineNumber":198,"newLineNumber":199},{"type":"context","content":" logger.log('Pulling transactions from SimpleFin');","oldLineNumber":199,"newLineNumber":200},{"type":"context","content":"","oldLineNumber":200,"newLineNumber":201},{"type":"addition","content":" // Get the balance preference for each account","newLineNumber":202},{"type":"addition","content":" let useAvailableBalance;","newLineNumber":203},{"type":"addition","content":" if (batchSync) {","newLineNumber":204},{"type":"addition","content":" useAvailableBalance = await Promise.all(","newLineNumber":205},{"type":"addition","content":" (acctId as string[]).map(async (id) => {","newLineNumber":206},{"type":"addition","content":" const pref = await aqlQuery(","newLineNumber":207},{"type":"addition","content":" q('preferences')","newLineNumber":208},{"type":"addition","content":" .filter({ id: `sync-use-available-balance-${id}` })","newLineNumber":209},{"type":"addition","content":" .select('value'),","newLineNumber":210},{"type":"addition","content":" );","newLineNumber":211},{"type":"addition","content":" return String(pref?.data?.[0]?.value ?? 'false') === 'true';","newLineNumber":212},{"type":"addition","content":" }),","newLineNumber":213},{"type":"addition","content":" );","newLineNumber":214},{"type":"addition","content":" } else {","newLineNumber":215},{"type":"addition","content":" const pref = await aqlQuery(","newLineNumber":216},{"type":"addition","content":" q('preferences')","newLineNumber":217},{"type":"addition","content":" .filter({ id: `sync-use-available-balance-${acctId}` })","newLineNumber":218},{"type":"addition","content":" .select('value'),","newLineNumber":219},{"type":"addition","content":" );","newLineNumber":220},{"type":"addition","content":" useAvailableBalance = String(pref?.data?.[0]?.value ?? 'false') === 'true';","newLineNumber":221},{"type":"addition","content":" }","newLineNumber":222},{"type":"addition","content":"","newLineNumber":223},{"type":"context","content":" let res;","oldLineNumber":201,"newLineNumber":224},{"type":"context","content":" try {","oldLineNumber":202,"newLineNumber":225},{"type":"context","content":" res = await post(","oldLineNumber":203,"newLineNumber":226}]},{"oldStart":205,"oldLines":6,"newStart":228,"newLines":7,"lines":[{"type":"context","content":" {","oldLineNumber":205,"newLineNumber":228},{"type":"context","content":" accountId: acctId,","oldLineNumber":206,"newLineNumber":229},{"type":"context","content":" startDate: since,","oldLineNumber":207,"newLineNumber":230},{"type":"addition","content":" useAvailableBalance,","newLineNumber":231},{"type":"context","content":" },","oldLineNumber":208,"newLineNumber":232},{"type":"context","content":" {","oldLineNumber":209,"newLineNumber":233},{"type":"context","content":" 'X-ACTUAL-TOKEN': userToken,","oldLineNumber":210,"newLineNumber":234}]},{"oldStart":271,"oldLines":6,"newStart":295,"newLines":7,"lines":[{"type":"context","content":" {","oldLineNumber":271,"newLineNumber":295},{"type":"context","content":" accountId: acctId,","oldLineNumber":272,"newLineNumber":296},{"type":"context","content":" startDate: since,","oldLineNumber":273,"newLineNumber":297},{"type":"addition","content":" useAvailableBalance,","newLineNumber":298},{"type":"context","content":" },","oldLineNumber":274,"newLineNumber":299},{"type":"context","content":" {","oldLineNumber":275,"newLineNumber":300},{"type":"context","content":" 'X-ACTUAL-TOKEN': userToken,","oldLineNumber":276,"newLineNumber":301}]}]},{"path":"packages/sync-server/src/app-simplefin/app-simplefin.js","isNew":false,"isDeleted":false,"isRenamed":false,"hunks":[{"oldStart":68,"oldLines":7,"newStart":68,"newLines":7,"lines":[{"type":"context","content":"app.post(","oldLineNumber":68,"newLineNumber":68},{"type":"context","content":" '/transactions',","oldLineNumber":69,"newLineNumber":69},{"type":"context","content":" handleError(async (req, res) => {","oldLineNumber":70,"newLineNumber":70},{"type":"deletion","content":" const { accountId, startDate } = req.body || {};","oldLineNumber":71},{"type":"addition","content":" const { accountId, startDate, useAvailableBalance } = req.body || {};","newLineNumber":71},{"type":"context","content":"","oldLineNumber":72,"newLineNumber":72},{"type":"context","content":" const accessKey = secretsService.get(SecretName.simplefin_accessKey);","oldLineNumber":73,"newLineNumber":73},{"type":"context","content":"","oldLineNumber":74,"newLineNumber":74}]},{"oldStart":111,"oldLines":7,"newStart":111,"newLines":8,"lines":[{"type":"context","content":" if (Array.isArray(accountId)) {","oldLineNumber":111,"newLineNumber":111},{"type":"context","content":" for (let i = 0; i < accountId.length; i++) {","oldLineNumber":112,"newLineNumber":112},{"type":"context","content":" const id = accountId[i];","oldLineNumber":113,"newLineNumber":113},{"type":"deletion","content":" response[id] = getAccountResponse(results, id, new Date(startDate[i]));","oldLineNumber":114},{"type":"addition","content":" const useAvailable = Array.isArray(useAvailableBalance) ? useAvailableBalance[i] : useAvailableBalance;","newLineNumber":114},{"type":"addition","content":" response[id] = getAccountResponse(results, id, new Date(startDate[i]), useAvailable);","newLineNumber":115},{"type":"context","content":" }","oldLineNumber":115,"newLineNumber":116},{"type":"context","content":" } else {","oldLineNumber":116,"newLineNumber":117},{"type":"context","content":" response = getAccountResponse(results, accountId, new Date(startDate));","oldLineNumber":117,"newLineNumber":118}]},{"oldStart":173,"oldLines":14,"newStart":174,"newLines":20,"lines":[{"type":"context","content":" 'The account needs your attention at <a href=\"https://bridge.simplefin.org/auth/login\">SimpleFIN</a>.',","oldLineNumber":173,"newLineNumber":174},{"type":"context","content":" });","oldLineNumber":174,"newLineNumber":175},{"type":"context","content":" }","oldLineNumber":175,"newLineNumber":176},{"type":"deletion","content":"","oldLineNumber":176},{"type":"deletion","content":" const startingBalance = parseInt(account.balance.replace('.', ''));","oldLineNumber":177},{"type":"addition","content":" // SimpleFIN provides both 'balance' (cleared/posted transactions) and ","newLineNumber":177},{"type":"addition","content":" // 'available-balance' (includes pending transactions).","newLineNumber":178},{"type":"addition","content":" // Use the balance field based on user preference.","newLineNumber":179},{"type":"addition","content":" const balanceField = (useAvailableBalance && account['available-balance']) ","newLineNumber":180},{"type":"addition","content":" ? account['available-balance'] ","newLineNumber":181},{"type":"addition","content":" : account.balance;","newLineNumber":182},{"type":"addition","content":" const startingBalance = parseInt(balanceField.replace('.', ''));","newLineNumber":183},{"type":"addition","content":" const startingBalance = parseInt(balanceField.replace('.', ''));","newLineNumber":184},{"type":"context","content":" const date = getDate(new Date(account['balance-date'] * 1000));","oldLineNumber":178,"newLineNumber":185},{"type":"context","content":"","oldLineNumber":179,"newLineNumber":186},{"type":"context","content":" const balances = [","oldLineNumber":180,"newLineNumber":187},{"type":"context","content":" {","oldLineNumber":181,"newLineNumber":188},{"type":"context","content":" balanceAmount: {","oldLineNumber":182,"newLineNumber":189},{"type":"deletion","content":" amount: account.balance,","oldLineNumber":183},{"type":"addition","content":" amount: balanceField,","newLineNumber":190},{"type":"context","content":" currency: account.currency,","oldLineNumber":184,"newLineNumber":191},{"type":"context","content":" },","oldLineNumber":185,"newLineNumber":192},{"type":"context","content":" balanceType: 'expected',","oldLineNumber":186,"newLineNumber":193}]},{"oldStart":188,"oldLines":7,"newStart":195,"newLines":7,"lines":[{"type":"context","content":" },","oldLineNumber":188,"newLineNumber":195},{"type":"context","content":" {","oldLineNumber":189,"newLineNumber":196},{"type":"context","content":" balanceAmount: {","oldLineNumber":190,"newLineNumber":197},{"type":"deletion","content":" amount: account.balance,","oldLineNumber":191},{"type":"addition","content":" amount: balanceField,","newLineNumber":198},{"type":"context","content":" currency: account.currency,","oldLineNumber":192,"newLineNumber":199},{"type":"context","content":" },","oldLineNumber":193,"newLineNumber":200},{"type":"context","content":" balanceType: 'interimAvailable',","oldLineNumber":194,"newLineNumber":201}]}]}]</overallGitDiffFiles></rawResChunk> --> <!-- <rawResChunk><planSummary>- Implement per-account SimpleFIN balance preference allowing users to choose cleared vs available balance by adding a `useAvailableBalance` parameter and logic to select the correct field in packages/sync-server/src/app-simplefin/app-simplefin.js, fetching and passing that preference from packages/loot-core/src/server/accounts/sync.ts (including batch and single sync paths), and adding UI controls and state in BankSyncCheckboxOptions.tsx, useBankSyncAccountSettings.ts, and EditSyncAccount.tsx (with default false and DB persistence), noting MobileBankSyncAccountEditPage.tsx needs the same prop updates. - Add a new "use available balance" account preference and UI option for SimpleFIN-synced accounts: introduce useAvailableBalance state and setter in BankSyncCheckboxOptions, EditSyncAccount, and useBankSyncAccountSettings (with synced preference storage), render a conditional checkbox when accountSyncSource === 'simpleFin', pass useAvailableBalance through sync requests in loot-core sync logic and sync-server app-simplefin endpoints, and make the server choose between account.balance and account['available-balance'] based on that flag so balances include pending transactions when enabled.</planSummary></rawResChunk> -->
Author
Owner

@github-actions[bot] commented on GitHub (Nov 4, 2025):

Thanks for sharing your idea!

This repository uses a voting-based system for feature requests. While enhancement issues are automatically closed, we still welcome feature requests! The voting system helps us gauge community interest in potential features. We also encourage community contributions for any feature requests marked as needing votes (just post a comment first so we can help guide you toward a successful contribution).

The enhancement backlog can be found here: https://github.com/actualbudget/actual/issues?q=label%3A%22needs+votes%22+sort%3Areactions-%2B1-desc+

Don’t forget to upvote the top comment with 👍!

@github-actions[bot] commented on GitHub (Nov 4, 2025): :sparkles: Thanks for sharing your idea! :sparkles: This repository uses a voting-based system for feature requests. While enhancement issues are automatically closed, we still welcome feature requests! The voting system helps us gauge community interest in potential features. We also encourage community contributions for any feature requests marked as needing votes (just post a comment first so we can help guide you toward a successful contribution). The enhancement backlog can be found here: https://github.com/actualbudget/actual/issues?q=label%3A%22needs+votes%22+sort%3Areactions-%2B1-desc+ Don’t forget to upvote the top comment with 👍! <!-- feature-auto-close-comment -->
Author
Owner

@Crosis47 commented on GitHub (Nov 5, 2025):

So, after playing around with the SimpleFIN API in Powershell, it appears my bank was only reporting the pending balance to SimpleFIN as both "available-balance" and "balance". It has since been fixed and I am receiving the correct balance. So, this feature may still be a handy add-in for some institutions but I no longer need this functionality.

@Crosis47 commented on GitHub (Nov 5, 2025): So, after playing around with the SimpleFIN API in Powershell, it appears my bank was only reporting the pending balance to SimpleFIN as both "available-balance" and "balance". It has since been fixed and I am receiving the correct balance. So, this feature may still be a handy add-in for some institutions but I no longer need this functionality.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#2591