good question. heres what we do:
1. HMAC verification: most services (stripe, shopify, github) send a signature header. first node in our workflow validates the signature before proceeding. if it doesnt match the workflow stops
2. IP allowlisting: for internal services we check the source IP in a condition node. only our server IPs get through
3. payload validation: we have a condition node that checks required fields exist and are the right type. prevents malformed data from corrupting our tables
4. the webhook URL being a random UUID is already decent security but yeah for PII workflows you want additional layers
the HMAC approach is what we ended up implementing too. its the industry standard and most API providers support it. thanks for confirming were on the right track
also worth noting: rotate your webhook URLs periodically if theyre exposed to external services. you can regenerate the URL and update the sending service. quick way to invalidate any leaked URLs