RocketChat/Rocket.Chat · error · Error

Errors occurred while deleting an app user: ${err}

Error message

Errors occurred while deleting an app user: ${err}

What it means

Thrown by the users bridge remove method when the underlying deleteUser call rejects. The bridge wraps deleteUser in try/catch and re-throws a wrapped error that interpolates the original via `${err}`, losing the original error type but preserving its message.

Source

Thrown at apps/meteor/app/apps/server/bridges/users.ts:124

		}

		void notifyOnUserChangeById({ clientAction: 'inserted', id: user._id });

		return user._id;
	}

	protected async remove(user: IUser & { id: string }, appId: string): Promise<boolean> {
		this.orch.debugLog(`The App's user is being removed: ${appId}`);

		// It's actually not a problem if there is no App user to delete - just means we don't need to do anything more.
		if (!user) {
			return true;
		}

		try {
			await deleteUser(user.id);
		} catch (err) {
			throw new Error(`Errors occurred while deleting an app user: ${err}`);
		}

		return true;
	}

	protected async update(user: IUser & { id: string }, fields: Partial<IUser>, appId: string): Promise<boolean> {
		this.orch.debugLog(`The App ${appId} is updating a user`);

		if (!user) {
			throw new Error('User not provided');
		}

		const { status, statusText, ...updateFields } = fields;

		if (status) {
			await Presence.setStatus(user.id, status as UserStatus, statusText);
		} else if (typeof statusText === 'string') {
			await setStatusText(

View on GitHub (pinned to f9d3ec372b)

Solutions

  1. Inspect the interpolated inner error message to find the real cause (it is stringified after the colon).
  2. Reassign ownership of rooms owned by the bot user before removal.
  3. Retry after resolving the dependency; if persistent, remove the user manually via admin tooling.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  await users.remove(user, appId);
} catch (err) {
  if (err instanceof Error && err.message.startsWith('Errors occurred while deleting an app user')) {
    // inspect inner cause; resolve room ownership / dependencies, then retry
  } else {
    throw err;
  }
}

Prevention

When it happens

Trigger: App uninstall/remove flow deletes its bot user and deleteUser fails — e.g. the user is the last owner of a room, has active livechat sessions, is referenced by other collections, or a database error occurs.

Common situations: Bot user is owner of channels that would be left ownerless; user has open livechat rooms; concurrent modification or DB connectivity issue; cascading delete blocked by a server-side guard.

Related errors


AI-assisted analysis of RocketChat/Rocket.Chat@f9d3ec372b (2026-08-12). Data as JSON: /api/errors/b474eefa78c468b0. Report an issue: GitHub.