Integration guide

How to Connect HeySale to Zoho CRM

You connect HeySale to Zoho CRM in one of three ways: point a HeySale webhook at a Zoho Flow webhook trigger (no code, recommended), point it at a Zoho CRM Deluge function published as a REST API (full control over field mapping and signature verification), or pull leads on a schedule from the HeySale leads API using an API key. All three deliver the same lead payload, so a field mapping written once keeps working whichever route you choose.

Everything below is configured from your HeySale dashboard under Developer → API keys and webhooks. You do not need an add-on or a marketplace listing.

What HeySale sends to Zoho

Every lead your AI salesperson captures produces a single JSON object. It contains the contact details the visitor gave, what they said they need, a qualification verdict written from the conversation, the page they started on, how long they talked, and — if you ask for it — the full transcript.

  • id, created_at, updated_at, status — HeySale's own identifiers, useful as a dedupe key in Zoho
  • name, email, phone, company, job_title — the contact fields
  • needs — what the visitor said they are trying to buy or solve
  • qualification — a short verdict on fit based on budget, timing, authority and need
  • conversation_summary, buying_signals, page_url, conversation_seconds — the sales context
  • agent — which of your salespeople handled the conversation
  • transcript — the full conversation, when include_transcript is requested

Which events fire

Choose the events per endpoint. Most Zoho setups subscribe to lead.captured and lead.updated, and skip conversation.ended unless they want every conversation logged as an activity.

  • lead.captured — a new lead was created, either from the conversation or from a form the visitor filled in
  • lead.updated — HeySale learned something material later in the conversation (company, title, needs, qualification)
  • conversation.ended — a conversation finished, with its summary and duration

Option 1 — Zoho Flow (recommended, no code)

The same steps work for Zoho Bigin: choose the Bigin app instead of Zoho CRM and map to a Contact plus an associated Pipeline record.

1. Create the Flow

In Zoho Flow, create a new Flow and choose Webhook as the trigger. Set the payload type to JSON. Zoho gives you a webhook URL that starts with https://flow.zoho.com/…/flow?apikey=… — copy it.

2. Add the endpoint in HeySale

In your HeySale dashboard, open Developer, paste the Zoho Flow URL into the webhook endpoint field, select lead.captured and lead.updated, and save. Click Send test — Zoho Flow will capture the sample payload and use it to build the field list.

3. Map the fields to a Zoho CRM Lead

Add a Zoho CRM action — Create Lead (or Create/Update Lead if you want upserts on email). Map name to Last Name, email to Email, phone to Phone, company to Company, job_title to Title, needs to Description, qualification to a custom single-line field such as HeySale Qualification, and page_url to a custom URL field such as Source Page. Set Lead Source to a constant like "HeySale".

4. Store the conversation

Add a second action — Create Note on the record just created — and map conversation_summary (or the transcript) into the note body. Turn the Flow on.

Option 2 — a Deluge function published as a REST API

Use this when you want the mapping to live inside Zoho CRM, need custom deduplication, or want to verify HeySale's signature before writing anything.

1. Create the function

In Zoho CRM go to Setup → Developer Space → Functions → New Function, choose Standalone, and set the return type to a REST API function. Add arguments for the raw body (crmAPIRequest gives you the full request including headers).

2. Read the payload

The body arrives as { event, sent_at, data }. Read data.get("email"), data.get("name"), data.get("company") and so on, then call zoho.crm.createRecord("Leads", leadMap) — or searchRecords on Email first and updateRecord when a match exists, so a lead.updated event enriches the existing record instead of duplicating it.

3. Verify the signature

Each delivery carries x-heysale-timestamp and x-heysale-signature: v1=<hex>. The signature is an HMAC-SHA256 of "<timestamp>.<raw JSON body>" using the endpoint secret shown in your HeySale dashboard. Recompute it with zoho.encryption.hmacsha256(secret, timestamp + "." + rawBody, "hex") and reject the request when it does not match, or when the timestamp is more than five minutes old.

4. Publish and connect

Publish the function as a REST API, copy the generated URL (keep its API key in the URL), and paste it into the HeySale webhook endpoint field. Use Send test to confirm, then check the delivery log in HeySale — it records the status code and error for every attempt.

Option 3 — pull leads from the HeySale API

If your team prefers a scheduled sync, create an API key in the HeySale dashboard and call the leads endpoint from a Zoho CRM scheduled function or Zoho Flow's custom function.

  • GET https://hey.sale/api/public/v1/leads — most recent leads for that salesperson
  • Authenticate with the x-api-key header (or Authorization: Bearer <key>)
  • Filter with since=<ISO timestamp> and status=<new|contacted|…>, page with limit (max 100)
  • Add include_transcript=true when you want the full conversation in the response
  • GET /api/public/v1/leads/{id} returns a single lead in the same shape

Recommended Zoho CRM field mapping

Create the custom fields once under Setup → Modules and Fields → Leads before you build the mapping, so they appear in the Zoho Flow picker.

  • Last Name ← name (Zoho requires it; use the company or "Website visitor" as a fallback when the visitor gave no name)
  • Email ← email · Phone ← phone · Company ← company · Title ← job_title
  • Description ← needs
  • Lead Source ← the constant "HeySale"
  • Custom field — HeySale Qualification (single line) ← qualification
  • Custom field — Source Page (URL) ← page_url
  • Custom field — HeySale Lead ID (single line, set as unique) ← id, so updates match the right record
  • Note or custom multi-line field ← conversation_summary and transcript

Testing and troubleshooting

  • Use Send test in HeySale — it posts a realistic lead.captured payload to your endpoint
  • The delivery log in HeySale shows status code and error text for the last 25 attempts
  • A 401 from Zoho Flow usually means the apikey query parameter was dropped when the URL was copied
  • A duplicate lead per conversation means the mapping creates rather than upserts — match on HeySale Lead ID or Email
  • Endpoints must use https, and HeySale gives each delivery ten seconds to respond

Frequently asked questions

Does HeySale have an official Zoho Marketplace app?
Not today. The webhook and API integration described here is the supported path, and it works with Zoho CRM, Zoho Bigin and Zoho Flow without a marketplace installation.
Can I send leads to Zoho Bigin instead of Zoho CRM?
Yes. The payload is identical; in Zoho Flow pick the Bigin action instead of the Zoho CRM action and map name, email, phone and company to a Contact, then create the associated pipeline record.
Will a lead.updated event overwrite details my team edited in Zoho?
Only if your mapping tells it to. HeySale only sends fields it has, and lead.updated typically adds company, title, needs or qualification. If your team edits records by hand, map updates to empty fields only, or write them into a note.
Can I get the full conversation transcript into Zoho?
Yes. Webhook payloads include the transcript array, and the API returns it when you pass include_transcript=true. Most teams write the summary into the record and the full transcript into an attached note.
How do I verify a webhook really came from HeySale?
Recompute an HMAC-SHA256 over "<x-heysale-timestamp>.<raw body>" with the endpoint secret from your dashboard and compare it to the x-heysale-signature header, which is formatted as v1=<hex>. Reject requests older than five minutes.

See what an AI salesperson would say about your company

Enter your website. HeySale reads it, learns your business, and introduces the salesperson your visitors would meet. $0 setup, $0 per month, $0.33 per conversation minute.

Related resources