LPLeadProof

Synthflow post-call CRM delivery

Make every Synthflow post-call lead reach the CRM exactly once.

Verify Synthflow's call-ID signature, select only approved collected variables, and turn each completed call into a duplicate-safe CRM delivery 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.

Synthflow sends a structured payload to external_webhook_url after a call completes, but webhook receipt is not proof that a downstream CRM accepted the lead. The bridge must verify HTTP_SYNTHFLOW_SIGNATURE using the call ID, avoid forwarding the complete call payload, and keep call.call_id stable through queued delivery and recovery.

Synthflow post-call webhook -> authenticated mapping handler -> durable queue -> LeadProof -> CRM
01

A completed call is not a CRM record

The post-call webhook can arrive successfully while the later sales-system request times out, rejects a field, or silently disappears.

02

Recovery can repeat the same call

Retries and webhook-log resends need call.call_id as the original identity so the CRM does not receive a duplicate.

03

Post-call payloads contain sensitive extras

The CRM should receive approved collected variables, not a complete call payload containing unrelated artifacts.

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: Synthflow webhook documentationOpen sandbox instructions →
  1. Set external_webhook_url for the Synthflow call and generate a webhook secret under Workspace Settings, Security, Webhooks.
  2. Read call.call_id, calculate its HMAC-SHA256 digest with the shared secret, and compare the base64 value with HTTP_SYNTHFLOW_SIGNATURE.
  3. Select only the named collected_variables your CRM is authorized to receive, enqueue the compact job with call.call_id, and acknowledge Synthflow promptly.
  4. Let the worker send the selected lead through LeadProof using call.call_id as the Idempotency-Key, then retain the receipt ID.
POSThttps://leadproof.jessesay.chatgpt.site/api/v1/leads
import crypto from "node:crypto";

app.post("/synthflow/post-call", express.json(), async (req, res) => {
  const callId = req.body?.call?.call_id;
  const signature = req.get("HTTP_SYNTHFLOW_SIGNATURE");
  const secret = process.env.SYNTHFLOW_WEBHOOK_SECRET;
  if (!callId || !signature || !secret) return res.sendStatus(401);

  const expected = crypto
    .createHmac("sha256", secret)
    .update(callId)
    .digest();
  const supplied = Buffer.from(signature, "base64");
  const authentic =
    supplied.length === expected.length &&
    crypto.timingSafeEqual(supplied, expected);
  if (!authentic) return res.sendStatus(401);

  const fields = req.body.collected_variables;
  const lead = {
    name: fields?.customer_name?.value ?? req.body.lead?.name,
    email: fields?.email?.value,
    phone: fields?.phone?.value ?? req.body.lead?.phone_number
  };

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

export async function deliverSynthflowLead({ 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: "synthflow_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.

Where does Synthflow send the post-call result?

Set external_webhook_url on the call request. Synthflow sends a structured payload there after the call completes.

What exactly does Synthflow sign?

Synthflow documents an HMAC-SHA256 signature of call_id, base64 encoded in HTTP_SYNTHFLOW_SIGNATURE. Verify it with the workspace webhook secret.

Which fields should reach the CRM?

Use the specific collected_variables configured for the agent, plus only the contact fields the buyer authorized. Do not copy the complete call object.

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