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.
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
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
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
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
In Zapier, create a Zap. For the trigger, choose Webhooks by Zapier, then Catch Hook. Copy the custom webhook URL.
- 2
In Delwin, paste that URL under Integrations and click Send test event.
- 3
Back in Zapier, click Test trigger. It will find the sample lead we just sent.
- 4
Add an action: pick your CRM (HubSpot, Zoho, Salesforce, Pipedrive, and so on) and choose Create or Update Contact.
- 5
Map the fields using the field mapping below, then publish the Zap.
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:
| Header | Example | Meaning |
|---|---|---|
Content-Type | application/json | The body is always JSON. |
X-Delwin-Event | lead.qualified | What happened. |
X-Delwin-Delivery | 8f14e45f-ceea-467a | Unique id for this delivery. Same across retries. |
X-Delwin-Signature | sha256=9b1f...c3 | Proof 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?" }
]
}| Field | Type | Notes |
|---|---|---|
event | string | Currently always lead.qualified. |
occurred_at | string | ISO 8601, UTC. |
source | string | Always Delwin Chatbot. Useful as your lead source. |
client_id | string | Your account identifier with us. |
contact.name | string | The name the visitor gave. |
contact.phone | string | Digits with country code. Empty if never shared. |
contact.email | string | Reserved. The chatbot does not ask for an email today, so this is currently always empty. |
contact.language | string | Reserved. Not recorded today, so this is currently always empty. |
lead.intent | string | One of: buy, sell, rent, rent_out. |
lead.budget | string | Budget formatted for display, for example 2.5M AED. Empty if not given. |
lead.budget_aed | number | The same budget as a plain number, for filtering and sorting. null if not given. |
lead.neighborhood | string | Area they asked about. Empty if not given. |
lead.bedrooms | number | Bedrooms wanted. null if not given. |
lead.preferred_contact_date | string | When they asked to be called back. Empty if not given. |
lead.preferred_contact_time | string | Time they asked to be called back. Empty if not given. |
lead.notes | string | Anything else worth passing to your team. Empty if none. |
lead.qualification_score | number | 0 to 100. Higher means a stronger lead. |
lead.qualification_band | string | hot, warm or cold. The score bucketed for easy routing. |
lead.status | string | Currently always qualified. |
transcript | array | The full conversation, oldest first. Each entry is { role, text } where role is "user" or "bot". |
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 "")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 field | Typical CRM field |
|---|---|
contact.name | Contact name |
contact.phone | Phone |
lead.intent | Interest, or the deal name |
lead.budget_aed | Budget (number, so you can filter and sort) |
lead.neighborhood | Area of interest (custom field) |
lead.bedrooms | Bedrooms (custom field) |
lead.preferred_contact_date | Follow-up task due date |
lead.preferred_contact_time | Follow-up task time |
lead.qualification_score | Lead score (custom field) |
lead.qualification_band | Priority, or a routing rule (hot goes straight to sales) |
lead.notes | Contact notes |
source | Lead source |
transcript | A note or activity on the contact |
Troubleshooting
| Symptom | Fix |
|---|---|
| Nothing arrives | Check the connection is switched On and the URL has no typo. Use Send test event to confirm. |
| Signature check always fails | You are almost certainly verifying against a parsed body. Use the raw bytes instead. |
| Duplicate contacts | Skip deliveries whose X-Delwin-Delivery id you have already handled, and match on phone or email in your CRM. |
| Zapier shows no sample data | Click Send test event in Delwin first, then Test trigger in Zapier. |
| Leads stopped arriving | Your 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
Stay Updated
Learn about the latest trends and updates from ModSolutions.