Adding a custom Webhook Type to Umbraco V13

With the Umbraco V13 RC1 out today, I wanted to do a bit of playing and hacking around with the new features. One new feature I am excited about is Webhooks.

Out of the box Umbraco V13-rc1 supports:

  • Content Publish
  • Content Unpublish
  • Content Delete
  • Media Save
  • Media Delete

With the lovely DTeam working on this feature they have made it possible to extend which Umbraco Notifications (aka events) can fire off a Webhook. So let’s jump on in and take a look at the code.

Just show me the code

using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Notifications;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Sync;
using Umbraco.Cms.Core.Webhooks;

namespace UmbracoV13Playground.MyCustomWebhooks;

public class MemberDeletedWebhookEvent : WebhookEventBase<MemberDeletedNotification, IMember>
{
    public MemberDeletedWebhookEvent(
        IWebhookFiringService webhookFiringService, 
        IWebHookService webHookService, 
        IOptionsMonitor<WebhookSettings> webhookSettings, 
        IServerRoleAccessor serverRoleAccessor) 
        : base(
            webhookFiringService, 
            webHookService, 
            webhookSettings, 
            serverRoleAccessor, 
            "MemberDeleted")
    {
    }

    protected override IEnumerable<IMember> GetEntitiesFromNotification(MemberDeletedNotification notification) => notification.DeletedEntities;

    protected override object? ConvertEntityToRequestPayload(IMember entity)
    {
        // Return everything
        return entity;

        // But we could decide on the shape of the data we send to the Webhook URL
        // return new
        // {
        //     Id = entity.Key,
        //     Name = entity.Name,
        //     Email = entity.Email,
        //     Username = entity.Username,
        //     MemberType = entity.ContentType.Alias
        // };
    }
}

Now we have this class that inherits from WebhookEventBase<TNotification, TEntity> we are able to hook into anytime a Member is deleted and the notification (event) is raised from anywhere in the Umbraco site/application.

The next part we need to do is add it into the WebhookEvents collection using a simple IComposer like so

using Umbraco.Cms.Core.Composing;
namespace UmbracoV13Playground.MyCustomWebhooks;

public class AddMoreWebHooksComposer : IComposer
{
    public void Compose(IUmbracoBuilder builder)
    {
        builder.WebhookEvents().Append<MemberDeletedWebhookEvent>();
    }
}

Tada! It’s that simple

As you can see in the Umbraco backoffice I have a new event I can be notified and send out to a Webhook URL.

A screenshot of Umbraco v13 with our new custom Webhook Event
webhooks.site showing us the payload of the deleted member

Notes

This is code running against Umbraco V13-rc1 and this could change and I have run into a bug with using Webhooks and made a suggestion on making the WebhookEventBase class a bit more flexible to work with a more broader range of notifications and hopefully including custom ones.

Update

A BIG thanks to Kevin Jump aka Mr uSync as he has spent a bit more time and has got a prototype working with uSync and even got some code working for recieving a Webhook from another Umbraco instance that is sending out Webhooks. Kudos Kevin.

If your curious to see how he has done it then take a look at these files in the GitHub repo
https://github.com/Jumoo/uSync.Webhooks/blob/master/uSync.Webhooks/Webhooks/uSyncExportCompletedWebhook.cs

https://github.com/Jumoo/uSync.Webhooks/blob/dev/webhooks/uSync.Webhooks/WebhookEvents/uSyncItemWebhookEventBase.cs