CampaignStack with Zapier: any of 9,000 apps in, any exit out
Zapier is how a form submission, a CRM stage change or a new row anywhere becomes a lead in a CampaignStack workflow, and how a reply or a booked meeting in CampaignStack becomes a task, a Slack message or a CRM update anywhere else. Two Zaps cover it: one posts leads in over a signed webhook, one listens for the webhook step CampaignStack fires on the exit you choose.
The glue. Triggers in thousands of apps, the field mapping between them, filters and paths, and the fact that a non-developer can wire it in an afternoon. If the lead is born in a tool Zapier already talks to, Zapier is the shortest path to get it into a workflow, and the shortest path to tell the rest of the stack what happened to it.
The outreach itself. Zapier has no LinkedIn sending action, and an HTTP action would be sending from Zapier's IP with no session, no budget and no memory of yesterday. CampaignStack holds the account session and its proxy, the daily and weekly budgets, the AI drafts and the review queue, and the reply that cancels the rest of the sequence. A Zap hands the lead over and hears back when something happens.
Where each Zap attaches
Two Zaps, what triggers them, and what arrives on the other side.
| On the Zapier side | On the CampaignStack side | |
|---|---|---|
| Leads in | Any trigger, a Code step that signs the JSON body, then Webhooks by Zapier posting it with the signature header. | A workflow's Webhook source. Leads land workspace-scoped, get enriched and scored, and enter the graph. |
| Outcomes out | A Zap starting from a Webhooks by Zapier Catch Hook, then whatever apps should know: CRM, Slack, a sheet. | A Webhook step on the exit that matters: replied, meeting booked, not interested, finished. It posts the body you template. |
| Agents | Zapier's own agents can call HTTP endpoints, but they are not an MCP client. | For an agent that drives CampaignStack directly, use Claude, n8n or any MCP client with a user key. Zapier stays the glue. |
Set it up
Inbound first, then the outcomes Zap. Webhooks by Zapier is a premium app on Zapier's side; the CampaignStack side is included in every workspace.
- 1
Create the webhook source in CampaignStack
Open the workflow, click its source node, add a provider and choose Webhook. You get the endpoint URL, a signing secret and a curl example, each with a Copy button. The token in the URL identifies the source; the secret signs the body.
PAYLOAD='{"leads":[{"linkedinUrl":"https://linkedin.com/in/janedoe","fullName":"Jane Doe"}]}' SIG=$(printf '%s' "$PAYLOAD" | openssl dgst -sha256 -hmac "<your-secret>" | cut -d" " -f2) curl -X POST 'https://actions.campaignstack.io/api/webhooks/workflow-leads/<your-token>' \ -H 'Content-Type: application/json' \ -H "X-Webhook-Signature: $SIG" \ -d "$PAYLOAD" - 2
Sign the body in a Code step
Zapier cannot compute an HMAC in the Webhooks action itself, so add a Code by Zapier step before it. Pass it the JSON string as payload and the secret as secret; it returns the hex signature and the untouched payload. Build the JSON in a Formatter step or directly in the Code step's inputs, so the string that is signed is byte for byte the string that is sent.
// Code by Zapier (JavaScript). Inputs: payload (the JSON string), secret const crypto = require("crypto"); const signature = crypto .createHmac("sha256", inputData.secret) .update(inputData.payload) .digest("hex"); output = [{ signature, payload: inputData.payload }]; - 3
POST with Webhooks by Zapier
Action: Custom Request, method POST, the URL from step 1, Data set to the payload output of the Code step, and two headers: Content-Type application/json and the signature header with the Code step's signature. Only linkedinUrl is required per lead; up to 100 leads per request.
{ "leads": [ { "linkedinUrl": "https://linkedin.com/in/janedoe", "fullName": "Jane Doe", "email": "jane@acme.com", "title": "VP Sales", "companyName": "Acme" } ] } # headers Content-Type: application/json X-Webhook-Signature: <signature from the Code step> - 4
Hear back with a Catch Hook
New Zap, trigger Webhooks by Zapier, Catch Hook; copy the hook URL. In CampaignStack, add a Webhook step on the exit you want to react to, paste the URL, pick POST and template the body with lead fields. Test the step once so Zapier sees a sample, then map the fields into the apps that should know.
{ "name": "{{lead:fullName}}", "title": "{{lead:title}}", "company": "{{lead:company}}", "linkedin": "{{lead:linkedinUrl}}", "email": "{{lead:email}}" }
The URL is not the secret
A webhook URL travels: it ends up in a Zap's history, in a screenshot, in a support ticket. If the URL alone could create leads in your workflow, anyone holding it could fill your review queue with junk or poison a list you are about to send to. The signature is the second factor: the secret never leaves the Code step, and a request without a valid signature is dropped before it touches a lead.
Webhook leads are yours, not the shared database's
Leads that arrive over a webhook are user-supplied, so they land workspace-scoped: they never enter the shared lead database other workspaces read from and never cross a workspace boundary. They are enriched, scored and worked like any other lead, and your exclusions are checked at every send.
Frequently asked questions
Do I need the Code step?
Yes. The endpoint requires an HMAC-SHA256 signature of the raw body, and Webhooks by Zapier has no signing option. The Code step is eight lines and runs on every Zap plan that includes it.
Can one Zap feed several workflows?
Each workflow source has its own URL and secret. Use Paths in the Zap to post to the right one, or one Zap per workflow; both are fine.
What does the outbound step send if the lead has no email?
The template's field renders empty. Every lead field is optional in the body template, so map the ones you rely on and let the rest be blank.
Is there a comparison of the two?
Yes, at /vs/zapier, for the buyer still weighing the names. This page assumes you run both.
Every claim about the vendor on this page was checked against these pages on its own site:
Running something else next to it?
Get started
Start building your stack.
Your LinkedIn accounts will be safer with CampaignStack than doing it by hand. That's not a pitch. It's a measurable claim.