WhatsApp message templates
Required WhatsApp Business API message templates for BAP notifications — register these in your Meta Business Manager before using WhatsApp as a connector.
WhatsApp message templates
The WhatsApp Business Cloud API requires pre-approved message templates for business-initiated messages (messages sent outside the 24-hour customer service window). Since BAP sends proactive notifications — liveness checks, transfer alerts, OTPs — you must register these templates in your Meta Business Manager before WhatsApp delivery will work.
This page lists every template BAP uses. Register all of them in Meta Business Manager → WhatsApp Manager → Message Templates.
Before you start
- Complete the WhatsApp connector setup first
- Your Meta Business account must be verified
- Templates are submitted for review and typically approved within minutes for UTILITY category
URL buttons
Templates that direct the user to a website include a Call to Action (CTA) URL button. WhatsApp requires a static domain prefix — replace https://app.example.com with your actual deployment domain when registering. The dynamic suffix {{1}} lets BAP append the specific path and query parameters at send time.
Template reference
All templates use English (en) language and UTILITY category unless noted otherwise. Body variables are shown as {{1}}, {{2}}, etc. Button URL variables are scoped separately from body variables.
1. bap_verification_otp
One-time verification codes for host login, survivor authentication, and OTP flows.
| Field | Value |
|---|---|
| Category | AUTHENTICATION |
| Language | en |
Body:
{{1}} is your BA Protocol verification code. It expires in 10 minutes. Do not share it with anyone.Button:
| Type | Text | Parameter |
|---|---|---|
| Copy code | Copy code (auto-added by Meta) | OTP code |
Variables:
| Component | Variable | Description | Example |
|---|---|---|---|
| Body | {{1}} | 6-digit OTP code | 482901 |
| Button | {{1}} | Same OTP code (for copy-code button) | 482901 |
Register this as AUTHENTICATION with a Copy code button. Meta auto-adds the button — BAP passes the OTP code as both the body and button parameter.
2. bap_liveness_check
Periodic "are you alive?" pings sent to the host based on their check-in interval (HCIT).
| Field | Value |
|---|---|
| Category | UTILITY |
| Language | en |
Body:
This is a scheduled liveness check from BA Protocol. Please confirm you are alive by tapping the button below.
This check expires in {{1}} minutes.Button:
| Type | Text | URL |
|---|---|---|
| URL | Confirm I'm alive | https://app.example.com/{{1}} |
Variables:
| Component | Variable | Description | Example |
|---|---|---|---|
| Body | {{1}} | Expiry in minutes | 15 |
| Button URL | {{1}} | Path and query string | liveness/confirm?token=abc123 |
3. bap_transfer_initiated_host
Sent to the host when the will transfer process begins (host presumed dead after missed liveness checks).
| Field | Value |
|---|---|
| Category | UTILITY |
| Language | en |
Body:
A will transfer has been initiated on BA Protocol. You have until {{1}} to cancel it from your dashboard.Button:
| Type | Text | URL |
|---|---|---|
| URL | Go to dashboard | https://app.example.com/{{1}} |
Variables:
| Component | Variable | Description | Example |
|---|---|---|---|
| Body | {{1}} | Cancel deadline (RFC 1123 format) | Mon, 31 Mar 2026 12:00:00 UTC |
| Button URL | {{1}} | Path | dashboard |
4. bap_transfer_reminder
Periodic urgent reminders to the host while the cancel window is open.
| Field | Value |
|---|---|
| Category | UTILITY |
| Language | en |
Body:
URGENT: A will transfer is in progress on BA Protocol.{{1}} Please cancel it immediately.Button:
| Type | Text | URL |
|---|---|---|
| URL | Cancel at dashboard | https://app.example.com/{{1}} |
Variables:
| Component | Variable | Description | Example |
|---|---|---|---|
| Body | {{1}} | Time remaining (prefixed with space) | You have 2 hours remaining. |
| Button URL | {{1}} | Path | dashboard |
5. bap_transfer_initiated_survivor
Sent to survivors when the host is presumed dead and the transfer process begins.
| Field | Value |
|---|---|
| Category | UTILITY |
| Language | en |
Body:
The will transfer process has been initiated on BA Protocol. The host has been confirmed deceased or presumed dead.
You will need to verify your identity with a one-time code to access the will.Button:
| Type | Text | URL |
|---|---|---|
| URL | Access will | https://app.example.com/{{1}} |
Variables:
| Component | Variable | Description | Example |
|---|---|---|---|
| Button URL | {{1}} | Path and query string | transfer/lookup?tid=abc&sid=def |
6. bap_awaiting_auth
Sent to survivors after the cancel window expires and authentication is open.
| Field | Value |
|---|---|
| Category | UTILITY |
| Language | en |
Body:
The cancel window has passed on BA Protocol. You can now authenticate to access the will.
You will receive a one-time verification code on this channel.Button:
| Type | Text | URL |
|---|---|---|
| URL | Access will | https://app.example.com/{{1}} |
Variables:
| Component | Variable | Description | Example |
|---|---|---|---|
| Button URL | {{1}} | Path and query string | transfer/lookup?tid=abc&sid=def |
7. bap_transfer_cancelled
Sent to survivors when the host cancels the transfer or confirms they are alive.
| Field | Value |
|---|---|
| Category | UTILITY |
| Language | en |
Body:
The will transfer on BA Protocol has been cancelled. The host has confirmed they are alive.No variables or buttons — this is a static template.
8. bap_beneficiary_added
Sent when a host adds a new survivor to their will.
| Field | Value |
|---|---|
| Category | UTILITY |
| Language | en |
Body:
Hi, {{1}} has designated you as a beneficiary on BA Protocol. You have been granted access to a secure digital document.
{{2}}
You can use a backup code or a one-time verification code to access your document when it becomes available.Button:
| Type | Text | URL |
|---|---|---|
| URL | View details | https://app.example.com/{{1}} |
Variables:
| Component | Variable | Description | Example |
|---|---|---|---|
| Body | {{1}} | Host display name | John Doe |
| Body | {{2}} | Backup codes or fallback message | Your backup codes: A1B2C3, D4E5F6, G7H8I9 |
| Button URL | {{1}} | Path | transfer/lookup |
When backup codes are generated, BAP passes the formatted codes as {{2}}. When no codes are available, it sends "Your backup codes will be shared with you separately."
9. bap_test
Sent when testing a WhatsApp connector from the dashboard.
| Field | Value |
|---|---|
| Category | UTILITY |
| Language | en |
Body:
This is a test message from BA Protocol. If you received this, your WhatsApp connector is working correctly.No variables or buttons — this is a static template.
Registering templates via Meta Business Manager
- Go to Meta Business Manager → WhatsApp Manager → Message Templates
- Click Create Template
- For each template above:
- Category: Select as listed (UTILITY or AUTHENTICATION)
- Name: Use the exact name (e.g.
bap_liveness_check) - Language: English (en)
- Body: Copy the body text exactly, including
{{1}},{{2}}placeholders - Buttons (where listed): Add a Call to Action → Visit Website button. Set the URL type to Dynamic, enter your domain as the static prefix (e.g.
https://app.yourdomain.com/), and append{{1}}as the dynamic suffix - Leave Header and Footer empty
- Submit for review — UTILITY templates are typically approved within minutes
Registering templates via the Management API
If you prefer automation, use the WhatsApp Business Management API:
# Example: register the liveness check template (with CTA button)
curl -X POST \
"https://graph.facebook.com/v21.0/{WABA_ID}/message_templates" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "bap_liveness_check",
"language": "en",
"category": "UTILITY",
"components": [
{
"type": "BODY",
"text": "This is a scheduled liveness check from BA Protocol. Please confirm you are alive by tapping the button below.\n\nThis check expires in {{1}} minutes.",
"example": {
"body_text": [["15"]]
}
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Confirm I'\''m alive",
"url": "https://app.example.com/{{1}}",
"example": ["liveness/confirm?token=abc123"]
}
]
}
]
}'Replace https://app.example.com with your actual deployment domain in every button URL before registering. WhatsApp validates that the domain is owned by your Meta Business account.
All templates as API payloads
Custom branding
If you've customized your APP_NAME environment variable, you may want to replace "BA Protocol" in the template bodies with your app name before registering. WhatsApp templates are immutable once approved — to change the text, you must delete the template and create a new one with a different name (e.g. bap_liveness_check_v2).
Troubleshooting
| Issue | Solution |
|---|---|
| Template rejected | Ensure the category is correct. AUTHENTICATION has strict body format rules — if rejected, use UTILITY instead |
| Messages not delivered | Verify all 9 templates are approved and the template names match exactly |
| "Template not found" error | Template names are case-sensitive and must match the constants in the BAP codebase exactly |
| Rate limited by Meta | WhatsApp has messaging limits based on your business tier — new accounts start at 250 messages/day |
| Button URL rejected | The domain in the URL must be verified in your Meta Business Manager. Ensure you replaced app.example.com with your actual domain |
Next steps
- WhatsApp connector setup — configure your Phone Number ID and Access Token
- Configuring connectors — overview of all connector types
- Liveness settings — configure check-in intervals