diff --git a/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs
new file mode 100644
index 000000000..68c03d9fc
--- /dev/null
+++ b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs
@@ -0,0 +1,32 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System.ComponentModel.DataAnnotations;
+using Squidex.Domain.Apps.Core.HandleRules;
+using Squidex.Domain.Apps.Core.Rules;
+
+namespace Squidex.Extensions.Actions.Comment
+{
+ [RuleAction(
+ Title = "Comment",
+ IconImage = "",
+ IconColor = "#3389ff",
+ Display = "Create comment",
+ Description = "Create a comment for a content event.")]
+ public sealed class CommentAction : RuleAction
+ {
+ [Required]
+ [Display(Name = "Text", Description = "The comment text.")]
+ [DataType(DataType.MultilineText)]
+ [Formattable]
+ public string Text { get; set; }
+
+ [Display(Name = "Client", Description = "An optional client name.")]
+ [DataType(DataType.Text)]
+ public string Client { get; set; }
+ }
+}
diff --git a/backend/extensions/Squidex.Extensions/Actions/Comment/CommentActionHandler.cs b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentActionHandler.cs
new file mode 100644
index 000000000..844aca37b
--- /dev/null
+++ b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentActionHandler.cs
@@ -0,0 +1,85 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Squidex.Domain.Apps.Core.HandleRules;
+using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents;
+using Squidex.Domain.Apps.Entities.Comments.Commands;
+using Squidex.Infrastructure;
+using Squidex.Infrastructure.Commands;
+using Squidex.Infrastructure.Reflection;
+
+namespace Squidex.Extensions.Actions.Comment
+{
+ public sealed class CommentActionHandler : RuleActionHandler
+ {
+ private const string Description = "Send a Comment";
+ private readonly ICommandBus commandBus;
+
+ public CommentActionHandler(RuleEventFormatter formatter, ICommandBus commandBus)
+ : base(formatter)
+ {
+ Guard.NotNull(commandBus);
+
+ this.commandBus = commandBus;
+ }
+
+ protected override (string Description, CommentJob Data) CreateJob(EnrichedEvent @event, CommentAction action)
+ {
+ if (@event is EnrichedContentEvent contentEvent)
+ {
+ var text = Format(action.Text, @event);
+
+ var actor = contentEvent.Actor;
+
+ if (!string.IsNullOrEmpty(action.Client))
+ {
+ actor = new RefToken(RefTokenType.Client, action.Client);
+ }
+
+ var ruleJob = new CommentJob
+ {
+ AppId = contentEvent.AppId,
+ Actor = actor,
+ CommentsId = contentEvent.Id,
+ Text = text
+ };
+
+ return (Description, ruleJob);
+ }
+
+ return ("Ignore", new CommentJob());
+ }
+
+ protected override async Task ExecuteJobAsync(CommentJob job, CancellationToken ct = default)
+ {
+ if (job.CommentsId == Guid.Empty)
+ {
+ return Result.Ignored();
+ }
+
+ var command = SimpleMapper.Map(job, new CreateComment());
+
+ await commandBus.PublishAsync(command);
+
+ return Result.Success($"Commented: {job.Text}");
+ }
+ }
+
+ public sealed class CommentJob
+ {
+ public NamedId AppId { get; set; }
+
+ public RefToken Actor { get; set; }
+
+ public Guid CommentsId { get; set; }
+
+ public string Text { get; set; }
+ }
+}
diff --git a/backend/extensions/Squidex.Extensions/Actions/Comment/CommentPlugin.cs b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentPlugin.cs
new file mode 100644
index 000000000..013cbc42d
--- /dev/null
+++ b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentPlugin.cs
@@ -0,0 +1,21 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Squidex.Infrastructure.Plugins;
+
+namespace Squidex.Extensions.Actions.Comment
+{
+ public sealed class CommentPlugin : IPlugin
+ {
+ public void ConfigureServices(IServiceCollection services, IConfiguration config)
+ {
+ services.AddRuleAction();
+ }
+ }
+}