Add leads from a website form or popup (and auto-start a campaign)

The short version

You can connect any website form or popup — a newsletter signup, a demo request, a lead-magnet download — straight to WarmySender. When someone submits the form, your form tool sends their details to WarmySender, the new lead drops into one of your lists, and if a Running campaign is linked to that list, the lead is enrolled automatically and your cold email sequence begins. No spreadsheet exports, no copy-paste, no daily clean-up.

The trick is one extra value in the request: your list ID. Send a lead's email along with a listId, and WarmySender adds them to that list and folds them into whatever campaign you've linked to it. You manage the campaign once; every new signup flows in continuously.

WarmySender is a 4-pillar outreach platform — Cold Emailing, Email Warmup, LinkedIn Outreach, and Multichannel sequences. This guide focuses on the most common case for form-captured leads: cold emailing. The same leads work across every pillar.

How it works, in three pieces

Three things connect to make this run on autopilot:

Set it up once and leave it. Every new submission lands in the list and joins the linked campaign on its own.

Step 1 — Create an API key

Go to Settings › API Keys › Create API Key. Give the key the prospects:write permission (to create leads). The key is shown only once at creation and starts with ws_ — copy it and store it somewhere safe, like your form tool's secret store or a password manager. Never paste it into public code.

Paste the key exactly, with no leading or trailing spaces and no line breaks. A key copied with a stray space or newline is rejected and won't connect. You send it on every request as a Bearer token: Authorization: Bearer ws_your_api_key_here.

Step 2 — Find your list ID

Open the Lists page in WarmySender and pick the list you want new signups to flow into (or create one). Hover the list, click the ··· menu on the right, and choose Copy List ID — it's copied to your clipboard, ready to paste. That value is what you'll send as listId in your form tool's request body.

Make sure a campaign built from this list is set to Running. That's the piece that turns each new lead into an active recipient. (If you haven't linked a campaign yet, you can do that any time — see the note below on changing campaigns.)

Step 3 — Send the request when the form is submitted

Point your form's submit action at WarmySender. The request adds the lead to your list and, because enroll defaults to true, enrolls them into any Running campaign linked to that list.

curl example

curl -X POST https://warmysender.com/api/v1/prospects \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","firstName":"Sam","listId":"YOUR_LIST_ID","enroll":true}'

JavaScript (fetch) example

If your form runs JavaScript, you can call the API directly from your form's submit handler. (For a public website, route this through your own server or a no-code tool so your API key is never exposed in the browser — see the no-code section below.)

const res = await fetch("https://warmysender.com/api/v1/prospects", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    email: "[email protected]",
    firstName: "Sam",
    listId: "YOUR_LIST_ID",
    enroll: true,
  }),
});

const data = await res.json();
console.log(data.list);
// { attached: true, enrolledCampaigns: 1 }

That's it. The lead is saved (201 for a brand-new lead, 200 if that email already existed), added to your list, and enrolled in the linked Running campaign — all in one call.

The fields you send

Re-sending the same email won't create duplicates — leads are matched by email address, so a returning visitor updates the existing record instead of adding a second one.

Reading the response

The response confirms exactly what happened so you can verify your setup:

{
  "data": { "id": "...", "email": "[email protected]", "firstName": "Sam", ... },
  "alreadyExisted": false,
  "listId": "YOUR_LIST_ID",
  "list": { "attached": true, "enrolledCampaigns": 1 }
}

Your lead is always saved, even if the list step can't complete. If the list ID doesn't match one of your lists, you still get a saved lead plus a clear note — the request never fails outright:

{
  "data": { "id": "...", "email": "[email protected]", ... },
  "alreadyExisted": false,
  "listId": "WRONG_ID",
  "list": { "attached": false, "error": "list_not_found", "message": "Lead saved, but that list was not found. Check the list ID and try again." }
}

If you see list_not_found, open the Lists page, click the ··· menu on your list, choose Copy List ID, and paste the fresh value into your form tool.

A worked example

You run a newsletter signup popup on your marketing site. In WarmySender you create a list called "Newsletter signups," build a 3-step welcome campaign from it, and set the campaign to Running. You copy the list ID and wire your popup to post each new signup's email and that list ID to the API.

From then on, every time a visitor subscribes, their email is sent to WarmySender, they're added to "Newsletter signups," and they're enrolled into your welcome campaign automatically. The response comes back with "list": { "attached": true, "enrolledCampaigns": 1 }, so you know it worked. Your welcome sequence starts for each new subscriber — paced within your sending window — with zero manual work.

Changing the campaign later (without touching your form)

Because your form points at a list rather than a specific campaign, you can swap out the campaign whenever you like. Want next quarter's signups to get a new sequence? Link a new Running campaign to the same list. Your form keeps posting to the same list ID; the leads simply flow into whatever Running campaign that list is connected to now. This is the main advantage of the list-based approach: your form setup never has to change.

Prefer to send leads straight into one fixed campaign instead? You can do that with a single enrollInCampaignId value — see Automatically email new leads from a form or popup.

Connecting a popup or form with no code

Almost any form or popup builder can send a request when someone submits — so you usually don't need to write any JavaScript, and your API key stays out of the browser. Point that request at the recipe above:

Store your API key in your tool's credentials or secret manager rather than typing it into the step, so it isn't visible to teammates or in your site's source.

"Can I send them a file?"

A common follow-up is wanting to email each new lead a file — a guide, a price sheet, a welcome PDF. Campaign emails send links, not attachments. Host the file somewhere (your website, a file host, a cloud drive with a shareable link) and put that link in your campaign email. Links are better for deliverability than attachments — large attachments slow delivery and are more likely to trip spam filters — and you can update the file later without re-sending. So: upload the file once, drop the link into your sequence, and every enrolled lead gets it.

What to expect — paced for deliverability, not instant

New leads don't get emailed the instant they sign up, and that's a feature, not a delay. WarmySender sends within each campaign's sending window (the hours and days you chose), respects your daily sending limits, and follows your warmup ramp — so your volume stays in a range inbox providers trust. Blasting every new signup the second they subscribe is exactly the pattern that lands senders in spam. By pacing sends, WarmySender protects your domain's reputation so more of your emails reach the inbox over the long run. Leads captured outside your sending window simply go out when the next window opens.

Leads that shouldn't be emailed — anyone on your suppression or unsubscribe list, or a hard-bounced address — are automatically skipped. They're still saved, but they won't be contacted. Account safety always wins.

Common questions

Where do I find my list ID?

Open the Lists page in WarmySender, hover the list you want new signups to land in, click the ··· menu, and choose Copy List ID. That copied value is what you send as listId in the request. If you ever get a list_not_found note back, just copy the ID again the same way — that error only means the ID didn't match a list in your workspace.

Do new leads start getting emails automatically?

Yes — as long as a campaign linked to that list is set to Running and enroll is true (it's true by default). Each new lead is added to the list and enrolled into the Running campaign, and the sequence starts for them on the next send cycle within your sending window. The response shows enrolledCampaigns so you can confirm.

What if I just want to collect leads now and email them later?

Send "enroll": false. The lead is added to your list but not enrolled into any campaign, so nothing is emailed. When you're ready, link a Running campaign to the list (which enrolls everyone on it) or enroll the list into a campaign from the app.

Can I send each new lead a file, like a PDF guide?

Campaign emails send links, not attachments. Host the file and put the link in your campaign email — that's better for deliverability and lets you update the file later. Every enrolled lead gets the link automatically as part of the sequence.

Will the same person be added twice if they submit again?

No. Leads are matched by email address, so a repeat submission updates the existing lead rather than creating a duplicate, and they won't be enrolled into the same campaign twice.

My response says list_not_found. What happened?

The listId you sent didn't match a list in your workspace. Your lead was still saved — only the list step was skipped. On the Lists page, click the ··· menu on the right list and choose Copy List ID, paste the correct value into your form tool, then submit a test lead and confirm the response shows "list": { "attached": true }.

Can I change which campaign new signups go into?

Yes, without touching your form. Your form posts to a list, so just link a different Running campaign to that same list. New leads then flow into the new campaign. If you'd rather send leads into one fixed campaign by ID, use enrollInCampaignId as described in Automatically email new leads from a form or popup.

Stuck wiring up your form? Email [email protected] with the form tool you're using and your list ID, and we'll help you get new signups flowing into your campaign.