A form that sends an email is a form that sends a lead into an inbox, where it competes with everything else and waits for a human. A form that creates a contact and an opportunity in the CRM starts the follow-up the moment it is submitted. The difference in conversion is large, and the technical work to connect WordPress forms to your CRM is small — if you pick the right method for your setup and map the fields properly.
This guide covers the four ways to connect a WordPress form to a CRM, using GoHighLevel, HubSpot and Zoho as the examples, and the testing routine that catches the silent failures. It pairs with the CRM setup guide (what the CRM should do with the lead once it arrives) and the speed-to-lead article (why arriving instantly matters).
First: what the CRM needs from the form
Before choosing a method, decide what should arrive. The minimum that makes automation possible:
- Name (split into first and last if the CRM wants that), email, phone in international format.
- The service or enquiry type — a dropdown, not a free-text field, so the CRM can branch on it.
- The message.
- Hidden fields: source (which form / which page), and the UTM parameters captured from the URL, so the lead carries its channel. Without this, the tracking stops at the form.
- The consent checkbox state, if you will text them (A2P reviewers ask about this — see the A2P registration walkthrough).
The four methods
| Method | Best for | Pros | Cons |
|---|---|---|---|
| Native integration (plugin/add-on) | HubSpot, Zoho with their official WordPress plugins | No code, field mapping UI | Another plugin; limited to what the vendor exposes |
| Webhook from the form | GoHighLevel, any CRM with an inbound webhook | Direct, instant, free, no middleman | Field mapping done in the CRM; needs a form with a webhook action |
| Zapier / Make | Odd combinations, multiple destinations | Flexible, visual | Monthly cost, task limits, another thing to break |
| Small custom plugin | High volume, special formatting, agencies with many sites | Complete control; stores every lead locally | Needs a developer; needs maintaining |
Method 1: Native integrations
HubSpot has an official WordPress plugin that can replace your form entirely or capture submissions from other form plugins into HubSpot contacts. Fine for simple use, heavy if you only want the capture part. Zoho offers SalesIQ and CRM plugins with form capture. For both, the trade-off is convenience against plugin weight and the vendor’s field limits. If you use one, still add the hidden source/UTM fields; the plugins do not do that for you.
Method 2: Webhook (the one I use most)
Elementor Pro forms have a Webhook action; Gravity Forms, WPForms and Fluent Forms have webhook add-ons. The form posts its fields to a URL the moment a submission is valid. In GoHighLevel:
- Create a workflow with the trigger Inbound Webhook. Copy the URL it gives you.
- In the Elementor form, Actions After Submit → add Webhook, paste the URL, enable “Advanced Data” if you want the page URL and user agent included.
- Submit the form once with test data. Back in GoHighLevel the trigger shows the received payload; map fields to contact fields (first name, email, phone, custom fields for service, source, UTMs).
- Add the actions: create/update contact, create opportunity in “New lead” with the source tag, send the instant reply, notify the owner.
- Submit again from a phone and confirm the contact, opportunity, tag and message all appear.
HubSpot and Zoho accept webhooks too (via their APIs or workflow triggers), though for those two the native plugin is often simpler. For GoHighLevel the webhook is the cleanest route and needs no third-party tool.
Method 3: Zapier or Make
Form → Zapier/Make → CRM. Use it when you need the same submission in two or three places (CRM, a Google Sheet, Slack) or when the CRM has no webhook trigger. Watch the task quota: a busy site with several forms can exceed a plan’s limit mid-month, and submissions silently queue or drop. If you go this way, my comparison of Zapier and Make for business automation covers which fits which budget.
Method 4: A small custom plugin
For agencies with dozens of client sites, or businesses that want every lead stored on their own server as well as in the CRM, a small custom plugin that hooks the form’s submission event, stores the entry, and posts to the CRM with retries is the robust option. It is what I run on my own site: every lead is kept locally with its status, and forwarded to GoHighLevel only when configured. It costs developer time once and then simply works; that is part of the WordPress integration work I do.
Field mapping mistakes that lose leads
- Phone numbers in local format. “07700 900123” is not textable by a US-registered CRM. Normalise to +44… on the form (a small script) or in the workflow.
- Full name into a first-name field. The instant SMS then reads “Hi Sarah Jones Smith”. Split it on the form or with a formatter step.
- No source field. Every lead looks the same; no report on channels. Add a hidden field with a fixed value per form.
- UTMs not captured. Hidden fields need a snippet that reads the URL parameters on page load and stores them (and remembers them across pages with a cookie or session storage).
- Consent not recorded. If the checkbox value never reaches the CRM, you cannot prove opt-in later.
- Webhook fires on invalid submissions. It should fire only after validation succeeds; check the form plugin’s setting.
The test routine (do it every time you change a form)
- Submit from a phone in a private window with a test name like “Test Webhook 14 Sept”.
- Confirm in the CRM: contact created, phone in +format, opportunity in the right stage, source tag, UTM fields, consent value.
- Confirm the automated reply arrived on your test phone and email.
- Confirm the backup email notification arrived.
- Delete the test contact so it does not skew reports.
Keep the email notification. Not as the workflow, but as the audit trail. When a webhook fails for an hour (it happens — the CRM has an outage, a plugin update changes a field name), the emails are how you find the leads that did not arrive.
Which method should you use?
- GoHighLevel + Elementor or Gravity/WPForms: webhook.
- HubSpot or Zoho, one or two forms, no developer: native plugin, plus hidden source fields.
- Same lead to several tools: Make or Zapier.
- Many sites or strict requirements: custom plugin.
Further reading: Elementor Help Center · GoHighLevel Help Center.
FAQ
What is the most reliable way to connect a WordPress form to a CRM?
A direct webhook from the form to the CRM’s inbound endpoint, with the submission also stored in WordPress as a backup. It has no middleman to fail and no monthly task quota.
Can Elementor forms send to GoHighLevel without Zapier?
Yes. Elementor Pro’s form widget has a Webhook action; point it at a GoHighLevel inbound webhook trigger in a workflow and map the fields there. No third-party tool needed.
Should I still email form submissions if they go to the CRM?
Keep a notification email as a backup and an audit trail, but treat the CRM as the system of record. Email-only handling is how leads get lost.
What about the phone number format?
Store numbers in international format (+1…, +44…) and strip spaces before sending. CRMs that receive “0300 123 4567” cannot text it; “+443001234567” works everywhere.
Forms going to an inbox instead of your CRM? Book a call — connecting them properly, with source tracking and a test routine, is usually a half-day job.