No Products in the Cart
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 requestsWEBHOOK_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_id
utm.medium → medium_id
utm.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": "john.doe@example.com",
"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":"john@ex.com",
"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.* .