{"record":{"id":"de753c4048a0aa91","repo":"actualbudget/actual","slug":"unrecognized-bank-sync-provider-acctrow-account","errorCode":null,"errorMessage":"Unrecognized bank-sync provider: ${acctRow.account_sync_source}","messagePattern":"Unrecognized bank-sync provider: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/loot-core/src/server/accounts/sync.ts","lineNumber":1243,"sourceCode":"      acctId,\n      syncStartDate,\n      fileId,\n    );\n  } else if (acctRow.account_sync_source === 'akahu') {\n    download = await downloadAkahuTransactions(acctId, syncStartDate);\n  } else if (acctRow.account_sync_source === 'goCardless') {\n    download = await downloadGoCardlessTransactions(\n      userId,\n      userKey,\n      acctId,\n      bankId,\n      syncStartDate,\n      newAccount,\n    );\n  } else if (acctRow.account_sync_source === 'enableBanking') {\n    download = await downloadEnableBankingTransactions(acctId, syncStartDate);\n  } else {\n    throw new Error(\n      `Unrecognized bank-sync provider: ${acctRow.account_sync_source}`,\n    );\n  }\n\n  return processBankSyncDownload(\n    download,\n    id,\n    acctRow,\n    newAccount,\n    customStartingBalance,\n    customStartingDate,\n  );\n}\n\nexport async function simpleFinBatchSync(\n  accounts: Array<Pick<AccountEntity, 'id' | 'account_id'>>,\n) {\n  const startDates = await Promise.all(","sourceCodeStart":1225,"sourceCodeEnd":1261,"githubUrl":"https://github.com/actualbudget/actual/blob/d4334cb6e6123f4d3bcea1ad6166608884c7e658/packages/loot-core/src/server/accounts/sync.ts#L1225-L1261","documentation":"Actual's bank sync dispatches on the account's account_sync_source column, supporting 'goCardless', 'simpleFin', and 'enableBanking'. If an account row carries any other value (or a stale/legacy source string from an older version), downloadFrom4 different providers is impossible, so sync.ts throws this Error naming the unrecognized provider.","triggerScenarios":"BankSync/Schedule/normal sync runs against an account whose acctRow.account_sync_source is set to a value outside the known set — e.g. data migrated from an older Actual version, a manually edited SQLite DB, or a third-party tool writing an unsupported source string.","commonSituations":"Upgrading from a version that used a different provider identifier; manually editing the accounts table; a forked/patched build adding a custom provider that the running core doesn't know; corrupted DB rows after a failed migration; copying a budget between deployments with different provider plugins.","solutions":["Query the accounts table (SELECT id,name,account_sync_source FROM accounts) and fix the unsupported value to one of goCardless/simpleFin/enableBanking, or NULL it to unlink bank sync.","If the account should no longer auto-sync, clear its bank-sync configuration in the UI (Edit account > remove bank-sync) so account_sync_source is reset.","Update Actual to a version that supports the provider string stored on the account (or migrate the legacy identifier to the current one).","Restore the accounts row from a backup taken before the value was corrupted."],"exampleFix":"// before (sqlite)\nSELECT id, account_sync_source FROM accounts; -- row shows 'plaid'\n// after\nUPDATE accounts SET account_sync_source = NULL WHERE id = '...'; -- unlink and reconfigure bank sync in the UI","handlingStrategy":"validation","validationCode":"const VALID_SOURCES = ['goCardless', 'simpleFin', 'enableBanking'];\nconst acct = await db.get('SELECT account_sync_source FROM accounts WHERE id = ?', [accountId]);\nif (acct.account_sync_source != null && !VALID_SOURCES.includes(acct.account_sync_source)) {\n  throw new Error(`account ${acct.id} has invalid bank-sync source: ${acct.account_sync_source}`);\n}","typeGuard":"function hasKnownSyncSource(acct) {\n  return acct.account_sync_source == null ||\n    ['goCardless', 'simpleFin', 'enableBanking'].includes(acct.account_sync_source);\n}","tryCatchPattern":"try {\n  await bankSync.syncAccount(accountId);\n} catch (e) {\n  if (e.message.startsWith('Unrecognized bank-sync provider')) {\n    await unlinkBankSync(accountId); // reset account_sync_source and prompt user to reconfigure\n  } else throw e;\n}","preventionTips":["Never hand-edit the accounts table; change bank-sync config through the UI or API.","After migrations/upgrades, audit account_sync_source values against the currently supported set.","When removing a provider integration, explicitly null out account_sync_source on affected accounts."],"tags":["bank-sync","configuration","unsupported-provider","data-integrity"],"backgroundTag":"unsupported-provider","analyzedSha":"d4334cb6e6123f4d3bcea1ad6166608884c7e658","analyzedAt":"2026-08-29T01:02:11.213Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}