diff --git a/src/models/instance.ts b/src/models/instance.ts
index d3906df427..7a94a0a041 100644
--- a/src/models/instance.ts
+++ b/src/models/instance.ts
@@ -32,4 +32,24 @@ export interface IInstance {
 	 * このインスタンスから受け取った投稿数
 	 */
 	notesCount: number;
+
+	/**
+	 * このインスタンスのユーザーからフォローされている、自インスタンスのユーザーの数
+	 */
+	followingCount: number;
+
+	/**
+	 * このインスタンスのユーザーをフォローしている、自インスタンスのユーザーの数
+	 */
+	followersCount: number;
+
+	/**
+	 * 最近の通信日時
+	 */
+	latestRequestSentAt?: Date;
+
+	/**
+	 * 最近の通信のHTTPステータス
+	 */
+	latestStatus?: number;
 }
diff --git a/src/queue/processors/http/deliver.ts b/src/queue/processors/http/deliver.ts
index d1dad55cd7..cb92a4d760 100644
--- a/src/queue/processors/http/deliver.ts
+++ b/src/queue/processors/http/deliver.ts
@@ -2,19 +2,43 @@ import * as bq from 'bee-queue';
 
 import request from '../../../remote/activitypub/request';
 import { queueLogger } from '../../logger';
+import { registerOrFetchInstanceDoc } from '../../../services/register-or-fetch-instance-doc';
+import Instance from '../../../models/instance';
 
 export default async (job: bq.Job, done: any): Promise<void> => {
 	try {
 		await request(job.data.user, job.data.to, job.data.content);
+
+		// Update stats
+		registerOrFetchInstanceDoc(job.data.user.host).then(i => {
+			Instance.update({ _id: i._id }, {
+				$set: {
+					latestRequestSentAt: new Date(),
+					latestStatus: 200
+				}
+			});
+		});
+
 		done();
 	} catch (res) {
+		// Update stats
+		registerOrFetchInstanceDoc(job.data.user.host).then(i => {
+			Instance.update({ _id: i._id }, {
+				$set: {
+					latestRequestSentAt: new Date(),
+					latestStatus: res != null && res.hasOwnProperty('statusCode') ? res.statusCode : null
+				}
+			});
+		});
+
 		if (res != null && res.hasOwnProperty('statusCode')) {
+			queueLogger.warn(`deliver failed: ${res.statusCode} ${res.statusMessage} to=${job.data.to}`);
+
 			if (res.statusCode >= 400 && res.statusCode < 500) {
 				// HTTPステータスコード4xxはクライアントエラーであり、それはつまり
 				// 何回再送しても成功することはないということなのでエラーにはしないでおく
 				done();
 			} else {
-				queueLogger.warn(`deliver failed: ${res.statusCode} ${res.statusMessage} to=${job.data.to}`);
 				done(res.statusMessage);
 			}
 		} else {
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index a4173c5e82..2902b4b7f9 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -12,7 +12,7 @@ import { fromHtml } from '../../../mfm/fromHtml';
 import usersChart from '../../../chart/users';
 import { URL } from 'url';
 import { resolveNote, extractEmojis } from './note';
-import registerInstance from '../../../services/register-instance';
+import { registerOrFetchInstanceDoc } from '../../../services/register-or-fetch-instance-doc';
 import Instance from '../../../models/instance';
 import getDriveFileUrl from '../../../misc/get-drive-file-url';
 import { IEmoji } from '../../../models/emoji';
@@ -188,7 +188,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
 	}
 
 	// Register host
-	registerInstance(host).then(i => {
+	registerOrFetchInstanceDoc(host).then(i => {
 		Instance.update({ _id: i._id }, {
 			$inc: {
 				usersCount: 1
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
index 936655d7d1..4df271a977 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -10,6 +10,8 @@ import renderReject from '../../remote/activitypub/renderer/reject';
 import { deliver } from '../../queue';
 import createFollowRequest from './requests/create';
 import perUserFollowingChart from '../../chart/per-user-following';
+import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
+import Instance from '../../models/instance';
 
 export default async function(follower: IUser, followee: IUser, requestId?: string) {
 	// check blocking
@@ -97,6 +99,32 @@ export default async function(follower: IUser, followee: IUser, requestId?: stri
 	});
 	//#endregion
 
+	//#region Update instance stats
+	if (isRemoteUser(follower) && isLocalUser(followee)) {
+		registerOrFetchInstanceDoc(follower.host).then(i => {
+			Instance.update({ _id: i._id }, {
+				$inc: {
+					followingCount: 1
+				}
+			});
+
+			// TODO
+			//perInstanceChart.newFollowing();
+		});
+	} else if (isLocalUser(follower) && isRemoteUser(followee)) {
+		registerOrFetchInstanceDoc(followee.host).then(i => {
+			Instance.update({ _id: i._id }, {
+				$inc: {
+					followersCount: 1
+				}
+			});
+
+			// TODO
+			//perInstanceChart.newFollower();
+		});
+	}
+	//#endregion
+
 	perUserFollowingChart.update(follower, followee, true);
 
 	// Publish follow event
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 6afdcbbfbd..7b5975bace 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -27,7 +27,7 @@ import activeUsersChart from '../../chart/active-users';
 
 import { erase, concat } from '../../prelude/array';
 import insertNoteUnread from './unread';
-import registerInstance from '../register-instance';
+import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
 import Instance from '../../models/instance';
 import extractMentions from '../../misc/extract-mentions';
 import extractEmojis from '../../misc/extract-emojis';
@@ -222,7 +222,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
 
 	// Register host
 	if (isRemoteUser(user)) {
-		registerInstance(user.host).then(i => {
+		registerOrFetchInstanceDoc(user.host).then(i => {
 			Instance.update({ _id: i._id }, {
 				$inc: {
 					notesCount: 1
diff --git a/src/services/register-instance.ts b/src/services/register-or-fetch-instance-doc.ts
similarity index 82%
rename from src/services/register-instance.ts
rename to src/services/register-or-fetch-instance-doc.ts
index 6576a9ed06..3b338b48af 100644
--- a/src/services/register-instance.ts
+++ b/src/services/register-or-fetch-instance-doc.ts
@@ -1,7 +1,7 @@
 import Instance, { IInstance } from '../models/instance';
 import federationChart from '../chart/federation';
 
-export default async function(host: string): Promise<IInstance> {
+export async function registerOrFetchInstanceDoc(host: string): Promise<IInstance> {
 	if (host == null) return null;
 
 	const index = await Instance.findOne({ host });