diff --git a/apps/dashboard/src/features/accounts/accounts-page.tsx b/apps/dashboard/src/features/accounts/accounts-page.tsx
index 3e4e66f..473ffe0 100644
--- a/apps/dashboard/src/features/accounts/accounts-page.tsx
+++ b/apps/dashboard/src/features/accounts/accounts-page.tsx
@@ -99,6 +99,7 @@ function AccountRow({ account }: { account: RedditAccountSummary }) {
const removeMutation = useRemoveRedditAccountMutation();
const [confirmRemove, setConfirmRemove] = useState(false);
const isRemoved = account.status === 'removed';
+ const isSuspended = account.status === 'suspended';
useEffect(() => {
if (!confirmRemove) return;
@@ -106,7 +107,10 @@ function AccountRow({ account }: { account: RedditAccountSummary }) {
return () => globalThis.clearTimeout(timer);
}, [confirmRemove]);
- const rowClass = isRemoved ? 'account-row is-removed' : account.isRunning ? 'account-row is-active' : 'account-row';
+ const rowClass = isRemoved
+ ? 'account-row is-removed'
+ : isSuspended ? 'account-row is-suspended'
+ : account.isRunning ? 'account-row is-active' : 'account-row';
return (
@@ -114,13 +118,15 @@ function AccountRow({ account }: { account: RedditAccountSummary }) {
{isRemoved
? 'Removed — its conversations and media are kept, read-only'
+ : isSuspended
+ ? 'Suspended by Reddit — all bot work is paused'
: account.isRunning ? 'Running independently' : 'Waiting for a refreshed session'}
- {isRemoved ? null : establishmentPill(account.establishment)}
+ {isRemoved || isSuspended ? null : establishmentPill(account.establishment)}
- {isRemoved ? 'Removed' : account.isRunning ? 'Running' : 'Paused'}
+ {isRemoved ? 'Removed' : isSuspended ? 'Suspended' : account.isRunning ? 'Running' : 'Paused'}
@@ -162,6 +168,12 @@ function AccountRow({ account }: { account: RedditAccountSummary }) {
{!isRemoved && account.establishment && account.establishment.state !== 'unknown' ? (
) : null}
+ {isSuspended ? (
+
+ Account suspended
+ Reddit or Matrix confirmed this account is suspended. It cannot send, scan, or sync until you review it and import a newly verified session.
+
+ ) : null}
);
}
@@ -213,7 +225,8 @@ export function AccountsPage() {
const accounts = accountsQuery.data ?? [];
// Removed accounts are not paused work — nothing about them needs attention.
const liveAccounts = accounts.filter((account) => account.status !== 'removed');
- const pausedCount = liveAccounts.filter((account) => !account.isRunning).length;
+ const suspendedAccounts = liveAccounts.filter((account) => account.status === 'suspended');
+ const pausedCount = liveAccounts.filter((account) => !account.isRunning && account.status !== 'suspended').length;
const heldAccounts = liveAccounts.filter((account) => account.establishment?.sendingHeld);
return (
@@ -240,6 +253,17 @@ export function AccountsPage() {
) : null}
+ {suspendedAccounts.length > 0 ? (
+