When a registered webhook target is a Discord webhook URL, the dispatcher should auto-detect it and POST a nicely-formatted Discord embed (Discord's {username, embeds:[…]} shape) instead of the raw WebhookEvent JSON — so players can point a webhook straight at a Discord channel and get readable transaction messages with zero glue code. Still substrate (PAR-151/PAR-153): no new gameplay, just smarter delivery formatting.
Host ∈ {discord.com, discordapp.com, canary.discord.com, ptb.discord.com} and path matches ^/api(/v\d+)?/webhooks/\d+/.+. (https-only is already enforced by the SSRF guard; Discord resolves to public Cloudflare addresses so it passes.)
util/DiscordWebhook — isDiscordWebhook(URI) + toPayload(DueDelivery) building an embed: credit/debit title + green/red color by amount sign, fields (amount, account, txn, system, memo/message, initiator), ISO timestamp, footer. Discord embed length limits respected.WebhookDispatcherService.deliver: branch on detection — Discord path sends the embed body and omits the X-Treasury-Signature/X-Treasury-Event headers (Discord ignores them and the body isn't our canonical event). Non-Discord path unchanged (signed WebhookEvent). Success is still any 2xx (Discord returns 204); 429/5xx ride the existing retry/backoff/auto-disable.isDiscordWebhookUrl helper; show a Discord badge on the webhooks table/detail and a hint under the create-form URL input ("Looks like a Discord webhook — deliveries will be sent as a rich embed").Follow-up to PAR-151 (feed/dispatcher) and PAR-153 (explorer self-service).