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:
- A list — a saved audience in WarmySender. You'll point your form at this list using its ID.
- A Running campaign linked to that list — when a campaign is built from a list and set to Running, anyone added to the list afterward is enrolled automatically. This is what makes new signups start receiving your sequence without any action from you.
- One API request from your form — when someone submits, your form tool posts the lead's email and the list ID to WarmySender.
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
- email (required) — the lead's email address. That's the only required field.
- listId — the ID of the list to add the lead to. Find it on the Lists page. When a Running campaign is linked to that list, the lead is enrolled into it automatically.
- enroll — defaults to
true. Leave it true to auto-enroll the lead into the linked Running campaign. Set it tofalseif you want to add the lead to the list only, without starting any campaign (handy for building an audience you'll email later). - firstName, lastName, company, role, phone (optional) — personalization details. The more you send, the more your emails can be personalized with merge variables.
- linkedinUrl (optional) — a LinkedIn profile URL, so the lead is ready for LinkedIn or multichannel outreach too.
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 }
}
- list.attached —
truemeans the lead was added to your list. - list.enrolledCampaigns — how many Running campaigns linked to that list the lead was just enrolled into. A value of
1(or more) means your sequence will start for them. - listId — echoes back the list you targeted (or
nullif you didn't send one).
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:
- Zapier — add a "Webhooks by Zapier" action, choose POST, set the URL to
https://warmysender.com/api/v1/prospects, add the Authorization and Content-Type headers, and map your form fields (email, firstName, …) plus a fixedlistIdinto the JSON body. - Make — use the "HTTP › Make a request" module with method POST, the same URL and headers, and a JSON body mapping your form fields plus your
listId. - n8n — use the "HTTP Request" node (POST), same URL and headers, body mapped from the form trigger.
- Any other tool — if it can POST with custom headers and a JSON body, it works. Typeform, Webflow, Framer, Tally, and most popup builders can do this directly or through one of the 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.
Related guides
- Automatically email new leads from a form or popup — The campaign-ID version: enroll a new lead straight into one specific campaign
- Create & enroll prospects with the API — Full walkthrough of the prospects and enrollment endpoints
- Find your ideal leads with filters — Build targeted audiences from the leads database
- Setting up your first campaign — Build the Running campaign your form feeds into
- API reference — Every endpoint, authentication, idempotency, rate limits, and error codes
- Full documentation — All guides
- Support — How to get in touch
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.