Webhook = canalul tău de date primary
Cel mai robust mod de a duce datele formularului în alt sistem (CRM, ERP, data lake, Slack, Telegram via bot) e prin webhook. Megaforms POST-uiește către URL-ul tău un payload JSON cu submission completă la fiecare event configurat (`submission.created`, `submission.updated`, `payment.succeeded`, `submission.deleted`). Endpoint-ul tău răspunde 2xx → marcat livrat. Răspunde 4xx/5xx → retry. Webhooks sunt async (NU blochează submit-ul pentru respondent).
HMAC-SHA256 signature + rotation
Fiecare webhook delivery include header `X-Megaforms-Signature: t=<timestamp>,v1=<hmac>`. Receiver verifică recalculând HMAC(secret, timestamp + body). Inegalitatea HMAC = reject (replay attack prevention via timestamp tolerance ±5 min). Secret-ul webhook poate fi rotated din dashboard cu **24h grace period** — vechiul secret continuă să fie acceptat 24h după rotation, oferind timp pentru deploy update la receiver fără downtime.
// Receiver-side verification (Node.js)
import crypto from 'crypto';
function verifyMegaformsSignature(req, secret) {
const sig = req.headers['x-megaforms-signature'];
const [tsPart, sigPart] = sig.split(',');
const t = tsPart.split('=')[1];
const v1 = sigPart.split('=')[1];
// Replay window
if (Math.abs(Date.now()/1000 - parseInt(t)) > 300) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(t + '.' + req.rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(v1)
);
}Retry exponential cu jitter
Dacă endpoint-ul răspunde non-2xx sau timeout (10s default), Megaforms retry-ește cu backoff exponential + jitter: 30s, 2min, 10min, 1h, 6h, 24h. După 6 tentative eșuate, webhook intră în «dead letter queue» — owner notificat email + poate retry manual din dashboard. Pentru evita thundering herd la receiver care revine după downtime, jitter ±20% pe fiecare interval.
Templating Mustache pentru payload custom
Default payload e schema Megaforms standard. Dacă receiver-ul tău (ex. Pipedrive, HubSpot, CRM custom) cere alt format, definești template Mustache în webhook config. Toate câmpurile submission accesibile ca `{{form.fields.email}}`, `{{submission.created_at}}`, plus helpers (`{{date_format created_at 'DD/MM/YYYY'}}`, `{{score_label total_score}}`).
Template Pipedrive Deal:
{
"title": "{{form.fields.name}} - {{form.title}}",
"value": {{form.fields.budget | default 0}},
"currency": "EUR",
"person": {
"email": "{{form.fields.email}}",
"phone": "{{form.fields.phone}}"
},
"stage_id": {{#if (gt score 70)}}5{{else}}2{{/if}},
"custom_fields": {
"form_source": "{{form.slug}}",
"submission_id": "{{submission.id}}"
}
}Filtre + multiple endpoints
Per formular poți configura N webhooks cu filtre. Exemplu: webhook A trimite TOATE submissions la CRM intern; webhook B trimite DOAR submissions cu score >70 la Slack #hot-leads channel; webhook C trimite DOAR submissions cu payment.succeeded la accounting system. Filtrele suportă expresii pe orice câmp (email contains, score >=, etc.).