Destinations with a brand on them are pinned to that brand's hosts:
slack to hooks.slack.com, discord to
discord.com or discordapp.com, msteams to
webhook.office.com, outlook.office.com,
logic.azure.com, logic.azure.us or
environment.api.powerplatform.com, googlechat to
chat.googleapis.com. Every destination URL must use
https.
To deliver alerts somewhere else, use the webhook kind. It takes
any https endpoint and signs the payload with your shared secret,
and it is what the console, the API, MCP and Terraform will point you at if a
branded URL is refused.
ntfy is unpinned, so a self-hosted ntfy server keeps working.
A destination's config must also name only the fields its kind accepts, each
exactly once. A stray or repeated key used to be silently dropped, which is
how a setting you thought you had saved turned out never to have applied. It
is now an explicit refusal that names the fields the kind takes.
Nothing you already have stops working. A destination stored
before this change keeps delivering, and renaming it is unaffected. The rules
apply the moment you edit its config. Alongside this, a project now holds at
most 25 destinations.
Being on a vendor's host is a labelling rule, not proof of ownership: every
one of those domains is multi-tenant and anyone can obtain an endpoint under
one. What the pin removes is a destination labelled Slack quietly
feeding your whole alert stream somewhere else.
The same check at send time (refusing to deliver to a
grandfathered destination that is off-host) is built and ships switched
off. Turning it on would silence exactly the destinations
deliberately left alone above, so it waits on evidence: until then the
notifier logs each delivery the rule would have stopped, and nobody's alerts
go quiet without warning.