diff --git a/src/client/app/admin/views/queue.vue b/src/client/app/admin/views/queue.vue
index fa9e3df78034302f9939ea0b8c7ee0cb67d6ac02..ae3aa0db5794637f5cca889563cf981cb22bf28d 100644
--- a/src/client/app/admin/views/queue.vue
+++ b/src/client/app/admin/views/queue.vue
@@ -2,6 +2,34 @@
 <div>
 	<ui-card>
 		<template #title>{{ $t('operation') }}</template>
+		<section>
+			<header>Deliver</header>
+			<ui-horizon-group inputs v-if="stats">
+				<ui-input :value="stats.deliver.waiting | number" type="text" readonly>
+					<span>Waiting</span>
+				</ui-input>
+				<ui-input :value="stats.deliver.active | number" type="text" readonly>
+					<span>Active</span>
+				</ui-input>
+				<ui-input :value="stats.deliver.delayed | number" type="text" readonly>
+					<span>Delayed</span>
+				</ui-input>
+			</ui-horizon-group>
+		</section>
+		<section>
+			<header>Inbox</header>
+			<ui-horizon-group inputs v-if="stats">
+				<ui-input :value="stats.inbox.waiting | number" type="text" readonly>
+					<span>Waiting</span>
+				</ui-input>
+				<ui-input :value="stats.inbox.active | number" type="text" readonly>
+					<span>Active</span>
+				</ui-input>
+				<ui-input :value="stats.inbox.delayed | number" type="text" readonly>
+					<span>Delayed</span>
+				</ui-input>
+			</ui-horizon-group>
+		</section>
 		<section>
 			<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button>
 		</section>
@@ -18,9 +46,16 @@ export default Vue.extend({
 
 	data() {
 		return {
+			stats: null
 		};
 	},
 
+	created() {
+		this.$root.api('admin/queue/stats').then(stats => {
+			this.stats = stats;
+		});
+	},
+
 	methods: {
 		async removeAllJobs() {
 			const process = async () => {
diff --git a/src/queue/index.ts b/src/queue/index.ts
index d5294f8367bd67c77d8804cf75f74c5354844f7d..93b103f5dc2747410c29eaf4e25dc649ad79e087 100644
--- a/src/queue/index.ts
+++ b/src/queue/index.ts
@@ -21,9 +21,9 @@ function initializeQueue(name: string) {
 	} : null);
 }
 
-const deliverQueue = initializeQueue('deliver');
-const inboxQueue = initializeQueue('inbox');
-const dbQueue = initializeQueue('db');
+export const deliverQueue = initializeQueue('deliver');
+export const inboxQueue = initializeQueue('inbox');
+export const dbQueue = initializeQueue('db');
 
 export function deliver(user: ILocalUser, content: any, to: any) {
 	if (content == null) return null;
diff --git a/src/server/api/endpoints/admin/queue/stats.ts b/src/server/api/endpoints/admin/queue/stats.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a90daa3989e30351e61f6538accfc11706ba4980
--- /dev/null
+++ b/src/server/api/endpoints/admin/queue/stats.ts
@@ -0,0 +1,21 @@
+import define from '../../../define';
+import { deliverQueue } from '../../../../../queue';
+
+export const meta = {
+	tags: ['admin'],
+
+	requireCredential: true,
+	requireModerator: true,
+
+	params: {}
+};
+
+export default define(meta, async (ps) => {
+	const deliverJobCounts = await deliverQueue.getJobCounts();
+	const inboxJobCounts = await deliverQueue.getJobCounts();
+
+	return {
+		deliver: deliverJobCounts,
+		inbox: inboxJobCounts
+	};
+});