Intercom & Zendesk

Intercom & Zendesk

Gate AI-driven customer support actions — refunds, account changes, bulk emails, subscription cancellations — behind a human approval step before they execute. Works with any Intercom workflow or Zendesk Trigger, no SDK required.

Zendesk — Trigger setup

JSON
{
  "action":    "process_refund",
  "summary":   "Refund request on ticket #{{ticket.id}} — {{ticket.requester.name}}",
  "riskLevel": "high",
  "details": {
    "ticketId":    "{{ticket.id}}",
    "subject":     "{{ticket.title}}",
    "requester":   "{{ticket.requester.email}}",
    "amount":      "{{ticket.ticket_field_option_title_360001234567}}",
    "assistantNote": "{{ticket.latest_comment}}"
  },
  "webhookUrl": "https://yourapp.com/zendesk/decision-callback"
}

Intercom — Relay handler

Node.js
export async function POST(req: Request) {
  const event = await req.json();
  const convo = event.data.item;

  await fetch("https://app.cheqpoint.co/api/webhooks/inbound", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-api-key": process.env.CHEQPOINT_CONNECTION_KEY!,
    },
    body: JSON.stringify({
      action:     "intercom_action",
      summary:    `Fin wants to ${event.topic} on conversation ${convo.id}`,
      riskLevel:  "medium",
      details: {
        conversationId: convo.id,
        contactEmail:   convo.contacts?.contacts?.[0]?.email,
        assignedAdmin:  convo.assignee?.email,
        lastMessage:    convo.conversation_parts?.conversation_parts?.slice(-1)[0]?.body,
      },
      webhookUrl: "https://yourapp.com/intercom/decision-callback",
    }),
  });

  return new Response("ok");
}

Decision callback handler

Node.js
export async function POST(req: Request) {
  const body = await req.json();
  const details = body.modifiedDetails ?? body.details;

  if (body.status === "APPROVED") {
    // Execute action and update support ticket via API
    await processRefund(details);
    await updateTicket(details.ticketId, "Refund processed.");
  } else {
    // Action declined — add internal note
    await updateTicket(details.ticketId, "Action declined: " + body.decisionNote);
  }

  return new Response("ok");
}

How it works

  1. 1. Your AI Assistant or automation triggers an action (e.g. "issue refund")
  2. 2. Instead of executing immediately, it POSTs to Cheqpoint's inbound endpoint
  3. 3. A reviewer sees it in the Cheqpoint dashboard (and on Slack/Teams/Discord)
  4. 4. They approve, reject, or modify the payload
  5. 5. Cheqpoint POSTs the decision back to your webhook URL — the automation continues or stops