LPLeadProof

Bland AI post-call CRM delivery

Turn every Bland AI post-call result into verified CRM delivery.

Verify Bland AI's signed post-call webhook, queue only approved analysis fields, and deliver each qualified lead once with the original call ID and a receipt.

Protect 25 live leads free →Start Builder · $49/monthAudit this workflow
Paid plan uses secure Stripe checkout · plan assigned after verified payment · activate with the checkout email
THE FAILURE GAP

A successful automation run is not proof of delivery.

Bland AI sends the configured webhook after a call ends, but receiving that payload does not prove a downstream CRM stored the lead. A production bridge should verify X-Webhook-Signature against the raw body, select only the authorized analysis fields, acknowledge the provider promptly, and preserve call_id through the queued CRM delivery.

Bland AI post-call webhook -> signed mapping handler -> durable queue -> LeadProof -> CRM
01

Post-call receipt is not CRM proof

A successful response to Bland confirms the mapping handler received the call data, not that the sales system accepted the lead.

02

Repeated delivery can duplicate records

Webhook recovery and operator resends must keep the original call_id so every attempt has the same business identity.

03

The payload contains more than sales needs

A CRM handoff should select the approved analysis fields instead of copying the complete post-call payload.

Implementation

Put LeadProof in the delivery path.

Keep the tools that create and process the lead. Standardize only the fragile handoff between them.

Platform reference: Bland AI post-call webhook documentationOpen sandbox instructions →
  1. Configure the Bland post-call webhook URL and create a webhook signing secret in the Bland developer portal.
  2. Read the untouched request body, calculate its HMAC-SHA256 digest, and compare it with X-Webhook-Signature before parsing.
  3. Select only approved fields from analysis, keep call_id, place the compact job on a durable queue, and acknowledge Bland promptly.
  4. Let the worker send the selected lead through LeadProof with call_id as the Idempotency-Key, then retain the returned receipt ID.
POSThttps://leadproof.jessesay.chatgpt.site/api/v1/leads
import crypto from "node:crypto";

app.use(
  "/bland/post-call",
  express.raw({ type: "application/json" })
);

app.post("/bland/post-call", async (req, res) => {
  const signature = req.headers["x-webhook-signature"];
  const secret = process.env.BLAND_WEBHOOK_SECRET;
  if (
    !secret ||
    typeof signature !== "string" ||
    !/^[0-9a-f]{64}$/i.test(signature)
  ) {
    return res.sendStatus(401);
  }

  const expected = crypto
    .createHmac("sha256", secret)
    .update(req.body)
    .digest("hex");

  const authentic = crypto.timingSafeEqual(
    Buffer.from(signature, "hex"),
    Buffer.from(expected, "hex")
  );
  if (!authentic) return res.sendStatus(401);

  const event = JSON.parse(req.body.toString("utf-8"));
  const lead = {
    name: event.analysis?.name,
    email: event.analysis?.email,
    phone: event.analysis?.phone
  };

  if (event.call_id && lead.name && lead.email) {
    await deliveryQueue.send({ callId: event.call_id, lead });
  }
  return res.sendStatus(204);
});

export async function deliverBlandLead({ callId, lead }) {
  const response = await fetch(
    "https://leadproof.jessesay.chatgpt.site/api/v1/leads",
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.LEADPROOF_API_KEY}`,
        "Content-Type": "application/json",
        "Idempotency-Key": callId
      },
      body: JSON.stringify({
        destination: process.env.CRM_WEBHOOK_URL,
        ...lead,
        source: "bland_ai_post_call"
      })
    }
  );

  if (!response.ok) throw new Error("Lead delivery failed");
  const delivery = await response.json();
  await persistReceipt(callId, delivery.receipt?.id);
}

Questions

What teams ask before adding LeadProof.

Which Bland AI event should I use?

Use the webhook setting for the post-call notification. Bland documents webhook_events separately for events streamed during the call.

How is the webhook authenticated?

Bland signs the request body with HMAC-SHA256 and sends the hex signature in X-Webhook-Signature. Keep the generated secret in server-side environment storage.

What prevents duplicate CRM records?

The original call_id becomes the LeadProof Idempotency-Key, so a resend or replay keeps the same delivery identity.

FREE · NO SIGNUP

See the gaps in your real workflow.

Get an explainable risk score, prioritized fixes, and the right LeadProof plan.

Protect 25 live leads free →Run the reliability auditStart Builder · $49/month