Send WhatsApp notifications from Jira issue webhooks
Jira's email digests and in-app bell are easy to ignore, especially for people who aren't in Jira all day — a support lead waiting on a "ready for QA" transition, a client-facing PM who needs to know the moment a blocker issue is reopened. WhatsApp gets opened within minutes of arriving. This guide wires Jira's own webhooks directly to the TextMeFlow API, so a status change or reassignment becomes a WhatsApp message with no automation subscription sitting in between.
Why go direct instead of an automation tool
Jira can push a signed JSON payload to any URL for issue created, updated, deleted and comment events. If you already run a backend, turning that payload into a WhatsApp message is a small route handler — nothing else to host, nothing else that can go down independently of your own stack. If you'd rather not write or maintain that endpoint, n8n, Make or Zapier all have native Jira triggers and are the faster path when nobody on the team wants to touch code.
Step 1: register the webhook
For Jira Cloud, webhooks are managed per-app if you're building a Connect/Forge app, or — for a simpler setup on your own instance or via an admin-created webhook — under Settings → System → WebHooks (Jira admin access required). Point it at your endpoint and pick the events you care about:
URL: https://yourdomain.tld/jira-webhook
Events: jira:issue_updated, jira:issue_created
JQL filter: project = SUPPORT AND status changed
The JQL filter matters more than it looks — without it you get every edit on every issue in the project, including ones nobody needs a phone notification for.
Step 2: handle the payload and filter for real changes
Jira sends the full issue object on every event, plus a changelog block listing exactly which fields changed. Match on that instead of re-deriving the change yourself:
// routes/web.php
Route::post('/jira-webhook', function (Request $request) {
$changelog = $request->input('changelog.items', []);
$statusChange = collect($changelog)->first(
fn ($item) => ($item['field'] ?? null) === 'status'
);
if (! $statusChange) {
return response()->json(['ok' => true]);
}
$issue = $request->input('issue', []);
$key = $issue['key'] ?? 'UNKNOWN';
$summary = $issue['fields']['summary'] ?? '';
$to = $statusChange['toString'] ?? '';
Http::withToken(config('services.textmeflow.api_key'))
->post('https://textmeflow.eu/v1/messages', [
'to' => config('services.jira_notify.phone'),
'text' => "{$key} moved to {$to}: {$summary}",
]);
return response()->json(['ok' => true]);
});
Reassignment works the same way — check for a changelog item where field is assignee, and look up the new assignee's phone number from your own user table rather than hardcoding a single recipient.
Step 3: route to the right person, not everyone
A single number in config works for a first test, but in production you usually want the message to reach whoever is actually responsible for that issue next — the new assignee on a reassignment, a fixed support WhatsApp group on a status change into "Escalated". Keep that mapping in your own database rather than in Jira; webhook payloads only carry Jira account IDs, so you still need a lookup table linking those to phone numbers. If one event needs to reach several people, send sequentially with a short delay and check the 202/429 response from /v1/messages, per the rate limits documentation — firing a burst of parallel requests for one issue update is the fastest way to trip them.
Secure the endpoint
Jira webhooks aren't signed by default on a standard instance-level webhook — anyone who finds the URL could POST a fake payload. Put a secret token in the URL path or as a header your route checks before processing, and keep that endpoint separate from any inbound WhatsApp handling. TextMeFlow's own inbound webhooks use proper HMAC signature verification — the two integrations are independent and shouldn't share a trust assumption just because they live in the same codebase.
Extending it
The same changelog-filtering pattern covers any Jira field: priority bumped to Highest, a due date set, a comment added by someone outside the team. Combine it with TextMeFlow's webhook events to close the loop in both directions — a client replying "approved" on WhatsApp calling the Jira API to transition the linked issue automatically.
Get started
TextMeFlow's free plan includes 50 messages per month with no expiry date, enough to build and test this entire Jira integration before paying anything. Start for free.
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