Integrations

n8n

Trigger n8n workflows from Prosyo events, verify webhook signatures, and add leads and enroll them in LinkedIn campaigns from n8n.

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#

  1. Create a new workflow.
  2. Add a Webhook node.
  3. Set HTTP Method to POST.
  4. Set Path, for example prosyo.
  5. Set Respond to Immediately.
  6. Under Options, turn on Raw Body. You need it to verify the signature.
  7. Copy the Production URL, for example https://yourname.app.n8n.cloud/webhook/prosyo.
Important

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#

  1. Go to Integrations → Custom webhook.
  2. Paste the n8n Production URL into HTTPS endpoint and click Connect.
  3. Copy the Signing secret.
  4. Choose your Events.
  5. Click Test connection. The execution appears in n8n.

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:

JavaScript
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):

RouteExample next step
conversation.reply_receivedSend an SMS, create a CRM task, post to Teams
prospect.stage_changed where data.stage = meetingAdd a row to Google Sheets, create a deal in Pipedrive
account.needs_reconnectEmail the account owner
prospect.createdLook up the company in Clearbit or Apollo

Recipe: replies → Google Sheets#

  1. Webhook (Prosyo, conversation.reply_received)
  2. Google Sheets → Append row with data.full_name, data.company, data.email, data.stage and created_at

Recipe: meetings → Pipedrive deal#

  1. Webhook (Prosyo, prospect.stage_changed)
  2. If data.stage equals meeting
  3. Pipedrive → Create person and Create deal

Add leads to Prosyo from n8n#

Use the same API token as the Chrome extension.

  1. In Prosyo, go to Integrations → Chrome extension & API and click Generate API token. Copy it.
  2. In n8n, create a Header Auth credential:
    • Name: Authorization
    • Value: Bearer YOUR_TOKEN
  3. 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
JSON
{
  "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.
  • listName adds the leads to that list, creating it if needed. Or pass an existing listId.
  • 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:

CallUse
GET /api/v1/ext/sessionCheck the token and remaining import quota
GET /api/v1/ext/boardsGet your lists, tags and stages
GET /api/v1/ext/inboxRead 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.