Sending WhatsApp Notifications from Freshdesk Ticket Updates
Freshdesk tells a customer their ticket was solved by email. Most people don't open that email for hours, if they open it at all — and then they re-open the ticket by replying "any update?" because they never saw the resolution. WhatsApp gets read within minutes. Freshdesk doesn't have a native WhatsApp notification channel, but its automation rules can call a webhook, and that webhook can call the TextMeFlow messages API directly — no marketplace app, no middleware subscription.
Step 1: Build the automation rule in Freshdesk
In Freshdesk, go to Admin → Workflows → Automations → Ticket Updates and create a new rule. Set the condition to the transition you actually want a message for — typically "Status changes to Resolved" or "Status changes to Open AND previous status was Pending" (meaning the customer's reply is now expected from your side, not theirs). Avoid triggering on "any ticket update": Freshdesk fires that event on internal notes, tag changes and agent reassignment too, and you don't want a WhatsApp ping for each of those.
Add a "Trigger Webhook" action to the rule:
- Request type:
POST - Callback URL: your receiver, e.g.
https://yourapp.example.com/freshdesk-hook - Encoding:
JSON - Authentication: Freshdesk lets you add a custom header — use it to carry a shared secret, since the webhook body itself has no built-in signature
Step 2: Shape the payload with placeholders
Freshdesk's webhook body editor supports ticket placeholders. Keep the payload to only what your receiver needs:
{
"ticket_id": "{{ticket.id}}",
"status": "{{ticket.status}}",
"subject": "{{ticket.subject}}",
"requester_phone": "{{ticket.requester.mobile}}"
}
Freshdesk stores contact phone numbers under mobile or phone depending on which field the requester filled in — check both in your receiver, since many contacts only have one of the two populated.
Step 3: Receive the webhook and send the WhatsApp message
from flask import Flask, request
import os, requests
app = Flask(__name__)
@app.post("/freshdesk-hook")
def freshdesk_hook():
if request.headers.get("X-Webhook-Secret") != os.environ["FRESHDESK_WEBHOOK_SECRET"]:
return "", 401
data = request.json
phone = data.get("requester_phone")
if not phone:
return "", 200
status = data.get("status")
subject = data.get("subject")
ticket_id = data.get("ticket_id")
if status == "Resolved":
text = f'Your ticket "{subject}" (#{ticket_id}) has been resolved. Reply here if you still need help.'
else:
text = f'We\'re waiting on your reply for ticket "{subject}" (#{ticket_id}).'
requests.post(
"https://api.textmeflow.eu/v1/messages",
headers={"Authorization": f'Bearer {os.environ["TEXTMEFLOW_TOKEN"]}'},
json={"to": phone, "text": text},
)
return "", 200
The same request works from PHP or Node with any HTTP client — see the PHP, Python and Node examples if Python isn't your stack.
Step 4: Normalize the phone number first
Freshdesk doesn't enforce a phone format on the contact record, so mobile can be 0470 12 34 56, +32470123456, or just empty. TextMeFlow's API requires strict E.164 and rejects anything else with 400 invalid_recipient. Run the number through a normalizer before sending, and skip the send — don't guess a country code — when the field is blank or clearly not a phone number. The phone number validation guide covers the normalization step in more detail.
Step 5: Don't message on every reply
A ticket with a long back-and-forth can trigger the "status changes" condition several times an hour if an agent toggles it between Open and Pending while troubleshooting. Scope the rule tightly — resolved, or genuinely waiting-on-customer — rather than reacting to every status flip. TextMeFlow's anti-spam pipeline will throttle a number that receives bursts of messages that look automated, which protects your WhatsApp number but also means a noisy rule gets some of its messages delayed rather than delivered instantly.
Agent-facing alerts too
The same rule structure works for internal notifications: a condition on "SLA due in 30 minutes" or "ticket reassigned to me" that messages the agent's own WhatsApp number instead of the requester's. That traffic is one-to-one and internal, with no consent question attached, which makes it a safe first integration to test your receiver against before pointing the webhook at customer numbers.
Start free on TextMeFlow — 50 messages a month, no time limit, enough to wire up a Freshdesk automation end to end before deciding on 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