Your lead’s own details,
inside the message.
A Zoho workflow rule calls us the moment a lead is created or a deal moves. The fields it posts drop straight into your approved template’s variables, and the message goes out on your own WhatsApp number.
- No OAuth app
- Fires on the rule, not a poll
- Your field names
Four moments in Zoho, four messages.
Not four unrelated features - four moments in the life of the same lead, in the order they happen. Watch one walk them, and the thread it leaves behind.
- Lead created
- Lead status changed
- Contact created
- Deal stage changed
/webhooks/zoho/lead_created{{1}}name{{2}}company (or lead source)/webhooks/zoho/lead_status{{1}}name{{2}}status/webhooks/zoho/contact_created{{1}}name/webhooks/zoho/deal_stage{{1}}name{{2}}deal{{3}}stage{{4}}amountFour moments, four messages - and each one has its own switch, so you can send one of them and none of the rest.
Map it straight through. No renaming.
Name the fields however Zoho names them.
A Zoho webhook sends whatever JSON you build in the rule. Rather than make you rename everything, each value is looked up under several spellings - ours, and Zoho’s own. Map the module fields straight through and it works.
nameFull_Namefirst_name + last_namephonePhonemobileMobilecompanyCompanysourceLead_SourceThe number is normalised to E.164 before anything is sent, so 9876543210, 09876543210 and +91 98765 43210 all reach the same person.
One URL, pasted once.
- 1
Copy your URL
Switch Zoho on in your dashboard and it gives you one URL per event, with your secret already in it.
…/webhooks/zoho/lead_created?key=••• - 2
Make the rule in Zoho
Setup → Automation → Workflow Rules. Pick the module and when it runs, then add a Webhook as the instant action.
LeadsOn CreateWebhook - 3
Choose the template
Back in the dashboard, switch the event on and name the approved template it should send. The variables fill themselves.
order_update
The URL is the credential.
There is no app to register and no token to refresh, which makes the secret in that URL the only thing standing between your customers and anyone else. So it is treated like one.
A secret in the URL
Your webhook URL carries a secret only your account has. Paste it into the Zoho rule and that is the whole of the setup - no OAuth app, no API console, no token to refresh.
Compared in constant time
The secret is checked with a timing-safe comparison, so a near-miss cannot be walked towards a hit one character at a time.
Or send it as a header
If you would rather not have a secret in a URL, the same value is accepted as an X-AiOneChat-Secret header instead.
Always answered, never retried into the ground
A payload we cannot act on still gets a clean 200 with the reason in it, so Zoho does not sit retrying - and the reason lands in your event log.
“Zoho fired, nothing sent” stops being a mystery.
Every event walks the same five gates, and it can stop at any of them for reasons that are all perfectly ordinary. Your panel names the one it stopped at, rather than leaving you to guess between Zoho and us.
- The URL secret matches
secret - That trigger is switched on
trigger - The payload carries a number
phone - The wallet covers the template
wallet - Meta accepts the send
meta
zoho/deal/stageskippedno enabled trigger for event zoho/deal/stage•••• 3344zoho/lead/createdskippedno phone in payload—zoho/lead/createdskippedinsufficient wallet balance - needs 0.115 INR for a UTILITY message•••• 4455zoho/lead/createdsent•••• 3210Numbers in the log are masked to their last four digits, and rows expire after 30 days on their own.
Let every new lead hear from you first.
Copy the URL, paste it into a Zoho workflow rule, pick the template. That is the whole setup.
