Automation completion is not CRM proof
The outbound request can complete while a downstream sales-system write times out, rejects a field, or disappears without a portable receipt.
Wix form CRM delivery
Map only approved Wix Forms fields into a controlled server-side relay, preserve one stable source event ID, and return a LeadProof receipt to the automation.
Paid plan uses secure Stripe checkout · plan assigned after verified payment · activate with the checkout emailWix Automations can send an HTTP request after a Wix Forms trigger, but a completed automation step is not lasting proof that a later CRM write succeeded. Sending the entire trigger payload also exposes every form field, while putting a LeadProof API key in the webhook URL would expose a production credential. A safe bridge uses Wix's custom body structure, a separate ingress token, and a stable source ID before calling LeadProof server-side.
Wix Forms trigger -> Wix Send HTTP request -> authenticated relay -> LeadProof -> CRMThe outbound request can complete while a downstream sales-system write times out, rejects a field, or disappears without a portable receipt.
Wix can send every form field, even when the destination only needs an approved name, email, phone, and source ID.
The LeadProof production key must remain in server-side configuration rather than a Wix path or query parameter.
Implementation
Keep the tools that create and process the lead. Standardize only the fragile handoff between them.
Platform reference: Wix HTTP request automation documentation ↗Open sandbox instructions →https://leadproof.jessesay.chatgpt.site/api/v1/leadsimport crypto from "node:crypto";
app.post("/wix/form/:ingressToken", express.json({ limit: "32kb" }), async (req, res) => {
const expected = process.env.WIX_INGRESS_TOKEN;
const supplied = req.params.ingressToken;
if (!expected || !supplied) return res.sendStatus(401);
const expectedBytes = Buffer.from(expected);
const suppliedBytes = Buffer.from(supplied);
const authentic =
expectedBytes.length === suppliedBytes.length &&
crypto.timingSafeEqual(expectedBytes, suppliedBytes);
if (!authentic) return res.sendStatus(401);
const { event_id: eventId, name, email, phone } = req.body;
if (!eventId || !name || !email) {
return res.status(422).json({ error: "Missing approved lead fields" });
}
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": eventId
},
body: JSON.stringify({
destination: process.env.CRM_WEBHOOK_URL,
name,
email,
phone,
source: "wix_form"
})
}
);
const delivery = await response.json();
if (!response.ok) return res.status(502).json({ status: "delivery_failed" });
return res.json({
status: delivery.status,
receipt_id: delivery.receipt?.id
});
});Questions
Use a controlled relay so the required LeadProof Authorization header and CRM destination remain server-side. Do not place the LeadProof API key in a Wix URL or request body.
No. Wix documents a Customize structure option; map only the fields the destination is authorized to receive.
Use the stable form submission or contact identifier exposed by the selected Wix trigger. Confirm it remains unchanged in Wix test requests before activation.
Get an explainable risk score, prioritized fixes, and the right LeadProof plan.