# Templates

# Utility templates | Developer Documentation

<div id="bkmrk-utility-templatesupd">## Utility templates

<div><span>Updated: Nov 14, 2025</span></div><div>This document describes how to create and send utility templates.</div><div>Utility templates are typically sent in response to a user action or request, such as an order confirmation or update.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-02okhn9n.png)</div><div>Utility templates have strict content requirements, particularly around marketing material. If you attempt to create or update a utility template with marketing material, the template will automatically be re-categorized as a marketing template.</div><div>See our [template categorization](/books/meta-whatsapp/page/template-categorization-developer-documentation) documentation for content guidelines.</div><div id="bkmrk-supported-components"><div id="bkmrk-supported-components-1"><div>### Supported components

</div></div></div><div>Utility templates support the following components:</div>
<span>1 header (optional; all types supported)</span><span>1 body</span><span>1 footer (optional)</span><span>Up to 10 buttons (optional). Supported types: </span>
<span>Call request</span><span>Copy code</span><span>Phone number</span><span>Quick-reply</span><span>URL</span></div>

# Best practices for authenticating users via WhatsApp | Developer Documentation

<div id="bkmrk-best-practices-for-a">## Best practices for authenticating users via WhatsApp

<div><span>Updated: Nov 21, 2025</span></div><div id="bkmrk-security"><div id="bkmrk-security-1"><div>### Security

</div></div></div><div>To register with WhatsApp, users must register using their phone number. During [this sign-up process<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Fcoronavirus%2Fget-started&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw), WhatsApp verifies the user has ownership of this phone number by sending a 6-digit registration code via SMS or phone call.</div><div>For many WhatsApp users, their phone number will continue to be the same as the number they have registered with WhatsApp. However, WhatsApp does not enforce ownership of the phone number past initial registration, so there is no guarantee that a phone number and the WhatsApp account tied to that phone number are owned by the same individual. In particular, since phone numbers are recycled by mobile providers, it is possible that if your user currently owns the phone number and does not use WhatsApp, [the previous owner of that phone number still has access to the WhatsApp account tied to that phone number<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Ffaq.whatsapp.com%2F3347469605523961&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw).</div><div>As such, for sensitive authentication use cases such as account recovery (where a code sent via WhatsApp may be the only authentication factor), a phone number and the WhatsApp account tied to that phone number should not be treated interchangeably. In these cases, some best practices may apply:</div><span>Explicitly verifying that your user owns the WhatsApp account as you would any other new authentication channel, by sending e.g. an initial OTP and having the user enter it in your app during registration or while they are logged in.</span><span>Showing an additional challenge to verify the user, on top of the code sent via WhatsApp.</span><div>With the first method, you can take advantage of our identity change check systems on [Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation) to “bind” the WhatsApp account to your user’s account, making sure that future messages only reach the WhatsApp user who received that initial OTP. For example, on Cloud API you should store the identity hash received after sending the initial OTP and (assuming the verification was successful) include it in all subsequent message send requests. This setup would improve security over SMS as message delivery would fail if the phone number is recycled and the new owner registers on WhatsApp (OTP codes will not be accidentally sent to an unintended recipient).</div><div>To combat phishing, WhatsApp disables [forwarding<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Ffaq.whatsapp.com%2F887468535575482%2F&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw) of authentication messages. Messages travel end-to-end encrypted between [Cloud API and the user](/books/meta-whatsapp/page/data-privacy-security-developer-documentation).</div><div>WhatsApp does not support and cannot validate the security practices of [unofficial apps<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Ffaq.whatsapp.com%2F1217634902127718&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw). There is no guarantee that authentication via WhatsApp is secure for users who use these apps.</div><div id="bkmrk-ux"><div id="bkmrk-ux-1"><div>### UX

</div></div></div><div id="bkmrk-collect-opt-in"><div id="bkmrk-collect-opt-in-1"><div>#### Collect opt-in

</div></div></div><div>Per the [WhatsApp Business Messaging Policy<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Flegal%2Fbusiness-policy%2F&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw), you must get opt-in before send you can send a message to a WhatsApp user. A common implementation is to offer users a choice of authentication channels (WhatsApp, e-mail, SMS, etc.), as shown in [our sample application](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#sample-app).</div><div id="bkmrk-resolving-message-de"><div id="bkmrk-resolving-message-de-1"><div>#### Resolving message delivery issues

</div></div></div><div>If you are seeing issues where users are selecting WhatsApp but messages end up being undeliverable, it is possible users are accidentally selecting WhatsApp when they in fact are not registered on WhatsApp. To mitigate this, on Android, you can check if WhatsApp is installed and only show WhatsApp in this case.</div><div>```
<span>fun isWhatsAppAvailable</span><span>(</span><span>context</span><span>:</span><span>Context</span><span>){</span><span>return</span><span> isAppAvailable</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp"</span><span>)</span><span>||</span><span>
          isAppAvailable</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp.w4b"</span><span>)</span><span>}</span><span>

fun isAppAvailable</span><span>(</span><span>
   context</span><span>:</span><span>Context</span><span>,</span><span>
   packageName</span><span>:</span><span>String</span><span>):</span><span>Boolean</span><span>{</span><span>
 val intent </span><span>=</span><span>Intent</span><span>()</span><span>
 intent</span><span>.</span><span>setPackage</span><span>(</span><span>packageName</span><span>)</span><span>
 intent</span><span>.</span><span>action </span><span>=</span><span>"com.whatsapp.otp.OTP_REQUESTED"</span><span>
 val packageManager </span><span>=</span><span> context</span><span>.</span><span>packageManager
 val listActivities </span><span>=</span><span> packageManager</span><span>.</span><span>queryBroadcastReceivers</span><span>(</span><span>intent</span><span>,</span><span>0</span><span>)</span><span>return</span><span> listActivities</span><span>.</span><span>isNotEmpty</span><span>()</span><span>}</span>
```

</div><div>If you are still seeing issues where users are selecting WhatsApp but messages end up being undeliverable, it is also possible that the WhatsApp phone number is not correct. This could be through a user typo error, or that an app is incorrectly assuming the initial registration phone number is the same as the WhatsApp phone number. Users may have a phone number used for SMS and a different phone number used for WhatsApp, in the case where they might have multiple SIM cards for traveling. You should ensure that if WhatsApp is chosen as the authentication channel that the user has a chance to confirm their WhatsApp phone number.</div><div>If messages are being delivered but you are seeing lower than expected conversion rates in your authentication flows, consider adopting [our more seamless “one-tap autofill” functionality](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#example-request--one-tap-autofill-), available for Android.</div><div id="bkmrk-support-all-apps"><div id="bkmrk-support-all-apps-1"><div>#### Support all apps

</div></div></div><div>Your users may be ready to receive messages through WhatsApp or the WhatsApp Business App (or both). If following [our Android client implementation guide](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#client-implementation), your “one-tap autofill” messages should work with any combination of installs, but we recommend testing one-tap across both the consumer app and the business app.</div><div id="bkmrk-be-ready-to-receive-"><div id="bkmrk-be-ready-to-receive--1"><div>#### Be ready to receive the code from WhatsApp

</div></div></div><div>If integrating with “one-tap autofill” functionality, you should be able to handle the code arriving as soon as you have sent the [handshake](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#handshake). WhatsApp will send the code when received regardless of what screen is currently shown on your app. For example, in situations with poor network connectivity, you may receive the code before you are able to load the code entry screen in your app. To handle these cases, one option is to store the received code such that the app can retrieve it when the next screen is fully loaded. This way, the code can be automatically filled by your app as soon as the code is received.</div><div id="bkmrk-business-accounts-an"><div id="bkmrk-business-accounts-an-1"><div>### Business accounts and phone numbers

</div></div></div><div>Every business must have its own WhatsApp Business Account and be sending authentication templates through its own phone number, as opposed to sharing WABAs and phone numbers with separate business entities. Sharing a WABA across multiple businesses is against policy as it conflicts with the [WhatsApp Business Terms of Service<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Flegal%2Fbusiness-terms&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw) and [WhatsApp Business Messaging Policy<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Flegal%2Fbusiness-policy%2F&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw), in addition to creating poor user and business experiences on WhatsApp.</div><div id="bkmrk-checking-if-whatsapp"><div id="bkmrk-checking-if-whatsapp-1"><div>### Checking if WhatsApp is installed on Android and iOS

</div></div></div><div id="bkmrk-checking-on-android"><div id="bkmrk-checking-on-android-1"><div>#### Checking on Android

</div></div></div><div>You can check WhatsApp installation before offering WhatsApp as an option if you expect both WhatsApp and your app to be on the same device.</div><div>First, you need to add the following to your `AndroidManifest.xml` file:</div><div><div>```
<span><span><</span><span>queries</span><span>></span></span><br></br><span><span><</span><span>package</span><span>android:name</span><span>=</span><span>"com.whatsapp"</span><span>/</span><span>></span></span><br></br><span><span><</span><span>package</span><span>android:name</span><span>=</span><span>"com.whatsapp.w4b"</span><span>/</span><span>></span></span><br></br><span><span></</span><span>queries</span><span>></span></span><br></br>
```

</div></div><div id="bkmrk-using-the-sdk-%28prefe"><div id="bkmrk-using-the-sdk-%28prefe-1"><div>##### Using the SDK (Preferred)

</div></div></div><div>Instantiate the `WhatsAppOtpHandler` object:</div><div>```
<span>WhatsAppOtpHandler</span><span> whatsAppOtpHandler </span><span>=</span><span>new</span><span>WhatsAppOtpHandler</span><span>();</span>
```

</div><div>Check if the WhatsApp client is installed by passing the `isWhatsAppInstalled` method as the clause in an `If` statement:</div><div>```
<span>If</span><span>(</span><span>whatsAppOtpHandler</span><span>.</span><span>isWhatsAppInstalled</span><span>(</span><span>context</span><span>))</span><span>{</span><span>// ... do something</span><span>}</span>
```

</div><div id="bkmrk-without-the-sdk"><div id="bkmrk-without-the-sdk-1"><div>##### Without the SDK

</div></div></div><div>```
<span>if</span><span>(</span><span>this</span><span>.</span><span>isWhatsAppInstalled</span><span>(</span><span>context</span><span>))</span><span>{</span><span>// ... do something</span><span>}</span><span>public</span><span>boolean</span><span> isWhatsAppInstalled</span><span>(</span><span>final</span><span>@NonNull</span><span>Context</span><span> context</span><span>){</span><span>return</span><span> isWhatsAppInstalled</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp"</span><span>)</span><span>||</span><span>
           isWhatsAppInstalled</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp.w4b"</span><span>);</span><span>}</span><span>public</span><span>boolean</span><span> isWhatsAppInstalled</span><span>(</span><span>final</span><span>@NonNull</span><span>Context</span><span> context</span><span>,</span><span>final</span><span>@NonNull</span><span>String</span><span> type</span><span>){</span><span>final</span><span>Intent</span><span> intent </span><span>=</span><span>new</span><span>Intent</span><span>();</span><span>
    intent</span><span>.</span><span>setPackage</span><span>(</span><span>type</span><span>);</span><span>
    intent</span><span>.</span><span>setAction</span><span>(</span><span>"com.whatsapp.otp.OTP_REQUESTED"</span><span>);</span><span>PackageManager</span><span> packageManager </span><span>=</span><span> context</span><span>.</span><span>getPackageManager</span><span>();</span><span>List</span><span><</span><span>ResolveInfo</span><span>></span><span> receivers </span><span>=</span><span> packageManager</span><span>.</span><span>queryBroadcastReceivers</span><span>(</span><span>intent</span><span>,</span><span>0</span><span>);</span><span>return</span><span>!</span><span>receivers</span><span>.</span><span>isEmpty</span><span>();</span><span>}</span><span>}</span>
```

</div><div id="bkmrk-checking-on-ios"><div id="bkmrk-checking-on-ios-1"><div>#### Checking on iOS

</div></div></div><div>Use the following code in your iOS application to check if WhatsApp is installed</div><div>```
<span>let</span><span> schemeURL </span><span>=</span><span> URL</span><span>(</span><span>string</span><span>:</span><span>"whatsapp://otp"</span><span>)!</span><span>let</span><span> isWhatsAppInstalled </span><span>=</span><span>UIApplication</span><span>.</span><span>shared</span><span>.</span><span>canOpenURL</span><span>(</span><span>schemeURL</span><span>)</span>
```

</div></div>

# Best practices for authenticating users via WhatsApp | Developer Documentation

<div id="bkmrk-best-practices-for-a">## Best practices for authenticating users via WhatsApp

<div><span>Updated: Nov 21, 2025</span></div><div id="bkmrk-security"><div id="bkmrk-security-1"><div>### Security

</div></div></div><div>To register with WhatsApp, users must register using their phone number. During [this sign-up process<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Fcoronavirus%2Fget-started&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw), WhatsApp verifies the user has ownership of this phone number by sending a 6-digit registration code via SMS or phone call.</div><div>For many WhatsApp users, their phone number will continue to be the same as the number they have registered with WhatsApp. However, WhatsApp does not enforce ownership of the phone number past initial registration, so there is no guarantee that a phone number and the WhatsApp account tied to that phone number are owned by the same individual. In particular, since phone numbers are recycled by mobile providers, it is possible that if your user currently owns the phone number and does not use WhatsApp, [the previous owner of that phone number still has access to the WhatsApp account tied to that phone number<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Ffaq.whatsapp.com%2F3347469605523961&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw).</div><div>As such, for sensitive authentication use cases such as account recovery (where a code sent via WhatsApp may be the only authentication factor), a phone number and the WhatsApp account tied to that phone number should not be treated interchangeably. In these cases, some best practices may apply:</div><span>Explicitly verifying that your user owns the WhatsApp account as you would any other new authentication channel, by sending e.g. an initial OTP and having the user enter it in your app during registration or while they are logged in.</span><span>Showing an additional challenge to verify the user, on top of the code sent via WhatsApp.</span><div>With the first method, you can take advantage of our identity change check systems on [Cloud API](/books/meta-whatsapp/page/business-phone-numbers-developer-documentation) to “bind” the WhatsApp account to your user’s account, making sure that future messages only reach the WhatsApp user who received that initial OTP. For example, on Cloud API you should store the identity hash received after sending the initial OTP and (assuming the verification was successful) include it in all subsequent message send requests. This setup would improve security over SMS as message delivery would fail if the phone number is recycled and the new owner registers on WhatsApp (OTP codes will not be accidentally sent to an unintended recipient).</div><div>To combat phishing, WhatsApp disables [forwarding<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Ffaq.whatsapp.com%2F887468535575482%2F&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw) of authentication messages. Messages travel end-to-end encrypted between [Cloud API and the user](/books/meta-whatsapp/page/data-privacy-security-developer-documentation).</div><div>WhatsApp does not support and cannot validate the security practices of [unofficial apps<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Ffaq.whatsapp.com%2F1217634902127718&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw). There is no guarantee that authentication via WhatsApp is secure for users who use these apps.</div><div id="bkmrk-ux"><div id="bkmrk-ux-1"><div>### UX

</div></div></div><div id="bkmrk-collect-opt-in"><div id="bkmrk-collect-opt-in-1"><div>#### Collect opt-in

</div></div></div><div>Per the [WhatsApp Business Messaging Policy<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Flegal%2Fbusiness-policy%2F&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw), you must get opt-in before send you can send a message to a WhatsApp user. A common implementation is to offer users a choice of authentication channels (WhatsApp, e-mail, SMS, etc.), as shown in [our sample application](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#sample-app).</div><div id="bkmrk-resolving-message-de"><div id="bkmrk-resolving-message-de-1"><div>#### Resolving message delivery issues

</div></div></div><div>If you are seeing issues where users are selecting WhatsApp but messages end up being undeliverable, it is possible users are accidentally selecting WhatsApp when they in fact are not registered on WhatsApp. To mitigate this, on Android, you can check if WhatsApp is installed and only show WhatsApp in this case.</div><div>```
<span>fun isWhatsAppAvailable</span><span>(</span><span>context</span><span>:</span><span>Context</span><span>){</span><span>return</span><span> isAppAvailable</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp"</span><span>)</span><span>||</span><span>
          isAppAvailable</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp.w4b"</span><span>)</span><span>}</span><span>

fun isAppAvailable</span><span>(</span><span>
   context</span><span>:</span><span>Context</span><span>,</span><span>
   packageName</span><span>:</span><span>String</span><span>):</span><span>Boolean</span><span>{</span><span>
 val intent </span><span>=</span><span>Intent</span><span>()</span><span>
 intent</span><span>.</span><span>setPackage</span><span>(</span><span>packageName</span><span>)</span><span>
 intent</span><span>.</span><span>action </span><span>=</span><span>"com.whatsapp.otp.OTP_REQUESTED"</span><span>
 val packageManager </span><span>=</span><span> context</span><span>.</span><span>packageManager
 val listActivities </span><span>=</span><span> packageManager</span><span>.</span><span>queryBroadcastReceivers</span><span>(</span><span>intent</span><span>,</span><span>0</span><span>)</span><span>return</span><span> listActivities</span><span>.</span><span>isNotEmpty</span><span>()</span><span>}</span>
```

</div><div>If you are still seeing issues where users are selecting WhatsApp but messages end up being undeliverable, it is also possible that the WhatsApp phone number is not correct. This could be through a user typo error, or that an app is incorrectly assuming the initial registration phone number is the same as the WhatsApp phone number. Users may have a phone number used for SMS and a different phone number used for WhatsApp, in the case where they might have multiple SIM cards for traveling. You should ensure that if WhatsApp is chosen as the authentication channel that the user has a chance to confirm their WhatsApp phone number.</div><div>If messages are being delivered but you are seeing lower than expected conversion rates in your authentication flows, consider adopting [our more seamless “one-tap autofill” functionality](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#example-request--one-tap-autofill-), available for Android.</div><div id="bkmrk-support-all-apps"><div id="bkmrk-support-all-apps-1"><div>#### Support all apps

</div></div></div><div>Your users may be ready to receive messages through WhatsApp or the WhatsApp Business App (or both). If following [our Android client implementation guide](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#client-implementation), your “one-tap autofill” messages should work with any combination of installs, but we recommend testing one-tap across both the consumer app and the business app.</div><div id="bkmrk-be-ready-to-receive-"><div id="bkmrk-be-ready-to-receive--1"><div>#### Be ready to receive the code from WhatsApp

</div></div></div><div>If integrating with “one-tap autofill” functionality, you should be able to handle the code arriving as soon as you have sent the [handshake](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#handshake). WhatsApp will send the code when received regardless of what screen is currently shown on your app. For example, in situations with poor network connectivity, you may receive the code before you are able to load the code entry screen in your app. To handle these cases, one option is to store the received code such that the app can retrieve it when the next screen is fully loaded. This way, the code can be automatically filled by your app as soon as the code is received.</div><div id="bkmrk-business-accounts-an"><div id="bkmrk-business-accounts-an-1"><div>### Business accounts and phone numbers

</div></div></div><div>Every business must have its own WhatsApp Business Account and be sending authentication templates through its own phone number, as opposed to sharing WABAs and phone numbers with separate business entities. Sharing a WABA across multiple businesses is against policy as it conflicts with the [WhatsApp Business Terms of Service<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Flegal%2Fbusiness-terms&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw) and [WhatsApp Business Messaging Policy<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Flegal%2Fbusiness-policy%2F&h=AT55-EeSYSwivWosK_z5VgCWlKTSyZOwFmqLfQfR-jBoE3gd09YxOSNEQTgeVL3WcKW2Y6gadTB61yhkgHZ4Suw6u-S40QLMtQ2BDyGDYT1MP-R6xZ77-_YqRK7bbZumrovXPW4c6xLeiUj8A7vylw), in addition to creating poor user and business experiences on WhatsApp.</div><div id="bkmrk-checking-if-whatsapp"><div id="bkmrk-checking-if-whatsapp-1"><div>### Checking if WhatsApp is installed on Android and iOS

</div></div></div><div id="bkmrk-checking-on-android"><div id="bkmrk-checking-on-android-1"><div>#### Checking on Android

</div></div></div><div>You can check WhatsApp installation before offering WhatsApp as an option if you expect both WhatsApp and your app to be on the same device.</div><div>First, you need to add the following to your `AndroidManifest.xml` file:</div><div><div>```
<span><span><</span><span>queries</span><span>></span></span><br></br><span><span><</span><span>package</span><span>android:name</span><span>=</span><span>"com.whatsapp"</span><span>/</span><span>></span></span><br></br><span><span><</span><span>package</span><span>android:name</span><span>=</span><span>"com.whatsapp.w4b"</span><span>/</span><span>></span></span><br></br><span><span></</span><span>queries</span><span>></span></span><br></br>
```

</div></div><div id="bkmrk-using-the-sdk-%28prefe"><div id="bkmrk-using-the-sdk-%28prefe-1"><div>##### Using the SDK (Preferred)

</div></div></div><div>Instantiate the `WhatsAppOtpHandler` object:</div><div>```
<span>WhatsAppOtpHandler</span><span> whatsAppOtpHandler </span><span>=</span><span>new</span><span>WhatsAppOtpHandler</span><span>();</span>
```

</div><div>Check if the WhatsApp client is installed by passing the `isWhatsAppInstalled` method as the clause in an `If` statement:</div><div>```
<span>If</span><span>(</span><span>whatsAppOtpHandler</span><span>.</span><span>isWhatsAppInstalled</span><span>(</span><span>context</span><span>))</span><span>{</span><span>// ... do something</span><span>}</span>
```

</div><div id="bkmrk-without-the-sdk"><div id="bkmrk-without-the-sdk-1"><div>##### Without the SDK

</div></div></div><div>```
<span>if</span><span>(</span><span>this</span><span>.</span><span>isWhatsAppInstalled</span><span>(</span><span>context</span><span>))</span><span>{</span><span>// ... do something</span><span>}</span><span>public</span><span>boolean</span><span> isWhatsAppInstalled</span><span>(</span><span>final</span><span>@NonNull</span><span>Context</span><span> context</span><span>){</span><span>return</span><span> isWhatsAppInstalled</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp"</span><span>)</span><span>||</span><span>
           isWhatsAppInstalled</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp.w4b"</span><span>);</span><span>}</span><span>public</span><span>boolean</span><span> isWhatsAppInstalled</span><span>(</span><span>final</span><span>@NonNull</span><span>Context</span><span> context</span><span>,</span><span>final</span><span>@NonNull</span><span>String</span><span> type</span><span>){</span><span>final</span><span>Intent</span><span> intent </span><span>=</span><span>new</span><span>Intent</span><span>();</span><span>
    intent</span><span>.</span><span>setPackage</span><span>(</span><span>type</span><span>);</span><span>
    intent</span><span>.</span><span>setAction</span><span>(</span><span>"com.whatsapp.otp.OTP_REQUESTED"</span><span>);</span><span>PackageManager</span><span> packageManager </span><span>=</span><span> context</span><span>.</span><span>getPackageManager</span><span>();</span><span>List</span><span><</span><span>ResolveInfo</span><span>></span><span> receivers </span><span>=</span><span> packageManager</span><span>.</span><span>queryBroadcastReceivers</span><span>(</span><span>intent</span><span>,</span><span>0</span><span>);</span><span>return</span><span>!</span><span>receivers</span><span>.</span><span>isEmpty</span><span>();</span><span>}</span><span>}</span>
```

</div><div id="bkmrk-checking-on-ios"><div id="bkmrk-checking-on-ios-1"><div>#### Checking on iOS

</div></div></div><div>Use the following code in your iOS application to check if WhatsApp is installed</div><div>```
<span>let</span><span> schemeURL </span><span>=</span><span> URL</span><span>(</span><span>string</span><span>:</span><span>"whatsapp://otp"</span><span>)!</span><span>let</span><span> isWhatsAppInstalled </span><span>=</span><span>UIApplication</span><span>.</span><span>shared</span><span>.</span><span>canOpenURL</span><span>(</span><span>schemeURL</span><span>)</span>
```

</div></div>

# One-tap autofill authentication templates | Developer Documentation

<div id="bkmrk-one-tap-autofill-aut">## One-tap autofill authentication templates

<div><span>Updated: Feb 6, 2026</span></div><div><div>**Upcoming deprecation:** Starting **April 15, 2026**, the `PendingIntent`-based handshake method for authentication templates will be deprecated. If you are currently using `PendingIntent` to initiate handshakes or verify app identity, the [OTP Android SDK](/books/meta-whatsapp/page/zero-tap-authentication-templates-developer-documentation) is the preferred way to migrate.</div></div><div>One-tap autofill authentication templates allow you to send a one-time password or code along with an one-tap autofill button to your users. When a WhatsApp user taps the autofill button, the WhatsApp client triggers an activity which opens your app and delivers it the password or code.</div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-jpwqx5h3.png)</div></div><div>One-tap autofill button authentication templates consist of:</div><span>Preset text: *&lt;VERIFICATION\_CODE&gt; is your verification code.*</span><span>An optional security disclaimer: *For your security, do not share this code.*</span><span>An optional expiration warning (optional): *This code expires in &lt;NUM\_MINUTES&gt; minutes.*</span><span>A one-tap autofill button.</span><div>**Note**: The OTP Android SDK features a simplified workflow for implementing one-tap and zero-tap authentication templates. You can learn how to use it below.</div><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>### Limitations

</div></div></div><div>One-tap autofill buttons are only supported on Android. If you send an authentication template to a WhatsApp user who is using a non-Android device, the WhatsApp client will display a copy code button instead.</div><div>URLs, media, and emojis are not supported.</div><div id="bkmrk-app-signing-key-hash"><div id="bkmrk-app-signing-key-hash-1"><div>### App signing key hash

</div></div></div><div>You must include your app signing key hash in your post body.</div><div>To calculate your hash, follow Google’s instructions for [computing your app’s hash string<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdevelopers.google.com%2Fidentity%2Fsms-retriever%2Fverify%23computing_your_apps_hash_string&h=AT6nbQ7OdYH3kxxs9CPLkbMFkYJdmIlnOVCV5-cSWm9YOPWX3wj8IaCbUQZ3PCvPJL58yRVUoc31Rq8zLrppd4YbzVcqH55nVkPlZx-pER5EHim51KZ9h-yFe3NvmGzhr8kOekdIiMptgwbNBo1BKw).</div><div>Alternatively, if you follow Google’s instructions and download your app signing key certificate (step 1), you can use your certificate with the [sms\_retriever\_hash\_v9.sh<span>⁠</span>](https://l.facebook.com/l.php?u=http%3A%2F%2Ftinyurl.com%2F43bkdrdt&h=AT6nbQ7OdYH3kxxs9CPLkbMFkYJdmIlnOVCV5-cSWm9YOPWX3wj8IaCbUQZ3PCvPJL58yRVUoc31Rq8zLrppd4YbzVcqH55nVkPlZx-pER5EHim51KZ9h-yFe3NvmGzhr8kOekdIiMptgwbNBo1BKw) shell script to compute the hash. For example:</div><div>```
<span>.</span><span>/sms_retriever_hash_v9.sh --package "com.example.myapplication" --keystore ~/</span><span>.</span><span>android</span><span>/</span><span>debug</span><span>.</span><span>keystore</span>
```

</div><div id="bkmrk-supported-apps"><div id="bkmrk-supported-apps-1"><div>### Supported apps

</div></div></div><div>The `supported_apps` array allows you define pairs of app package names and signing key hashes for up to 5 apps. This can be useful if you have different app builds and want each of them to be able to initiate the handshake:</div><div>Alternatively, if you are using Graph API version 20.0 or older and have only a single app, you can define the app’s package name and signing key hash as `buttons` object properties, but this is not recommended as we will stop supporting this method starting with version 21.0:</div><div id="bkmrk-handshake"><div id="bkmrk-handshake-1"><div>### Handshake

</div></div></div><div>You must signal to the WhatsApp client to expect imminent delivery of a password or code. You can do this by initiating a “handshake”.</div><div>A handshake is an Android intent and public class that you implement but that the WhatsApp client can start.</div><div>When a user in your app requests a one-time password or verification code and chooses for it to be delivered to their WhatsApp number, first perform the handshake, then call our API to send the authentication template message. When the WhatsApp client receives the message, it will perform an eligibility check, and if there are no errors, start the intent and display the message to the user. Finally, when the user taps the message’s one-tap autofill button, we automatically load your app and pass it the password or code.</div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-hawyahss.png)</div></div><div>If you do not perform a handshake before sending the message, or the message fails an eligibility check, the delivered message will display a copy code button instead of a one-tap button.</div><div id="bkmrk-eligibility-check"><div id="bkmrk-eligibility-check-1"><div>#### Eligibility check

</div></div></div><div>The WhatsApp client performs the following checks when it receives an authentication template message. If any check fails, the one-tap autofill button will be replaced with a copy code button.</div><span>The handshake was initiated no more than 10 minutes ago (or no more than the number of minutes indicated by the template’s `code_expiration_minutes` property, if present).</span><span>The package name in the message (defined in the `package_name` property in the `components` array upon template creation) matches the package name set on the intent. The match is determined through the `getCreatorPackage` method called in the `PendingIntent` object provided by your application.</span><span>None of the other apps that you included in the template’s list of `supported_apps` initiated a handshake in the last 10 minutes (or the number of minutes indicated by the template’s `code_expiration_minutes` property, if present).</span><span>The app signing key hash in the message (defined in the `signature_hash` property in the components array upon template creation) matches your installed app’s signing key hash.</span><span>The message includes the one-tap autofill button text.</span><span>Your app has defined an activity to receive the password or code.</span><div id="bkmrk-android-notification"><div id="bkmrk-android-notification-1"><div>#### Android notifications

</div></div></div><div>Android notifications indicating receipt of a WhatsApp authentication template message will only appear on the user’s Android device if:</div><span>The user is logged into the WhatsApp app or WhatsApp Business app with the phone number (account) that the message was sent to.</span><span>The user is logged into your app.</span><span>Android OS is KitKat (4.4, API 19) or above.</span><span>**Show notifications** is enabled (**Settings** &gt; **Notifications**) in the WhatsApp app or WhatsApp Business app.</span><span>Device level notification is enabled for the WhatsApp app or WhatsApp Business app.</span><span>Prior message threads in the WhatsApp app or WhatsApp Business app between the user and your business are not muted.</span><div id="bkmrk-using-the-sdk"><div id="bkmrk-using-the-sdk-1"><div>#### Using the SDK

</div></div></div><div>The OTP Android SDK can be used to perform handshakes, as well as other functions in both one-tap and zero-tap authentication templates.</div><div>To access SDK functionality, add the following configuration to your Gradle file:</div><div>```
<span>dependencies </span><span>{</span><span>…</span><span>
    implementation </span><span>'com.whatsapp.otp:whatsapp-otp-android-sdk:1.0.0'</span><span>…</span><span>}</span>
```

</div><div>To your repositories, add `mavenCentral()`:</div><div>```
<span>repositories </span><span>{</span><span>…</span><span>
    mavenCentral</span><span>()</span><span>…</span><span>}</span>
```

</div><div id="bkmrk-activity"><div id="bkmrk-activity-1"><div>#### Activity

</div></div></div><div>Declare an activity and intent filter that can receive the one-time password or code. The intent filter must have the action name `com.whatsapp.otp.OTP_RETRIEVED`.</div><div>```
<span><activity</span><span>android:name</span><span>=</span><span>".ReceiveCodeActivity"</span><span>android:enabled</span><span>=</span><span>"true"</span><span>android:exported</span><span>=</span><span>"true"</span><span>android:launchMode</span><span>=</span><span>"standard"</span><span>></span><span><intent-filter></span><span><action</span><span>android:name</span><span>=</span><span>"com.whatsapp.otp.OTP_RETRIEVED"</span><span>/></span><span></intent-filter></span><span></activity></span>
```

</div><div>This is the activity that the WhatsApp app or WhatsApp Business app will start once the authentication template message is received and it passes all [eligibility checks](#bkmrk-eligibility-check-1).</div><div id="bkmrk-activity-class"><div id="bkmrk-activity-class-1"><div>#### Activity class

</div></div></div><div id="bkmrk-using-the-sdk-%28prefe"><div id="bkmrk-using-the-sdk-%28prefe-1"><div>##### Using the SDK (Preferred)

</div></div></div><div>Define the activity public class and instantiate a `WhatsAppOtpIncomingIntentHandler` object to handle the intent. The `.processOtpCode()` method validates the handshake ID against the expected value you stored during handshake initiation and handles errors.</div><div>```
<span>public</span><span>class</span><span>ReceiveCodeActivity</span><span>extends</span><span>AppCompatActivity</span><span>{</span><span>@Override</span><span>protected</span><span>void</span><span> onCreate</span><span>(</span><span>Bundle</span><span> savedInstanceState</span><span>)</span><span>{</span><span>super</span><span>.</span><span>onCreate</span><span>(</span><span>savedInstanceState</span><span>);</span><span>WhatsAppOtpIncomingIntentHandler</span><span> incomingIntentHandler </span><span>=</span><span>new</span><span>WhatsAppOtpIncomingIntentHandler</span><span>();</span><span>// Retrieve the expected handshake ID that was stored during handshake initiation</span><span>String</span><span> expectedHandshakeId </span><span>=</span><span> retrieveStoredHandshakeId</span><span>();</span><span>

          incomingIntentHandler</span><span>.</span><span>processOtpCode</span><span>(</span><span>
                                 getIntent</span><span>(),</span><span>
                                 expectedHandshakeId</span><span>,</span><span>(</span><span>code</span><span>)</span><span>-></span><span>{</span><span>// The handshake ID has been validated by the SDK</span><span>
                                   validateCode</span><span>(</span><span>code</span><span>);</span><span>},</span><span>// call your function to handle errors</span><span>(</span><span>error</span><span>,</span><span> exception</span><span>)</span><span>-></span><span> handleError</span><span>(</span><span>error</span><span>,</span><span> exception</span><span>));</span><span>}</span>
```

</div><div id="bkmrk-without-the-sdk"><div id="bkmrk-without-the-sdk-1"><div>##### Without the SDK

</div></div></div><div>Define the activity public class that can accept the code once it has been passed to your app. The activity should validate the `request_id` (handshake ID) to ensure the OTP code is coming from a legitimate handshake initiated by your app.</div><div>```
<span>public</span><span>class</span><span>ReceiveCodeActivity</span><span>extends</span><span>AppCompatActivity</span><span>{</span><span>@Override</span><span>protected</span><span>void</span><span> onCreate</span><span>(</span><span>Bundle</span><span> savedInstanceState</span><span>)</span><span>{</span><span>super</span><span>.</span><span>onCreate</span><span>(</span><span>savedInstanceState</span><span>);</span><span>Intent</span><span> intent </span><span>=</span><span> getIntent</span><span>();</span><span>// Extract the handshake ID from the intent</span><span>String</span><span> incomingRequestId </span><span>=</span><span> intent</span><span>.</span><span>getStringExtra</span><span>(</span><span>"request_id"</span><span>);</span><span>// Retrieve the previously stored handshake ID</span><span>String</span><span> storedRequestId </span><span>=</span><span> retrieveStoredRequestId</span><span>();</span><span>// Validate the handshake ID matches</span><span>if</span><span>(</span><span>storedRequestId </span><span>!=</span><span>null</span><span>&&</span><span> storedRequestId</span><span>.</span><span>equals</span><span>(</span><span>incomingRequestId</span><span>))</span><span>{</span><span>// use OTP code</span><span>String</span><span> otpCode </span><span>=</span><span> intent</span><span>.</span><span>getStringExtra</span><span>(</span><span>"code"</span><span>);</span><span>// ...</span><span>}</span><span>}</span><span>}</span>
```

</div><div id="bkmrk-initiating-the-hands"><div id="bkmrk-initiating-the-hands-1"><div>#### Initiating the handshake

</div></div></div><div id="bkmrk-using-the-sdk-%28prefe-3"><div id="bkmrk-using-the-sdk-%28prefe-4"><div>##### Using the SDK (Preferred)

</div></div></div><div>Performing a handshake can be done by instantiating the `WhatsAppOtpHandler` object and passing in your context to the `.sendOtpIntentToWhatsApp()` method. The method returns a UUID (handshake ID) that must be stored and used to validate the incoming OTP code later:</div><div>```
<span>WhatsAppOtpHandler</span><span> whatsAppOtpHandler </span><span>=</span><span>new</span><span>WhatsAppOtpHandler</span><span>();</span><span>
UUID handshakeId </span><span>=</span><span> whatsAppOtpHandler</span><span>.</span><span>sendOtpIntentToWhatsApp</span><span>(</span><span>context</span><span>);</span><span>// Store handshakeId to validate the received OTP code later</span>
```

</div><div id="bkmrk-without-the-sdk-3"><div id="bkmrk-without-the-sdk-4"><div>##### Without the SDK

</div></div></div><div>This example demonstrates one way to initiate a handshake with the WhatsApp client. The handshake includes a `request_id` (UUID) that must be stored and validated when receiving the OTP code.</div><div>```
<span>private</span><span>String</span><span> currentRequestId</span><span>;</span><span>public</span><span>void</span><span> sendOtpIntentToWhatsApp</span><span>()</span><span>{</span><span>// Generate a unique handshake ID</span><span>
   currentRequestId </span><span>=</span><span> UUID</span><span>.</span><span>randomUUID</span><span>().</span><span>toString</span><span>();</span><span>// Store this ID for later validation when receiving the OTP</span><span>
   storeRequestId</span><span>(</span><span>currentRequestId</span><span>);</span><span>// Send OTP_REQUESTED intent to both WA and WA Business App</span><span>
   sendOtpIntentToWhatsApp</span><span>(</span><span>"com.whatsapp"</span><span>,</span><span> currentRequestId</span><span>);</span><span>
   sendOtpIntentToWhatsApp</span><span>(</span><span>"com.whatsapp.w4b"</span><span>,</span><span> currentRequestId</span><span>);</span><span>}</span><span>private</span><span>void</span><span> sendOtpIntentToWhatsApp</span><span>(</span><span>String</span><span> packageName</span><span>,</span><span>String</span><span> requestId</span><span>)</span><span>{</span><span>/**
  * Starting with Build.VERSION_CODES.S, it will be required to explicitly
  * specify the mutability of  PendingIntents on creation with either
  * (@link #FLAG_IMMUTABLE} or FLAG_MUTABLE
  */</span><span>int</span><span> flags </span><span>=</span><span>Build</span><span>.</span><span>VERSION</span><span>.</span><span>SDK_INT </span><span>>=</span><span>Build</span><span>.</span><span>VERSION_CODES</span><span>.</span><span>S </span><span>?</span><span> FLAG_IMMUTABLE </span><span>:</span><span>0</span><span>;</span><span>PendingIntent</span><span> pi </span><span>=</span><span>PendingIntent</span><span>.</span><span>getActivity</span><span>(</span><span>
      getApplicationContext</span><span>(),</span><span>0</span><span>,</span><span>new</span><span>Intent</span><span>(),</span><span>
      flags</span><span>);</span><span>// Send OTP_REQUESTED intent to WhatsApp</span><span>Intent</span><span> intentToWhatsApp </span><span>=</span><span>new</span><span>Intent</span><span>();</span><span>
  intentToWhatsApp</span><span>.</span><span>setPackage</span><span>(</span><span>packageName</span><span>);</span><span>
  intentToWhatsApp</span><span>.</span><span>setAction</span><span>(</span><span>"com.whatsapp.otp.OTP_REQUESTED"</span><span>);</span><span>// WA will use this to verify the identity of the caller app.</span><span>Bundle</span><span> extras </span><span>=</span><span> intentToWhatsApp</span><span>.</span><span>getExtras</span><span>();</span><span>if</span><span>(</span><span>extras </span><span>==</span><span>null</span><span>)</span><span>{</span><span>
     extras </span><span>=</span><span>new</span><span>Bundle</span><span>();</span><span>}</span><span>
  extras</span><span>.</span><span>putParcelable</span><span>(</span><span>"_ci_"</span><span>,</span><span> pi</span><span>);</span><span>// Add the handshake ID for secure validation</span><span>
  intentToWhatsApp</span><span>.</span><span>putExtra</span><span>(</span><span>"request_id"</span><span>,</span><span> requestId</span><span>);</span><span>
  intentToWhatsApp</span><span>.</span><span>putExtras</span><span>(</span><span>extras</span><span>);</span><span>
  getApplicationContext</span><span>().</span><span>sendBroadcast</span><span>(</span><span>intentToWhatsApp</span><span>);</span><span>}</span>
```

</div><div id="bkmrk-checking-if-whatsapp"><div id="bkmrk-checking-if-whatsapp-1"><div>#### Checking if WhatsApp is installed on Android

</div></div></div><div>You can check WhatsApp installation before offering WhatsApp as an option if you expect both WhatsApp and your app to be on the same device.</div><div>First, you need to add the following to your `AndroidManifest.xml` file:</div><div><div>```
<span><span><</span><span>queries</span><span>></span></span><br></br><span><span><</span><span>package</span><span>android:name</span><span>=</span><span>"com.whatsapp"</span><span>/</span><span>></span></span><br></br><span><span><</span><span>package</span><span>android:name</span><span>=</span><span>"com.whatsapp.w4b"</span><span>/</span><span>></span></span><br></br><span><span></</span><span>queries</span><span>></span></span><br></br>
```

</div></div><div id="bkmrk-using-the-sdk-%28prefe-6"><div id="bkmrk-using-the-sdk-%28prefe-7"><div>##### Using the SDK (Preferred)

</div></div></div><div>Instantiate the `WhatsAppOtpHandler` object:</div><div>```
<span>WhatsAppOtpHandler</span><span> whatsAppOtpHandler </span><span>=</span><span>new</span><span>WhatsAppOtpHandler</span><span>();</span>
```

</div><div>Check if the WhatsApp client is installed by passing the `isWhatsAppInstalled` method as the clause in an `If` statement:</div><div>```
<span>If</span><span>(</span><span>whatsAppOtpHandler</span><span>.</span><span>isWhatsAppInstalled</span><span>(</span><span>context</span><span>))</span><span>{</span><span>// ... do something</span><span>}</span>
```

</div><div id="bkmrk-without-the-sdk-6"><div id="bkmrk-without-the-sdk-7"><div>##### Without the SDK

</div></div></div><div>```
<span>if</span><span>(</span><span>this</span><span>.</span><span>isWhatsAppInstalled</span><span>(</span><span>context</span><span>))</span><span>{</span><span>// ... do something</span><span>}</span><span>public</span><span>boolean</span><span> isWhatsAppInstalled</span><span>(</span><span>final</span><span>@NonNull</span><span>Context</span><span> context</span><span>){</span><span>return</span><span> isWhatsAppInstalled</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp"</span><span>)</span><span>||</span><span>
           isWhatsAppInstalled</span><span>(</span><span>context</span><span>,</span><span>"com.whatsapp.w4b"</span><span>);</span><span>}</span><span>public</span><span>boolean</span><span> isWhatsAppInstalled</span><span>(</span><span>final</span><span>@NonNull</span><span>Context</span><span> context</span><span>,</span><span>final</span><span>@NonNull</span><span>String</span><span> type</span><span>){</span><span>final</span><span>Intent</span><span> intent </span><span>=</span><span>new</span><span>Intent</span><span>();</span><span>
    intent</span><span>.</span><span>setPackage</span><span>(</span><span>type</span><span>);</span><span>
    intent</span><span>.</span><span>setAction</span><span>(</span><span>"com.whatsapp.otp.OTP_REQUESTED"</span><span>);</span><span>PackageManager</span><span> packageManager </span><span>=</span><span> context</span><span>.</span><span>getPackageManager</span><span>();</span><span>List</span><span><</span><span>ResolveInfo</span><span>></span><span> receivers </span><span>=</span><span> packageManager</span><span>.</span><span>queryBroadcastReceivers</span><span>(</span><span>intent</span><span>,</span><span>0</span><span>);</span><span>return</span><span>!</span><span>receivers</span><span>.</span><span>isEmpty</span><span>();</span><span>}</span><span>}</span>
```

</div><div id="bkmrk-checking-if-whatsapp-3"><div id="bkmrk-checking-if-whatsapp-4"><div>#### Checking if WhatsApp is installed on iOS

</div></div></div><div>Use the following code in your iOS application to check if WhatsApp is installed</div><div>```
<span>let</span><span> schemeURL </span><span>=</span><span> URL</span><span>(</span><span>string</span><span>:</span><span>"whatsapp://otp"</span><span>)!</span><span>let</span><span> isWhatsAppInstalled </span><span>=</span><span>UIApplication</span><span>.</span><span>shared</span><span>.</span><span>canOpenURL</span><span>(</span><span>schemeURL</span><span>)</span>
```

</div><div id="bkmrk-error-signals"><div id="bkmrk-error-signals-1"><div>#### Error signals

</div></div></div><div>See [Error Signals](/books/meta-whatsapp/page/error-signals-developer-documentation) that can help with debugging.</div><div id="bkmrk-handshake-id-error-c"><div id="bkmrk-handshake-id-error-c-1"><div>#### Handshake ID error codes

</div></div></div><div>The following error codes may be returned when using the SDK with handshake ID validation:</div><div><table><thead><tr><th><span>Error Code</span></th><th><span>Description</span></th></tr></thead><tbody><tr><td><div>`HANDSHAKE_ID_MISSING`</div></td><td><div>The handshake ID was not included in the intent from WhatsApp</div></td></tr><tr><td><div>`HANDSHAKE_ID_INVALID_FORMAT`</div></td><td><div>The handshake ID is not a valid UUID format</div></td></tr><tr><td><div>`HANDSHAKE_ID_MISMATCH`</div></td><td><div>The handshake ID in the intent does not match the expected value</div></td></tr></tbody></table>

</div><div id="bkmrk-sample-app"><div id="bkmrk-sample-app-1"><div>#### Sample app

</div></div></div><div>See our [WhatsApp One-Time Password (OTP) Sample App<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fgithub.com%2FWhatsApp%2FWhatsApp-OTP-Sample-App&h=AT6nbQ7OdYH3kxxs9CPLkbMFkYJdmIlnOVCV5-cSWm9YOPWX3wj8IaCbUQZ3PCvPJL58yRVUoc31Rq8zLrppd4YbzVcqH55nVkPlZx-pER5EHim51KZ9h-yFe3NvmGzhr8kOekdIiMptgwbNBo1BKw) for Android on Github. The sample app demonstrates how to send and receive OTP passwords and codes via the API, how to integrate the one-tap autofill and copy code buttons, how to create a template, and how to spin up a sample server.</div></div>

# Zero-tap authentication templates | Developer Documentation

<div id="bkmrk-zero-tap-authenticat">## Zero-tap authentication templates

<div><span>Updated: Feb 6, 2026</span></div><div><div>**Upcoming deprecation:** Starting **April 15, 2026**, the `PendingIntent`-based handshake method for authentication templates will be deprecated. If you are currently using `PendingIntent` to initiate handshakes or verify app identity, the [OTP Android SDK](#bkmrk-using-the-sdk-1) is the preferred way to migrate.</div></div><div>Zero-tap authentication templates allow your users to receive one-time passwords or codes via WhatsApp without having to leave your app.</div><div>When a user in your app requests a password or code and you deliver it using a zero-tap authentication template, the WhatsApp client simply broadcasts the included password or code and your app can capture it immediately with a broadcast receiver.</div><div>From your user’s perspective, they request a password or code in your app and it appears in your app automatically. If your app user happens to check the message in the WhatsApp client, they will only see a message displaying the default fixed text: *&lt; code &gt; is your verification code.*</div><div>Like one-tap autofill button authentication templates, when the WhatsApp client receives the template message containing the user’s password or code, we perform a series of eligibility checks. If the message fails this check and we are unable to broadcast the password or code, the message will display either a one-tap autofill button or a copy code button. For this reason, when you create a zero-tap authentication template, you must include a one-tap autofill and copy code button in your post body payload, even if the user may never see one of these buttons.</div><div>Note: The OTP Android SDK features a simplified workflow for implementing one-tap and zero-tap authentication templates. You can learn how to use it below.</div><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>### Limitations

</div></div></div><div>Zero-tap is only supported on Android. If you send a zero-tap authentication template to a WhatsApp user who is using a non-Android device, the WhatsApp client will display a copy code button instead.</div><div>URLs, media, and emojis are not supported.</div><div id="bkmrk-best-practices"><div id="bkmrk-best-practices-1"><div>### Best practices

</div></div></div><span>Do not make WhatsApp your default password/code delivery method.</span><span>Make it clear to your app users that the password or code will be automatically delivered to your app when they select WhatsApp for delivery.</span><span>Link to our [About security codes that automatically fill on WhatsApp<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Ffaq.whatsapp.com%2F659113242716268%2F&h=AT5j1FrEeNSjq0mXa563rUdInE9KHgB4gowwaET01HBHIkml1nDJx8j3jsUV07i-M18d5jOfrt7mlzKasP55IAVweALZONR41zO8SzHIjeg9Dx3ZVC7mcYKmNfiMinoriuN64XxSSMnfEbYLYbM9UA) help center article if your users are worried about auto-delivery of the password or code.</span><span>After the password/code is used in your app, make it clear to your app user that it was received successfully.</span><div>Here are some examples that make it clear to an app user that their code will automatically appear in the app. ![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-or3d3mot.png)</div><div id="bkmrk-app-signing-key-hash"><div id="bkmrk-app-signing-key-hash-1"><div>### App signing key hash

</div></div></div><div>You must include your app signing key hash in your post body.</div><div>To calculate your hash, follow Google’s instructions for [computing your app’s hash string<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdevelopers.google.com%2Fidentity%2Fsms-retriever%2Fverify%23computing_your_apps_hash_string&h=AT5j1FrEeNSjq0mXa563rUdInE9KHgB4gowwaET01HBHIkml1nDJx8j3jsUV07i-M18d5jOfrt7mlzKasP55IAVweALZONR41zO8SzHIjeg9Dx3ZVC7mcYKmNfiMinoriuN64XxSSMnfEbYLYbM9UA).</div><div>Alternatively, if you follow Google’s instructions and download your app signing key certificate (step 1), you can use your certificate with the [sms\_retriever\_hash\_v9.sh<span>⁠</span>](https://l.facebook.com/l.php?u=http%3A%2F%2Ftinyurl.com%2F43bkdrdt&h=AT5j1FrEeNSjq0mXa563rUdInE9KHgB4gowwaET01HBHIkml1nDJx8j3jsUV07i-M18d5jOfrt7mlzKasP55IAVweALZONR41zO8SzHIjeg9Dx3ZVC7mcYKmNfiMinoriuN64XxSSMnfEbYLYbM9UA) shell script to compute the hash. For example:</div><div>```
./sms_retriever_hash_v9.sh --package "com.example.myapplication" --keystore ~/.android/debug.keystore

```

</div><div id="bkmrk-supported-apps"><div id="bkmrk-supported-apps-1"><div>### Supported apps

</div></div></div><div>The `supported_apps` array allows you define pairs of app package names and signing key hashes for up to 5 apps. This can be useful if you have different app builds and want each of them to be able to initiate the handshake:</div><div>Alternatively, if you are using Graph API version 20.0 or older and have only a single app, you can define the app’s package name and signing key hash as `buttons` object properties, but this is not recommended as we will stop supporting this method starting with version 21.0:</div><div id="bkmrk-error-signals"><div id="bkmrk-error-signals-1"><div>### Error signals

</div></div></div><div>See [Error Signals](/books/meta-whatsapp/page/error-signals-developer-documentation) that can help with debugging.</div><div id="bkmrk-handshake-id-error-c"><div id="bkmrk-handshake-id-error-c-1"><div>#### Handshake ID Error Codes

</div></div></div><div>The following error codes may be returned when using the SDK with handshake ID validation:</div><div><table><thead><tr><th><span>Error Code</span></th><th><span>Description</span></th></tr></thead><tbody><tr><td><div>`HANDSHAKE_ID_MISSING`</div></td><td><div>The handshake ID was not included in the intent from WhatsApp</div></td></tr><tr><td><div>`HANDSHAKE_ID_INVALID_FORMAT`</div></td><td><div>The handshake ID is not a valid UUID format</div></td></tr><tr><td><div>`HANDSHAKE_ID_MISMATCH`</div></td><td><div>The handshake ID in the intent does not match the expected value</div></td></tr></tbody></table>

</div></div>

# Copy code authentication templates | Developer Documentation

<div id="bkmrk-copy-code-authentica">## Copy code authentication templates

<div><span>Updated: Nov 4, 2025</span></div><div>Copy code authentication templates allow you to send a one-time password or code along with a copy code button to your users. When a WhatsApp user taps the copy code button, the WhatsApp client copies the password or code to the device’s clipboard. The user can then switch to your app and paste the password or code into your app.</div><div>Note: The “I didn’t request a code” button is currently in beta and is being rolled out incrementally to business customers.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-rurb1shr.png)</div><div>Copy code button authentication templates consist of:</div>
<span>Preset text: *&lt;VERIFICATION\_CODE&gt; is your verification code.*</span><span>An optional security disclaimer: *For your security, do not share this code.*</span><span>An optional expiration warning (optional): *This code expires in &lt;NUM\_MINUTES&gt; minutes.*</span><span>A copy code button.</span><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>### Limitations

</div></div></div><div>URLs, media, and emojis are not supported.</div><div id="bkmrk-sample-app"><div id="bkmrk-sample-app-1"><div>### Sample app

</div></div></div><div>See our [WhatsApp One-Time Password (OTP) Sample App<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fgithub.com%2FWhatsApp%2FWhatsApp-OTP-Sample-App&h=AT54maGhOmvXT06pYtOeAI4XmtpMYoJVoRKv_HTjomnN37neIDwjhNpTUuLYV_p9KfVytI0PeUl3t8fV7oeiSSTKh3MPxZyHosbTiHoPcR8tyP_vppb9IIcgGCyCzgCo3VGpzlG6mPJiu6wKIG_iPQ) for Android on Github. The sample app demonstrates how to send and receive OTP passwords and codes via the API, how to integrate the one-tap autofill and copy code buttons, how to create a template, and how to spin up a sample server.</div></div>

# Error Signals | Developer Documentation

<div id="bkmrk-error-signalsupdated">## Error Signals

<div><span>Updated: Feb 6, 2026</span></div><div><div>**Upcoming deprecation:** Starting **April 15, 2026**, the `PendingIntent`-based handshake method for authentication templates will be deprecated. If you are currently using `PendingIntent` to initiate handshakes or verify app identity, the [OTP Android SDK](/books/meta-whatsapp/page/zero-tap-authentication-templates-developer-documentation) is the preferred way to migrate.</div></div><div><div>The OTP Android SDK features a simplified workflow for implementing one-tap and zero-tap authentication templates. You can learn how to use it below.</div></div><div>This document describes Android-only error signals that can help you debug [one-tap autofill authentication templates](/books/meta-whatsapp/page/one-tap-autofill-authentication-templates-developer-documentation) and [zero-tap authentication templates](/books/meta-whatsapp/page/zero-tap-authentication-templates-developer-documentation).</div><div>If your message fails the eligibility check, the one-tap autofill button will be replaced with a copy code button. In addition, there may be device or WhatsApp client settings that prevent message notifications. To help with debugging, our apps surface some error information via the `com.whatsapp.OTP_ERROR` intent. In these situations you will receive an error key and message instead of the user’s one-time passwords or verification code.</div><div>Note that some of these error signals will only surface if you are running WhatsApp in the Android emulator.</div><div><table><thead><tr><th><span>Key </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>`ambiguous_delivery_destination`</div><div>*Emulator only*</div></div></td><td><div><div>**Ambiguous delivery destination**</div><div>There are multiple active OTP requests for the packages specified by this template, and we could not determine which package to deliver the code to.</div><div>This can happen when multiple applications specified in the template’s `supported_apps` array have initiated the handshake (sent the `com.whatsapp.otp.OTP_REQUESTED` intent) within the past 10 minutes.</div></div></td></tr><tr><td><div><div>`incompatible_os_version`</div></div></td><td><div><div>**Incompatible Android version**</div><div>  
This can happen when you initiate the handshake (send the `com.whatsapp.otp.OTP_REQUESTED` intent) but the device is running a version of Android older than v19.</div></div></td></tr><tr><td><div><div>`incorrect_signature_hash`</div><div>*Emulator only*</div></div></td><td><div><div>**Incorrect signature hash**</div><div>  
This can happen when you initiate the handshake (send the `com.whatsapp.otp.OTP_REQUESTED` intent) and our app receives an authentication template message that uses a one-tap autofill button, but the package name in the message does not produce the message’s signature hash.</div></div></td></tr><tr><td><div><div>`missing_handshake_or_disorder`</div></div></td><td><div><div>**Missing handshake / Order of operations**</div><div>  
This can happen when our app receives an authentication template message with a one-tap autofill button but the handshake was not initiated.</div></div></td></tr><tr><td><div><div>`otp_request_expired`</div></div></td><td><div><div>**OTP request expired**</div><div>  
This can happen when an authentication template that uses a one-tap autofill button is delivered to the user but more than 10 minutes (or the number of minutes indicated in the template’s `code_expiration_minutes` property, if present) have passed since you initiated the handshake. In this situation, we display the copy code button instead.</div></div></td></tr><tr><td><div><div>`whatsapp_message_notification_disabled`</div><div>*Emulator only*</div></div></td><td><div><div>**Message notification disabled in WA settings**</div><div>  
This can happen when you initiate the handshake (send the `com.whatsapp.otp.OTP_REQUESTED` intent) but the user has disabled notifications in the WhatsApp app or WhatsApp Business app (within our app settings).</div></div></td></tr><tr><td><div><div>`whatsapp_notification_disabled`</div><div>*Emulator only*</div></div></td><td><div><div>**WA notification disabled in device level**</div><div>  
This can happen when you initiate the handshake (send the `com.whatsapp.otp.OTP_REQUESTED` intent) but the user has disabled app notifications for our apps (device level settings).</div></div></td></tr></tbody></table>

</div><div id="bkmrk-integration"><div id="bkmrk-integration-1"><div>#### Integration

</div></div></div><div>The error signals are delivered via broadcasted intent so you must implement [`BroadcastReceiver`<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fdeveloper.android.com%2Freference%2Fandroid%2Fcontent%2FBroadcastReceiver&h=AT4q1RHNaJfjSsir9UNvGDxY4-HhwpaY6fOkDZsIpDJHKMOwNP-nZcaAdhaI9KzfEGZB9Jw-VMrO1bBrJ7ADuvmNXRAuZRituKcRtJxQXGp0-0U4cCe-_AFGd5ll08W0401dWbGJyxnEK4YvCN5frA) to listen for error signals.</div><div id="bkmrk-in-manifest.xml"><div id="bkmrk-in-manifest.xml-1"><div>##### In manifest.xml

</div></div></div><div><div>```
<receiver
 android:name=".app.otp.OtpErrorReceiver"
 android:enabled="true"
 android:exported="true" >
   <intent-filter>
       <action android:name="com.whatsapp.otp.OTP_ERROR"/>
   </intent-filter>
</receiver>
```

</div></div><div id="bkmrk-receiver-class---usi"><div id="bkmrk-receiver-class---usi-1"><div>##### Receiver class - Using the SDK (Preferred)

</div></div></div><div>Implement `onReceive` and use a `WhatsAppOtpIncomingIntentHandler` object to process the debug signals.</div><div>```
<span>public</span><span>class</span><span>OtpErrorReceiver</span><span>extends</span><span>BroadcastReceiver</span><span>{</span><span>@Override</span><span>public</span><span>void</span><span> onReceive</span><span>(</span><span>Context</span><span> context</span><span>,</span><span>Intent</span><span> intent</span><span>)</span><span>{</span><span>WhatsAppOtpIncomingIntentHandler</span><span> whatsAppOtpIncomingIntentHandler </span><span>=</span><span>new</span><span>WhatsAppOtpIncomingIntentHandler</span><span>();</span><span>
     whatsAppOtpIncomingIntentHandler</span><span>.</span><span>processOtpDebugSignals</span><span>(</span><span>
                          intent</span><span>,</span><span>// your function to handle the signal</span><span>(</span><span>debugSignal</span><span>)</span><span>-></span><span> handleSignal</span><span>(</span><span>debugSignal</span><span>),</span><span>// your function to handle any error</span><span>(</span><span>error</span><span>,</span><span> exception</span><span>)</span><span>-></span><span> handleError</span><span>(</span><span>error</span><span>,</span><span> exception</span><span>));</span><span>}</span><span>}</span>
```

</div><div id="bkmrk-receiver-class---wit"><div id="bkmrk-receiver-class---wit-1"><div>##### Receiver class - Without the SDK

</div></div></div><div>```
<span>public</span><span>class</span><span>OtpErrorReceiver</span><span>extends</span><span>BroadcastReceiver</span><span>{</span><span>public</span><span>static</span><span>final</span><span>String</span><span> OTP_ERROR_KEY </span><span>=</span><span>"error"</span><span>;</span><span>public</span><span>static</span><span>final</span><span>String</span><span> OTP_ERROR_MESSAGE_KEY </span><span>=</span><span>"error_message"</span><span>;</span><span>@Override</span><span>public</span><span>void</span><span> onReceive</span><span>(</span><span>Context</span><span> context</span><span>,</span><span>Intent</span><span> intent</span><span>)</span><span>{</span><span>String</span><span> otpErrorKey </span><span>=</span><span> intent</span><span>.</span><span>getStringExtra</span><span>(</span><span>OTP_ERROR_KEY</span><span>);</span><span>String</span><span> otpErrorMessage </span><span>=</span><span> intent</span><span>.</span><span>getStringExtra</span><span>(</span><span>OTP_ERROR_MESSAGE_KEY</span><span>);</span><span>// Handle errors</span><span>}</span><span>}</span>
```

</div></div>

# Bulk management | Developer Documentation

<div id="bkmrk-bulk-managementupdat">## Bulk management

<div><span>Updated: Nov 10, 2025</span></div><div>If a template already exists with a matching name and language, the template will be updated with the contents of the request, otherwise, a new template will be created.</div><div id="bkmrk-post-body"><div id="bkmrk-post-body-1"><div>#### Post Body

</div></div></div><div id="bkmrk-properties"><div id="bkmrk-properties-1"><div>#### Properties

</div></div></div><div>All [template creation properties](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates#properties) are supported, with these exceptions:</div><span>The `language` property is not supported. Instead, use `languages` and set its value to an array of [language and locale code](/books/meta-whatsapp/page/template-library-developer-documentation) strings. For example: `["en_US","es_ES","fr"]`.</span><span>The `text` property is not supported.</span><span>The `autofill_text` property is not supported.</span></div>

# Template previews | Developer Documentation

<div id="bkmrk-template-previewsupd">## Template previews

<div><span>Updated: Nov 4, 2025</span></div><div id="bkmrk-request-parameters"><div id="bkmrk-request-parameters-1"><div>#### Request parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<LANGUAGE>`</div><div>*Comma-separated list*</div></div></td><td><div><div>**Optional.**</div><div>  
Comma-separated list of [language and locale codes](/books/meta-whatsapp/page/template-library-developer-documentation) of language versions you want returned.</div><div>  
If omitted, versions of all supported languages will be returned.</div></div></td><td><div><div>`en_US,es_ES`</div></div></td></tr><tr><td><div><div>`<ADD_SECURITY_RECOMMENDATION>`</div><div>*Boolean*</div></div></td><td><div><div>**Optional.**</div><div>  
Set to `true` if you want the security recommendation body string included in the response.</div><div>  
If omitted, the security recommendation string will not be included.</div></div></td><td><div><div>`true`</div></div></td></tr><tr><td><div><div>`<CODE_EXPIRATION_MINUTES>`</div><div>*Int64*</div></div></td><td><div><div>**Optional.**</div><div>  
Set to an integer if you want the code expiration footer string included in the response.</div><div>  
If omitted, the code expiration footer string will not be included.</div><div>  
Value indicates number of minutes until code expires.</div><div>Minimum `1`, maximum `90`.</div></div></td><td><div><div>`10`</div></div></td></tr><tr><td><div><div>`<BUTTON_TYPES>`</div><div>*Comma-separated list of strings*</div></div></td><td><div><div>**Required.**</div><div>  
Comma-separated list of strings indicating button type.</div><div>  
If included, the response will include the button text for each button in the response.</div><div>  
For authentication templates, this value must be `OTP`.</div></div></td><td><div><div>`OTP`</div></div></td></tr></tbody></table>

</div></div>

# Templates | Developer Documentation

<div id="bkmrk-templatesupdated%3A-de">## Templates

<div><span>Updated: Dec 5, 2025</span></div><div>Learn about templates, their uses and limitations, and the various types of templates you can create.</div><div>Templates are WhatsApp Business Account assets that can be sent in template messages via Cloud API or Marketing Messages API for WhatsApp. Template messages are the only type of message that can be sent to WhatsApp users outside of a [customer service window](/books/meta-whatsapp/page/sending-messages-developer-documentation), so templates are commonly used when messaging users in bulk, or when you need to message a user, but no customer service window is open between you and the user.</div><div id="bkmrk-creation"><div id="bkmrk-creation-1"><div>### Creation

</div></div></div><div>Template creation via API uses a common syntax. The bulk of the variation occurs in the category string, which assigns a category to the template, and the components array, which defines the components that make up the template.</div><div>You can create a maximum of 100 templates in a WhatsApp Business Account per hour.</div><div id="bkmrk-names"><div id="bkmrk-names-1"><div>#### Names

</div></div></div><div>Every template must have a name, but names are not unique. This flexibility allows you to create multiple templates with the same name, but in different languages.</div><div>Template names are limited to a maximum of 512 characters, consisting of lowercase alphanumeric characters and underscores.</div><div id="bkmrk-categories"><div id="bkmrk-categories-1"><div>#### Categories

</div></div></div><div>Each template must be categorized as **authentication**, **marketing**, or **utility**. Our [template categorization](/books/meta-whatsapp/page/template-categorization-developer-documentation) document describes how to assign the proper category to a template, and what can happen if we determine that a template has been mis-categorized.</div><div>Note that template categories also factor into [pricing](/books/meta-whatsapp/page/pricing-on-the-whatsapp-business-platform-developer-documentation).</div><div id="bkmrk-components"><div id="bkmrk-components-1"><div>#### Components

</div></div></div><div>Templates are made up of various text, media, and interactive UI components, which you define upon template creation. Our [template components document](/books/meta-whatsapp/page/template-components-developer-documentation) describes all possible components and how to define them.</div><div>Since there are a lot of components to choose from, we have dedicated [authentication](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates), [marketing](/books/meta-whatsapp/page/marketing-templates-developer-documentation), and [utility](/books/meta-whatsapp/page/utility-templates-developer-documentation) template documents and sub-documents, each with code examples that show how to create various templates with commonly used components.</div><div id="bkmrk-languages"><div id="bkmrk-languages-1"><div>#### Languages

</div></div></div><div>You must assign a [template language code](/books/meta-whatsapp/page/template-library-developer-documentation) upon template creation. Template strings and variables are not translated by Meta, so you are responsible for supplying strings and example parameters in their appropriate language.</div><div>If you create multiple templates with the same name but with different languages, each template counts against your [template limit](#bkmrk-template-limits-1).</div><div id="bkmrk-parameter-formats"><div id="bkmrk-parameter-formats-1"><div>#### Parameter formats

</div></div></div><div>Some template components allow you to define strings that contain one or more parameters (described as “variables” in WhatsApp Manager). These are replaced with values included by you in your send message payload when you send the template.</div><div>Upon template creation, if a string includes one or more parameters, you can specify their format — either `named` or `positional` — and you must include an example value for each parameter. If you do not specify a format, the template will use `positional` format by default.</div><div id="bkmrk-named-parameters"><div id="bkmrk-named-parameters-1"><div>##### Named parameters

</div></div></div><div>Parameters using the named format must be unique, single strings, composed of lowercase characters and underscores, wrapped in double curly brackets, for example, `{{first_name}}`. Example values in template creation payloads and real values in template send payloads can appear in any order.</div><div>Example template creation payload with named parameters:</div><div>Example template send payload of template that uses named parameters:</div><div id="bkmrk-positional-parameter"><div id="bkmrk-positional-parameter-1"><div>#### Positional parameters

</div></div></div><div>Positional parameters must be ordered array index numbers, starting from 1, wrapped in double curly brackets: (`{{1}}`...`{{2}}`...and so on). Example values in template creation payloads and real values in template send payloads must appear in the order in which their corresponding placeholders appear in the component text string.</div><div>Example template creation payload with positional parameter:</div><div>Example template send payload of template that uses positional parameter:</div><div id="bkmrk-media"><div id="bkmrk-media-1"><div>### Media

</div></div></div><div>Template header components can display media assets. If you are creating a template with a media header, you must use the [Resumable Upload API](https://developers.facebook.com/docs/graph-api/guides/upload) to obtain an asset handle, and include this asset handle in your template creation request. The example asset will be reviewed as part of [template review](/books/meta-whatsapp/page/template-review-developer-documentation).</div><div id="bkmrk-template-review"><div id="bkmrk-template-review-1"><div>### Template review

</div></div></div><div>Templates are automatically reviewed upon creation or after editing. If your template is approved, its status will be set to `APPROVED` and you can begin sending it in template messages. If it is rejected, or if its status changes to any other value, it cannot be sent in template messages.</div><div>See our [template review](/books/meta-whatsapp/page/template-review-developer-documentation) document to learn more about the template review process, common rejection reasons, and what you can do if your template is rejected.</div><div id="bkmrk-template-limits"><div id="bkmrk-template-limits-1"><div>### Template limits

</div></div></div><div>The number of templates a WhatsApp Business Account can have is determined by its parent business portfolio.</div><div>If a parent business portfolio is unverified, each of its WhatsApp Business Accounts is limited to 250 message templates. However, if the portfolio is [verified<span>⁠</span>](https://www.facebook.com/business/help/1095661473946872), and at least one of its WhatsApp Business Accounts has a business phone number with an approved [display name](/books/meta-whatsapp/page/display-names-developer-documentation), each of its WhatsApp Business Accounts can have up to 6,000 templates.</div><div>Additionally, there are limits on the number of templates you can send, as well as processes that can affect template delivery:</div><span>[Messaging limits](/books/meta-whatsapp/page/messaging-limits-developer-documentation) — A limit on the number of message templates you can send outside of customer service windows.</span><span>[Template pacing](/books/meta-whatsapp/page/template-pacing-developer-documentation) — A process that allows time for WhatsApp users to provide feedback on message templates.</span><span>[Template pausing](/books/meta-whatsapp/page/template-pausing-developer-documentation) — A process that can temporarily pause message templates that have received poor feedback.</span><span>[Per-user marketing template message limits](/books/meta-whatsapp/page/per-user-marketing-template-message-limits-developer-documentation) — A process that limits the number of marketing message templates a given WhatsApp user may receive from any business.</span><div id="bkmrk-time-to-live"><div id="bkmrk-time-to-live-1"><div>### Time-to-live

</div></div></div><div>If a message sent to a WhatsApp user cannot be delivered, the system will continue attempting delivery for a period known as the time-to-live (TTL). You can customize the TTL for templates upon template creation.</div><div>See our [time-to-live](/books/meta-whatsapp/page/configure-message-time-to-live-developer-documentation) document for more information.</div><div id="bkmrk-quality-rating"><div id="bkmrk-quality-rating-1"><div>### Quality rating

</div></div></div><div>Template quality rating is a system used to evaluate the quality of message templates, based on usage, customer feedback, and engagement. This rating helps maintain a high-quality messaging ecosystem and helps ensure that you are sending relevant and well-received messages.</div><div>See our [template quality rating](/books/meta-whatsapp/page/template-quality-rating-developer-documentation) document for more information about quality ratings, how they can affect a template’s status, and how you can be notified of changes to template quality scores.</div><div id="bkmrk-delivery-sequence-of"><div id="bkmrk-delivery-sequence-of-1"><div>### Delivery sequence of multiple messages

</div></div></div><div>When sending a series of messages, the order in which messages are delivered is not guaranteed to match the order of your API requests. If you need to ensure the sequence of message delivery, confirm receipt of a `delivered` status in a [status messages](/books/meta-whatsapp/page/status-messages-webhook-reference-developer-documentation) webhook before sending the next message in your message sequence.</div><div id="bkmrk-template-management"><div id="bkmrk-template-management-1"><div>### Template management

</div></div></div><div>See our [template management](/books/meta-whatsapp/page/template-management-developer-documentation) document for a list of endpoints commonly used for getting, updating, and deleting templates.</div></div>

# Marketing templates | Developer Documentation

<div id="bkmrk-marketing-templatesu">## Marketing templates

<div><span>Updated: Dec 5, 2025</span></div><div>Marketing templates are typically used to drive engagement, brand awareness, and driving sales. They are the only type of template that can be used with both Cloud API and Marketing Messages API for WhatsApp.</div><div id="bkmrk-custom-templates"><div id="bkmrk-custom-templates-1"><div>### Custom templates

</div></div></div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-ayog9wvu.png)</div><div>See our [custom marketing templates](/documentation/business-messaging/whatsapp/templates/marketing-templates/custom-marketing-templates) document for example of how to create and send a custom template, and which components are supported.</div><div id="bkmrk-specialty-templates"><div id="bkmrk-specialty-templates-1"><div>### Specialty templates

</div></div></div><div>Some templates use a special component that requires or excludes additional components, or require additional configuration. These are described below.</div><div><div><div id="bkmrk-catalog-templates"><div id="bkmrk-catalog-templates-1"><div>#### Catalog templates

</div></div></div><div>[Catalog templates](/books/meta-whatsapp/page/catalog-templates-developer-documentation) are marketing templates that allow you to showcase your product catalog entirely within WhatsApp.</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-fpnmwoax.png)</div></div><div><div id="bkmrk-coupon-code-template"><div id="bkmrk-coupon-code-template-1"><div>#### Coupon code templates

</div></div></div><div>[Coupon code templates](/documentation/business-messaging/whatsapp/templates/marketing-templates/coupon-templates) are marketing templates that display a single copy code button. When tapped, the code is copied to the customer’s clipboard.</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-mre3nwqo.png)</div></div><div><div id="bkmrk-media-card-carousel-"><div id="bkmrk-media-card-carousel--1"><div>#### Media card carousel templates

</div></div></div><div>[Media card carousel templates](/documentation/business-messaging/whatsapp/templates/marketing-templates/media-card-carousel-templates) allow you to send a single text message accompanied by a set of up to 10 media cards in a horizontally scrollable view.</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-8dsjh6h0.png)</div></div><div><div id="bkmrk-call-permission-requ"><div id="bkmrk-call-permission-requ-1"><div>#### Call permission request templates

</div></div></div><div>[Call permission request templates](/documentation/business-messaging/whatsapp/templates/marketing-templates/call-permission-request-message-template) allow your business to call your customers outside of the customer service window.</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-5j3nx7ed.webp)</div></div><div><div id="bkmrk-limited-time-offer-t"><div id="bkmrk-limited-time-offer-t-1"><div>#### Limited-time offer templates

</div></div></div><div>[Limited-time offer templates](/books/meta-whatsapp/page/limited-time-offer-templates-developer-documentation) allow you to display expiration dates and running countdown timers for offer codes in template messages, making it easy for you to communicate time-bound offers and drive customer engagement.</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-ytwyz8cl.png)</div></div><div><div id="bkmrk-multi-product-messag"><div id="bkmrk-multi-product-messag-1"><div>#### Multi-product message templates

</div></div></div><div>[Multi-product message templates](/books/meta-whatsapp/page/multi-product-message-templates-developer-documentation) allow you to showcase up to 30 products from your ecommerce catalog, organized in up to 10 sections, in a single message.</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-fwq2d7cp.png)</div></div><div><div id="bkmrk-product-card-carouse"><div id="bkmrk-product-card-carouse-1"><div>#### Product card carousel templates

</div></div></div><div>[Product card carousel templates](/books/meta-whatsapp/page/product-card-carousel-templates-developer-documentation) allow you to send a single text message accompanied by a set of up to 10 product cards in a horizontally scrollable view:</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-mhcl2ufc.png)</div></div><div><div id="bkmrk-single-product-messa"><div id="bkmrk-single-product-messa-1"><div>#### Single-product message templates

</div></div></div><div>[Single-product message templates](/books/meta-whatsapp/page/single-product-message-templates-developer-documentation) allow you to send a single text message accompanied by a set of up to 10 product cards in a horizontally scrollable view:</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-jbhgukiz.png)</div></div></div><div id="bkmrk-per-user-marketing-t"><div id="bkmrk-per-user-marketing-t-1"><div>### Per-user marketing template message limits

</div></div></div><div>WhatsApp may limit the number of marketing template messages a person receives from any business in a given period of time, starting with delivering fewer marketing conversations to those users who are less likely to engage with them. In most WhatsApp markets, this is determined based on a number of factors, including a dynamic view of an individual’s marketing message read rate.</div><div>Refer to [per-user marketing template message limits](/books/meta-whatsapp/page/per-user-marketing-template-message-limits-developer-documentation) document for more information.</div><div id="bkmrk-user-preferences-for"><div id="bkmrk-user-preferences-for-1"><div>### User preferences for marketing messages

</div></div></div><div>WhatsApp provides a setting, **Offers and announcements**, that allows WhatsApp users to indicate their interest level in marketing messages sent from your business, and to stop or resume delivery of marketing messages from your business entirely.</div><div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-esawokvd.png)</div></div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-iwhyge04.png)</div></div></div><div id="bkmrk-interested%2Fnot-inter"><div id="bkmrk-interested%2Fnot-inter-1"><div>#### Interested/Not Interested feedback

</div></div></div><div>WhatsApp users can use the **Offers and announcements** setting to indicate how interested they are in receiving marketing template messages from your business.</div><div>If a user chooses **Not interested**, it can affect [per-user marketing template messaging limits](/books/meta-whatsapp/page/per-user-marketing-template-message-limits-developer-documentation) between you and the user. Choosing this option also displays the second modal, which gives the user the option to stop delivery of marketing messages from your business.</div><div id="bkmrk-stop%2Fresume-controls"><div id="bkmrk-stop%2Fresume-controls-1"><div>#### Stop/Resume controls

</div></div></div><div>WhatsApp users can use the **Offers and announcements** setting to stop or resume delivery of marketing template messages from your business.</div><div>If you attempt to send a marketing template to a WhatsApp user who has stopped marketing template messages from your business, the API will process the request but not send the message. Instead, the API will trigger a [status messages webhook](/books/meta-whatsapp/page/status-messages-webhook-reference-developer-documentation) with:</div><span>`status` set to `failed`,</span><span>`code` set to `131050`,</span><span>`title` set to </span>```
Unable to deliver the message. This recipient has chosen to stop receiving marketing messages on WhatsApp from your business
```

<div>To be notified whenever a WhatsApp user stops or resumes delivery of marketing template messages from your business, subscribe to the [user\_preferences webhook](/books/meta-whatsapp/page/user-preferences-webhook-reference-developer-documentation) webhook.</div><div id="bkmrk-for-accounts-linked-"><div id="bkmrk-for-accounts-linked--1"><div>### For accounts linked with WhatsApp Business app (aka “Coexistence”)

</div></div></div><div>To improve the experience for WhatsApp Business Users, marketing messages sent to business customers will not bump chat threads to the top of the inbox. These messages will still be delivered and visible to business customers, but the thread will only move to the top if the customer responds.</div><div>Note: This feature is currently limited and not generally available (GA) to all users.</div></div>

# Coupon code templates | Developer Documentation

<div id="bkmrk-coupon-code-template">## Coupon code templates

<div><span>Updated: Dec 3, 2025</span></div><div>Coupon code templates are marketing templates that display a single copy code button. When tapped, the code is copied to the customer's clipboard.</div><div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-xyvz1wzb.png)</div></div><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>### Limitations

</div></div></div>
<span>Coupon code templates are currently not supported by the WhatsApp web client.</span><span>Copy code button text cannot be customized.</span><span>Templates are limited to one copy code button.</span></div>

# Limited-time offer templates | Developer Documentation

<div id="bkmrk-limited-time-offer-t">## Limited-time offer templates

<div><span>Updated: Nov 4, 2025</span></div><div>This document describes limited-time offer templates and how to use them.</div><div>Limited-time offer templates allow you to display expiration dates and running countdown timers for offer codes in template messages, making it easy for you to communicate time-bound offers and drive customer engagement.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-4fs5f9gq.png)</div><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>### Limitations

</div></div></div>
<span>Only templates categorized as `MARKETING` are supported.</span><span>Footer components are not supported.</span><span>Users who view a limited-time offer template message using that WhatsApp web app or desktop app will not see the offer, but will instead see a message indicating that they have received a message but that it's not supported in the client they are using.</span></div>

# Template categorization | Developer Documentation

<div id="bkmrk-template-categorizat">## Template categorization

<div><span>Updated: Jan 30, 2025</span></div><div>When creating a new template, or managing existing ones, it’s important to understand how WhatsApp categorizes your template for pricing purposes.</div><span>Consider template category guidelines before creating a new template</span><span>Stay updated on your template’s approval status after template creation</span><span>Learn about automatic category updates to templates in production</span><div>***This information is also available in PDF form in our [Message templates category guidelines explainer PDF](https://l.facebook.com/l.php?u=https%3A%2F%2Fscontent-ams2-1.xx.fbcdn.net%2Fv%2Ft39.8562-6%2F522646671_1032957015586071_352200442705405080_n.pdf%3F_nc_cat%3D108%26ccb%3D1-7%26_nc_sid%3Db8d81d%26_nc_ohc%3DWI_Vs_az-pkQ7kNvwHRrFFm%26_nc_oc%3DAdrles0HkJ2s2MdlkGISGxb-kDEIEzUZBgLy3_mty9opVFjySA1ifMgBvrZi1k9GrR4%26_nc_zt%3D14%26_nc_ht%3Dscontent-ams2-1.xx%26_nc_gid%3DNKHHzwOL-F_z27FQO_98ig%26_nc_ss%3D7a389%26oh%3D00_Af2qkEmosMONqnYBg6kkH2P34QYFOKgaFPb7q13RSs6lYw%26oe%3D69D2A2E2&h=AT6OkZ46PzLVnyBlF9xtpP0mjTsiMh8U4yiIXZPEbS6q60FQKaSgJAmqGh1xo8pMLK9KlXqtWA891zH7ei0CW9vTcuxNBNjIOGhGUBnCkK-QiNLV1XPsHAaOTK24GJJhsWuyEvtaZJijuRwxuVyocQ).***</div><div id="bkmrk-template-category-gu"><div id="bkmrk-template-category-gu-1"><div>### Template category guidelines

</div></div></div><div>Our template category guidelines define the category of message templates. Message templates can be categorized as:</div><span>**Marketing templates** – Enable businesses to achieve a wide range of goals, from generating awareness to driving sales and retargeting customers.</span><span>**Utility templates** – Enable businesses to follow up on user actions or requests, since these messages are typically triggered by user actions.</span><span>**Authentication templates** – Enable businesses to verify a user’s identity, potentially at various steps of the customer journey.</span><div id="bkmrk-marketing-template-g"><div id="bkmrk-marketing-template-g-1"><div>#### Marketing template guidelines

</div></div></div><div>Marketing templates are the most flexible. They enable businesses to achieve a wide range of goals, from generating awareness to driving sales and more.</div><div>The following templates are also considered marketing:</div><span>Templates with mixed content (for example, both utility and marketing, such as an order update with a promo or a feedback survey with promotional content).</span><span>Templates where contents are unclear (for example, where contents are only “{{1}}” or “Congratulations!”).</span><div>*Note: Examples are illustrative only. Templates that contain similar content, or the example text above, might be categorized differently based on the exact content.*</div><div><table><thead><tr><th><span>Message Objective </span></th><th><span>Business Goal </span></th><th><span>Example Templates </span></th></tr></thead><tbody><tr><td><div><div>**Awareness**</div></div></td><td><div><div>Generate awareness of your business, products, or services among customers who have subscribed to receive messages from your business on WhatsApp.</div></div></td><td><div><span>Did you know? We installed a {{new\_tower}} in your area so you can enjoy a better network experience. To learn more, visit our site.</span><span>{{Diwali}} is around the corner! Join us at {{location}} on {{date}} to celebrate with friends and family. For more details about our event, click below.</span><span>Looking for a getaway this fall? Our newest resort just opened in {{location}}: the perfect place to relax and unwind.</span></div></td></tr><tr><td><div><div>**Sales**</div></div></td><td><div><div>Send promotional offers to customers related to sales events, coupons, or other content intended to drive sales or renewals.</div></div></td><td><div><span>As a thank you for your last order, please enjoy {{15}}% off your next order. Use code {{loyal15}} at checkout. Visit our site here below.</span><span>We are actively seeking {{donations}} to meet our fundraising goal of {{amount}}. Support our cause and contribute now!</span><span>Upgrade to our {{premium\_cabin}} to enjoy new benefits, like {{more\_legroom}} and {{priority\_boarding}}. Click below or log into our app to upgrade.</span><span>You have been {{pre\_approved}} for our {{credit\_card}}! Enjoy an introductory {{apr\_rate}} if you apply via your personalized link below.</span></div></td></tr><tr><td><div><div>**Retargeting**</div></div></td><td><div><div>Promote or recommend offers, products or services; attempt to renew subscriptions; or other calls to action to users who might have visited your website, used your app or engaged with you. These are marketing even if requested by users.</div></div></td><td><div><span>Your subscription will expire on {{date}}! Renew today to save {{discount}}.</span><span>You left {{items}} in your cart! Don’t worry, we saved them. Checkout now below.</span><span>Your loan application is {{pending\_approval}}! Please log in to pick up where you left off.</span><span>We found a {{car}} that meets your saved search. Log in to our app to view.</span><span>We apologize for the delay in your {{package}} delivery. We have deposited a {{credit}} to your account, available immediately.</span></div></td></tr><tr><td><div><div>**App Promotion**</div></div></td><td><div><div>Request customers to install or take a specific action with your app.</div></div></td><td><div><span>Did you know? You can now {{checkout}} in our app. Download it below to use our streamlined experience.</span><span>Thank you for using our app. We noticed you have not used our {{latest\_feature}}. Click below to learn more about how this benefits you!</span><span>In-app only: {{20}}% off this week! Use code {{summer\_promo}} to save on select styles.</span><span>Hi {{name}}, your friend {{name}} recently joined our community. Send them a welcome message in our app today: {{URL}}.</span></div></td></tr><tr><td><div><div>**Build Customer Relationships**</div></div></td><td><div><div>Strengthen customer relationships through personalized messages or by prompting new conversations.</div></div></td><td><div><span>{{Name}}, did you think we’d forget? No way! {{Happy\_birthday}}! We wish you the best in the year ahead.</span><span>As we approach the end of the year, we reflect on what drives us: {{Name}}. Thank you for being a {{valued\_customer}}. We look forward to continuing to serve you.</span><span>Hello, I am the new {{virtual\_assistant}}. I can help you discover products or provide support. Please reach out if I can help!</span></div></td></tr></tbody></table>

</div><div id="bkmrk-utility-template-gui"><div id="bkmrk-utility-template-gui-1"><div>#### Utility template guidelines

</div></div></div><div>Utility templates are typically triggered by a user action or request. For a template to be categorized as utility, it needs to meet both criteria below:</div><span>*Must* be **non-promotional**, not containing any promotional or persuasive intent.</span><span>*Must* ALSO be either **specific to or requested by the user** (clearly related to their order, account, services or transactions) OR **essential or critical** to the user (for example, to ensure user safety).</span><div><table><thead><tr><th><span>Message Objective </span></th><th><span>Business Goal </span></th><th><span>Example Templates </span></th></tr></thead><tbody><tr><td><div><div>**Opt-In Management on WhatsApp**</div></div></td><td><div><div>Confirm opt-in to receive messages on WhatsApp as a follow-up to opt-in collected via other channels (for example, website, email) or confirm opt-out.</div></div></td><td><div><span>Thanks for confirming opt-in! You’ll now receive notifications via WhatsApp.</span><span>Thank you for confirming your opt-out preference. You will no longer receive messages from us on WhatsApp.</span></div></td></tr><tr><td><div><div>**Order Management**</div></div></td><td><div><div>Confirm, update or cancel an order or transaction with a customer, using specific order or transaction details in the body of your message.</div><div>*These messages should not promote, recommend, upsell, or cross-sell products; include offers; or attempt to secure renewals.*</div></div></td><td><div><span>Thank you! Your order {{order\_number}} is confirmed. We will let you know once your package is on its way.</span><span>Hooray! Your package from order {{order\_number}} is on its way. Your tracking number is {{tracking\_ID}} and expected delivery date is {{date}}.</span><span>Unfortunately, one item from your order {{number}} is backordered. We will follow up with an estimated ship date. If you wish to cancel and receive a refund, please click below.</span><span>We have received your item from order {{order\_number}}. Your refund for ${{amount}} has been processed. Thank you for your business.</span></div></td></tr><tr><td><div><div>**Account Alerts or Updates**</div></div></td><td><div><div>Send important or time-sensitive updates or alerts or other information specific to purchased or subscribed products/services.</div><div>*These messages should not promote, recommend, upsell, or cross-sell products; include offers; or attempt to secure renewals.*</div></div></td><td><div><span>Daily update for account ending in {{four\_digit\_number}}: Your available balance is {{amount}}.</span><span>Reminder: Your monthly payment for {{service}} will be billed on {{date}} to the {{card}} you have saved on file.</span><span>You only have {{number}} minutes remaining in your plan. Remember to top up your account by {{date}} to avoid disruptions.</span><span>To finish setting up your {{new\_profile}}, you need to upload a {{photo}}. Please click below to upload.</span><span>Please note, we have updated our {{Customer\_service}} phone number to {{number}}. Please save this and call if we can be of support.</span></div></td></tr><tr><td><div><div>**Feedback Surveys**</div></div></td><td><div><div>Collect feedback on previous orders, transactions or engagements with customers.</div><div>*Specificity of the order or interaction to which these relate is necessary. A general/generic survey or request for feedback will not be approved as utility.*</div></div></td><td><div><span>We have delivered your order {{order\_number}}! Please let us know if there was any issue by reaching out below.</span><span>Your feedback ensures we continually {{improve}}. Please click below to share your thoughts on your {{recent visit}} at our {{store}} location. Thank you in advance!</span><span>You chatted with us {{online}} recently about order {{order\_number}}. How was your experience? Click below to fill out a short survey.</span></div></td></tr><tr><td><div><div>**Continue a Conversation on WhatsApp**</div></div></td><td><div><div>Send a message to begin an interaction on WhatsApp that began in another channel.</div><div>*These messages should not be initiated without a user having requested the conversation to be moved to WhatsApp.*</div></div></td><td><div><span>Hi! I see you requested support via our {{online\_chat}}. I am the virtual assistant on WhatsApp. How can I help?</span><span>Hi {{name}}, we are following up on your call with customer service on {{issue}}. Your case has progressed to the next step. Please log into your account to continue.</span></div></td></tr></tbody></table>

</div><div>For a utility template to be deemed essential or critical to the user, it must reflect one of the use cases below and must also be non-promotional (not containing any promotional or persuasive intent).</div><div><table><thead><tr><th><span>Use Case Category </span></th><th><span>Use Case </span></th><th><span>Example that meets definition of "essential or critical to the user" </span></th></tr></thead><tbody><tr><td><div><div>**Public Safety**</div></div></td><td><div><div>Severe weather</div></div></td><td><div><div>There is a {{tornado}} alert in your area. We recommend you remain indoors until {{time}} today.</div></div></td></tr><tr><td><div><div>**Public Safety**</div></div></td><td><div><div>Crisis response</div></div></td><td><div><div>We activated support services for the {{crisis}} in the {{zip code}} area. Live updates on our site, available below.</div></div></td></tr><tr><td><div><div>**Public Service**</div></div></td><td><div><div>Health awareness</div></div></td><td><div><div>Stay up-to-date with your health. Stop by {{location}} by {{time}} to get your free COVID-19 {{vaccine}}. Bring your {{vaccination_card}} and identification document.</div></div></td></tr><tr><td><div><div>**Public Service**</div></div></td><td><div><div>Health emergency</div></div></td><td><div><div>The {{city}} has just declared a health emergency because of {{issue}}. We will follow up with more details once available.</div></div></td></tr><tr><td><div><div>**Public Service**</div></div></td><td><div><div>Voting registration</div></div></td><td><div><div>To vote on {{date}}, please ensure your voter {{registration card}} is active. Please click the URL below to understand steps required to renew, if needed. Please disregard this message if your {{registration card}} will be active.</div></div></td></tr><tr><td><div><div>**Public Service**</div></div></td><td><div><div>Disbursements</div></div></td><td><div><div>Your {{welfare}} disbursement balance is {{amount}}. Kindly note it will expire on {{date}}.</div></div></td></tr><tr><td><div><div>**Public Disruption**</div></div></td><td><div><div>System outages</div></div></td><td><div><div>We have detected a system outage that impacts zip code {{code}}. We expect to restore service by {{time_and_date}}. We apologize for the inconvenience.</div></div></td></tr><tr><td><div><div>**Public Disruption**</div></div></td><td><div><div>Operational disruption</div></div></td><td><div><div>This is to notify you that {{trains}} at our {{location}} station are halted because of {{issue}}. Please avoid the area as we work to rectify.</div></div></td></tr><tr><td><div><div>**Account or Product Protection**</div></div></td><td><div><div>Fraud awareness</div></div></td><td><div><div>We have detected an increase in {{ATM fraud}}. To protect your card ending in {{1234}}, please consider updating your PIN. Click below to see the step-by-step.</div></div></td></tr><tr><td><div><div>**Account or Product Protection**</div></div></td><td><div><div>Product recalls</div></div></td><td><div><div>The {{product}} you ordered on {{date}} has been recalled. Please click below to let us know how you would like to proceed.</div></div></td></tr><tr><td><div><div>**Account or Product Protection**</div></div></td><td><div><div>Warranty alerts</div></div></td><td><div><div>Thank you for your purchase of {{product}}. Your warranty is active as of {{date}}. Our {{product manuals}} are below, for your reference</div></div></td></tr><tr><td><div><div>**Legal/Regulatory Compliance**</div></div></td><td><div><div>Identity compliance</div></div></td><td><div><div>This is to notify you that you need to upgrade to a {{updated_identification_card}} by {{date}}. To avoid any inconveniences when traveling, please ensure you make an appointment at your local {{office}}.</div></div></td></tr><tr><td><div><div>**Legal/Regulatory Compliance**</div></div></td><td><div><div>Privacy disclosures</div></div></td><td><div><div>We updated our privacy policy on {{date}}. Please click the button below to learn more.</div></div></td></tr><tr><td><div><div>**Legal/Regulatory Compliance**</div></div></td><td><div><div>Warranty alerts</div></div></td><td><div><div>Thank you for your purchase of {{product}}. Your warranty is active as of {{date}}. Our {{product manuals}} are below, for your reference</div></div></td></tr></tbody></table>

</div><div id="bkmrk-authentication-templ"><div id="bkmrk-authentication-templ-1"><div>#### Authentication template guidelines

</div></div></div><div>*Note: Only authentication templates can be used to send a one-time passcode for identity verification. Marketing and utility templates cannot be used for this purpose.*</div><div>You can use authentication templates from [Template Library](/books/meta-whatsapp/page/template-library-developer-documentation). These templates include optional add-ons like security disclaimers and expiry warnings.</div><div>Authentication templates enable businesses to verify user identity (usually with alphanumeric codes) at various steps of the customer journey:</div><span>New account creation</span><span>Account integrity, access or recovery</span><span>New or existing orders/transactions</span><div>Authentication templates are our most restrictive, so for a template to be classified as authentication, **a business must**:</div><span>Use Cloud API authentication message templates in [Template Library](/books/meta-whatsapp/page/template-library-developer-documentation): These templates include optional add-ons like security disclaimers and expiry warnings.</span><span>Configure a one-time password button: Such as [copy-code](/books/meta-whatsapp/page/copy-code-authentication-templates-developer-documentation) or [one-tap](/books/meta-whatsapp/page/one-tap-autofill-authentication-templates-developer-documentation)</span><span>Follow content restrictions: URLs, media, and emojis are not allowed for authentication template content or parameters. Parameters are also restricted to 15 characters.</span><div id="bkmrk-message-objective%3A-a"><div id="bkmrk-message-objective%3A-a-1"><div>##### Message Objective: **Authentication**

</div></div></div><div><table><thead><tr><th><span>Message Objective </span></th><th><span>Business Goal </span></th><th><span>Example Templates </span></th></tr></thead><tbody><tr><td><div><div>**Authentication**</div></div></td><td><div><div>Authenticate users with one-time passcodes, potentially at multiple steps in the login process (for example, account verification, account recovery, integrity challenges).</div></div></td><td><div><span>{{123456}} is your verification code.</span></div></td></tr></tbody></table>

</div><div id="bkmrk-how-whatsapp-assigns"><div id="bkmrk-how-whatsapp-assigns-1"><div>### How WhatsApp assigns a category during template creation

</div></div></div><div>When you create a template, you indicate the template’s category, based on the guidelines above. WhatsApp validates the category you indicated per the contents of the template and the [guidelines](#bkmrk-template-category-gu-1). The template is then created and its status is set to one of the statuses below, based on the outcome of the validation process.</div><div>a. When you create a template and it is approved, you can request a review up to 60 days from the creation date.</div><div>b. For utility templates that may be updated to marketing, you can request a review up to 60 days from the date the category was updated.</div><div id="bkmrk-approved-status"><div id="bkmrk-approved-status-1"><div>#### Approved status

</div></div></div><div>`APPROVED` status means WhatsApp agrees with the category chosen in your template creation request and that the template successfully passed [template review](/books/meta-whatsapp/page/templates-developer-documentation). It can now be used to send messages.</div><div>**Status updates** — An email and WhatsApp Manager alert will inform you that the template was approved, and a [message\_template\_status\_update](/books/meta-whatsapp/page/message-template-status-update-webhook-reference-developer-documentation) webhook will be triggered with the event property set to `APPROVED`.</div><div><div>Effective April 9, 2025, If you selected `UTILITY` as the template’s category and WhatsApp determined it should be `MARKETING`, **the template is approved as `MARKETING`**. In WhatsApp Manager, you will see the screen below. When using the API, the behavior will be as outlined above. You can request a review up to 60 days from the date the category was updated.</div></div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-5fm8rsrh.png)</div><div><div>Effective April 9, 2025 – The `allow_category_change` property during template creation. Previously, if set to `true` in a template creation request, this allowed us to update a template’s category to `marketing`, if `marketing` to be its category was determined to be its category per its content and the guidelines. This is now the default behavior.</div></div><div id="bkmrk-pending-status"><div id="bkmrk-pending-status-1"><div>#### Pending status

</div></div></div><div>`PENDING` status means WhatsApp agrees with the category chosen in your template creation request, however the template is undergoing [template review](/books/meta-whatsapp/page/templates-developer-documentation).</div><div>**Status Alerts** — The outcome of template review will be communicated via email and WhatsApp Manager alert. Upon completion, a [message\_template\_status\_update](/books/meta-whatsapp/page/managing-webhooks-developer-documentation) webhook will be triggered with the event property set to `APPROVED` or `REJECTED`.</div><div id="bkmrk-rejected-status"><div id="bkmrk-rejected-status-1"><div>#### Rejected status

</div></div></div><div>`REJECTED` status indicates that WhatsApp disagreed with the category you designated in your template creation request.</div><div>**Status Alerts** — Rejections are communicated via email and WhatsApp Manager alert. Upon review completion, a [message\_template\_status\_update](/books/meta-whatsapp/page/message-template-status-update-webhook-reference-developer-documentation) webhook will be triggered and the `event` property set to `REJECTED`, with the `reason` property set to `INCORRECT_CATEGORY`.</div><div>If your message template is rejected, you have the following options:</div><span>[Create a new message template](/books/meta-whatsapp/page/templates-developer-documentation) via WhatsApp Manager or the API.</span><span>[Edit the template’s category](/books/meta-whatsapp/page/template-management-developer-documentation), and resubmit for approval.</span><span>[Request a review](#bkmrk-how-to-request-a-cat-1).</span><div id="bkmrk-duplicated-templates"><div id="bkmrk-duplicated-templates-1"><div>#### Duplicated Templates from Phone Number Migration

</div></div></div><div>All eligible templates are automatically duplicated in the destination WABA and category checks will be performed to ensure that all duplicated templates are correctly categorized.</div><div id="bkmrk-how-whatsapp-updates"><div id="bkmrk-how-whatsapp-updates-1"><div>### How WhatsApp updates a template’s category after initial approval

</div></div></div><div><div>July 1, 2024 — To ensure templates on the platform are correctly categorized per the template category guidelines, WhatsApp introduced a recurring process to identify and update approved templates that should be of a different category, per the template category guidelines.</div></div><div><div>Effective April 16, 2025 — For any business detected to be abusing the template categorization system and to whom [a warning is sent](#bkmrk-notices-when-action--1), the 24-hour notice mentioned below will no longer be provided if a utility template that should be marketing is detected. The category will be updated with no advance notice and emails/webhooks will be triggered to confirm the category change</div></div><div>Automatic category updates can apply to approved templates only that were not initially approved per the template category guidelines. Advance notice is provided on different surfaces, like through webhook and email, before action is taken on these templates.</div><div id="bkmrk-how-it-works"><div id="bkmrk-how-it-works-1"><div>#### **How it works**

</div></div></div><div id="bkmrk-for-templates-approv"><div id="bkmrk-for-templates-approv-1"><div>#### For templates approved as **utility**, but should actually be **marketing**

</div></div></div><span>**Notice period** — A 1-day advance notice is provided before **the template category is updated to `marketing`**. </span><span>**As of April 16 2025 — If you are warned for template categorization misuse:**</span><span>24 hour notice **will not** be provided before changing template categories from `UTILITY` to `MARKETING`</span><span>Category changes will be **instant**</span><span>**Template category** — The template category is changed to `MARKETING`</span><span>**Template status** — There is no change to template status; it remains `APPROVED` and can continue to be used to send messages.</span><div id="bkmrk-for-templates-approv-3"><div id="bkmrk-for-templates-approv-4"><div>#### For templates approved as **marketing or utility**, but should actually be **authentication**

</div></div></div><div>*This process was introduced on October 1, 2024*</div><span>**Notice period** — Advance notice is provided.</span><span>**Template category** — There is no change in the template’s category.</span><span>**Template status** — On the first day of the following month, the template status is changed to `REJECTED` and can no longer be used to send messages.   
</span><div id="bkmrk-how-you-are-notified"><div id="bkmrk-how-you-are-notified-1"><div>#### **How you are notified**

</div></div></div><div id="bkmrk-for-templates-approv-6"><div id="bkmrk-for-templates-approv-7"><div>#### For templates approved as **utility**, but should actually be **marketing**

</div></div></div><div><table><thead><tr><th><span>Advanced notification of category updates </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>*Via Email*</div></div></td><td><div><span>An email will be sent to any people in the business’ portfolio with ‘full control’ of the WhatsApp Business Account (WABA).</span><span>The email will contain a link to the WhatsApp Manager &gt; Message Templates &gt; Manage Templates panel.</span><span>Templates whose categories will be updated will have an “information” icon beside their name. Hovering over the icon will display the category it will be updated to, and the date when it will be updated.</span><span>For templates that will be rejected, the icon will display</span></div></td></tr><tr><td><div><div>*Via Webhook*</div></div></td><td><div><div>A [template\_category\_update](/books/meta-whatsapp/page/template-category-update-webhook-reference-developer-documentation) webhook will be triggered for each template whose category will be updated, with a `correct_category` property in the payload set to what the template’s category should be. The `new_category` property also exists in the payload indicating the template’s current category.</div></div></td></tr><tr><td><div><div>*Via WhatsApp Manager*</div></div></td><td><div><span>The WhatsApp Manager &gt; Message Templates &gt; Manage Templates panel will display a banner with a link to a downloadable CSV identifying these templates.</span><span>[Business Support<span>⁠</span>](https://business.facebook.com/business-support-home/) will list the name and current category of these templates, as well as the categories they will be updated to.</span></div></td></tr></tbody></table>

</div><div><table><thead><tr><th><span>Notification when action is taken </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>*Via Email*</div></div></td><td><div><span>An email will be sent to any people in the business portfolio who have been granted full control of the WABA that owns the templates whose categories have been updated.</span><span>The email will highlight the number of templates whose categories were updated, and will include a link to the WhatsApp Manager &gt; Message Templates &gt; Manage Templates panel where the name and new category of these templates, as well as the categories before automatic update will be listed. It also includes a link to [Business Support<span>⁠</span>](https://business.facebook.com/business-support-home/).</span></div></td></tr><tr><td><div><div>*Via Webhook*</div></div></td><td><div><div>A [template\_category\_update](/books/meta-whatsapp/page/template-category-update-webhook-reference-developer-documentation) webhook will be triggered for each template whose category has been updated. The `new_category` property will indicate the template’s new category and the `previous_category` property will indicate the template’s category before automatic update.</div></div></td></tr></tbody></table>

</div><div id="bkmrk-for-templates-approv-9"><div id="bkmrk-for-templates-approv-10"><div>#### For templates approved as **marketing or utility**, but should actually be **authentication**

</div></div></div><div><table><thead><tr><th><span>Advanced notification of category updates </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>*Via Email*</div></div></td><td><div><span>An email will be sent to any people in the business portfolio who have been granted full control of the WABA that owns the templates whose categories have been updated.</span><span>The email will contain a link to the WhatsApp Manager &gt; Message Templates &gt; Manage Templates panel.</span><span>Templates whose status will be updated to `REJECTED` will be updated will have an “information” icon beside their name. Hovering over the icon will display the date when the template will be rejected.</span></div></td></tr><tr><td><div><div>*Via Webhook*</div></div></td><td><div><span>A [template\_category\_update](/books/meta-whatsapp/page/template-category-update-webhook-reference-developer-documentation) webhook will be triggered for each template which will be rejected.</span></div></td></tr><tr><td><div><div>*Via WhatsApp Manager*</div></div></td><td><div><span>The WhatsApp Manager &gt; Message Templates &gt; Manage Templates panel will display a banner with a link to a downloadable CSV identifying these templates. [Business Support<span>⁠</span>](https://business.facebook.com/business-support-home/) will list these as well.</span></div></td></tr></tbody></table>

</div><div><table><thead><tr><th><span>Notification when action is taken </span></th><th><span>Description </span></th></tr></thead><tbody><tr><td><div><div>*Via Email*</div></div></td><td><div><span>An email will be sent to any people in the business portfolio who have been granted full control of the WABA that owns the templates whose categories have been updated.</span><span>The email will highlight the number of templates that were rejected, and will include a link to the WhatsApp Manager &gt; Message Templates &gt; Manage Templates panel, where the status will reflect the template is rejected.</span><span>It also includes a link to [Business Support<span>⁠</span>](https://business.facebook.com/business-support-home/).</span></div></td></tr><tr><td><div><div>*Via Webhook*</div></div></td><td><div><div>A `status` webhook will be triggered for each template that has been rejected. whose category has been updated. The webhook will have the `event` property set to `REJECTED` and the reason property set to `INCORRECT_CATEGORY`.</div></div></td></tr></tbody></table>

</div><div id="bkmrk-your-options-in-this"><div id="bkmrk-your-options-in-this-1"><div>#### Your options in this process

</div></div></div><div>When you receive notice that a template’s category will be updated or a template will be rejected, you can:</div><span>Create a new template</span><span>For **utility templates** that will be updated to **marketing**: </span><span>You can [request a review](#bkmrk-how-to-request-a-cat-1): </span><span>If the review is approved – The template’s category will not be updated as previously notified.</span><span>If the review is not approved – The template will be updated to marketing, as previously notified.</span><span>For **marketing or utility templates** that will be **rejected**: </span><span>You cannot request a review.</span><span>Businesses on Cloud API can browse the [template library](/books/meta-whatsapp/page/template-library-developer-documentation) to identify available options for your identity verification use case. It is recommended that businesses browse, choose and create a new template from the [template library](/books/meta-whatsapp/page/template-library-developer-documentation) before the utility/marketing template is rejected, to avoid workflow disruptions.</span><div>**You have 60 days to review and appeal these changes in [Business Support Home<span>⁠</span>](https://business.facebook.com/business-support-home/).**</div><div id="bkmrk-learn-which-template"><div id="bkmrk-learn-which-template-1"><div>#### Learn which template(s) will be updated or have been updated

</div></div></div><div id="bkmrk-via-api"><div id="bkmrk-via-api-1"><div>#### Via API

</div></div></div><div>You can use the [](/books/meta-whatsapp/page/whatsapp-cloud-api-template-api-developer-documentation)endpoint to get the list of templates that have been or will be updated.</div><div>Request the `category` and `correct_category` fields, which will return the IDs of all of the WABA’s templates, and each template’s `category` and `correct_category` values. You can then compare these values:</div><span>If the values match (for example, they are both `MARKETING`), the template’s category has already been updated with the `correct_category` value.</span><span>If they mismatch and the `correct_category` is not an empty string or null (for example, category is `UTILITY` but `correct_category` is `MARKETING`), the template’s category will be updated on the first day of the next month with the `correct_category` value.</span><span>If the `correct_category` value is an empty string or null, the template has not been impacted.</span><div id="bkmrk-via-whatsapp-manager"><div id="bkmrk-via-whatsapp-manager-1"><div>#### Via WhatsApp Manager

</div></div></div><div>The WhatsApp Manager’s Manage Templates panel identifies any templates whose categories will be updated.</div><div id="bkmrk-how-to-update-a-temp"><div id="bkmrk-how-to-update-a-temp-1"><div>### How to update a template category or request a category review

</div></div></div><div><div>This process has been in effect since June 2023, when the marketing, utility and authentication template categories were introduced.</div></div><div id="bkmrk-edit-your-template%E2%80%99s"><div id="bkmrk-edit-your-template%E2%80%99s-1"><div>#### Edit your template’s category

</div></div></div><div id="bkmrk-via-api-3"><div id="bkmrk-via-api-4"><div>##### Via API

</div></div></div><div>You can [edit template content or just its category](/books/meta-whatsapp/page/template-management-developer-documentation).</div><span>The template will undergo category validation and template review again.</span><span>If the template passes validation and review, its category will be updated and a [template\_category\_update](/books/meta-whatsapp/page/template-category-update-webhook-reference-developer-documentation) webhook will be triggered.</span><div id="bkmrk-via-whatsapp-manager-3"><div id="bkmrk-via-whatsapp-manager-4"><div>##### Via WhatsApp Manager

</div></div></div><div>On the **Manage Templates** tab:</div><span>Select your template</span><span>Edit the content so it aligns to the guidelines of that category</span><span>Re-submit the template for approval</span><div id="bkmrk-qualifications-and-o"><div id="bkmrk-qualifications-and-o-1"><div>#### Qualifications and outcomes for category review

</div></div></div><div>You can request Meta to review the category of your template if:</div><span>It is categorized as `UTILITY` or `MARKETING` and status is `REJECTED`</span><span>It is categorized as `MARKETING` and status is `APPROVED`</span><div>Possible outcomes after you submit a request of your template’s category:</div><span>Review is rejected – The category will not change.</span><div id="bkmrk-how-to-request-a-cat"><div id="bkmrk-how-to-request-a-cat-1"><div>#### How to request a category review

</div></div></div><div>A review can only be requested via WhatsApp Manager.</div><div>In the sidebar of WhatsApp Manager, select the **Message Templates** dropdown, and then **Message Templates**. You should see a rejection banner with the template in question. Click **Go to Business Support**.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-rfucetti.png)</div><div>Click **Template Category Updates**, select the templates you would like reviewed and then click the **Request Review** button to begin the review process.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-0b3yjhuh.png)</div><div id="bkmrk-how-to-view-template"><div id="bkmrk-how-to-view-template-1"><div>#### How to view templates submitted for review

</div></div></div><div>In the Business Support sidebar, click **Template category Updates**, and then the **In review** tab.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-yfug0xjb.png)</div><div id="bkmrk-how-to-view-template-3"><div id="bkmrk-how-to-view-template-4"><div>#### How to view template category decisions

</div></div></div><div>**If the template category change is not approved**: The template can be viewed in Business Support under the **Template category updates** &gt; **Unchanged** tab. The template’s category will change to the correct category during an automatic category update.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-j01nbofk.png)</div><div>**If the template category change is approved**: the template can be viewed in Business Support under the **Template category updates** &gt; **Reversed** tab. If the template category was already changed during automatic category update, it will be reverted to its previous category.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-9aon64z7.png)</div><div id="bkmrk-restrictions-on-busi"><div id="bkmrk-restrictions-on-busi-1"><div>### Restrictions on businesses misusing the template categorization system

</div></div></div><div id="bkmrk-how-it-works-3"><div id="bkmrk-how-it-works-4"><div>#### How it works

</div></div></div><div>Written notice is provided before businesses are restricted from using the WhatsApp Business Platform for utility messaging in the following way:</div><span>**Warning** – If a business is detected to be misusing the template categorization system to secure the utility category for templates that should be categorized as marketing, a written warning will be sent before the business is restricted from using utility messaging on the WhatsApp Business Platform. </span><span>**As of April 16 2025 — After you are given a warning:**</span><span>A 24 hour notice **will not be provided** before changing template categories from `UTILITY` to `MARKETING`</span><span>Category changes will be **instant**</span><span>**Restriction** – If misuse is detected after this warning, the following restrictions will be introduced which would prevent the WhatsApp Business Account from using the WhatsApp Business Platform for utility messaging for 7 days: </span><span>**As of April 16 2025 — Previously approved `UTILITY` templates will no longer be rejected. Instead, they will be re-categorized as `MARKETING`**</span><span>For 7 days – Disable [category reviews](#bkmrk-how-to-request-a-cat-1) for these templates</span><span>For 7 days – Disable creation of new utility templates</span><div><div>**For businesses that have been restricted previously** — If continued misuse of the template categorization system is detected, these restrictions might be re-introduced for 30 days.</div></div><div id="bkmrk-notices-when-action-"><div id="bkmrk-notices-when-action--1"><div>#### Notices when action is taken

</div></div></div><div>The following notices are triggered:</div><div>**Warnings** – Email is sent to all WhatsApp Business Account admins (people with **Full control** of the WhatsApp Business Account). An `account_update` webhook will be sent out indicating utility restriction `WARN` for the WhatsApp Business Account.</div><div>**Restrictions** – When restrictions are introduced or lifted, email is sent to all WhatsApp Business Account admins (people with **Full control** of the WhatsApp Business Account). A change to the `restriction_info` object in the `account_update` webhook is also triggered.</div><div id="bkmrk-your-options-in-this-3"><div id="bkmrk-your-options-in-this-4"><div>#### Your options in this process

</div></div></div><div>Businesses that believe these restrictions have been applied in error can request a review via [Business Support<span>⁠</span>](https://business.facebook.com/business-support-home/).</div></div>

# Template components | Developer Documentation

<div id="bkmrk-template-componentsu">## Template components

<div><span>Updated: Nov 21, 2025</span></div><div>Templates are made up of four primary components which you define when you create a template: header, body, footer, and buttons. The components you choose for each of your templates should be based on your business needs. The only required component is the body component.</div><div>Some components support variables, whose values you can supply when using the Cloud API to send the template in a template message. If your templates use variables, you must include sample variable values upon template creation.</div><div id="bkmrk-text-header"><div id="bkmrk-text-header-1"><div>### Text header

</div></div></div><div>Text headers are optional elements that can be added to the top of template messages. Each template may include only one text header. Please note that markdown special characters are not supported in this component, so we recommend avoiding their use.</div><div>Text headers support 1 [parameter](/books/meta-whatsapp/page/templates-developer-documentation).</div><div id="bkmrk-creation-syntax"><div id="bkmrk-creation-syntax-1"><div>#### Creation syntax

</div></div></div><div id="bkmrk-creation-parameters"><div id="bkmrk-creation-parameters-1"><div>#### Creation parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<HEADER_TEXT>`</div><div>*String*</div></div></td><td><div><div>**Required.**</div><div>Header body text string. Supports 1 [parameter](/books/meta-whatsapp/page/templates-developer-documentation).</div><div>If this string contains a parameter, you must include the `example` property and example parameter value.</div><div>Maximum 60 characters.</div></div></td><td><div><div>`Our new sale starts {{sale_start_date}}!`</div></div></td></tr><tr><td><div><div>`<NAMED_PARAMETER_NAME>`</div><div>*String*</div></div></td><td><div><div>**Required if using a named parameter.**</div><div>[Named parameter](/books/meta-whatsapp/page/templates-developer-documentation) name.</div></div></td><td><div><div>`{{sale_start_date}}`</div></div></td></tr><tr><td><div><div>`<PARAMETER_EXAMPLE_VALUE>`</div><div>*String*</div></div></td><td><div><div>**Required if using a parameter.**</div><div>[Parameter](/books/meta-whatsapp/page/templates-developer-documentation) example value.</div></div></td><td><div><div>`December 1st`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-media-header"><div id="bkmrk-media-header-1"><div>### Media header

</div></div></div><div>Media headers can be an image, video, gif, or a document such as a PDF. All media must be uploaded with the [Resumable Upload API](https://developers.facebook.com/docs/graph-api/guides/upload). The syntax for defining a media header is the same for all media types.</div><div>Note: Gifs are currently only available for [Marketing Messages API for WhatsApp](/books/meta-whatsapp/page/features-developer-documentation). Gifs are mp4 files with a max size of 3.5MB and larger files will be displayed as video messages.</div><div id="bkmrk-creation-syntax-3"><div id="bkmrk-creation-syntax-4"><div>#### Creation syntax

</div></div></div><div id="bkmrk-creation-parameters-3"><div id="bkmrk-creation-parameters-4"><div>#### Creation parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<FORMAT>`</div></div></td><td><div><div>Indicates media asset type. Set to `IMAGE`, `VIDEO`, `GIF`, or `DOCUMENT`.</div></div></td><td><div><div>`IMAGE`</div></div></td></tr><tr><td><div><div>`<HEADER_HANDLE>`</div></div></td><td><div><div>Uploaded media asset handle. Use the [Resumable Upload API](https://developers.facebook.com/docs/graph-api/guides/upload) to generate an asset handle.</div></div></td><td><div><div>`4::aW...`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-location-header"><div id="bkmrk-location-header-1"><div>### Location header

</div></div></div><div>Location headers appear as generic maps at the top of the template and are useful for order tracking, delivery updates, ride-hailing pickup/dropoff, locating physical stores, etc. When tapped, the app user's default map app will open and load the specified location. Locations are specified when you send the template.</div><div>Location headers can only be used in templates categorized as `UTILITY` or `MARKETING`. Real-time locations are not supported.</div><div id="bkmrk-creation-syntax-6"><div id="bkmrk-creation-syntax-7"><div>#### Creation syntax

</div></div></div><div id="bkmrk-creation-parameters-6"><div id="bkmrk-creation-parameters-7"><div>#### Creation parameters

</div></div></div><div>None.</div><div id="bkmrk-send-syntax"><div id="bkmrk-send-syntax-1"><div>#### Send syntax

</div></div></div><div id="bkmrk-send-parameters"><div id="bkmrk-send-parameters-1"><div>#### Send parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`<LOCATION_ADDRESS>`</div></div></td><td><div><div>Location address.</div></div></td><td><div><div>`101 Forest Ave, Palo Alto, CA 94301`</div></div></td></tr><tr><td><div><div>`<LOCATION_LATITUDE>`</div></div></td><td><div><div>Location latitude in decimal degrees.</div></div></td><td><div><div>`37.44211676562361`</div></div></td></tr><tr><td><div><div>`<LOCATION_LONGITUDE>`</div></div></td><td><div><div>Location longitude in decimal degrees.</div></div></td><td><div><div>`122.16155960083124`</div></div></td></tr><tr><td><div><div>`<LOCATION_NAME>`</div></div></td><td><div><div>Location name.</div></div></td><td><div><div>`Philz Coffee`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-body"><div id="bkmrk-body-1"><div>### Body

</div></div></div><div>The body component represents the core text of your message template and is a text-only template component. Templates are limited to one body component.</div><div>The message text in the body component accepts multiple [parameters](/books/meta-whatsapp/page/templates-developer-documentation).</div><div id="bkmrk-creation-syntax-9"><div id="bkmrk-creation-syntax-10"><div>#### Creation syntax

</div></div></div><div id="bkmrk-creation-parameters-9"><div id="bkmrk-creation-parameters-10"><div>#### Creation parameters

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<BODY_TEXT>`</div><div>*String*</div></div></td><td><div><div>**Required.**</div><div>Body text string. Supports multiple [parameters](/books/meta-whatsapp/page/templates-developer-documentation).</div><div>Maximum of 1024 characters.</div></div></td><td><div><div>`Thank you, {{first_name}}! Your order number is {{order_number}}.`</div></div></td></tr><tr><td><div><div>`<NAMED_PARAMETER_NAME>`</div><div>*String*</div></div></td><td><div><div>**Required if using a named parameter.**</div><div>[Named parameter](/books/meta-whatsapp/page/templates-developer-documentation) name.</div></div></td><td><div><div>`{{order_number}}`</div></div></td></tr><tr><td><div><div>`<PARAMETER_EXAMPLE_VALUE>`</div><div>*String*</div></div></td><td><div><div>**Required if using a parameter.**</div><div>[Parameter](/books/meta-whatsapp/page/templates-developer-documentation) example value.</div></div></td><td><div><div>`December 1st`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-footer"><div id="bkmrk-footer-1"><div>### Footer

</div></div></div><div>Footers are optional text-only components that appear immediately after the body component. Templates are limited to one footer component.</div><div id="bkmrk-properties"><div id="bkmrk-properties-1"><div>#### Properties

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<TEXT>`</div></div></td><td><div><div>Text to appear in template footer when sent.</div><div>  
60 characters maximum.</div></div></td><td><div><div>`Use the buttons below to manage your marketing subscriptions`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-buttons"><div id="bkmrk-buttons-1"><div>### Buttons

</div></div></div><div>Buttons are optional interactive components that perform specific actions when tapped.</div><div>Templates can have a combination of up to 10 button components in total, although there are limits to individual buttons of the same type as well as combination limits, which are described below. In addition, templates composed of 4 or more buttons, or a quick reply button and one or more buttons of another type, cannot be viewed on WhatsApp desktop clients. WhatsApp users who receive one of these template messages will be prompted to view the message on a phone instead.</div><div>Buttons are defined within a single buttons component object, packed into a single `buttons` array. For example, this template uses a voice call button and a URL button:</div><div>If a template has more than three buttons, two buttons will appear in the delivered message, and the remaining buttons will be replaced with a **See all options** button. Tapping the **See all options** button reveals the remaining buttons.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-sooru2d8.png)</div><div id="bkmrk-copy-code-buttons"><div id="bkmrk-copy-code-buttons-1"><div>#### Copy code buttons

</div></div></div><div>Copy code buttons copy a text string (defined when the template is sent in a template message) to the device's clipboard when tapped by the app user. Templates are limited to one copy code button.</div><div id="bkmrk-properties-3"><div id="bkmrk-properties-4"><div>##### Properties

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<EXAMPLE>`</div></div></td><td><div><div>String to be copied to the device's clipboard when tapped by the app user.</div><div>  
Maximum 15 characters.</div></div></td><td><div><div>`250FF`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-multi-product-messag"><div id="bkmrk-multi-product-messag-1"><div>#### Multi-product message buttons

</div></div></div><div>Multi-product message buttons are special, non-customizable buttons that, when tapped, display up to 30 products from your ecommerce catalog, organized in up to 10 sections, in a single message. See [Multi-Product Message Templates](/books/meta-whatsapp/page/multi-product-message-templates-developer-documentation).</div><div id="bkmrk-one-time-password-bu"><div id="bkmrk-one-time-password-bu-1"><div>#### One-time password buttons

</div></div></div><div>One-time password buttons are a special type of [URL button](#bkmrk-url-buttons-1) component used with authentication templates. See [Authentication Templates](/documentation/business-messaging/whatsapp/templates/authentication-templates/authentication-templates).</div><div id="bkmrk-voice-call-buttons"><div id="bkmrk-voice-call-buttons-1"><div>#### Voice call buttons

</div></div></div><div>Voice call buttons make a WhatsApp call to the business when tapped by the app user. See [Create and send WhatsApp call button template message](/books/meta-whatsapp/page/send-whatsapp-call-button-messages-and-deep-links-developer-documentation) to learn more</div><div id="bkmrk-phone-number-buttons"><div id="bkmrk-phone-number-buttons-1"><div>#### Phone number buttons

</div></div></div><div>Phone number buttons call the specified business phone number when tapped by the app user. Templates are limited to one phone number button.</div><div id="bkmrk-properties-6"><div id="bkmrk-properties-7"><div>##### Properties

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<PHONE_NUMBER>`</div></div></td><td><div><div>Alphanumeric string. Business phone number to be called when the user taps the button.</div><div>Note that some countries have special phone numbers that have leading zeros after the country calling code (for example, +55-0-955-585-95436). If you assign one of these numbers to the button, the leading zero will be stripped from the number. If your number will not work without the leading zero, assign an alternate number to the button, or add the number as message body text.</div><div>20 characters maximum.</div></div></td><td><div><div>`15550051310`</div></div></td></tr><tr><td><div><div>`<TEXT>`</div></div></td><td><div><div>Button label text.</div><div>  
25 characters maximum.</div></div></td><td><div><div>`Call`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-quick-reply-buttons"><div id="bkmrk-quick-reply-buttons-1"><div>#### Quick reply buttons

</div></div></div><div>Quick reply buttons are custom text-only buttons that immediately message you with the specified text string when tapped by the app user. A common use case is a button that allows your customer to easily opt-out of any marketing messages.</div><div>Templates are limited to 10 quick reply buttons. If using quick reply buttons with other buttons, buttons must be organized into two groups: quick reply buttons and non-quick reply buttons. If grouped incorrectly, the API will return an error indicating an invalid combination.</div><div>Examples of valid groupings:</div><span>Quick Reply, Quick Reply</span><span>Quick Reply, Quick Reply, URL, Phone</span><span>URL, Phone, Quick Reply, Quick Reply</span><div>Examples of invalid groupings:</div><span>Quick Reply, URL, Quick Reply</span><span>URL, Quick Reply, URL</span><div>When using the API to send a template that has multiple quick reply buttons, you can use the index property to designate the order in which buttons appear in the template message.</div><div id="bkmrk-properties-9"><div id="bkmrk-properties-10"><div>##### Properties

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<TEXT>`</div></div></td><td><div><div>Button label text.</div><div>  
25 characters maximum.</div></div></td><td><div><div>`Unsubscribe`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-spm-buttons"><div id="bkmrk-spm-buttons-1"><div>#### SPM buttons

</div></div></div><div>Single-product message (SPM) buttons are special, non-customizable buttons that can be mapped to a product in your product catalog. When tapped, they load details about the product, which it pulls from your catalog. Users can then add the product to their cart and place an order. See [Single-Product Message Templates](/books/meta-whatsapp/page/single-product-message-templates-developer-documentation) and [Product Card Carousel Templates](/books/meta-whatsapp/page/product-card-carousel-templates-developer-documentation).</div><div id="bkmrk-url-buttons"><div id="bkmrk-url-buttons-1"><div>#### URL buttons

</div></div></div><div>URL buttons load the specified URL in the device's default web browser when tapped by the app user. Templates are limited to two URL buttons.</div><div id="bkmrk-properties-12"><div id="bkmrk-properties-13"><div>##### Properties

</div></div></div><div><table><thead><tr><th><span>Placeholder </span></th><th><span>Description </span></th><th><span>Example Value </span></th></tr></thead><tbody><tr><td><div><div>`<EXAMPLE>`</div></div></td><td><div><div>URL of website. Supports 1 variable.</div><div>  
If using a variable, add sample variable property to the end of the URL string. The URL loads in the device's default mobile web browser when the customer taps the button.</div><div>  
2000 characters maximum.</div></div></td><td><div><div>`https://www.luckyshrub.com/shop?promo=summer2023`</div></div></td></tr><tr><td><div><div>`<TEXT>`</div></div></td><td><div><div>Button label text. 25 characters maximum.</div></div></td><td><div><div>`Shop Now`</div></div></td></tr><tr><td><div><div>`<URL>`</div></div></td><td><div><div>URL of website that loads in the device's default mobile web browser when the button is tapped by the app user.</div><div>  
Supports 1 variable, appended to the end of the URL string.</div><div>  
2000 characters maximum.</div></div></td><td><div><div>`https://www.luckyshrub.com/shop?promo={{1}}`</div></div></td></tr></tbody></table>

</div><div id="bkmrk-limited-time-offer"><div id="bkmrk-limited-time-offer-1"><div>### Limited-time offer

</div></div></div><div>Limited-Time Offer components are special components used to create [limited-time offer templates](/books/meta-whatsapp/page/limited-time-offer-templates-developer-documentation).</div></div>

# Template Library | Developer Documentation

<div id="bkmrk-template-libraryupda">## Template Library

<div><span>Updated: Nov 14, 2025</span></div><div>Template Library makes it faster and easier for businesses to create utility templates for common use cases, like payment reminders, delivery updates - and authentication templates for common identity verification use cases.</div><div>These pre-written templates have already been categorized as utility or authentication. Library templates contain fixed content that cannot be edited and parameters you can adapt for business or user-specific information.</div><div>You can browse and create templates using Template Library in WhatsApp Manager, or programmatically via the API.</div><div id="bkmrk-creating-templates-v"><div id="bkmrk-creating-templates-v-1"><div>### Creating Templates via WhatsApp Manager (WAM)

</div></div></div><div>Follow the instructions below to create templates using the Template Library in [WhatsApp Manager<span>?</span>](https://business.facebook.com/wa/manage/template-library).</div><div>1: In the sidebar of WAM, under **Message Templates**, select **Create Template**.</div><div>![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-empvxulc.jpeg)</div><div>2: Under *Browse the WhatsApp Template Library*, select **Browse Templates**.</div><div>![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-lorbldze.jpeg)</div><div>3: You will now see all currently available templates. Use the search bar to search by topic or use case, or use the dropdown options on the sidebar to filter the results.</div><div>Note that hovering over a template will show you its parameter values.</div><div>![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-e3ga5b2t.jpeg)</div><div>4: To create a template, **select one** by clicking on it. Then, add your template name, select the language, and fill out the button details. Once you have completed these steps, click **Submit**.</div><div>Note: If you choose **Customize template**, your template will have to go through review before you are able to send messages.</div><div>![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-5xnyqufx.jpeg)</div><div id="bkmrk-template-parameters-"><div id="bkmrk-template-parameters--1"><div>### Template Parameters and Restrictions

</div></div></div><div><span></span><div>When a template contains the value `library_template_name` in the `GET <WABAID>/message_templates?name=<TEMPLATE_NAME>` response, it is a template created from the Template Library and is subject to type checks and restrictions.</div></div><div>![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-jsg0bj75.jpeg)![Image](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-gobu3z9r.jpeg)</div><div>Templates in the library contain both fixed content and parameters. The parameters represent spaces in the template where variable information can be inserted, such as names, addresses, and phone numbers.</div><div>In the example above, parameters like the name `Jim` or the business name `CS Mutual` can be modified to accept variables like your customer's name and your business's name.</div><div>Messages sent using templates from Template Library are subject to parameter checks during send time. Values used in parameters that are outside of the established ranges listed below will cause the message send to fail.</div><div id="bkmrk-list-of-parameters-a"><div id="bkmrk-list-of-parameters-a-1"><div>#### List of parameters and sample values

</div></div></div><div><span></span><div>All parameters are length restricted. If you receive an error, try again with a shorter value.</div></div><div><table><thead><tr><th><span>Parameter Type </span></th><th><span>Description </span></th><th><span>Sample Value </span></th></tr></thead><tbody><tr><td><div><div>`ADDRESS`</div></div></td><td><div><div>A location address.</div>
<span>Must be a valid address</span></div></td><td><div>
<span>`1 Hacker Way, Menlo Park, CA 94025`</span></div></td></tr><tr><td><div><div>`TEXT`</div></div></td><td><div><div>Basic text.</div></div></td><td><div>
<span>`regarding your order.`</span><span>`12 pack of paper towels`</span><span>`your request`</span><span>`purchase`</span><span>`Jasper's Market`</span></div></td></tr><tr><td><div><div>`AMOUNT`</div></div></td><td><div><div>A number signifying a quantity.</div>
<span>May contain a prefix or suffix for monetary values such as USD or RS</span><span>May contain decimals (.) and commas (,)</span><span>May contain valid currency symbols such as $ and ?</span></div></td><td><div>
<span>`145`</span><span>`USD $375.32`</span><span>`?1,376.22 EUR`</span><span>`RS 1200`</span></div></td></tr><tr><td><div><div>`DATE`</div></div></td><td><div><div>A standard calendar date.</div></div></td><td><div>
<span>`2021-04-19`</span><span>`13/03/2021`</span><span>`5th January 1982`</span><span>`08.22.1991`</span><span>`January 1st, 2024`</span><span>`05 12 2022`</span></div></td></tr><tr><td><div><div>`PHONE NUMBER`</div></div></td><td><div><div>A telephone number.</div>
<span>May contain numbers, spaces, dashes (-), parentheses, and plus symbols (+)</span></div></td><td><div>
<span>`+1 4256789900`</span><span>`+91-7884-789122`</span><span>`+39 87 62232`</span></div></td></tr><tr><td><div><div>`EMAIL`</div></div></td><td><div><div>A standard email address.</div>
<span>Must be a valid email address</span></div></td><td><div>
<span>`1hackerway@meta.com`</span><span>`yourcustomername@gmail.com`</span><span>`abusinessorcustomername@hotmail.com`</span></div></td></tr><tr><td><div><div>`NUMBER`</div></div></td><td><div><div>A number.</div>
<span>Must be a number.</span><span>Cannot contain spaces.</span></div></td><td><div>
<span>`23444`</span><span>`90001234921388904`</span><span>`453638`</span></div></td></tr></tbody></table>

</div><div id="bkmrk-sending-template-mes"><div id="bkmrk-sending-template-mes-1"><div>### Sending Template Messages

</div></div></div><div>To learn how to send templated messages, view the [Send Templates guide](/books/meta-whatsapp/page/template-messages-developer-documentation)</div></div>

# Template management | Developer Documentation

<div id="bkmrk-template-managementu">## Template management

<div><span>Updated: Nov 14, 2025</span></div><div>Learn about common endpoints used to manage templates.</div><div id="bkmrk-edit-templates"><div id="bkmrk-edit-templates-1"><div>### Edit templates

</div></div></div><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>#### Limitations

</div></div></div><span>Only templates with an `APPROVED`, `REJECTED`, or `PAUSED` status can be edited.</span><span>You can only edit a template's category, components, or time-to-live.</span><span>You cannot edit individual template components; all components will be replaced with the components in the edit request payload.</span><span>You cannot edit the category of an approved template.</span><span>Approved templates can be edited up to 10 times in a 30 day window, or 1 time in a 24 hour window. Rejected or paused templates can be edited an unlimited number of times.</span><span>After editing an approved or paused template, it will automatically be approved unless it fails template review.</span><div id="bkmrk-delete-templates"><div id="bkmrk-delete-templates-1"><div>### Delete templates

</div></div></div><div id="bkmrk-limitations-3"><div id="bkmrk-limitations-4"><div>#### Limitations

</div></div></div><span>If you delete a template that has been sent in a template message but has yet to be delivered (e.g. because the customer's phone is turned off), the template's status will be set to `PENDING_DELETION` and we will attempt to deliver the message for 30 days.</span><span>If you delete an approved template, you cannot create a new template with the same name for 30 days.</span><span>Templates that are in a disabled status cannot be deleted.</span><div id="bkmrk-delete-template-by-n"><div id="bkmrk-delete-template-by-n-1"><div>#### Delete template by name

</div></div></div><div>Deleting a template by name deletes all templates that match that name (meaning templates with the same name but different languages will also be deleted).</div><div id="bkmrk-delete-template-by-i"><div id="bkmrk-delete-template-by-i-1"><div>#### Delete template by ID

</div></div></div><div>To delete a template by ID, include the template's ID along with its name in your request; only the template with the matching template ID will be deleted.</div></div>

# Business portfolio pacing | Developer Documentation

<div id="bkmrk-business-portfolio-p">## Business portfolio pacing

<div><span>Updated: Dec 8, 2025</span></div><div><span></span><div>This feature is being released gradually over the coming weeks so may not apply to you immediately.</div></div><div>Business portfolio pacing is a template message delivery batching mechanism that allows time to gather feedback on any template sent as part of a large-scale messaging campaign.</div><div>Note that business portfolio pacing is different from [template pacing](/books/meta-whatsapp/page/template-pacing-developer-documentation), which only affects marketing and utility templates.</div><div>Business portfolio pacing applies to:</div>
<span>business portfolios that have sent less than 500K template messages collectively, across all of their business phone numbers, within a moving 365-day lookback period</span><span>business portfolios that are currently being monitored for suspicious activity (for example, for violating our [WhatsApp Business Messaging Policy<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fbusiness.whatsapp.com%2Fpolicy&h=AT6XrhY0KdXEaMPqhZQZgGYWRVyATxzTasLD1Cfq-b9CN_SDedXtuw_7-KcexIcBejpbUd4BLkNGnphXM01dJM60imycV-0Zy2VlXqPDJ4lLf65Rb98-Y61ZgM_SC7T7dqtPYxOVeBn03JIK2c3sdA) or [WhatsApp Messaging Guidelines<span>⁠</span>](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.whatsapp.com%2Flegal%2Fmessaging-guidelines&h=AT6XrhY0KdXEaMPqhZQZgGYWRVyATxzTasLD1Cfq-b9CN_SDedXtuw_7-KcexIcBejpbUd4BLkNGnphXM01dJM60imycV-0Zy2VlXqPDJ4lLf65Rb98-Y61ZgM_SC7T7dqtPYxOVeBn03JIK2c3sdA))</span><div>If pacing applies to your business portfolio and you attempt to send a large number of templates within a short period of time using any of your portfolio’s business phone numbers:</div>
<span>an initial set of messages will be processed normally</span><span>subsequent messages will be held, and the `message_status` property in API responses will be set to `held_for_quality_assessment`</span><div>We will then deliver messages in batches, monitoring feedback before releasing each new batch. If feedback suggests suspicious activity, all remaining held messages will be dropped, and a [status messages](/books/meta-whatsapp/page/status-messages-webhook-reference-developer-documentation) webhook with `status` set to `failed` and `code` set to `132015` will be triggered for each dropped message. Portfolio admins will be informed of dropped messages by Meta Business Suite notification, WhatsApp Manager banner, and email.</div><div>In addition, the business portfolio will be prevented from sending or creating templates while it undergoes further review. If messaging activity has been found to violate our policies or guidelines, it may be fully disabled completely. Portfolio admins will be notified of any enforcement actions and will have the option to appeal any decisions.</div></div>

# Template pacing | Developer Documentation

<div id="bkmrk-template-pacingupdat">## Template pacing

<div><span>Updated: Dec 8, 2025</span></div><div>Template pacing is a mechanism that allows time for customers to provide early feedback on templates. This identifies and [pauses templates](/books/meta-whatsapp/page/template-pausing-developer-documentation) that have received poor feedback or engagement, giving you enough time to adjust their contents before they are sent to too many customers, thereby reducing the likelihood of negative feedback impacting your business.</div><div>Template pacing is valid for marketing and utility templates. Newly created templates, paused templates that are unpaused, and templates that may have been created previously but don’t have a `GREEN` quality rating are potentially subject to pacing. Template quality history — for example, low quality resulting in a template pause — is one of the primary reasons for template pacing and you may see other templates get paced. When a template is paced, messages will be sent normally until an unspecified threshold is reached. Once this threshold is reached, subsequent messages using that template will be held to allow enough time for customer feedback. Once we receive a good quality signal, subsequent messages using that template will be scaled to the entire target audience. If we receive a bad quality signal, subsequent messages using that template will be dropped, giving you the opportunity to adjust content, targeting, etc.</div><div id="bkmrk-utility-template-pac"><div id="bkmrk-utility-template-pac-1"><div>### Utility template pacing

</div></div></div><div>Utility templates are subject to pacing only if you have had a utility template paused. Once a utility template has been paused, newly created templates, paused templates that are unpaused, and templates that may have been created previously but don’t have GREEN quality rating are potentially subject to pacing for the next 7 days.</div><div id="bkmrk-api-behavior"><div id="bkmrk-api-behavior-1"><div>### API Behavior

</div></div></div><div>The immediate response from the messages endpoint will indicate if the message was sent or held with the new `message_status` property in the `messages` object. This response will be available on all versions of the API.</div><span>Cloud API will always include a `message_status` property that will have a value of `accepted` for messages that are processed, and `held_for_quality_assessment` for messages that are held. Messages that are accepted will trigger the `sent` and `delivered` webhooks when they are actually sent (this is the same behavior that existed before pacing). A full example response can be found in the Cloud API docs.</span><div>If the feedback is positive and changes the template’s quality rating to high quality, the held messages will be released and sent normally. The `message_template_quality_update` will send the quality update and the `messages` webhook will send the sent and delivered updates.</div><div>If the feedback is negative and changes the template’s quality to low quality:</div><span>The template’s `status` will be set to `PAUSED`</span><span>A `message_template_status_update` will be sent with an event value of `paused`</span><span>Each held message will be dropped and trigger a `messages` webhook with and (Cloud API users).</span><span>A `message_template_quality_update` webhook will be triggered with the quality change</span><span>Admins of the WhatsApp Business Account owning business will be informed of the dropped messages by Meta Business Suite notification, WhatsApp Manager banner, and email</span><div>See [Template Pausing](/books/meta-whatsapp/page/template-pausing-developer-documentation) to learn how to unpause a template that has been paused due to pacing.</div><div>Note that we have internal guardrails in place to ensure that we evaluate and make a pacing decision within a reasonable time to avoid impact on time sensitive campaigns. Our goal is that even if paced, campaign messages with highest throughput still get delivered within an hour (99 percentile).</div><div>Thus, if our internal guardrails are reached before a template has received enough feedback to change its quality to high or low, the held messages will be released normally along with any appropriate messages webhooks.</div></div>

# Template pausing | Developer Documentation

<div id="bkmrk-template-pausingupda">## Template pausing

<div><span>Updated: Oct 22, 2025</span></div><div>If a message template reaches the lowest quality rating (a status of **Active - Low quality** in WhatsApp Manager, or a `quality_score` of `RED` via API), it will automatically be paused for a period of time to protect the quality rating of phone numbers that have used the template. Pausing durations are as follows:</div>
<span>1st Instance: Paused for 3 hours</span><span>2nd Instance: Paused for 6 hours</span><span>3rd Instance: Disabled</span><div>When a message template is paused (status of **Paused**) it can’t be sent to customers, so you should halt any automated messaging campaigns that rely on that template. Although you won’t be charged for attempting to send a paused message template to a customer, and the attempt won’t count against your messaging limit, the API will reject these attempts anyway. You should only resume these campaigns when the template’s status has been set to Active again.</div><div>You may wish to edit a paused template if you feel that editing its content will reduce the amount of negative feedback it may receive and increase user engagement. Keep in mind, however, that once you edit a message template and resubmit it for approval, its status will change to In Review and it can’t be sent to customers again until it has been re-approved and its status set to Active.</div><div>You may also wish to make changes to your business logic (targeting, delivery parameters, etc.) if you feel it is contributing to negative feedback or low engagement.</div><div>Pausing will initially not impact the business phone number from which the message template was sent. Other high quality message templates can continue to be sent from the phone number. However, if a business consistently sends message templates that reach a Low quality status, the phone number may eventually be impacted.</div><div id="bkmrk-pause-notifications"><div id="bkmrk-pause-notifications-1"><div>### Pause Notifications

</div></div></div><div>When a message template has been paused we will notify you by WhatsApp Manager notification, email, and a [message\_template\_status\_update](/books/meta-whatsapp/page/message-template-status-update-webhook-reference-developer-documentation) webhook will be triggered.</div><div id="bkmrk-unpausing"><div id="bkmrk-unpausing-1"><div>#### Unpausing

</div></div></div><div>A template will unpause on its own after satisfying the pause duration outlined above. Once unpaused, the template’s status will be set to **Active** and you may begin sending it to customers again. If you didn’t halt any automated messaging campaigns that relied on a paused template, they should start working again. However, we recommend that you halt any campaigns that rely on a template that has been paused until it is unpaused, because our APIs will reject your requests anyway.</div><div>The template’s [quality rating](/books/meta-whatsapp/page/template-quality-rating-developer-documentation) will also be reset to a value based on the most recent customer feedback the template has received.</div><div>Similar to pause notifications, we will notify you by WhatsApp Manager notification, email, and webhook once the template’s status has been set to Active.</div><div>Applies to businesses in Brazil, Colombia, and Singapore, starting September 12, 2023. Applies to all businesses starting October 12, 2023.</div><div>With the introduction of Template Pacing, we’re also introducing the ability to unpause any paused template through:</div>
<span>The API by making a POST request to `/{whats_app_message_template_id}/unpause`</span><span>WhatsApp Manager by clicking the **manually unpause it** link highlighted in the screenshots below.</span><div>Note that templates paused during Template Pacing must be manually unpaused (API or WhatsApp Manager) before they can be used again.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-vqrfu4jt.png)</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-7agfxqaa.png)</div><div id="bkmrk-appeals"><div id="bkmrk-appeals-1"><div>#### Appeals

</div></div></div><div>If your submission is rejected you may file an appeal. Note that appeals must include a sample. If an approved template has become disabled, you may also edit it and resubmit it for approval.</div><div>In the WhatsApp Manager:</div>
<span>Mouseover the suitcase icon (**Account tools**) and click **Message templates**.</span><span>If you have multiple WhatsApp Business Accounts, use the dropdown menu in the top-right corner to select the account whose templates you want to manage.</span><span>Find the message template that you would like to edit and click it.</span><span>Edit the template’s contents.</span><span>Click the **Add Sample** button and add sample variable values and images.</span><span>Click **Submit**.</span><div>The appeal will be reviewed and a decision made within 24 hours.</div></div>

# Per-user marketing template message limits | Developer Documentation

<div id="bkmrk-per-user-marketing-t">## Per-user marketing template message limits

<div><span>Updated: Feb 26, 2026</span></div><div><span></span><div>**Upcoming changes**</div><div>*Starting March 3, 2025*, we will take into account the overall volume of personal and business messages in a user’s inbox in addition to their recent marketing message read rates when determining if a given WhatsApp user should receive fewer marketing template messages, and what their limit should be. This means that if a person has low inbox activity or they have not engaged with many of the marketing messages they received lately they may receive fewer marketing messages to ensure a healthy balance of messages in their inbox. From late Q2 we will also align the per user marketing limit with upcoming per-message pricing changes so that all marketing messages delivered will now count towards the per user marketing limit.</div><div>*Starting April 1, 2025*, we will temporarily pause delivery of all marketing template messages to WhatsApp users who have a United States phone number (a number composed of a +1 dialing code and a US area code). This pause is intended to allow us to focus on building a better consumer experience in the US, which will ultimately lead to improved outcomes for businesses. Attempting to send a template message to a WhatsApp user with a US phone number after this date will [result in an error](#bkmrk-how-we-notify-via-er-1).</div></div><div id="bkmrk-what-is-it%3F"><div id="bkmrk-what-is-it%3F-1"><div>### What is it?

</div></div></div><div>WhatsApp may limit the number of marketing template messages a person receives from any business in a given period of time where users are less likely to be receptive and engage with them. This is determined based on a number of factors, including a dynamic view of an individual’s recent marketing message read rate and how many messages they currently have in their inbox from friends, family and businesses.</div><div>Starting April 1, 2025, to focus on building the consumer experience, WhatsApp will not deliver any marketing template messages to individuals with United States phone numbers (numbers composed of a +1 dialing code and a US area code).</div><div>Messages sent from a business phone number in the European Economic Area, United Kingdom, Japan, or South Korea, or to a consumer in these countries, will not receive delivery optimizations. Note that per-user marketing message template limits are also not active in these countries, so a lack of delivery optimizations will not have any effect on message delivery.</div><div id="bkmrk-why-is-it-important%3F"><div id="bkmrk-why-is-it-important%3F-1"><div>### Why is it important?

</div></div></div><div>WhatsApp has found that per-user marketing template limits maximize marketing message engagement and improve the user experience, measured through improvements in user read rates and sentiment. This limit helps WhatsApp users find business messaging more valuable and feel less like they receive too many business messages. How this Applies to Your Business</div><div>Our per user marketing limit adapts automatically over time based on a person’s recent engagement levels. While this may mean delivering fewer messages to some users during periods of lower marketing read rates or overall inbox activity, rest assured your ability to reach people when they are most engaged will not change.</div><div id="bkmrk-aligning-per-user-ma"><div id="bkmrk-aligning-per-user-ma-1"><div>### Aligning per-user marketing limits with upcoming per message pricing changes

</div></div></div><div>Gradually rolling out from late Q2 2025, the per user marketing limit will align with upcoming per-message [pricing changes](/books/meta-whatsapp/page/pricing-on-the-whatsapp-business-platform-developer-documentation). Previously, the limit only applied to marketing template messages that would normally open a new marketing conversation, and businesses could send one additional marketing template message if a marketing conversation is already open between you and a WhatsApp user.</div><div>Now businesses will be able to send an unlimited number of marketing messages, however each message delivered will now count towards the per user marketing limit. One exception is, if a person responds to a marketing message it will start a 24h [customer service window](/books/meta-whatsapp/page/sending-messages-developer-documentation). Marketing messages sent within this window will not count towards a person’s limit.</div><div id="bkmrk-how-we-notify-via-er"><div id="bkmrk-how-we-notify-via-er-1"><div>### How we notify via error code

</div></div></div><div>If a marketing template message is not sent due to per-user marketing template limit enforcement, a messages webhook will be triggered with status set to failed and (error) code set to `131049` (for Cloud API).</div><div>If you do receive this error code and suspect it is due to the limit, wait at least 24 hours before resending the template message. Doing so will only result in another error response since the limit may be in effect for differing periods of time.</div><div>We will continue to refine our approach, and we appreciate your partnership as we invest in making WhatsApp the best possible experience for your business and your customers.</div></div>

# Template quality rating | Developer Documentation

<div id="bkmrk-template-quality-rat">## Template quality rating

<div><span>Updated: Oct 29, 2025</span></div><div>Every template has a quality rating based on usage, customer feedback, and engagement. Templates can have the following ratings, as reported by the API:</div>
<span>`GREEN` - Indicates high quality. The template has received little to no negative feedback from WhatsApp users. The template can be sent.</span><span>`YELLOW` - Indicates medium quality. The template has received negative feedback from multiple WhatsApp users, or low read-rates, and may soon become paused or disabled. Message templates with this status can still be sent.</span><span>`RED` - Indicates low quality. The template has received negative feedback from multiple WhatsApp users, or low read-rates. The template can be sent, but is in danger of being paused or disabled soon. We recommend that you address the issues that users are reporting. are reporting.</span><span>`UNKNOWN` - Indicates a quality score is still pending, because it has yet to receive WhatsApp user feedback or read-rate data. The template can be sent.</span><div>Newly created templates have a quality score of `UNKNOWN`, but their rating will change automatically as usage, feedback, and engagement signal is collected over time.</div><div>Quality ratings factor into [template pacing](/books/meta-whatsapp/page/template-pacing-developer-documentation) and [template pausing](/books/meta-whatsapp/page/template-pausing-developer-documentation), which can affect template delivery. If a template continuously receives negative feedback or low engagement, it can eventually affect the template's status. If the status changes to anything other than `APPROVED`, the template cannot be sent in template messages unless its `APPROVED` status is restored.</div><div id="bkmrk-get-template-quality-3"><div id="bkmrk-get-template-quality-4"><div>### Get template quality rating via WhatsApp Manager

</div></div></div><div>The [Manage templates<span>?</span>](https://business.facebook.com/latest/whatsapp_manager/message_templates) panel in WhatsApp Manager also displays template quality ratings for templates that have an approved status:</div>
<span>Active - **Quality pending** (equates to an `UNKNOWN` quality score)</span><span>Active - **High quality** (equates to a `GREEN` quality score)</span><span>Active - **Medium quality** (equates to a `YELLOW` quality score)</span><span>Active - **Low quality** (equates to a `RED` quality score)</span><div id="bkmrk-see-also"><div id="bkmrk-see-also-1"><div>### See also

</div></div></div>
<span>[About your WhatsApp Business message template's quality rating<span>?</span>](https://www.facebook.com/business/help/766346674749731)</span></div>

# Template review | Developer Documentation

<div id="bkmrk-template-reviewupdat">## Template review

<div><span>Updated: Oct 31, 2025</span></div><div>Cloud API reviews templates and variable parameters using machine learning to protect the security and integrity of Cloud API services. When Cloud API reviews templates and variable text, no information is shared with WhatsApp.</div><div>When you submit a template creation request, the content undergoes validation through a combination of automated systems and manual reviews. This process ensures that the template complies with WhatsApp’s policies and quality standards. Templates that contain spam, scam-like content, or violate WhatsApp policies are rejected during this review process.</div><div id="bkmrk-approval-process"><div id="bkmrk-approval-process-1"><div>### Approval process

</div></div></div><div>Once you have created your template you can submit it for approval. It can take up to 24 hours for an approval decision to be made. Once a decision has been made, a notification will appear in your WhatsApp Manager and we will send an email to your Business Manager admins. In addition, we will send a [message\_template\_status\_change](/books/meta-whatsapp/page/message-template-status-update-webhook-reference-developer-documentation) webhook.</div><div>If your message template is approved, its status will be set to **Active - Quality pending** (`APPROVED` in the API) and you can begin sending it to customers. If it is rejected, you can edit it and resubmit for approval, or appeal the decision.</div><div id="bkmrk-samples"><div id="bkmrk-samples-1"><div>#### Samples

</div></div></div><div>If your template uses variables you must include sample variable values (media assets, text strings, etc.) with your submission. This makes it easier for us to visualize how your template will appear to customers.</div><div>To include a sample with your submission in the WhatsApp Manager, first create your template, adding any variables that it requires, then click the Add Sample button. The preview pane will render any sample media assets or sample text values you provide.</div><div id="bkmrk-common-rejection-rea"><div id="bkmrk-common-rejection-rea-1"><div>### Common rejection reasons

</div></div></div><div>Submissions are commonly rejected for the following reasons, so make sure you avoid these mistakes.</div><div id="bkmrk-parameter-formatting"><div id="bkmrk-parameter-formatting-1"><div>#### Parameter formatting

</div></div></div>
<span>Variable parameters are missing or have mismatched curly braces. The correct format is `{{1}}` for positional parameters .</span><span>Variable parameters contain special characters such as a `#`, `$`, or `%`.</span><span>Variable parameters are not sequential. For example, `{{1}}`, `{{2}}`, `{{5}}`, `{{4}}`.</span><span>The template contains too many variable parameters relative to the message length. You need to decrease the number of variable parameters or increase the message length.</span><span>The message template cannot start or end with a parameter i.e. dangling parameters are not allowed.</span><div id="bkmrk-content-and-policy-v"><div id="bkmrk-content-and-policy-v-1"><div>#### Content and Policy Violations

</div></div></div>
<span>The message template contains content that violates WhatsApp’s Commerce Policy: When you offer goods or services for sale, we consider all messages and media related to your goods or services, including any descriptions, prices, fees, taxes and/or any required legal disclosures, to constitute transactions. Transactions must comply with the WhatsApp Commerce Policy.</span><span>The message template contains content that violates the WhatsApps Business Policy: Do not request sensitive identifiers from users. For example, do not ask people to share full length individual payment card numbers, financial account numbers, National Identification numbers, or other sensitive identifiers. This also includes not requesting documents from users that might contain sensitive identifiers. Requesting partial identifiers (ex: last 4 digits of their Social Security number) is OK.</span><span>The content contains potentially abusive or threatening content, such as threatening a customer with legal action or threatening to publicly shame them.</span><div id="bkmrk-character-limits-and"><div id="bkmrk-character-limits-and-1"><div>#### Character limits and text format

</div></div></div><div>The body component will have different character limits depending on the format and tag of the template. The number of emojis allowed in the body component may also be limited.</div><div id="bkmrk-duplication"><div id="bkmrk-duplication-1"><div>#### Duplication

</div></div></div><div>The message template is a duplicate of an existing template. If a template is submitted with the same wording in the body and footer of an existing template, the duplicate template will be rejected.</div><div id="bkmrk-rejection-notificati"><div id="bkmrk-rejection-notificati-1"><div>#### Rejection Notifications

</div></div></div><div>A rejection notification that includes the rejection reason will appear in Business Support Home. You can view rejections in the Business Support Home by navigating to **Account Overview** &gt; **View my accounts** (button) &gt; (your Meta Business Account) &gt; (your WABA) &gt; **Rejected message templates**.</div><div>Rejection info will also be sent via email.</div><div>You can refer to the Business Support Home notification to see the name and language of the existing template with the same content as the rejected duplicate template. You may also choose to edit the template and resubmit.</div><div>Note: This check does not apply to templates categorized as `AUTHENTICATION`.</div><div id="bkmrk-appeals"><div id="bkmrk-appeals-1"><div>### Appeals

</div></div></div><div>If your submission is rejected you may file an appeal. Note that appeals must include a sample. If an approved template has become disabled, you may also edit it and resubmit it for approval.</div><div id="bkmrk-in-the-whatsapp-mana"><div id="bkmrk-in-the-whatsapp-mana-1"><div>#### In the WhatsApp Manager:

</div></div></div>
<span>Mouseover the suitcase icon (Account tools) and click Message templates. If you have multiple WhatsApp Business Accounts, use the dropdown menu in the top-right corner to select the account whose templates you want to manage.</span><span>Find the message template that you would like to edit and click it.</span><span>Edit the template’s contents.</span><span>Click the **Add Sample** button and add sample variable values and images.</span><span>Click **Submit**.</span><div>The appeal will be reviewed and a decision made within 24 hours.</div><div id="bkmrk-template-review-webh"><div id="bkmrk-template-review-webh-1"><div>### Template review webhooks

</div></div></div><div>You can receive updates via the [message\_template\_status\_update](/books/meta-whatsapp/page/message-template-status-update-webhook-reference-developer-documentation) webhook, which notifies whether a template is approved, pending, or rejected.</div><div>If your template is rejected and you disagree with the decision, you have the option to submit an appeal for reconsideration.</div></div>

# Tap target title URL override | Developer Documentation

<div id="bkmrk-tap-target-title-url">## Tap target title URL override

<div><span>Updated: Nov 13, 2025</span></div><div>This document explains how to send approved message templates using the `tap_target_configuration` component within a template message. Tap target override enables image-based, text-based, and header-less message templates to function as interactive Call-to-Action URL buttons. These buttons display a custom title and open the destination linked to the first URL button.</div><div>WhatsApp Business Accounts (WABAs) must be fully verified and consistently maintain high-quality standards to ensure compliance and access to this component.</div><div>![](https://support2.chatarchitect.com/uploads/images/gallery/2026-04/embedded-image-axkbcybu.png)</div></div>

# Configure message time-to-live | Developer Documentation

<div id="bkmrk-configure-message-ti">## Configure message time-to-live

<div><span>Updated: Feb 27, 2026</span></div><div>If a message cannot be delivered to a WhatsApp user, delivery is retried for a period of time known as *time-to-live* (“TTL”), or the message validity period.</div><div>You can customize the default TTL for authentication and utility templates sent via Cloud API, and for marketing templates sent via Marketing Messages API for WhatsApp.</div><div>Set a TTL for all authentication templates, preferably equal to or less than your code expiration time, to ensure your customers only get a message when a code is still usable.</div><div id="bkmrk-defaults%2C-min%2Fmax-va"><div id="bkmrk-defaults%2C-min%2Fmax-va-1"><div>### Defaults, min/max values, and compatibility table

</div></div></div><div><table><thead><tr><th></th><th><span>Authentication </span></th><th><span>Utility </span></th><th><span>Marketing </span></th></tr></thead><tbody><tr><td><div><div>**Default TTL**</div></div></td><td><div><div>10 minutes</div><div>30 days for authentication templates created before October 23, 2024</div></div></td><td><div><div>30 days</div></div></td><td><div><div>30 days</div></div></td></tr><tr><td><div><div>**Compatibility**</div></div></td><td><div><div>Cloud API</div></div></td><td><div><div>Cloud API only</div></div></td><td><div><div>Marketing Messages API for WhatsApp</div></div></td></tr><tr><td><div><div>**Customizable range**</div></div></td><td><div><div>30 seconds to 15 minutes</div></div></td><td><div><div>30 seconds to 12 hours</div></div></td><td><div><div>12 hours to 30 days</div></div></td></tr></tbody></table>

</div></div>

# Template groups | Developer Documentation

<div id="bkmrk-template-groupsupdat">## Template groups

<div><span>Updated: Feb 27, 2026</span></div><div>This document describes how to create, manage, and measure template groups.</div><div>Template groups allow you to associate a set of templates so it's easier to track their performance as a set when querying template metrics.</div><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>### Limitations

</div></div></div>
<span>a template can only be a part of a single template group at a time</span><span>template group names must be unique</span><span>removing a template from a template group does not remove any template metrics it may have contributed to the group</span><div id="bkmrk-template-group-analy"><div id="bkmrk-template-group-analy-1"><div>### Template group analytics

</div></div></div><div>See the [Template group analytics](/books/meta-whatsapp/page/analytics-developer-documentation) document.</div></div>

# Template Comparison | Developer Documentation

<div id="bkmrk-template-comparisonu">## Template Comparison

<div><span>Updated: Nov 14, 2025</span></div><div>You can compare two templates by examining how often each one is sent, which one has the lower ratio of blocks to sends, and each template's top reason for being blocked.</div><div id="bkmrk-requirements"><div id="bkmrk-requirements-1"><div>### Requirements

</div></div></div>
<span>A [User](/books/meta-whatsapp/page/access-tokens-guide-developer-documentation) or [System User](/books/meta-whatsapp/page/access-tokens-guide-developer-documentation) access token.</span><span>The [whatsapp\_business\_management](https://developers.facebook.com/docs/permissions/reference/whatsapp_business_management) permission.</span><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>### Limitations

</div></div></div>
<span>Only two templates can be compared at a time.</span><span>Both templates must be in the same WhatsApp Business Account.</span><span>Templates must have been sent at least 1,000 times in the queries specified timeframe.</span><span>Lookback windows are limited to 7, 30, 60 and 90 days from the time of the request.</span></div>

# Template migration | Developer Documentation

<div id="bkmrk-template-migrationup">## Template migration

<div><span>Updated: Nov 14, 2025</span></div><div>This document describes how to migrate templates from one WhatsApp Business Account (WABA) to another. Note that migration doesn't move templates, it recreates them in the destination WABA.</div><div id="bkmrk-limitations"><div id="bkmrk-limitations-1"><div>### Limitations

</div></div></div><span>Templates can only be migrated between WABAs owned by the same Meta business.</span><span>Only templates with a status of `APPROVED` and a `quality_score` of either `GREEN` or `UNKNOWN` are eligible for migration.</span></div>