actualbudget/actual · error

ACCOUNT_MISSING

ACCOUNT_MISSING

Error message

ACCOUNT_MISSING

What it means

Returned by getFailedSyncError for bank_sync_status 'account-missing'. The aggregator can no longer find the linked account in the list returned by the bank — typically because the account was closed, renamed, or the provider's account enumeration changed.

Solutions

  1. Confirm in online banking whether the account still exists and its id changed
  2. If replaced, re-link the account to its new counterpart via the Re-link flow
  3. If closed, unlink the bank sync from the account and keep it as a manual account
  4. Check the provider dashboard for enumeration changes or migration notices

Example fix

// before
await syncAccount(account.id); // ACCOUNT_MISSING every time
// after
if (getFailedSyncError(account).code === 'ACCOUNT_MISSING') {
  await relinkAccount(account.id); // bind to the new remote account id
}
Defensive patterns

Strategy: validation

Validate before calling

function isAccountMissing(account) {
  return getFailedSyncError(account).code === 'ACCOUNT_MISSING';
}

Type guard

function isAccountMissingError(v) {
  return !!v && typeof v === 'object' && v.code === 'ACCOUNT_MISSING';
}

Prevention

When it happens

Trigger: Calling getFailedSyncError on an account with bank_sync_status === 'account-missing', usually right after a bank refresh where the remote account id no longer exists in the provider response.

Common situations: User closed the account at the bank; bank reissued the account with a new id; aggregator stopped returning the account (hidden or restricted); institution migrations temporarily remove accounts from the API.

Related errors


AI-assisted analysis of actualbudget/actual@d4334cb6e6 (2026-08-29). Data as JSON: /api/errors/4236c1f2e58b7a6a. Report an issue: GitHub.

Appendix: source

Thrown at packages/desktop-client/src/accounts/syncStatus.ts:34

  account: Pick<AccountEntity, 'bank_sync_status' | 'account_sync_source'>,
): { type: string; code: string } {
  switch (account.bank_sync_status) {
    case 'reauth-required':
      if (account.account_sync_source === 'simpleFin') {
        return { type: 'INVALID_ACCESS_TOKEN', code: 'INVALID_ACCESS_TOKEN' };
      }
      return { type: 'ITEM_ERROR', code: 'ITEM_LOGIN_REQUIRED' };
    case 'attention-required':
      return {
        type: 'ACCOUNT_NEEDS_ATTENTION',
        code: 'ACCOUNT_NEEDS_ATTENTION',
      };
    case 'rate-limit-exceeded':
      return { type: 'RATE_LIMIT_EXCEEDED', code: 'RATE_LIMIT_EXCEEDED' };
    case 'timed-out':
      return { type: 'TIMED_OUT', code: 'TIMED_OUT' };
    case 'account-missing':
      return { type: 'ACCOUNT_MISSING', code: 'ACCOUNT_MISSING' };
    default:
      return { type: 'SYNC_ERROR', code: 'SYNC_ERROR' };
  }
}

View on GitHub (pinned to d4334cb6e6)