diff --git a/locales/index.d.ts b/locales/index.d.ts
index 80551c091094..29e4155b6028 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -4916,6 +4916,14 @@ export interface Locale extends ILocale {
      * QRコード
      */
     "qrcode": string;
+    /**
+     * このQRコードをスキャンすると、新規登録時の招待コードが自動で入力されます。
+     */
+    "qrcodeToInvite": string;
+    /**
+     * 指定された絵文字は既に存在します。
+     */
+    "emojiAlreadyExists": string;
     "_bubbleGame": {
         /**
          * 遊び方
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 3c2e1d8c16a9..e3e3b2643cdd 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1225,6 +1225,8 @@ loading: "読み込み中"
 surrender: "やめる"
 gameRetry: "リトライ"
 qrcode: "QRコード"
+qrcodeToInvite: "このQRコードをスキャンすると、新規登録時の招待コードが自動で入力されます。"
+emojiAlreadyExists: "指定された絵文字は既に存在します。"
 
 _bubbleGame:
   howToPlay: "遊び方"
diff --git a/packages/frontend/src/components/MkInviteCode.vue b/packages/frontend/src/components/MkInviteCode.vue
index 88eba6e665eb..e1ea79d6ec6a 100644
--- a/packages/frontend/src/components/MkInviteCode.vue
+++ b/packages/frontend/src/components/MkInviteCode.vue
@@ -55,7 +55,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 			<MkButton v-if="!invite.used || moderator" danger rounded @click="deleteCode()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
 		</div>
     <div v-if="!invite.used && !isExpired">
-			<div :class="$style.label">{{ i18n.ts.qrcode }}</div>
+			<div :class="$style.label">{{ i18n.ts.qrcode }} - {{ i18n.ts.qrcodeToInvite }}</div>
       <vue-qrcode :value="inviteUrl" :options="option" tag="img"></vue-qrcode>
     </div>
 	</div>
diff --git a/packages/frontend/src/components/global/MkCustomEmoji.vue b/packages/frontend/src/components/global/MkCustomEmoji.vue
index 3b2ecd81092f..7e4e08186baa 100644
--- a/packages/frontend/src/components/global/MkCustomEmoji.vue
+++ b/packages/frontend/src/components/global/MkCustomEmoji.vue
@@ -87,14 +87,17 @@ const importEmoji = async (emojiName) => {
 			query: emojiName,
 			host: props.host,
 		})).find((_emoji) => _emoji.name === emojiName);
-		await os.apiWithDialog('admin/emoji/copy', {
-			emojiId: emoji.id,
+		if (emoji) {
+			await os.apiWithDialog('admin/emoji/copy', {
+				emojiId: emoji.id,
+			});
+		}
+	} else {
+		os.alert({
+			title: i18n.ts.error,
+			text: i18n.ts.emojiAlreadyExists,
 		});
 	}
-
-	// リアクション
-	react(`:${emojiName}:`);
-	sound.playMisskeySfx('reaction');
 };
 
 function onClick(ev: MouseEvent) {
@@ -111,10 +114,20 @@ function onClick(ev: MouseEvent) {
 					os.success();
 				},
 			}, ...(props.menuImport && react ? [{
+				text: i18n.ts.import,
+				icon: 'ti ti-download',
+				action: () => {
+					importEmoji(props.name);
+				},
+			}, {
 				text: i18n.ts.doReaction,
 				icon: 'ti ti-plus',
 				action: () => {
-					importEmoji(props.name);
+					importEmoji(props.name).then(() => {
+						// リアクション
+						react(`:${props.name}:`);
+						sound.playMisskeySfx('reaction');
+					});
 				},
 			}] : []),
 			], ev.currentTarget ?? ev.target);