Zoho CRM webhooks are configured as actions within workflow rules. Go to Setup → Automation → Workflow Rules → create or open a rule → Add Action → Webhooks. The webhook action sends a POST request to your endpoint URL when the workflow rule fires.
Key webhook configuration settings:
Zoho CRM sends webhook payloads as form-encoded POST bodies (not JSON by default). The parameters you selected in the webhook configuration arrive as key-value pairs in the request body:
| # Example webhook payload (form-encoded) # from a Deal Stage Changed workflow rule POST /your-webhook-endpoint HTTP/1.1 Content-Type: application/x-www-form-urlencoded X-Zoho-Webhook-Secret: your-shared-secret dealId=1234567890& Deal_Name=Acme+Corp+-+Platform+Licence& Stage=Closed+Won& Amount=24000.0& Owner_Email=rep%40yourdomain.com& Account_Name=Acme+Corp |
|---|
| # Python Flask webhook receiver from flask import Flask, request, jsonify import hmac, hashlib app = Flask(__name__) WEBHOOK_SECRET = “your-shared-secret” @app.route(“/zoho-webhook”, methods=[“POST”]) def handle_zoho_webhook(): # 1. Verify the shared secret header received_secret = request.headers.get(“X-Zoho-Webhook-Secret”, “”) if received_secret != WEBHOOK_SECRET: return jsonify({“error”: “Unauthorized”}), 401 # 2. Parse the form-encoded payload deal_id = request.form.get(“dealId”) deal_name = request.form.get(“Deal_Name”) stage = request.form.get(“Stage”) amount = float(request.form.get(“Amount”, 0)) # 3. Route to appropriate handler based on stage if stage == “Closed Won”: create_invoice_in_erp(deal_id, deal_name, amount) elif stage == “Proposal Sent”: notify_operations_team(deal_id, deal_name) # 4. Return 200 quickly — Zoho retries on non-200 responses return jsonify({“status”: “received”}), 200 def create_invoice_in_erp(deal_id, deal_name, amount): # Your ERP integration logic here pass |
|---|
What is the difference between a webhook and an API call?
How do I set up a webhook in Zoho CRM?
Are there security considerations for Zoho CRM webhooks?
Can ABR configure Zoho CRM webhooks and the receiving endpoint?