Connect Prosyo to n8n in two directions:
- Prosyo → n8n: start a workflow when a prospect replies, changes stage, is enriched, and so on.
- n8n → Prosyo: add leads to a Prosyo list from any source n8n can read.
Works with n8n Cloud and self-hosted n8n. Self-hosted n8n must be reachable over public HTTPS.
Prosyo → n8n: trigger a workflow#
1. Add a Webhook trigger in n8n#
- Create a new workflow.
- Add a Webhook node.
- Set HTTP Method to
POST. - Set Path, for example
prosyo. - Set Respond to Immediately.
- Under Options, turn on Raw Body. You need it to verify the signature.
- Copy the Production URL, for example
https://yourname.app.n8n.cloud/webhook/prosyo.
Use the Production URL, not the Test URL, and activate the workflow. The Test URL only works while you're listening in the editor.
2. Connect the webhook in Prosyo#
- Go to Integrations → Custom webhook.
- Paste the n8n Production URL into HTTPS endpoint and click Connect.
- Copy the Signing secret.
- Choose your Events.
- Click Test connection. The execution appears in n8n.
3. Verify the signature (recommended)#
Add a Crypto node after the Webhook node:
- Action: Hmac
- Type: SHA256
- Value: the raw body
- Secret: your Prosyo signing secret. Store it in an n8n credential or variable, not in plain text.
- Encoding: hex
- Property name:
expectedSignature
Then add an If node that checks {{ $json.expectedSignature }} equals {{ $('Webhook').item.json.headers['x-prosyo-signature'] }}. Only continue on true.
Or use one Code node:
const crypto = require('crypto');
const secret = $env.PROSYO_WEBHOOK_SECRET; // or paste from a credential
const item = $input.first();
const raw = Buffer.from(item.binary.data.data, 'base64'); // raw body from the Webhook node
const expected = crypto.createHmac('sha256', secret).update(raw).digest('hex');
if (expected !== item.json.headers['x-prosyo-signature']) {
throw new Error('Invalid Prosyo signature');
}
return [{ json: JSON.parse(raw.toString('utf8')) }];On self-hosted n8n, allow the crypto module in Code nodes with NODE_FUNCTION_ALLOW_BUILTIN=crypto.
4. Route by event#
Add a Switch node on {{ $json.type }} (or the x-prosyo-event header):
| Route | Example next step |
|---|---|
conversation.reply_received | Send an SMS, create a CRM task, post to Teams |
prospect.stage_changed where data.stage = meeting | Add a row to Google Sheets, create a deal in Pipedrive |
account.needs_reconnect | Email the account owner |
prospect.created | Look up the company in Clearbit or Apollo |
Recipe: replies → Google Sheets#
- Webhook (Prosyo,
conversation.reply_received) - Google Sheets → Append row with
data.full_name,data.company,data.email,data.stageandcreated_at
Recipe: meetings → Pipedrive deal#
- Webhook (Prosyo,
prospect.stage_changed) - If
data.stageequalsmeeting - Pipedrive → Create person and Create deal
Add leads to Prosyo from n8n#
Use the same API token as the Chrome extension.
- In Prosyo, go to Integrations → Chrome extension & API and click Generate API token. Copy it.
- In n8n, create a Header Auth credential:
- Name:
Authorization - Value:
Bearer YOUR_TOKEN
- Name:
- Add an HTTP Request node:
- Method:
POST - URL:
https://app.prosyo.com/api/v1/ext/leads - Authentication: Generic → Header Auth → your credential
- Send Body: JSON
- Method:
{
"listName": "Inbound – website form",
"leads": [
{
"firstName": "{{ $json.first_name }}",
"lastName": "{{ $json.last_name }}",
"email": "{{ $json.email }}",
"title": "{{ $json.job_title }}",
"companyName": "{{ $json.company }}",
"website": "{{ $json.website }}",
"linkedinUrl": "{{ $json.linkedin }}"
}
]
}Lead fields: fullName, firstName, lastName, title, companyName, linkedinUrl, website, email, phone, locationName. Each lead needs at least a name, a LinkedIn URL or an email. If a value is empty, leave the field out or send null. An empty string in email is rejected as an invalid email.
Rules:
- Up to 100 leads per request. Use n8n's Loop Over Items node to batch.
listNameadds the leads to that list, creating it if needed. Or pass an existinglistId.- New leads count toward your monthly import limit. Existing prospects are updated instead.
- Up to 60 requests per minute per user.
Other useful calls with the same token:
| Call | Use |
|---|---|
GET /api/v1/ext/session | Check the token and remaining import quota |
GET /api/v1/ext/boards | Get your lists, tags and stages |
GET /api/v1/ext/inbox | Read the latest replies |
Start campaigns automatically#
Go one step further: add the lead and enroll them in a campaign in the same workflow. See Custom triggers for step-by-step recipes, and the API reference for every endpoint.
