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_id
utm.medium
→ medium_id
utm.campaign
→ campaign_id
null
.{ 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.*
.