Skip to content

Slack and webhooks

Corner can tell Slack, Zapier, Make, n8n or your own system the moment a visitor leaves their details or asks for a person. Set it up in Settings > Integrations. It comes with the Builder and Studio plans, and owners and admins can manage it.

Slack

Zapier, Make and n8n

Events

{
  "id": "evt_4Jx0...",
  "type": "lead.created",
  "createdAt": "2026-10-03T09:41:00.000Z",
  "workspaceId": "OrRq...",
  "data": {
    "assistant": "Harbor Bakery",
    "lead": {
      "id": "led_8Qm2...",
      "name": "Priya Shah",
      "email": "[email protected]",
      "phone": null,
      "message": "Wedding cake tasting?",
      "pageUrl": "https://harbor-bakery.example/cakes"
    },
    "url": "https://app.getcorner.ai/leads?lead=led_8Qm2..."
  }
}
{
  "id": "evt_9Pv1...",
  "type": "chat.requested",
  "createdAt": "2026-10-03T09:45:12.000Z",
  "workspaceId": "OrRq...",
  "data": {
    "assistant": "Harbor Bakery",
    "conversation": { "id": "cnv_2Kd7...", "visitor": "Sam Lee", "lastMessage": "Can I talk to someone?" },
    "url": "https://app.getcorner.ai/inbox?c=cnv_2Kd7..."
  }
}

Verify the signature

import { createHmac, timingSafeEqual } from "node:crypto"

// rawBody: the request body exactly as received, before any JSON parsing.
export function isFromCorner(rawBody, signatureHeader, secret) {
  const parts = Object.fromEntries(signatureHeader.split(",").map((p) => p.split("=")))
  const timestamp = Number(parts.t)
  if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > 300) return false // older than 5 minutes
  const expected = createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex")
  const given = Buffer.from(parts.v1 ?? "", "utf8")
  return given.length === expected.length && timingSafeEqual(given, Buffer.from(expected, "utf8"))
}

Delivery