Create crm.lead records in Odoo from any webform via a secure webhook.
The workflow validates required fields, resolves UTMs by name (source, medium, campaign) and writes standard lead fields in Odoo. Clean, portable, and production-ready.
x-webhook-token)firstname, lastname, email)utm.source, utm.medium, utm.campaign)name, contact_name, email_from, phone, description, type, UTM IDs)200 success / 400 bad requestWEBHOOK_URL / N8N_HOST / N8N_PROTOCOL / N8N_PORT are consistentx-webhook-token: <your-secret>)/webhook(-test)/lead-webform with Header Auth.400 Bad Request.getAll queries fetch IDs by name:
utm.source → source_idutm.medium → medium_idutm.campaign → campaign_idnull.{ name, contact_name, email_from, phone, description, type: "lead", campaign_id, source_id, medium_id }crm.lead → create) writes the lead with standard fields + UTM Many2one IDs.200 with { status: "ok", lead_id }.Required: firstname, lastname, email
Optional: phone, notes, source, medium, campaign
{
"firstname": "John",
"lastname": "Doe",
"email": "[email protected]",
"phone": "+393331234567",
"notes": "Wants a demo",
"source": "Ads",
"medium": "Website",
"campaign": "Spring 2025"
}
curl -X POST "https://<host>/webhook-test/lead-webform" \
-H "Content-Type: application/json" \
-H "x-webhook-token: <secret>" \
-d '{"firstname":"John","lastname":"Doe","email":"[email protected]",
"phone":"+39333...", "notes":"Demo",
"source":"Ads","medium":"Website","campaign":"Spring 2025"}'
mobile field on leads/partners: use phone instead.getAll and a create on utm.*.