diff --git a/packages/loot-core/src/client/actions/account.ts b/packages/loot-core/src/client/actions/account.ts
index f2c80730d2678a1eae0ec678ca84f073f86da2b3..df0a9c378506a3492c9daef46e8c8940f378753b 100644
--- a/packages/loot-core/src/client/actions/account.ts
+++ b/packages/loot-core/src/client/actions/account.ts
@@ -95,6 +95,11 @@ export function syncAccounts(id?: string) {
           .queries.accounts.filter(
             ({ bank, closed, tombstone }) => !!bank && !closed && !tombstone,
           )
+          .sort((a, b) =>
+            a.offbudget === b.offbudget
+              ? a.sort_order - b.sort_order
+              : a.offbudget - b.offbudget,
+          )
           .map(({ id }) => id);
 
     dispatch(setAccountsSyncing(accountIdsToSync));
diff --git a/packages/loot-core/src/server/main.ts b/packages/loot-core/src/server/main.ts
index 634293646e7007858ab7173ab4ca1ea8243a00a5..f6c98e88b4ff5ab2a4700f2be9a7bf1aae66b401 100644
--- a/packages/loot-core/src/server/main.ts
+++ b/packages/loot-core/src/server/main.ts
@@ -1062,7 +1062,8 @@ handlers['accounts-bank-sync'] = async function ({ id }) {
   const accounts = await db.runQuery(
     `SELECT a.*, b.bank_id as bankId FROM accounts a
          LEFT JOIN banks b ON a.bank = b.id
-         WHERE a.tombstone = 0 AND a.closed = 0 ${id ? 'AND a.id = ?' : ''}`,
+         WHERE a.tombstone = 0 AND a.closed = 0 ${id ? 'AND a.id = ?' : ''}
+         ORDER BY a.offbudget, a.sort_order`,
     id ? [id] : [],
     true,
   );
diff --git a/upcoming-release-notes/3029.md b/upcoming-release-notes/3029.md
new file mode 100644
index 0000000000000000000000000000000000000000..0ad61be82db66393a345be543cd78ae54cb9a0c0
--- /dev/null
+++ b/upcoming-release-notes/3029.md
@@ -0,0 +1,6 @@
+---
+category: Enhancements
+authors: [psybers]
+---
+
+Perform bank sync in same order as accounts shown in sidebar.