Webhooks
Social adds its events to Umbraco’s own webhooks, so a site can tell Slack, Zapier, a reporting tool or anything else that takes a webhook what happens to its posts, with no code.
Add a webhook in Settings › Webhooks, pick one or more of the events in the Social group, and give the URL to call. Umbraco sends each event as a POST with a JSON body, retries failed calls and logs every delivery, as it does for its own events. See Webhooks in the Umbraco documentation.
Umbraco sends webhooks from the server that runs scheduled work (a single server, or the scheduling publisher in a load-balanced setup), and only when Umbraco:CMS:Webhook:Enabled is on (the default).
Events
Section titled “Events”| Event | Alias | When it fires |
|---|---|---|
| Social post saved | umbSocialPostSaved |
A post was created or changed: saved as a draft, queued, scheduled, or published now. See SocialPostSavedNotification. |
| Social post deleted | umbSocialPostDeleted |
A post was deleted from Social (it stays on the networks). See SocialPostDeletedNotification. |
| Social post published | umbSocialPostPublished |
A post is live on a channel. Once per channel. See SocialPostTargetPublishedNotification. |
| Social post failed or outcome unknown | umbSocialPostFailed |
A post didn’t go out on a channel (Failed), or may have (Unknown): a person should look. Once per channel. See SocialPostTargetFailedNotification. |
The aliases are constants on SocialWebhookEventAliases (UmbSocial.Core.Webhooks).
Payloads
Section titled “Payloads”Every payload carries the post’s key, its status and its scheduled time (UTC). The per-channel events add the channel and its network. Times are UTC, in ISO 8601.
| Field | Events | Detail |
|---|---|---|
postKey |
All | The post’s key. |
status |
All | Saved and deleted: the post’s status. Published: Published. Failed: Failed or Unknown (the post’s status on the channel). |
scheduledForUtc |
All | When the post is (or was) scheduled for, or null. |
channelKey |
Published, failed | The channel. |
network |
Published, failed | The channel’s network id, such as bluesky. |
postUrl |
Published | The post’s link on the network, or null when the network didn’t give one. |
errorCode |
Failed | One of Social’s error codes, such as text.too_long, without its argument. Never the network’s own message, which can quote the post or an account: a failure the network described in its own words is run.failed, or run.outcome_unknown when the outcome is unknown. |
text |
All | The post’s main text. Only when the site opted in (below). |
author |
All | { "key", "name" }: the user who created the post. Only when the site opted in (below). null for a post no user created (an automation’s). |
Post text and author are opt-in
Section titled “Post text and author are opt-in”A webhook URL is often a third-party service, so the post’s words and who wrote them are left out unless the site says otherwise. Two settings in Settings › Social › Schedule & writing (ManageSettings) turn them on, independently:
- Include post text in webhooks adds
text, the post’s main text (not each channel’s own text). Off by default. - Include the post’s author in webhooks adds
author, the name and user key of the user who created the post. Off by default.
When a setting is off, its field isn’t in the payload at all (not null). Each setting applies to every webhook URL set up for Social events.
A post whose content the free edition’s history window has sealed never sends its text or its author, whatever the settings.
Examples
Section titled “Examples”umbSocialPostSaved, with both settings off:
{ "postKey": "0d5f5a4e-7c1b-4b8e-9a51-2f7d3c1e8b42", "status": "Scheduled", "scheduledForUtc": "2026-11-12T09:00:00Z"}umbSocialPostPublished, with both settings on:
{ "postUrl": "https://bsky.app/profile/example.com/post/3l6x2abc", "channelKey": "6a1e3b7c-2f4d-4c5e-8a9b-1c2d3e4f5a6b", "network": "bluesky", "postKey": "0d5f5a4e-7c1b-4b8e-9a51-2f7d3c1e8b42", "status": "Published", "scheduledForUtc": "2026-11-12T09:00:00Z", "text": "New prices from Monday", "author": { "key": "1e2d3c4b-5a69-4788-9a0b-c1d2e3f4a5b6", "name": "Ada Lovelace" }}umbSocialPostFailed, with the author setting on, for a post an automation created:
{ "errorCode": "text.too_long", "channelKey": "6a1e3b7c-2f4d-4c5e-8a9b-1c2d3e4f5a6b", "network": "x", "postKey": "0d5f5a4e-7c1b-4b8e-9a51-2f7d3c1e8b42", "status": "Failed", "scheduledForUtc": "2026-11-12T09:00:00Z", "author": null}umbSocialPostDeleted has the same fields as umbSocialPostSaved.
Read fields by name: their order isn’t fixed.
In code
Section titled “In code”The payloads are public records in UmbSocial.Core.Webhooks (SocialPostSavedWebhookPayload, SocialPostDeletedWebhookPayload, SocialPostPublishedWebhookPayload, SocialPostFailedWebhookPayload), for code that receives Social’s webhooks in .NET.
To react to these events inside the same site, use the notifications instead: they carry the whole post and run before anything is sent.