· 4 min · TextMeFlow Team

Sending WhatsApp Notifications from Zendesk Ticket Updates

A ticket sits in "Open" for two days, gets solved, and the customer only finds out when they happen to check their email — or never. Zendesk's own notification channel is email and in-app; WhatsApp gets read in minutes, not days. Wiring ticket-status changes into WhatsApp doesn't require a marketplace app: Zendesk's built-in triggers plus a webhook target and the TextMeFlow messages API is enough.

Step 1: Create a webhook target in Zendesk

In Zendesk Admin Center, go to Apps and integrations → Webhooks → Create webhook. Point it at a small receiver you host (an endpoint on your own server or a serverless function):

  • Endpoint URL: your receiver, e.g. https://yourapp.example.com/zendesk-hook
  • Request method: POST
  • Authentication: use a bearer token or basic auth header — Zendesk supports both — so your receiver can reject requests that don't carry it

Zendesk webhooks fire an empty or minimal payload by default; the actual ticket data comes from the trigger you attach to it (next step), using placeholders in the request body.

Step 2: Build the trigger that calls the webhook

Under Objects and rules → Business rules → Triggers, create a trigger with a condition like "Ticket status changed to Solved" and add a "Notify webhook" action pointing at the target from step 1. Set the JSON body using Zendesk placeholders so the payload actually contains something useful:

{
  "ticket_id": "{{ticket.id}}",
  "status": "{{ticket.status}}",
  "requester_phone": "{{ticket.requester.phone}}",
  "subject": "{{ticket.title}}"
}

Make a separate trigger per status transition you care about (Solved, or Open → Pending waiting on the customer) rather than one trigger for "any update" — Zendesk fires triggers on every ticket save, including internal note edits, and you don't want a WhatsApp message for those.

Step 3: Receive the webhook and forward to WhatsApp

import express from 'express';
const app = express();
app.use(express.json());

app.post('/zendesk-hook', async (req, res) => {
  const auth = req.headers.authorization;
  if (auth !== `Bearer ${process.env.ZENDESK_WEBHOOK_SECRET}`) {
    return res.sendStatus(401);
  }

  const { status, requester_phone, subject, ticket_id } = req.body;
  if (!requester_phone) return res.sendStatus(200);

  const text = status === 'solved'
    ? `Your ticket "${subject}" (#${ticket_id}) has been resolved. Reply if you still need help.`
    : `We're waiting on your reply for ticket "${subject}" (#${ticket_id}).`;

  await fetch('https://api.textmeflow.eu/v1/messages', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.TEXTMEFLOW_TOKEN}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ to: requester_phone, text }),
  });

  res.sendStatus(200);
});

The same call works from PHP or Python with any HTTP client — see the PHP, Python and Node examples if you're not on Node.

Step 4: Normalize the phone number before sending

Zendesk stores the requester's phone as whatever format they entered it in, or blank if it was never collected. TextMeFlow requires strict E.164 (+3247...) — anything else gets rejected with 400 invalid_recipient. Skip the send rather than guess when the field is empty or clearly not a phone number, and consider adding a required phone field to your Zendesk ticket form if WhatsApp notifications matter enough to build this integration in the first place.

Step 5: Keep it to status changes, not every comment

A ticket with an active back-and-forth can get a dozen comment updates in an hour. Sending a WhatsApp message for each one is a fast way to annoy the customer and trip TextMeFlow's anti-spam pacing — consecutive sends to the same number get spaced out automatically once volume looks bot-like. Reserve WhatsApp for the transitions that actually change what the customer needs to do: ticket solved, ticket needs their reply, or a new agent picked it up. Route routine comment activity to email or the Zendesk widget instead.

Agent-side notifications too

The same pattern works in the other direction: a trigger on "ticket assigned" or "SLA breach imminent" that messages the assigned agent's own WhatsApp instead of the customer's. That's internal, one-to-one traffic with no consent question attached, and it's a good first integration to test your receiver against before pointing anything at customers.

Start free on TextMeFlow — 50 messages a month, no time limit, enough to build and test a Zendesk trigger end to end before committing to a paid plan.

Zelf WhatsApp-berichten versturen via API?

Gratis voor altijd tot 50 berichten/maand. QR scannen en binnen 5 minuten verstuur je je eerste bericht.

Gratis voor altijd