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