Skip to main content

Tools and integrations

Slack and automation

Notifications, Zapier, Make and n8n.

What this page covers

Two separate things share this page. Slack notifications, which push deployment events into a channel your team already watches. And webhook-driven automation, which lets Zapier, Make and n8n act on Finn events without you writing a server.

Both are configured in the dashboard under Settings → Integrations. Neither has a management API. If you want to create or list endpoints programmatically, see api-webhooks for what the API does cover.

Slack

Slack is for ops awareness. A deployment finished, here are the numbers, nobody has to log into Finn to find out.

  1. Go to Settings → Integrations → Slack → Add to Workspace.
  2. Authorize in Slack.
  3. Pick a channel.
  4. Choose which notifications that channel receives.
NotificationFires when
Deployment launchedA deployment goes live
Deployment completedA deployment ends, includes summary stats
Deployment failedA deployment does not complete
Daily morning summaryOnce per day, aggregate over the previous day
Threshold alertsA metric crosses a limit you set, for example success rate dropping below a floor

You can connect more than one channel and give each a different set of notifications. Sales usually wants completions, ops usually wants failures and thresholds.

Slack notifications are deployment-level only. There is no per-call Slack notification. If you want a message per call, send call.analyzed to a webhook and post to Slack from there, which is what the Zapier and Make paths below do.

Zapier, Make and n8n

None of these three is a native Finn integration. There is no Finn app to install in Zapier. The connection is a webhook: Finn sends the event, the automation platform receives it on a catch-hook URL and does whatever you configured downstream.

The setup is the same in all three:

  1. In Zapier, Make or n8n, create a new automation whose trigger is an inbound webhook. Zapier calls this a Catch Hook, Make calls it a Custom Webhook, n8n calls it a Webhook node. Copy the URL it gives you.
  2. In Finn, go to Settings → Integrations → Webhooks → Add Endpoint. Paste the URL.
  3. Subscribe to the events you need. For most automations that is call.analyzed, because it fires after post-call analysis has run and so carries the extracted fields you actually want to branch on.
  4. Save. Finn shows a signing secret once. Copy it now. It is not shown again.
  5. Trigger a test call so the platform sends a real payload, then map fields in your automation from that payload.

Pick the event carefully. call.completed fires when the call ends, before analysis. The transcript is there, post_call_analysis is not. If your Zap branches on appointment_booked and you subscribed to call.completed, the field will be missing and your filter will silently drop every run.

Available events:

EventFires whenAnalysis fields present
call.startedThe call beginsNo
call.completedThe call endsNo
call.analyzedPost-call analysis finishesYes
deployment.launchedA deployment goes liveNot applicable
deployment.completedA deployment ends, with aggregate metricsNot applicable

A call.analyzed payload:

{
  "event": "call.analyzed",
  "call": {
    "id": "call_abc123",
    "deployment_id": "deploy_xyz",
    "started_at": "2026-06-15T10:30:00Z",
    "duration_seconds": 142,
    "contact": { "name": "Alice Chen", "phone_number": "+15551234567" },
    "transcript": [],
    "post_call_analysis": {
      "appointment_booked": true,
      "appointment_time": "2026-06-22 14:00"
    },
    "sentiment": "positive"
  }
}

See webhook-post-call for the full field list and analysis-fields for how post_call_analysis keys get defined.

Verify the signature

The catch-hook URL is public. Anyone who learns it can post fake calls into your automation. Verify the signing secret before acting on a payload.

Zapier and Make can run a code step to do this. n8n can run a Function node. In n8n:

const crypto = require('crypto');

const secret = $env.FINN_WEBHOOK_SECRET;
const raw = JSON.stringify($input.first().json.body);
const received = $input.first().json.headers['x-finn-signature'];

const expected = crypto
  .createHmac('sha256', secret)
  .update(raw)
  .digest('hex');

const a = Buffer.from(expected);
const b = Buffer.from(received || '', 'utf8');

if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
  throw new Error('Invalid Finn webhook signature');
}

return $input.all();

Signing over a re-serialized body is fragile. JSON.stringify of a parsed object will not always reproduce the exact bytes Finn signed, so key order or number formatting can break the comparison. Where the platform lets you read the raw request body, sign over that instead. See webhook-security.

What goes wrong

Zap fires but fields are empty. You subscribed to call.completed instead of call.analyzed. Analysis has not run yet.

Zap stops firing. Zapier returns a non-2xx while your account is over its task limit, or the Zap is turned off. Finn treats that as a failed delivery and retries with backoff for up to 24 hours, then gives up. Check Settings → Integrations → Webhooks → Delivery Log for the response Finn actually got. Details in webhook-retries.

Duplicate rows downstream. Retries mean the same event can arrive more than once. Deduplicate on call.id in your automation rather than assuming one delivery per call.

Slack channel goes quiet. The integration tile shows Needs attention when the Slack token has been revoked, usually because someone removed the app in Slack. Reconnect from the same tile.

Timeouts on large transcripts. A long call carries a long transcript array. Some automation platforms cap inbound payload size. If deliveries fail only on long calls, that is the cause. Receive on your own endpoint instead and forward a trimmed payload.