Nodes/ComfyUI-WebhookNotifier/Webhook Notifier (Any)
ComfyUI Node

Webhook Notifier (Any)

Fire a Webhook When the Render Finishes (Without Sending the Image)

By iSuneast·Created about a year ago·Updated 9 months ago· 2
Webhook Notifier (Any)
  • any_input
    webhook_urlhttps://example.com/webhook
    additional_info{}

    The name overpromises and underdelivers in the best way: Webhook Notifier (Any) fires a POST to whatever URL you give it the moment a workflow reaches it - and it sends nothing about the thing you plugged in. The any_input socket is pure trigger. The payload is exactly the JSON you type into additional_info. That sounds like a bug until you realize it's the whole point.

    Why you'd reach for it

    If your ComfyUI box is headless, a remote GPU box you SSH into, or just tucked in a corner while you work elsewhere, you want a ping when a long batch actually finishes. Webhooks are the least-friction way to do that: Discord webhooks are free, Notion buttons and home-automation endpoints speak them natively, and you don't need to stand up a server or deal with ComfyUI's API from the other side. You've seen people do this with the heavier Discord/notification packs; this node is the strip-down version - one wire in, one URL, done.

    How it works

    The node is an output node (OUTPUT_NODE = True), so ComfyUI treats it as an end of the graph and only runs it once every upstream node feeding it has finished. When it runs, it parses additional_info as JSON, and hands the payload to a background threading.Thread that does a plain requests.post with Content-Type: application/json. It returns immediately - ComfyUI doesn't wait for the HTTP call. That's a deliberate design: your workflow isn't held hostage by a slow or dead endpoint, but it also means no retries, no timeout guarantee, and no confirmation that the server got it. Fire-and-forget, so make your receiver idempotent.

    Crucially, the trigger data is never read or serialized. Plug in an IMAGE, a LATENT, a VHS_FILENAMES, a STRING - the code only checks that it exists.

    The inputs that matter

    • any_input - required, accepts any type. Whatever the upstream node hands you.
    • webhook_url - required. Your Discord/Notion/endpoint URL. This defaults to https://example.com/webhook, and yes, it will happily POST to example.com if you forget to change it. This is the #1 beginner footgun in the whole pack.
    • additional_info - optional, multiline JSON. This is the entire payload. Leave it as {} or paste something like:
    {
      "status": "completed",
      "batch": 3,
      "model": "flux-dev"
    }
    

    Invalid JSON (say, a trailing comma) silently collapses to {} - no error thrown.

    There are no outputs. It's a terminal node.

    Installing it

    Via ComfyUI Manager, search "WebhookNotifier" and hit install. Or, by hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/iSuneast/ComfyUI-WebhookNotifier.git
    cd ComfyUI-WebhookNotifier
    pip install -r requirements.txt
    

    Then restart ComfyUI. The only dependency is requests>=2.27.0, which ComfyUI already ships with, so it'll usually work even if you skip the pip step. No model downloads, no heavy deps - this is a featherweight pack.

    Where people get burned

    • Default URL. Change it before your first run or you'll be "notifying" example.com.
    • It fires when its upstream node finishes, not when the queue drains. If you wire any_input to a text primitive, it fires at the start of the queue, not the end. Wire it to the actual last render step (a KSampler's LATENT, a Save Image's IMAGE) to ping when the work is done.
    • Silent failures. Watch the ComfyUI console. You'll see Webhook notification successful: 200 or Webhook notification failed: <code> - <response>. A 2xx from a webhook endpoint usually means "accepted," not "processed."
    • No auth support. There's no header/API-key input. If your endpoint needs a bearer token, this node isn't it - point additional_info won't help since headers aren't sent. Pick a receiver that doesn't require auth, or use a general webhook pack.
    • Daemon thread, no retry. If the endpoint is down, the POST just dies and prints Error sending webhook. Nothing is queued.

    If you only ever trigger off an actual image, its sibling Webhook Notifier (IMAGE-only trigger) does the same job with a slightly stricter socket - but the Any version here is the one I'd reach for, because it frees you to trigger on a saved-file path, a latent, or anything else that marks "done."

    Categoryutils

    Inputs (3)

    NameTypeDefaultDescription
    any_input*
    webhook_urlSTRINGhttps://example.com/webhook
    additional_infooptSTRING{}

    Outputs (0)

    No outputs