Español

Connecting Your CMS Form to Salesforce Without Paying for Premium Connectors

If you're paying $50-200 per month for a third-party connector to push web form submissions into Salesforce, there's a good chance you don't need to be. This guide focuses on Salesforce specifically; for a broader look at form-to-CRM patterns across any CRM, see Form-to-CRM Automation Patterns That Actually Scale.

Salesforce has had a free, built-in lead capture API called Web-to-Lead since the early 2000s. It accepts form submissions via a standard POST request, creates Lead records automatically, and supports custom field mapping. No integration platform required. No monthly fee. The official Salesforce Web-to-Lead documentation is the authoritative reference for field limits, spam filter settings, and org-specific configuration options.

The reason most teams don't use it is that Salesforce's own documentation for Web-to-Lead is written for developers. It shows you HTML form code and expects you to embed it directly in your website. Teams running WordPress, Webflow, or Framer rightfully look at that HTML snippet and wonder how it fits into their existing forms.

It fits easily. You just need to understand the mechanics, which this guide explains without assuming any prior development background.

This guide covers three implementation options:

  • Option A: Salesforce Web-to-Lead (native, free, best for most teams)
  • Option B: Zapier free tier (no-code, works within Zapier's free task limits)
  • Option C: n8n self-hosted (free, unlimited volume, requires a server)

Each option is self-contained. Read the one that matches your situation and skip the others.

Before You Choose: Understand What You Need

Answer these questions to pick the right option:

How many form submissions per month?

  • Under 500: Any option works, start with Web-to-Lead
  • 500-5,000: Web-to-Lead or n8n (Zapier costs add up)
  • Over 5,000: Web-to-Lead or n8n

Do you have technical resources?

  • No: Option A (Web-to-Lead) or Option B (Zapier)
  • Yes, or willing to follow a technical guide: All three options

Do you need custom field mapping beyond standard Salesforce Lead fields?

  • Standard fields only: Option A works perfectly
  • Custom fields: Option A with some configuration, or Options B/C

What CMS are you on?

  • WordPress, Webflow, Framer, Squarespace: All options work
  • Custom-built website: All options work, Option A is simplest

Option A: Salesforce Web-to-Lead (Native, Free)

Web-to-Lead is a Salesforce feature that generates a unique endpoint URL for your Salesforce org. Any form on any website can POST data to that URL and Salesforce will create a Lead record.

Step 1: Generate Your Web-to-Lead Form in Salesforce

In Salesforce, go to: Setup → Marketing → Lead Management → Web-to-Lead

Click "Create Web-to-Lead Form."

You'll see a field selector on the left. Add the fields you want to capture. Standard Lead fields you'll commonly use:

  • First Name
  • Last Name
  • Email
  • Phone
  • Company
  • Title (job title)
  • Lead Source (you'll set this to a fixed value like "Website")
  • Description (for a free-text message or question field)

If you have custom Lead fields on your Salesforce org, they appear in this list too.

On the right side, you'll see:

  • Return URL: Where Salesforce redirects the user after form submission. Point this to a thank-you page on your website.
  • Response Email: An email Salesforce sends to the lead after capture (optional).

Click "Generate." Salesforce produces an HTML snippet that looks like this:

<form action="https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST">
  <input type="hidden" name="oid" value="YOUR_ORG_ID">
  <input type="hidden" name="retURL" value="https://yoursite.com/thank-you">
  
  First Name: <input  id="first_name" maxlength="40" name="first_name" size="20" type="text" />
  Last Name: <input  id="last_name" maxlength="80" name="last_name" size="20" type="text" />
  Email: <input  id="email" maxlength="80" name="email" size="20" type="text" />
  Company: <input  id="company" maxlength="40" name="company" size="20" type="text" />
  <input type="submit" name="submit">
</form>

The critical elements in this snippet:

  • action="https://webto.salesforce.com/..." — this is the endpoint your form sends to
  • name="oid" with your org ID — this routes the submission to your Salesforce org
  • name="retURL" — where to redirect after submission
  • The field name attributes — these must match exactly for Salesforce to map them correctly

Step 2: Connect Your Existing CMS Form to Web-to-Lead

You don't need to replace your form with the Salesforce HTML snippet. You just need to configure your existing form to POST to the Salesforce endpoint with the right field names.

For WordPress (Gravity Forms):

  1. In Gravity Forms, edit your form
  2. Go to Settings → Confirmations → Add New
  3. Set Confirmation Type to "Redirect" with your thank-you page URL
  4. Go to Settings → Add-Ons → Custom Post Type (if using a custom submission handler)

The cleaner approach for WordPress: use Gravity Forms' "Web API" add-on or the "Zapier" add-on to bridge to Salesforce. But if you want pure Web-to-Lead, install a plugin like "Web-to-Lead for Salesforce" which handles the field mapping interface.

For Webflow:

Webflow forms can redirect to a custom URL on submission and can be configured with custom field names. To connect to Web-to-Lead:

  1. In your Webflow form settings, change the form action to the Web-to-Lead URL: https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8
  2. Set the form method to POST
  3. Rename each form field's name attribute to match the Salesforce field names (first_name, last_name, email, company)
  4. Add a hidden field with name oid and value set to your Salesforce org ID
  5. Add a hidden field with name retURL and value set to your thank-you page URL

In Webflow's Designer, edit each input element. Under "Element Settings," find the "Name" field and set it to the Salesforce field name.

For Framer:

Framer's form component supports custom action URLs. Same approach as Webflow: update the action URL to the Web-to-Lead endpoint, rename fields to match Salesforce field names, add hidden oid and retURL fields.

Step 3: Handle Custom Salesforce Fields

If you need to map to custom Salesforce Lead fields (those you've created on your org), the process is similar but you need the field's API name.

In Salesforce, go to: Setup → Object Manager → Lead → Fields & Relationships

Find your custom field and note the "Field Name" column. It will end in __c (e.g., Website_Source__c).

In the Web-to-Lead form generator, custom fields appear in the field selector. When you select them, the generated HTML includes the correct input name format: 00N followed by your org-specific field ID.

This format looks like: <input type="hidden" name="00N1a000003abc" value="yourvalue">. Not as clean as standard field names, but it works. Copy the exact name attribute value from the generated HTML and use it in your CMS form.

Common Web-to-Lead Pitfalls

Spam filtering silently drops submissions: Salesforce's Web-to-Lead spam filter can reject submissions without any notification to you or the lead. You won't see an error. The form will submit normally, but no Lead will be created.

Signs of spam filtering: leads reporting they submitted a form but you have no record; lead count from form submissions doesn't match Salesforce Lead creation count.

Fix: add a hidden field to your form that Salesforce uses to whitelist submissions. In the Web-to-Lead setup, there's a "Captcha" option. Enable it and add the generated reCAPTCHA field to your form.

Default lead owner goes to a queue, not a person: Web-to-Lead assigns leads based on your Salesforce Lead Assignment Rules. If you haven't set up assignment rules, leads go to the default lead queue, not directly to a rep.

Fix: Set up at least one default assignment rule that assigns Web-to-Lead submissions to a specific user or runs your standard round-robin routing. Go to Setup → Marketing → Lead Assignment Rules. For more complex routing logic based on job title or company size, Routing Leads to Reps Based on Chat Conversation Context covers the routing decision framework even though it uses chat as the example.

Missing required fields cause silent failures: If Salesforce considers a field required on the Lead object but your form doesn't collect it, the submission will fail silently. No Lead is created, no error shown.

Fix: Check your Lead object for required fields (Setup → Object Manager → Lead → Fields & Relationships, look for "Required" column). The standard required field is Company, so make sure your form collects it.

Return URL redirect happens before record creation: Web-to-Lead redirects to your return URL as soon as it receives the POST, before it has actually processed and created the Lead. There's no way to pass a Salesforce record ID to your thank-you page.

This is expected behavior. Your thank-you page should not try to confirm that a Salesforce record was created, because the creation is asynchronous. Wikipedia's article on asynchronous processing patterns provides useful background on why fire-and-forget architectures like Web-to-Lead handle the redirect before the backend operation completes — a common source of confusion for non-technical ops teams configuring these integrations.

Option B: Zapier Free Tier

Zapier's free plan includes 100 tasks per month, which is enough for low-volume teams (less than 100 leads per month from web forms).

When to use Zapier instead of Web-to-Lead:

  • You want to add transformation logic before the Salesforce write (e.g., combine first + last name into full name, calculate a lead score)
  • Your form tool has a Zapier integration but not a direct Web-to-Lead option
  • You want to see the submission in Zapier's history for debugging

Setup (15-20 minutes)

  1. Connect your form tool as the trigger in Zapier

    • Most common: Typeform, Gravity Forms, HubSpot Forms, Webflow, Jotform, Google Forms
    • Select "New Submission" as the trigger event
    • Test to confirm Zapier receives a sample submission
  2. Add a Salesforce action

    • Select "Salesforce" as the app
    • Select "Create Lead" as the action (or "Find/Create Lead" for upsert behavior)
    • Authenticate your Salesforce account
  3. Map fields from your form to Salesforce Lead fields

    • Map email → Email
    • Map first_name → First Name
    • Map last_name → Last Name
    • Map company → Company
    • Map any custom fields you need
  4. Add a "Lead Source" field set to a fixed value: "Website" (or whichever source this form represents)

  5. Test with a real submission and confirm the Lead appears in Salesforce

The upsert limitation: Zapier's basic "Create Lead" action always creates a new record. If the same email submits your form twice, you get two Leads. To handle dedup, use the "Find Record" + conditional path approach:

Step 1: Zapier → Find Lead (search by email) Step 2: If Lead found → Update Lead / If not found → Create Lead

This uses 2-3 tasks per submission instead of 1. On the free plan's 100 tasks/month limit, this means you can handle about 30-50 unique form submissions per month before hitting the limit.

Option C: n8n Self-Hosted (Free, Unlimited Volume)

n8n is an open-source workflow automation tool that you can self-host. There's no per-task pricing. Once it's running, it's essentially free at any volume.

When to use n8n:

  • You're technical enough to set up a server (or already have one)
  • Volume exceeds Zapier's free tier
  • You want full control over logic without per-task pricing
  • You're already using n8n for other workflows

Setup Overview

1. Deploy n8n:

The easiest deployment for a non-developer: n8n Cloud (has a free tier with 5 active workflows). Or self-host on a $6/month VPS using Docker:

docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  -e N8N_BASIC_AUTH_ACTIVE=true \
  -e N8N_BASIC_AUTH_USER=admin \
  -e N8N_BASIC_AUTH_PASSWORD=yourpassword \
  -v ~/.n8n:/home/node/.n8n \
  n8nio/n8n

Access n8n at http://your-server:5678.

2. Create a Webhook trigger node:

In n8n, create a new workflow. Add a "Webhook" node as the trigger.

  • Method: POST
  • Authentication: None (or Header Auth for security)
  • Copy the webhook URL: https://your-n8n-instance/webhook/form-to-salesforce

3. Configure your form to POST to the n8n webhook:

Same approach as Web-to-Lead, but point the form action to your n8n webhook URL instead.

Or, if your form tool has a webhook option (Gravity Forms, Typeform, and Webflow all support this), configure it to send to your n8n URL.

4. Add field transformation (optional):

n8n's "Set" node lets you transform field values before writing to Salesforce. Common transformations:

  • Combine first name + last name into a full name
  • Normalize phone number format
  • Set lead source based on form ID or page URL

5. Add a Salesforce node:

Add a "Salesforce" node in n8n. Connect your Salesforce account. Action: "Create or Update Lead" (upsert).

Map fields from your webhook payload to Salesforce Lead fields.

n8n Workflow JSON Template (Form-to-Salesforce)

Below is a simplified workflow structure you can adapt:

{
  "nodes": [
    {
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "parameters": {
        "path": "form-to-salesforce",
        "responseMode": "onReceived",
        "responseCode": 200
      }
    },
    {
      "name": "Map Fields",
      "type": "n8n-nodes-base.set",
      "parameters": {
        "values": {
          "string": [
            { "name": "email", "value": "={{ $json.body.email }}" },
            { "name": "firstName", "value": "={{ $json.body.first_name }}" },
            { "name": "lastName", "value": "={{ $json.body.last_name }}" },
            { "name": "company", "value": "={{ $json.body.company }}" },
            { "name": "leadSource", "value": "Website" }
          ]
        }
      }
    },
    {
      "name": "Salesforce",
      "type": "n8n-nodes-base.salesforce",
      "parameters": {
        "resource": "lead",
        "operation": "upsert",
        "externalId": "Email",
        "email": "={{ $json.email }}",
        "additionalFields": {
          "firstName": "={{ $json.firstName }}",
          "lastName": "={{ $json.lastName }}",
          "company": "={{ $json.company }}",
          "leadSource": "={{ $json.leadSource }}"
        }
      }
    }
  ]
}

The upsert operation with externalId: "Email" handles the dedup logic: if a Lead with that email already exists, update it. If not, create it.

Test Submission Checklist

Before going live with any of the three options:

  • Submit a test form with your own contact details
  • Confirm a Salesforce Lead record is created within 2 minutes
  • Verify all mapped fields are populated correctly (no empty required fields)
  • Submit the same form twice (same email) — confirm dedup logic creates only one Lead (or updates)
  • Check the Lead Owner assignment — is it going to the right person/queue?
  • Verify the return URL redirect works (Web-to-Lead) or thank-you page shows (Zapier/n8n)
  • Confirm a submission with no email is rejected (validation)
  • Check the Lead in Salesforce for any fields showing "picklist value invalid" or other mapping errors

Measuring What Matters

Zero silent failures: Every form submission should produce a Salesforce Lead (or update an existing one). Compare weekly counts: form submission count (from your CMS or form tool analytics) vs. new Lead creation count in Salesforce. Any gap indicates silent failures. For teams who want custom webhook-based capture with full error logging, Webhook-Based Lead Capture for Custom Integrations covers that implementation.

Lead-to-Salesforce lag: Time from form submission to Lead creation. Web-to-Lead typically creates the record within seconds. Zapier may take 1-5 minutes depending on task queue. n8n should be near real-time.

$0 spent on connectors: If you've implemented any of these three options correctly, your recurring connector cost should be zero. Track this in your tool budget and redirect savings to content or ad spend. Gartner analysis of marketing technology spend consistently identifies integration and connector costs as one of the most common sources of bloat in martech stacks — eliminating unnecessary middleware licensing is a quick win for teams looking to rationalize spend without losing capability.

Learn More