diff --git a/src/Commands/KickCommandGroup.cs b/src/Commands/KickCommandGroup.cs
index 56154bd..7a9fe0c 100644
--- a/src/Commands/KickCommandGroup.cs
+++ b/src/Commands/KickCommandGroup.cs
@@ -6,12 +6,12 @@ using Remora.Commands.Attributes;
 using Remora.Commands.Groups;
 using Remora.Discord.API.Abstractions.Objects;
 using Remora.Discord.API.Abstractions.Rest;
-using Remora.Discord.API.Objects;
 using Remora.Discord.Commands.Attributes;
 using Remora.Discord.Commands.Conditions;
 using Remora.Discord.Commands.Contexts;
 using Remora.Discord.Commands.Feedback.Services;
 using Remora.Discord.Extensions.Embeds;
+using Remora.Rest.Core;
 using Remora.Results;
 
 namespace Boyfriend.Commands;
@@ -62,21 +62,25 @@ public class KickCommandGroup : CommandGroup {
     [RequireBotDiscordPermissions(DiscordPermission.KickMembers)]
     [Description("Kick member")]
     [UsedImplicitly]
-    public async Task<Result> KickUserAsync(
+    public async Task<Result> ExecuteKick(
         [Description("Member to kick")] IUser  target,
         [Description("Kick reason")]    string reason) {
         if (!_context.TryGetContextIDs(out var guildId, out var channelId, out var userId))
             return Result.FromError(
                 new ArgumentNullError(nameof(_context), "Unable to retrieve necessary IDs from command context"));
-
         // The current user's avatar is used when sending error messages
         var currentUserResult = await _userApi.GetCurrentUserAsync(CancellationToken);
         if (!currentUserResult.IsDefined(out var currentUser))
             return Result.FromError(currentUserResult);
+        var userResult = await _userApi.GetUserAsync(userId.Value, CancellationToken);
+        if (!userResult.IsDefined(out var user))
+            return Result.FromError(userResult);
+        var guildResult = await _guildApi.GetGuildAsync(guildId.Value, ct: CancellationToken);
+        if (!guildResult.IsDefined(out var guild))
+            return Result.FromError(guildResult);
 
         var data = await _dataService.GetData(guildId.Value, CancellationToken);
-        var cfg = data.Settings;
-        Messages.Culture = GuildSettings.Language.Get(cfg);
+        Messages.Culture = GuildSettings.Language.Get(data.Settings);
 
         var memberResult = await _guildApi.GetGuildMemberAsync(guildId.Value, target.ID, CancellationToken);
         if (!memberResult.IsSuccess) {
@@ -86,79 +90,56 @@ public class KickCommandGroup : CommandGroup {
             return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken);
         }
 
+        return await KickUserAsync(target, reason, guild, channelId.Value, data, user, currentUser);
+    }
+
+    private async Task<Result> KickUserAsync(
+        IUser target, string reason, IGuild guild, Snowflake channelId, GuildData data, IUser user, IUser currentUser) {
         var interactionResult
-            = await _utility.CheckInteractionsAsync(guildId.Value, userId.Value, target.ID, "Kick", CancellationToken);
+            = await _utility.CheckInteractionsAsync(guild.ID, user.ID, target.ID, "Kick", CancellationToken);
         if (!interactionResult.IsSuccess)
             return Result.FromError(interactionResult);
 
-        Result<Embed> responseEmbed;
         if (interactionResult.Entity is not null) {
-            responseEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, currentUser)
+            var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, currentUser)
                 .WithColour(ColorsList.Red).Build();
-        } else {
-            var userResult = await _userApi.GetUserAsync(userId.Value, CancellationToken);
-            if (!userResult.IsDefined(out var user))
-                return Result.FromError(userResult);
 
-            var dmChannelResult = await _userApi.CreateDMAsync(target.ID, CancellationToken);
-            if (dmChannelResult.IsDefined(out var dmChannel)) {
-                var guildResult = await _guildApi.GetGuildAsync(guildId.Value, ct: CancellationToken);
-                if (!guildResult.IsDefined(out var guild))
-                    return Result.FromError(guildResult);
-
-                var dmEmbed = new EmbedBuilder().WithGuildTitle(guild)
-                    .WithTitle(Messages.YouWereKicked)
-                    .WithDescription(string.Format(Messages.DescriptionActionReason, reason))
-                    .WithActionFooter(user)
-                    .WithCurrentTimestamp()
-                    .WithColour(ColorsList.Red)
-                    .Build();
-
-                if (!dmEmbed.IsDefined(out var dmBuilt))
-                    return Result.FromError(dmEmbed);
-                await _channelApi.CreateMessageAsync(dmChannel.ID, embeds: new[] { dmBuilt }, ct: CancellationToken);
-            }
-
-            var kickResult = await _guildApi.RemoveGuildMemberAsync(
-                guildId.Value, target.ID, $"({user.GetTag()}) {reason}".EncodeHeader(),
-                ct: CancellationToken);
-            if (!kickResult.IsSuccess)
-                return Result.FromError(kickResult.Error);
-            data.GetMemberData(target.ID).Roles.Clear();
-
-            responseEmbed = new EmbedBuilder().WithSmallTitle(
-                    string.Format(Messages.UserKicked, target.GetTag()), target)
-                .WithColour(ColorsList.Green).Build();
-
-            if ((!GuildSettings.PublicFeedbackChannel.Get(cfg).Empty()
-                 && GuildSettings.PublicFeedbackChannel.Get(cfg) != channelId.Value)
-                || (!GuildSettings.PrivateFeedbackChannel.Get(cfg).Empty()
-                    && GuildSettings.PrivateFeedbackChannel.Get(cfg) != channelId.Value)) {
-                var logEmbed = new EmbedBuilder().WithSmallTitle(
-                        string.Format(Messages.UserKicked, target.GetTag()), target)
-                    .WithDescription(string.Format(Messages.DescriptionActionReason, reason))
-                    .WithActionFooter(user)
-                    .WithCurrentTimestamp()
-                    .WithColour(ColorsList.Red)
-                    .Build();
-
-                if (!logEmbed.IsDefined(out var logBuilt))
-                    return Result.FromError(logEmbed);
-
-                var builtArray = new[] { logBuilt };
-                // Not awaiting to reduce response time
-                if (GuildSettings.PublicFeedbackChannel.Get(cfg) != channelId.Value)
-                    _ = _channelApi.CreateMessageAsync(
-                        GuildSettings.PublicFeedbackChannel.Get(cfg), embeds: builtArray,
-                        ct: CancellationToken);
-                if (GuildSettings.PrivateFeedbackChannel.Get(cfg) != GuildSettings.PublicFeedbackChannel.Get(cfg)
-                    && GuildSettings.PrivateFeedbackChannel.Get(cfg) != channelId.Value)
-                    _ = _channelApi.CreateMessageAsync(
-                        GuildSettings.PrivateFeedbackChannel.Get(cfg), embeds: builtArray,
-                        ct: CancellationToken);
-            }
+            return await _feedbackService.SendContextualEmbedResultAsync(failedEmbed, CancellationToken);
         }
 
-        return await _feedbackService.SendContextualEmbedResultAsync(responseEmbed, CancellationToken);
+        var dmChannelResult = await _userApi.CreateDMAsync(target.ID, CancellationToken);
+        if (dmChannelResult.IsDefined(out var dmChannel)) {
+            var dmEmbed = new EmbedBuilder().WithGuildTitle(guild)
+                .WithTitle(Messages.YouWereKicked)
+                .WithDescription(string.Format(Messages.DescriptionActionReason, reason))
+                .WithActionFooter(user)
+                .WithCurrentTimestamp()
+                .WithColour(ColorsList.Red)
+                .Build();
+
+            if (!dmEmbed.IsDefined(out var dmBuilt))
+                return Result.FromError(dmEmbed);
+            await _channelApi.CreateMessageAsync(dmChannel.ID, embeds: new[] { dmBuilt }, ct: CancellationToken);
+        }
+
+        var kickResult = await _guildApi.RemoveGuildMemberAsync(
+            guild.ID, target.ID, $"({user.GetTag()}) {reason}".EncodeHeader(),
+            CancellationToken);
+        if (!kickResult.IsSuccess)
+            return Result.FromError(kickResult.Error);
+        data.GetMemberData(target.ID).Roles.Clear();
+
+        var title = string.Format(Messages.UserKicked, target.GetTag());
+        var description = string.Format(Messages.DescriptionActionReason, reason);
+        var logResult = _utility.LogActionAsync(
+            data.Settings, channelId, user, title, description, target, CancellationToken);
+        if (!logResult.IsSuccess)
+            return Result.FromError(logResult.Error);
+
+        var embed = new EmbedBuilder().WithSmallTitle(
+                string.Format(Messages.UserKicked, target.GetTag()), target)
+            .WithColour(ColorsList.Green).Build();
+
+        return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken);
     }
 }