Template Webhooks

Receive real-time notifications whenever the approval status of a WhatsApp message template changes.

Events Covered

EventDescription
TEMPLATE_UPDATEFires whenever a WhatsApp message template's approval status changes

Template Updated

Event type: TEMPLATE_UPDATE

Fires whenever a WhatsApp message template transitions from one approval status to another — for example, from pending review to approved, or from approved to rejected.

This event only reports status transitions. Changes to a template's quality rating or category are not delivered through this webhook.

Trigger Conditions

The event is emitted when:

  • A template's approval status changes to a different value than it was before.

It is not emitted when:

  • The reported status is the same as the previous status (no-op changes are suppressed).
  • Only a template's quality rating or category changes, with no status change.

Sample Payload

Status Change

{
  "wabaPhoneNumber": "+919000000000",
  "templateName": "order_confirmation",
  "templateLanguage": "en",
  "newStatus": "APPROVED",
  "oldStatus": "PENDING",
  "rejectedReason": "",
  "agentName": "James Smith",
  "agentNumber": "+919111222333",
  "event": "TEMPLATE_STATUS_UPDATE"
}

Rejection

{
  "wabaPhoneNumber": "+919000000000",
  "templateName": "promo_offer",
  "templateLanguage": "en",
  "newStatus": "REJECTED",
  "oldStatus": "PENDING",
  "rejectedReason": "The template was rejected for promotional content that does not match its declared category.",
  "agentName": "James Smith",
  "agentNumber": "+919111222333",
  "event": "TEMPLATE_STATUS_UPDATE"
}

Field Reference

FieldTypeRequiredDescription
wabaPhoneNumberstringYesWhatsApp Business number the template belongs to
templateNamestringYesName of the template
templateLanguagestringYesLanguage code of the template
newStatusstringYesThe template's status after this change. See status values below.
oldStatusstring | nullYesThe template's status before this change
rejectedReasonstringYesRejection reason text. Empty for non-rejection status changes.
agentNamestringNoDisplay name of the DoubleTick agent who submitted the template for approval. This is not the reviewer — Meta determines approval status independently
agentNumberstringNoPhone number of the DoubleTick agent who submitted the template for approval
eventstringYesSubscribe using TEMPLATE_UPDATE in DoubleTick settings. In delivered payloads, the event field will be "TEMPLATE_STATUS_UPDATE". These are different names for the same event.

Status Values

ValueDescription
APPROVEDThe template has been approved and is ready to use
REJECTEDThe template was rejected during review
PENDINGThe template is awaiting review
PAUSEDThe template has been temporarily paused

Conditional Fields

FieldCondition
agentNameOmitted if the creating agent could not be resolved
agentNumberOmitted if the creating agent could not be resolved
oldStatusMay be null if there was no previous recorded status
rejectedReasonPresent only when newStatus is REJECTED. Empty string for other transitions.

Notes

  • rejectedReason is passed through as raw text from your WhatsApp provider and is not normalized into a fixed set of reason codes. Treat it as free text, not an enum.
  • This event reports status changes only — quality rating changes and category changes on a template do not trigger TEMPLATE_UPDATE.
  • If the same status is reported twice in a row with no actual change, no webhook is sent.

Edge Cases

Duplicate Status Reports

If your WhatsApp provider reports the same status more than once (for example, due to a retried delivery), only the first one results in a webhook — repeated reports of an unchanged status are suppressed.

Rapid Status Changes

If a template changes status multiple times in quick succession (for example, PENDINGAPPROVEDPAUSED), each transition is delivered as its own separate webhook event, in order.

Best Practices

  • Use templateName and templateLanguage together to identify a specific template — template names are not unique across languages.
  • Don't parse or pattern-match rejectedReason — it's intended for display to a human reviewer, not for automated branching logic.
  • Track oldStatus alongside newStatus if you need to detect specific transitions (e.g. only act when a template moves from PENDING to REJECTED).