AWS End User Messaging Social — WhatsApp
Overview
WhatsApp messaging via AWS End User Messaging Social: template management, sending, media handling, event destinations, and delivery troubleshooting.
Recommended setup: Use the AWS MCP server for sandboxed execution, audit logging, and enterprise controls.
Without AWS MCP: This skill works with any agent that has AWS CLI access. All commands use standard AWS CLI syntax.
Common Tasks
1. Verify Dependencies
Constraints:
- The AWS MCP server is recommended for seamless API execution but not required — all commands use standard AWS CLI syntax
- You MUST verify the AWS CLI is installed and configured with appropriate credentials
- You SHOULD recommend the user assume an IAM role with ephemeral credentials
- You MUST inform the user if any required tool is missing and how to install/configure it
- You MUST ask the user if they want to proceed despite any missing tools
- If the
aws socialmessaging subcommand is not recognized, the user must update to the latest AWS CLI version
- Required IAM permissions (scope to specific WABA and phone number ARNs):
- Templates:
social-messaging:CreateWhatsAppMessageTemplate, social-messaging:GetWhatsAppMessageTemplate, social-messaging:ListWhatsAppMessageTemplates, social-messaging:UpdateWhatsAppMessageTemplate, social-messaging:DeleteWhatsAppMessageTemplate, social-messaging:ListWhatsAppTemplateLibrary, social-messaging:CreateWhatsAppMessageTemplateFromLibrary
- Sending:
social-messaging:SendWhatsAppMessage
- Media:
social-messaging:PostWhatsAppMessageMedia, social-messaging:CreateWhatsAppMessageTemplateMedia, social-messaging:GetWhatsAppMessageMedia, social-messaging:DeleteWhatsAppMessageMedia
- Events:
social-messaging:PutWhatsAppBusinessAccountEventDestinations
- Diagnostics:
social-messaging:GetLinkedWhatsAppBusinessAccount, social-messaging:GetLinkedWhatsAppBusinessAccountPhoneNumber, social-messaging:ListLinkedWhatsAppBusinessAccounts
- Supporting:
sns:ListSubscriptionsByTopic, iam:PassRole (for event destination role)
2. Manage Templates
Create, update, and delete message templates (utility, marketing, authentication).
create-whatsapp-message-template: base64-encode --template-definition (blob type)
create-whatsapp-message-template-from-library: use pre-approved Meta library templates
list-whatsapp-template-library: browse available library templates
get-whatsapp-message-template: retrieve template details by --id (WABA) and --meta-template-id
update-whatsapp-message-template: modify existing template content
delete-whatsapp-message-template: requires --template-name (NOT --meta-template-name); always include --delete-all-languages
list-whatsapp-message-templates: response fields are templateStatus and templateCategory (NOT status/category)
- Templates with
{{N}} parameters MUST include "parameter_format": "positional" (exception: AUTHENTICATION — Meta handles OTP parameters automatically) and "example"
- Meta reviews all templates (minutes to 24h); MUST NOT send with PENDING/REJECTED
- Choosing the wrong category causes reclassification (UTILITY → MARKETING) which changes pricing — see managing-templates.md — Choosing the Right Category for guidance on selecting UTILITY vs MARKETING vs AUTHENTICATION
- You MUST confirm the intended category (UTILITY, MARKETING, or AUTHENTICATION) with the user before creating a template — explain the categorization criteria and reclassification risk if the choice is ambiguous
See managing-templates.md.
3. Send Messages
Template Messages (no 24h restriction)
- Use for: transactional updates (utility), promotions (marketing), verification codes (authentication)
- Collect: phone number ID, recipient (E.164 with
+), template name, language, parameters
- Marketing templates may include image headers
--message is blob type — MUST base64-encode JSON
Freeform Messages (24h window required)
- Use for: customer service replies within 24h of customer's last inbound message
- Supports: text, image, document, video, audio — see WhatsApp Cloud API media reference for supported format and size constraints
- No API to check window status — user must confirm from logs or event history
- Media URLs MUST be publicly accessible HTTPS and remain available for the full 30-day message availability window (Meta can re-fetch anytime). For sensitive content (receipts, invoices, PII), upload via
post-whatsapp-message-media and reference by media ID instead — presigned URLs cannot satisfy the 30-day availability requirement
Constraints for all sends:
- Before executing any API call, validate parameter formats:
- Phone number IDs match
phone-number-id-* pattern
- WABA IDs match
waba-* pattern
- Recipient numbers are E.164 with
+ prefix (e.g., +14155551234), or Business-Scoped User ID (BSUID) via the "recipient" field
- Template names contain only lowercase letters, numbers, and underscores
- Language codes use Meta's locale format with underscores (e.g.,
en_US, pt_BR)
--meta-api-version is v{Major}.{Minor} format (e.g., v21.0)
"messaging_product" MUST be "whatsapp" in the JSON body; check Meta's Graph API changelog for the supported Meta Graph API version
--message is blob type — MUST base64-encode the JSON payload
- A successful
messageId means queued, not delivered
- You MUST ask for all required parameters upfront in a single prompt
- You MUST accept parameters as individual values, JSON objects, or file references
- You MUST explain each step before executing
- You SHOULD confirm all parameters with the user before executing
- You MUST respect the user's decision to abort
- You MUST NOT send more than 5 messages per batch without user confirmation
- You MUST NOT create or access credentials directly
See sending-messages.md.
4. Manage Media
Upload, retrieve, and delete media for messages and template headers.
post-whatsapp-message-media: upload media, returns reusable media ID
create-whatsapp-message-template-media: upload media specifically for template headers
get-whatsapp-message-media: retrieve media metadata/URL by ID
delete-whatsapp-message-media: remove uploaded media
See managing-media.md.
5. Configure Event Destinations
Set up delivery tracking, template status notifications, and reclassification alerts.
Set up delivery tracking, template status notifications, and reclassification alerts. A WABA can only have one event destination. See configuring-event-destinations.md for prerequisites (IAM role, SNS topic with KMS encryption, HTTPS-only subscription endpoints, condition keys) and full security controls.
6. Troubleshoot Delivery
Diagnostic flow: WABA status → phone number → templates → event destinations → quotas.
get-linked-whatsapp-business-account: registration MUST be COMPLETE
get-linked-whatsapp-business-account-phone-number: verify phone number health
list-linked-whatsapp-business-accounts: list all WABAs
- Template reclassified: detectable via event destinations (real-time) or by listing templates and comparing categories; delete and recreate
- 24h window expired: use template message instead
- Rate limiting: new WABAs have lower limits; increases with quality
- Recipient without WhatsApp: silently dropped
See troubleshooting-delivery.md.
Quick Reference — Common Errors
- Access denied: verify IAM permissions scoped to WABA/phone number ARNs
- Template rejected: body must match category; include
parameter_format and example
- Template reclassified: configure event destinations to detect; delete and recreate
- 24h window expired: use template message instead of freeform
- Send fails:
--origination-phone-number-id is the ID (not phone number); recipient E.164 with +
- Queued but not delivered: 200 = queued; configure event destinations for status
- Media URL inaccessible: must be publicly accessible HTTPS
Security Considerations
- Use least-privilege IAM policies scoped to specific
social-messaging: actions and WABA/phone number ARNs
- Use ephemeral credentials (IAM roles) instead of long-lived access keys
- Store secrets in AWS Secrets Manager or Parameter Store — never in code or environment variables
- Enable CloudTrail for auditing all
social-messaging API calls; encrypt logs with KMS CMK
- Encrypt SNS topics for event destinations with KMS (callbacks contain recipient metadata)
- Encrypt CloudWatch Logs with KMS if monitoring social-messaging activity
- Avoid sensitive data in template parameters and freeform message content (they appear in CloudTrail logs)
- Validate recipient phone numbers to prevent unauthorized messaging
- Verify SNS subscription endpoints are authorized by your team — validate that all subscribed email addresses and systems belong to personnel/systems that should receive sensitive delivery status and recipient metadata before confirming subscriptions. Use HTTPS-only endpoints
- Add condition keys (
aws:SourceArn, aws:SourceAccount) to SNS topic policies to prevent confused deputy attacks
- Implement rate limiting via service quotas and CloudWatch alarms on send rates
Additional Resources
1---
2name: aws-social-messaging
3description: Manages WhatsApp messaging through AWS End User Messaging Social. Covers managing templates (create, update, delete, library), sending messages (utility/marketing/auth templates and freeform), uploading and managing media, configuring event destinations for delivery tracking, and troubleshooting delivery failures. Applicable when a user needs to send WhatsApp messages, create or manage templates, upload media, configure delivery notifications, or diagnose messaging issues.
4version: 1
5---
6
7# AWS End User Messaging Social — WhatsApp
8
9## Overview
10
11WhatsApp messaging via AWS End User Messaging Social: template management, sending, media handling, event destinations, and delivery troubleshooting.
12
13**Recommended setup:** Use the [AWS MCP server](https://docs.aws.amazon.com/agent-toolkit/latest/userguide/mcp-server.html) for sandboxed execution, audit logging, and enterprise controls.
14
15**Without AWS MCP:** This skill works with any agent that has AWS CLI access. All commands use standard AWS CLI syntax.
16
17## Common Tasks
18
19### 1. Verify Dependencies
20
21**Constraints:**
22
23- The AWS MCP server is recommended for seamless API execution but not required — all commands use standard AWS CLI syntax
24- You MUST verify the AWS CLI is installed and configured with appropriate credentials
25- You SHOULD recommend the user assume an IAM role with ephemeral credentials
26- You MUST inform the user if any required tool is missing and how to install/configure it
27- You MUST ask the user if they want to proceed despite any missing tools
28- If the `aws socialmessaging` subcommand is not recognized, the user must update to the latest AWS CLI version
29- Required IAM permissions (scope to specific WABA and phone number ARNs):
30 - Templates: `social-messaging:CreateWhatsAppMessageTemplate`, `social-messaging:GetWhatsAppMessageTemplate`, `social-messaging:ListWhatsAppMessageTemplates`, `social-messaging:UpdateWhatsAppMessageTemplate`, `social-messaging:DeleteWhatsAppMessageTemplate`, `social-messaging:ListWhatsAppTemplateLibrary`, `social-messaging:CreateWhatsAppMessageTemplateFromLibrary`
31 - Sending: `social-messaging:SendWhatsAppMessage`
32 - Media: `social-messaging:PostWhatsAppMessageMedia`, `social-messaging:CreateWhatsAppMessageTemplateMedia`, `social-messaging:GetWhatsAppMessageMedia`, `social-messaging:DeleteWhatsAppMessageMedia`
33 - Events: `social-messaging:PutWhatsAppBusinessAccountEventDestinations`
34 - Diagnostics: `social-messaging:GetLinkedWhatsAppBusinessAccount`, `social-messaging:GetLinkedWhatsAppBusinessAccountPhoneNumber`, `social-messaging:ListLinkedWhatsAppBusinessAccounts`
35 - Supporting: `sns:ListSubscriptionsByTopic`, `iam:PassRole` (for event destination role)
36
37### 2. Manage Templates
38
39Create, update, and delete message templates (utility, marketing, authentication).
40
41- `create-whatsapp-message-template`: base64-encode `--template-definition` (blob type)
42- `create-whatsapp-message-template-from-library`: use pre-approved Meta library templates
43- `list-whatsapp-template-library`: browse available library templates
44- `get-whatsapp-message-template`: retrieve template details by `--id` (WABA) and `--meta-template-id`
45- `update-whatsapp-message-template`: modify existing template content
46- `delete-whatsapp-message-template`: requires `--template-name` (NOT `--meta-template-name`); always include `--delete-all-languages`
47- `list-whatsapp-message-templates`: response fields are `templateStatus` and `templateCategory` (NOT `status`/`category`)
48- Templates with `{{N}}` parameters MUST include `"parameter_format": "positional"` (exception: AUTHENTICATION — Meta handles OTP parameters automatically) and `"example"`
49- Meta reviews all templates (minutes to 24h); MUST NOT send with PENDING/REJECTED
50- Choosing the wrong category causes reclassification (UTILITY → MARKETING) which changes pricing — see [managing-templates.md — Choosing the Right Category](references/managing-templates.md) for guidance on selecting UTILITY vs MARKETING vs AUTHENTICATION
51- You MUST confirm the intended category (UTILITY, MARKETING, or AUTHENTICATION) with the user before creating a template — explain the categorization criteria and reclassification risk if the choice is ambiguous
52
53See [managing-templates.md](references/managing-templates.md).
54
55### 3. Send Messages
56
57#### Template Messages (no 24h restriction)
58
59- Use for: transactional updates (utility), promotions (marketing), verification codes (authentication)
60- Collect: phone number ID, recipient (E.164 with `+`), template name, language, parameters
61- Marketing templates may include image headers
62- `--message` is blob type — MUST base64-encode JSON
63
64#### Freeform Messages (24h window required)
65
66- Use for: customer service replies within 24h of customer's last inbound message
67- Supports: text, image, document, video, audio — see [WhatsApp Cloud API media reference](https://developers.facebook.com/docs/whatsapp/cloud-api/reference/media) for supported format and size constraints
68- No API to check window status — user must confirm from logs or event history
69- Media URLs MUST be publicly accessible HTTPS and remain available for the full 30-day message availability window (Meta can re-fetch anytime). For sensitive content (receipts, invoices, PII), upload via `post-whatsapp-message-media` and reference by media ID instead — presigned URLs cannot satisfy the 30-day availability requirement
70
71**Constraints for all sends:**
72
73- Before executing any API call, validate parameter formats:
74 - Phone number IDs match `phone-number-id-*` pattern
75 - WABA IDs match `waba-*` pattern
76 - Recipient numbers are E.164 with `+` prefix (e.g., `+14155551234`), or Business-Scoped User ID (BSUID) via the `"recipient"` field
77 - Template names contain only lowercase letters, numbers, and underscores
78 - Language codes use Meta's locale format with underscores (e.g., `en_US`, `pt_BR`)
79 - `--meta-api-version` is `v{Major}.{Minor}` format (e.g., `v21.0`)
80- `"messaging_product"` MUST be `"whatsapp"` in the JSON body; check [Meta's Graph API changelog](https://developers.facebook.com/docs/graph-api/changelog) for the supported Meta Graph API version
81- `--message` is blob type — MUST base64-encode the JSON payload
82- A successful `messageId` means queued, not delivered
83- You MUST ask for all required parameters upfront in a single prompt
84- You MUST accept parameters as individual values, JSON objects, or file references
85- You MUST explain each step before executing
86- You SHOULD confirm all parameters with the user before executing
87- You MUST respect the user's decision to abort
88- You MUST NOT send more than 5 messages per batch without user confirmation
89- You MUST NOT create or access credentials directly
90
91See [sending-messages.md](references/sending-messages.md).
92
93### 4. Manage Media
94
95Upload, retrieve, and delete media for messages and template headers.
96
97- `post-whatsapp-message-media`: upload media, returns reusable media ID
98- `create-whatsapp-message-template-media`: upload media specifically for template headers
99- `get-whatsapp-message-media`: retrieve media metadata/URL by ID
100- `delete-whatsapp-message-media`: remove uploaded media
101
102See [managing-media.md](references/managing-media.md).
103
104### 5. Configure Event Destinations
105
106Set up delivery tracking, template status notifications, and reclassification alerts.
107
108Set up delivery tracking, template status notifications, and reclassification alerts. A WABA can only have one event destination. See [configuring-event-destinations.md](references/configuring-event-destinations.md) for prerequisites (IAM role, SNS topic with KMS encryption, HTTPS-only subscription endpoints, condition keys) and full security controls.
109
110### 6. Troubleshoot Delivery
111Diagnostic flow: WABA status → phone number → templates → event destinations → quotas.
112
113- `get-linked-whatsapp-business-account`: registration MUST be COMPLETE
114- `get-linked-whatsapp-business-account-phone-number`: verify phone number health
115- `list-linked-whatsapp-business-accounts`: list all WABAs
116- Template reclassified: detectable via event destinations (real-time) or by listing templates and comparing categories; delete and recreate
117- 24h window expired: use template message instead
118- Rate limiting: new WABAs have lower limits; increases with quality
119- Recipient without WhatsApp: silently dropped
120
121See [troubleshooting-delivery.md](references/troubleshooting-delivery.md).
122
123## Quick Reference — Common Errors
124
125- **Access denied**: verify IAM permissions scoped to WABA/phone number ARNs
126- **Template rejected**: body must match category; include `parameter_format` and `example`
127- **Template reclassified**: configure event destinations to detect; delete and recreate
128- **24h window expired**: use template message instead of freeform
129- **Send fails**: `--origination-phone-number-id` is the ID (not phone number); recipient E.164 with `+`
130- **Queued but not delivered**: 200 = queued; configure event destinations for status
131- **Media URL inaccessible**: must be publicly accessible HTTPS
132
133## Security Considerations
134
135- Use least-privilege IAM policies scoped to specific `social-messaging:` actions and WABA/phone number ARNs
136- Use ephemeral credentials (IAM roles) instead of long-lived access keys
137- Store secrets in AWS Secrets Manager or Parameter Store — never in code or environment variables
138- Enable CloudTrail for auditing all `social-messaging` API calls; encrypt logs with KMS CMK
139- Encrypt SNS topics for event destinations with KMS (callbacks contain recipient metadata)
140- Encrypt CloudWatch Logs with KMS if monitoring social-messaging activity
141- Avoid sensitive data in template parameters and freeform message content (they appear in CloudTrail logs)
142- Validate recipient phone numbers to prevent unauthorized messaging
143- Verify SNS subscription endpoints are authorized by your team — validate that all subscribed email addresses and systems belong to personnel/systems that should receive sensitive delivery status and recipient metadata before confirming subscriptions. Use HTTPS-only endpoints
144- Add condition keys (`aws:SourceArn`, `aws:SourceAccount`) to SNS topic policies to prevent confused deputy attacks
145- Implement rate limiting via service quotas and CloudWatch alarms on send rates
146
147## Additional Resources
148
149- [AWS End User Messaging Social User Guide](https://docs.aws.amazon.com/social-messaging/latest/userguide/what-is-service.html)
150- [AWS CLI socialmessaging Reference](https://docs.aws.amazon.com/cli/latest/reference/socialmessaging/)
151- [Getting Started with WhatsApp](https://docs.aws.amazon.com/social-messaging/latest/userguide/getting-started-whatsapp.html)
152- [Managing Event Destinations](https://docs.aws.amazon.com/social-messaging/latest/userguide/managing-event-destinations-add.html)
153- [Service Quotas](https://docs.aws.amazon.com/social-messaging/latest/userguide/quotas.html)
154- [IAM Security Best Practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)
155- [Confused Deputy Prevention](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)
156- [SNS Data Protection Best Practices](https://docs.aws.amazon.com/sns/latest/dg/sns-security-best-practices.html)
157- [AWS Well-Architected Security Pillar](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/welcome.html)