splitforms.com
All articles/ INTEGRATIONS10 MIN READPublished June 21, 2026

How to Send Form Submissions to Pipedrive (No Zapier, 2026)

Route HTML form submissions into Pipedrive as Leads or Deals without Zapier — keep your own form HTML and deliver via a signed splitforms webhook and a small proxy to the Pipedrive API.

✶ Written by
splitforms.com / blog

Founder of splitforms — the form backend API for developers. Writes about form UX, anti-spam, and shipping web apps without backend code.

Why route around Pipedrive Web Forms

Pipedrive's Web Forms and LeadBooster are convenient, but the form is Pipedrive-hosted, the styling is constrained, and the better fields sit behind a paid add-on. For a high-conversion landing page you usually want a fully custom, fast form that lives in your own site with your own spam protection.

Owning the HTML and routing through splitforms gives you that: a form you style freely, an AI spam classifier, email notifications, and an auditable dashboard — while Pipedrive stays your pipeline. A small proxy turns each signed webhook into a Person + Lead.

Step 1 — Get your Pipedrive API token and domain

In Pipedrive, go to Settings → Personal preferences → API and copy your API token. Note your company domain (e.g. yourco.pipedrive.com) — API calls go to https://yourco.pipedrive.com/api/v1/....

For a team setup, consider creating the token under a dedicated service user so lead ownership is consistent. Store the token and domain as environment variables on your proxy host — never in the browser.

Step 2 — Map form fields to Pipedrive

A web contact form maps to two records: a Person (name, email, phone) and a Lead (title, owner, attached to that Person). Creating a Lead looks like this:

POST https://yourco.pipedrive.com/api/v1/leads?api_token=...
Content-Type: application/json

{
  "title": "Ada Lovelace — website inquiry",
  "person_id": 1234,
  "label_ids": [],
  "expected_close_date": null
}

The Person is created first so you have a person_id to attach. Custom fields (on either object) use the hashed key from Settings → Data fields, not a readable label.

Step 3 — The splitforms → Pipedrive proxy

splitforms fires a signed webhook to your endpoint; the proxy holds the API token, de-dupes the Person by email, and creates the Lead. Cloudflare Worker version:

export default {
  async fetch(req, env) {
    if (req.method !== "POST") return new Response("Method Not Allowed", { status: 405 });

    // 1. (Recommended) verify the splitforms HMAC signature header here.

    const submission = await req.json();
    const f = submission.data ?? submission;
    const base = `https://${env.PD_DOMAIN}/api/v1`;
    const tok = `api_token=${env.PD_API_TOKEN}`;

    // 2. De-dupe: find an existing Person by email
    let personId;
    if (f.email) {
      const s = await fetch(
        `${base}/persons/search?term=${encodeURIComponent(f.email)}&fields=email&${tok}`
      ).then((r) => r.json());
      personId = s.data?.items?.[0]?.item?.id;
    }

    // 3. Create the Person if not found
    if (!personId) {
      const p = await fetch(`${base}/persons?${tok}`, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          name: f.name ?? "Website lead",
          email: f.email ? [{ value: f.email, primary: true }] : [],
          phone: f.phone ? [{ value: f.phone, primary: true }] : [],
        }),
      }).then((r) => r.json());
      personId = p.data?.id;
    }

    // 4. Create the Lead attached to the Person
    const lead = await fetch(`${base}/leads?${tok}`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        title: `${f.name ?? "Website"} — inquiry`,
        person_id: personId,
      }),
    });

    if (!lead.ok) return new Response(await lead.text(), { status: 502 });
    return new Response("ok", { status: 200 });
  },
};

Deploy the Worker and paste its URL into your form's webhook settings in the splitforms dashboard. Add the note (message, budget) as a Lead Note or custom field in a follow-up call if you want it on the record. Verify the webhook signature — see send form data to a webhook.

Step 4 — The form

Your public form talks only to splitforms with the public access key. Swap YOUR_ACCESS_KEY for the one from your free account.

<form action="https://splitforms.com/api/submit" method="POST">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
  <input name="name" required placeholder="Full name" />
  <input name="email" type="email" required placeholder="Email" />
  <input name="phone" type="tel" placeholder="Phone" />
  <textarea name="message" placeholder="How can we help?"></textarea>

  <!-- honeypot -->
  <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off" />
  <button type="submit">Get in touch</button>
</form>

What to do next

FAQ

Why not just use Pipedrive's built-in Web Forms / LeadBooster?

Pipedrive's Web Forms are convenient but limited: styling is constrained, advanced fields and logic sit behind the paid LeadBooster add-on, and the form is hosted by Pipedrive rather than living natively in your site. If you want a fully custom, fast-loading form with your own spam protection and a submission dashboard you control, own the HTML and route it through splitforms, then create the Lead or Deal via the Pipedrive API. You keep Pipedrive as the pipeline without the form limitations.

Should I create a Lead or a Deal in Pipedrive?

Create a Lead for unqualified inbound (the Leads Inbox is designed for exactly this — raw inbound you triage before it becomes a Deal). Create a Deal directly only if your form already represents a qualified opportunity, like a demo request from an existing pipeline stage. Most web contact forms should create a Lead plus the associated Person; the proxy example shows the Leads endpoint.

Is it safe to call the Pipedrive API from the browser?

No. Your Pipedrive API token is a secret and must stay server-side. This setup keeps it safe: the browser posts to splitforms with only the public access key, splitforms fires a signed webhook to your proxy, and the proxy — holding the API token — creates the Pipedrive record. The token never appears in client code.

How do I avoid duplicate Persons in Pipedrive?

Pipedrive can create duplicate Persons if you blindly POST every submission. In your proxy, first search Persons by email (GET /persons/search), reuse the match if found, and only create a new Person when there's no match — then attach the Lead to that Person ID. The proxy example notes where to add the lookup.

Can I map custom fields and lead source?

Yes. Pipedrive custom fields are referenced by a hashed field key (from Settings → Data fields). Pass form values — utm_source, budget, message — and map them to those keys in the proxy. Standard fields like name, email, and phone on the Person are straightforward; custom fields just need the key instead of a readable name.

About the author
✻ ✻ ✻

Get your free contact form API key in 60 seconds.

500 free form submissions per month. No credit card. No SDK, no PHP, no plugin. Drop one POST endpoint in your form and submissions land in your dashboard. Starter adds inbox delivery.

Generate access key →Read the docs
founders pricing locked in · early access open