Delwin · Integrations

Connect your CRM

Send every qualified lead from your Delwin chatbot straight into your CRM, automatically. It works with any CRM that can receive a webhook, either directly or through a tool like Zapier or Make.

What you get

When Delwin finishes qualifying a visitor, it hands the lead to your CRM within seconds. Every lead arrives with:

  • ·Contact details: the name and phone number they gave.
  • ·What they want: intent (buy, sell, rent), budget, area and bedrooms.
  • ·When to call them back, if they asked for a specific time.
  • ·A qualification score from 0 to 100, plus a hot / warm / cold band you can route on.
  • ·The full chat transcript, so whoever picks it up has the context.

How it works

You give us a web address (a "webhook URL") that can receive messages. Whenever a lead qualifies, we post the lead to that address. Your CRM, or a tool sitting in front of it, turns that into a contact.

01Delwin qualifies a lead in the chat.
02We send a signed message to your webhook URL.
03Your CRM creates or updates the contact.

Because this is a standard webhook, we do not need to build support for your specific CRM. If your CRM is on Zapier or Make, or accepts inbound webhooks itself, you are covered.

Set it up

This takes about ten minutes. You will need a Delwin plan that includes at least one CRM connection.

  1. 1

    Get a webhook URL

    Pick whichever suits you:

    • ·Zapier (easiest, no code): create a Zap with the Webhooks by Zapier trigger, choose Catch Hook, and copy the URL it gives you.
    • ·Make: add a Custom webhook module and copy its address.
    • ·Your CRM directly: if it accepts inbound webhooks, use that endpoint.
  2. 2

    Add it in Delwin

    Open your dashboard, go to Integrations, and paste the URL. Copy the signing secret shown next to it and keep it somewhere safe. You will need it to verify that messages really came from us.

  3. 3

    Send a test and turn it on

    Click Send test event. Confirm the sample lead arrives at the other end, then switch the connection to On. Real leads start flowing immediately.

Zapier recipe

The most common setup, start to finish.

  1. 1

    In Zapier, create a Zap. For the trigger, choose Webhooks by Zapier, then Catch Hook. Copy the custom webhook URL.

  2. 2

    In Delwin, paste that URL under Integrations and click Send test event.

  3. 3

    Back in Zapier, click Test trigger. It will find the sample lead we just sent.

  4. 4

    Add an action: pick your CRM (HubSpot, Zoho, Salesforce, Pipedrive, and so on) and choose Create or Update Contact.

  5. 5

    Map the fields using the field mapping below, then publish the Zap.

Tip

Add a second action in the same Zap to attach the transcript as a note on the contact. Your sales team will thank you.

Connect directly

If you would rather receive the lead on your own server, point the webhook URL at any HTTPS endpoint you control. Your endpoint should:

  • ·Accept a POST with a JSON body.
  • ·Verify the signature before trusting the contents.
  • ·Reply with a 2xx status quickly. Do the slow work afterwards.

What we send

Every delivery is a POST with these headers:

HeaderExampleMeaning
Content-Typeapplication/jsonThe body is always JSON.
X-Delwin-Eventlead.qualifiedWhat happened.
X-Delwin-Delivery8f14e45f-ceea-467aUnique id for this delivery. Same across retries.
X-Delwin-Signaturesha256=9b1f...c3Proof the message came from us.

And a body shaped like this:

{
  "event": "lead.qualified",
  "occurred_at": "2026-07-16T10:04:22Z",
  "source": "Delwin Chatbot",
  "client_id": "acme",
  "contact": {
    "name": "Aisha Rahman",
    "phone": "+971501234567",
    "email": "",
    "language": ""
  },
  "lead": {
    "intent": "buy",
    "budget": "2.5M AED",
    "budget_aed": 2500000,
    "neighborhood": "Dubai Hills",
    "bedrooms": 3,
    "preferred_contact_date": "2026-07-20",
    "preferred_contact_time": "4pm",
    "notes": "Looking to move before the school year.",
    "qualification_score": 82,
    "qualification_band": "hot",
    "status": "qualified"
  },
  "transcript": [
    { "role": "user", "text": "Do you have villas in Dubai Hills?" },
    { "role": "bot",  "text": "Yes. What budget are you working with?" }
  ]
}
FieldTypeNotes
eventstringCurrently always lead.qualified.
occurred_atstringISO 8601, UTC.
sourcestringAlways Delwin Chatbot. Useful as your lead source.
client_idstringYour account identifier with us.
contact.namestringThe name the visitor gave.
contact.phonestringDigits with country code. Empty if never shared.
contact.emailstringReserved. The chatbot does not ask for an email today, so this is currently always empty.
contact.languagestringReserved. Not recorded today, so this is currently always empty.
lead.intentstringOne of: buy, sell, rent, rent_out.
lead.budgetstringBudget formatted for display, for example 2.5M AED. Empty if not given.
lead.budget_aednumberThe same budget as a plain number, for filtering and sorting. null if not given.
lead.neighborhoodstringArea they asked about. Empty if not given.
lead.bedroomsnumberBedrooms wanted. null if not given.
lead.preferred_contact_datestringWhen they asked to be called back. Empty if not given.
lead.preferred_contact_timestringTime they asked to be called back. Empty if not given.
lead.notesstringAnything else worth passing to your team. Empty if none.
lead.qualification_scorenumber0 to 100. Higher means a stronger lead.
lead.qualification_bandstringhot, warm or cold. The score bucketed for easy routing.
lead.statusstringCurrently always qualified.
transcriptarrayThe full conversation, oldest first. Each entry is { role, text } where role is "user" or "bot".
Note

We may add new fields over time. Ignore anything you do not recognise rather than treating it as an error.

Verify the signature

Your webhook URL is reachable by anyone who learns it, so check the signature before you trust a lead. We sign the exact bytes of the request body using your signing secret, then send the result in X-Delwin-Signature.

Recompute it and compare. If it does not match, reject the request.

Node.js

import crypto from "node:crypto";

export function isFromDelwin(rawBody, signatureHeader, secret) {
  const expected =
    "sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(signatureHeader ?? "", "utf8");
  const b = Buffer.from(expected, "utf8");
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

Python

import hmac, hashlib

def is_from_delwin(raw_body: bytes, signature_header: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(
        secret.encode(), raw_body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature_header or "")
Important

Sign the raw body, exactly as received, before any JSON parsing. Frameworks that parse and re-serialise the body will change the bytes and the check will always fail. This is the single most common setup mistake.

Delivery and retries

  • ·Reply with any 2xx status within 10 seconds to acknowledge. Anything else counts as a failure.
  • ·Failed deliveries are retried up to 5 times, with growing gaps, over roughly an hour.
  • ·Every retry reuses the same X-Delwin-Delivery id. Store it and skip a delivery you have already processed, so retries never create duplicate contacts.
  • ·You can see every attempt and its result in the Delivery log in your dashboard.

Field mapping

A sensible default when wiring Delwin to your CRM. Field names differ between CRMs, so treat the right column as a guide.

Delwin fieldTypical CRM field
contact.nameContact name
contact.phonePhone
lead.intentInterest, or the deal name
lead.budget_aedBudget (number, so you can filter and sort)
lead.neighborhoodArea of interest (custom field)
lead.bedroomsBedrooms (custom field)
lead.preferred_contact_dateFollow-up task due date
lead.preferred_contact_timeFollow-up task time
lead.qualification_scoreLead score (custom field)
lead.qualification_bandPriority, or a routing rule (hot goes straight to sales)
lead.notesContact notes
sourceLead source
transcriptA note or activity on the contact

Troubleshooting

SymptomFix
Nothing arrivesCheck the connection is switched On and the URL has no typo. Use Send test event to confirm.
Signature check always failsYou are almost certainly verifying against a parsed body. Use the raw bytes instead.
Duplicate contactsSkip deliveries whose X-Delwin-Delivery id you have already handled, and match on phone or email in your CRM.
Zapier shows no sample dataClick Send test event in Delwin first, then Test trigger in Zapier.
Leads stopped arrivingYour endpoint probably returned errors until the retries ran out. Check the Delivery log.

Limits and FAQ

How many CRMs can I connect?

That depends on your plan. Your current allowance is shown on the Integrations page.

Can I change the URL later?

Yes, at any time. New leads go to the new address straight away.

What if my secret leaks?

Click Regenerate. The old secret stops working immediately, so update your endpoint at the same time.

Is the data secure in transit?

Deliveries go over HTTPS only, and every one is signed so you can confirm it came from us.

Do you store the transcript?

Yes, transcripts are kept in your Delwin account so you can review conversations. The copy sent to your CRM is yours to manage under your own retention rules.

Get a call within 55 seconds

Click here to get started

Stay Updated

Learn about the latest trends and updates from ModSolutions.

By clicking Subscribe, you agree to our Terms & Conditions and Privacy Policy.