369 lines
8.1 KiB
Markdown
369 lines
8.1 KiB
Markdown
|
|
# WhatsApp Message Template Example
|
||
|
|
|
||
|
|
This document shows exactly how to create the `po_notification` template in Meta Business Suite.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Template: Purchase Order Notification
|
||
|
|
|
||
|
|
### Basic Information
|
||
|
|
|
||
|
|
| Field | Value |
|
||
|
|
|-------|-------|
|
||
|
|
| **Template Name** | `po_notification` |
|
||
|
|
| **Category** | `UTILITY` |
|
||
|
|
| **Language** | `Spanish (es)` |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Template Content
|
||
|
|
|
||
|
|
### Body Text (Required)
|
||
|
|
|
||
|
|
```
|
||
|
|
Hola {{1}}, has recibido una nueva orden de compra {{2}} por un total de {{3}}.
|
||
|
|
```
|
||
|
|
|
||
|
|
### Parameters
|
||
|
|
|
||
|
|
| Position | Parameter Name | Example Value | Description |
|
||
|
|
|----------|---------------|---------------|-------------|
|
||
|
|
| {{1}} | supplier_name | "Proveedor ABC" | Name of the supplier |
|
||
|
|
| {{2}} | po_number | "PO-2024-001" | Purchase order number |
|
||
|
|
| {{3}} | total_amount | "€1,250.00" | Total amount with currency |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Preview Examples
|
||
|
|
|
||
|
|
### Example 1
|
||
|
|
```
|
||
|
|
Hola Proveedor ABC, has recibido una nueva orden de compra PO-2024-001 por un total de €1,250.00.
|
||
|
|
```
|
||
|
|
|
||
|
|
### Example 2
|
||
|
|
```
|
||
|
|
Hola Panadería Central, has recibido una nueva orden de compra PO-2024-052 por un total de €850.50.
|
||
|
|
```
|
||
|
|
|
||
|
|
### Example 3
|
||
|
|
```
|
||
|
|
Hola Distribuidora López, has recibido una nueva orden de compra PO-2024-123 por un total de €2,340.00.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Step-by-Step Creation in Meta
|
||
|
|
|
||
|
|
### 1. Navigate to Template Manager
|
||
|
|
|
||
|
|
1. Go to: https://business.facebook.com/
|
||
|
|
2. Click **WhatsApp Manager**
|
||
|
|
3. Select **Message Templates**
|
||
|
|
4. Click **Create Template** button
|
||
|
|
|
||
|
|
### 2. Fill Basic Information
|
||
|
|
|
||
|
|
**Step 1 of 4: Select Template Category**
|
||
|
|
- Select: `Utility`
|
||
|
|
- Template name: `po_notification`
|
||
|
|
- Languages: Select `Spanish (es)`
|
||
|
|
- Click **Continue**
|
||
|
|
|
||
|
|
### 3. Build Template Content
|
||
|
|
|
||
|
|
**Step 2 of 4: Edit Template**
|
||
|
|
|
||
|
|
**Header (Optional)**: Skip or add:
|
||
|
|
- Type: Text
|
||
|
|
- Content: `Nueva Orden de Compra`
|
||
|
|
- Or use emoji: `🛒 Nueva Orden de Compra`
|
||
|
|
|
||
|
|
**Body (Required)**:
|
||
|
|
```
|
||
|
|
Hola {{1}}, has recibido una nueva orden de compra {{2}} por un total de {{3}}.
|
||
|
|
```
|
||
|
|
|
||
|
|
**How to add variables**:
|
||
|
|
1. Type the text up to where you want the first variable
|
||
|
|
2. Click **Add Variable** button
|
||
|
|
3. Continue typing
|
||
|
|
4. Repeat for {{2}} and {{3}}
|
||
|
|
|
||
|
|
**Footer (Optional)**:
|
||
|
|
```
|
||
|
|
Sistema de Gestión de Panadería
|
||
|
|
```
|
||
|
|
|
||
|
|
**Buttons (Optional)**: Skip for basic implementation
|
||
|
|
|
||
|
|
Click **Continue**
|
||
|
|
|
||
|
|
### 4. Add Sample Content
|
||
|
|
|
||
|
|
**Step 3 of 4: Add Sample Content**
|
||
|
|
|
||
|
|
For template approval, provide example values:
|
||
|
|
|
||
|
|
| Variable | Sample Value |
|
||
|
|
|----------|--------------|
|
||
|
|
| {{1}} | Proveedor ABC |
|
||
|
|
| {{2}} | PO-2024-001 |
|
||
|
|
| {{3}} | €1,250.00 |
|
||
|
|
|
||
|
|
**Preview will show**:
|
||
|
|
```
|
||
|
|
Hola Proveedor ABC, has recibido una nueva orden de compra PO-2024-001 por un total de €1,250.00.
|
||
|
|
```
|
||
|
|
|
||
|
|
Click **Continue**
|
||
|
|
|
||
|
|
### 5. Submit for Review
|
||
|
|
|
||
|
|
**Step 4 of 4: Submit**
|
||
|
|
|
||
|
|
Review your template:
|
||
|
|
- ✅ Category: Utility
|
||
|
|
- ✅ Language: Spanish
|
||
|
|
- ✅ Body has 3 variables
|
||
|
|
- ✅ Sample content provided
|
||
|
|
|
||
|
|
Click **Submit**
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Approval Timeline
|
||
|
|
|
||
|
|
| Status | Timeline | Action Required |
|
||
|
|
|--------|----------|-----------------|
|
||
|
|
| **Pending** | 0-24 hours | Wait for Meta review |
|
||
|
|
| **Approved** | ✅ Ready to use | Start sending messages |
|
||
|
|
| **Rejected** | Review feedback | Fix issues and resubmit |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Common Rejection Reasons
|
||
|
|
|
||
|
|
❌ **Reason**: Variables in header or footer
|
||
|
|
- **Fix**: Only use variables in body text
|
||
|
|
|
||
|
|
❌ **Reason**: Too promotional
|
||
|
|
- **Fix**: Use UTILITY category, not MARKETING
|
||
|
|
|
||
|
|
❌ **Reason**: Unclear business purpose
|
||
|
|
- **Fix**: Make message clearly transactional
|
||
|
|
|
||
|
|
❌ **Reason**: Missing sample content
|
||
|
|
- **Fix**: Provide realistic examples for all variables
|
||
|
|
|
||
|
|
❌ **Reason**: Grammar/spelling errors
|
||
|
|
- **Fix**: Proofread carefully
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Code Implementation
|
||
|
|
|
||
|
|
### How This Template is Used in Code
|
||
|
|
|
||
|
|
```python
|
||
|
|
# services/notification/app/consumers/po_event_consumer.py
|
||
|
|
|
||
|
|
template_params = [
|
||
|
|
data.get('supplier_name', 'Estimado proveedor'), # {{1}}
|
||
|
|
data.get('po_number', 'N/A'), # {{2}}
|
||
|
|
f"€{data.get('total_amount', 0):.2f}" # {{3}}
|
||
|
|
]
|
||
|
|
|
||
|
|
success = await self.whatsapp_service.send_message(
|
||
|
|
to_phone=supplier_phone,
|
||
|
|
message="", # Not used for template messages
|
||
|
|
template_name="po_notification", # Must match exactly
|
||
|
|
template_params=template_params,
|
||
|
|
tenant_id=tenant_id
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
### API Request Format
|
||
|
|
|
||
|
|
The service converts this to:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"messaging_product": "whatsapp",
|
||
|
|
"to": "+34612345678",
|
||
|
|
"type": "template",
|
||
|
|
"template": {
|
||
|
|
"name": "po_notification",
|
||
|
|
"language": {
|
||
|
|
"code": "es"
|
||
|
|
},
|
||
|
|
"components": [
|
||
|
|
{
|
||
|
|
"type": "body",
|
||
|
|
"parameters": [
|
||
|
|
{"type": "text", "text": "Proveedor ABC"},
|
||
|
|
{"type": "text", "text": "PO-2024-001"},
|
||
|
|
{"type": "text", "text": "€1,250.00"}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Advanced Template (With Header & Buttons)
|
||
|
|
|
||
|
|
If you want a more feature-rich template:
|
||
|
|
|
||
|
|
### Template Name
|
||
|
|
`po_notification_advanced`
|
||
|
|
|
||
|
|
### Header
|
||
|
|
- Type: **Text**
|
||
|
|
- Content: `🛒 Nueva Orden de Compra`
|
||
|
|
|
||
|
|
### Body
|
||
|
|
```
|
||
|
|
Hola {{1}}, has recibido una nueva orden de compra {{2}} por un total de {{3}}.
|
||
|
|
|
||
|
|
Por favor, confirma la recepción de esta orden.
|
||
|
|
```
|
||
|
|
|
||
|
|
### Footer
|
||
|
|
```
|
||
|
|
Bakery Management System
|
||
|
|
```
|
||
|
|
|
||
|
|
### Buttons
|
||
|
|
1. **Quick Reply Button**: "✅ Confirmar Recepción"
|
||
|
|
2. **Phone Button**: "📞 Llamar" → Your bakery phone
|
||
|
|
|
||
|
|
### Preview
|
||
|
|
```
|
||
|
|
🛒 Nueva Orden de Compra
|
||
|
|
|
||
|
|
Hola Proveedor ABC, has recibido una nueva orden de compra PO-2024-001 por un total de €1,250.00.
|
||
|
|
|
||
|
|
Por favor, confirma la recepción de esta orden.
|
||
|
|
|
||
|
|
Bakery Management System
|
||
|
|
|
||
|
|
[✅ Confirmar Recepción] [📞 Llamar]
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Template Best Practices
|
||
|
|
|
||
|
|
### ✅ DO
|
||
|
|
- Keep messages concise and clear
|
||
|
|
- Use proper Spanish grammar
|
||
|
|
- Provide all variable examples
|
||
|
|
- Test with real phone numbers
|
||
|
|
- Use UTILITY category for transactional messages
|
||
|
|
- Include business name in footer
|
||
|
|
|
||
|
|
### ❌ DON'T
|
||
|
|
- Use promotional language for UTILITY templates
|
||
|
|
- Add too many variables (max 3-5 recommended)
|
||
|
|
- Use special characters excessively
|
||
|
|
- Mix languages within template
|
||
|
|
- Use uppercase only (LIKE THIS)
|
||
|
|
- Include pricing in UTILITY templates (use variables)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing Your Template
|
||
|
|
|
||
|
|
### After Approval
|
||
|
|
|
||
|
|
1. **Get Template Status**
|
||
|
|
```bash
|
||
|
|
# Check in Meta Business Suite
|
||
|
|
WhatsApp Manager → Message Templates → po_notification → Status: APPROVED
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Send Test Message**
|
||
|
|
```bash
|
||
|
|
curl -X POST http://localhost:8000/api/v1/tenants/{tenant_id}/notifications/send-whatsapp \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"recipient_phone": "+34612345678",
|
||
|
|
"template_name": "po_notification",
|
||
|
|
"template_params": ["Test Supplier", "PO-TEST-001", "€100.00"]
|
||
|
|
}'
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **Verify Delivery**
|
||
|
|
- Check recipient's WhatsApp
|
||
|
|
- Check database: `SELECT * FROM whatsapp_messages WHERE template_name = 'po_notification'`
|
||
|
|
- Check logs: `kubectl logs -f deployment/notification-service | grep po_notification`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Additional Template Ideas
|
||
|
|
|
||
|
|
Once the basic template works, consider creating:
|
||
|
|
|
||
|
|
### Template: Order Confirmation
|
||
|
|
```
|
||
|
|
Hola {{1}}, tu orden {{2}} ha sido confirmada. Entrega prevista: {{3}}.
|
||
|
|
```
|
||
|
|
|
||
|
|
### Template: Delivery Notification
|
||
|
|
```
|
||
|
|
Hola {{1}}, tu orden {{2}} está en camino. Llegada estimada: {{3}}.
|
||
|
|
```
|
||
|
|
|
||
|
|
### Template: Payment Reminder
|
||
|
|
```
|
||
|
|
Hola {{1}}, recordatorio: factura {{2}} por {{3}} vence el {{4}}.
|
||
|
|
```
|
||
|
|
|
||
|
|
### Template: Order Cancelled
|
||
|
|
```
|
||
|
|
Hola {{1}}, la orden {{2}} ha sido cancelada. Motivo: {{3}}.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Template Management
|
||
|
|
|
||
|
|
### Monitoring Template Performance
|
||
|
|
|
||
|
|
Check in Meta Business Suite:
|
||
|
|
- **Sent**: Total messages sent
|
||
|
|
- **Delivered**: Delivery rate
|
||
|
|
- **Read**: Read rate
|
||
|
|
- **Failed**: Failure reasons
|
||
|
|
|
||
|
|
### Updating Templates
|
||
|
|
|
||
|
|
⚠️ **Important**: You cannot edit approved templates
|
||
|
|
|
||
|
|
To make changes:
|
||
|
|
1. Create new template with modified content
|
||
|
|
2. Submit for approval
|
||
|
|
3. Update code to use new template name
|
||
|
|
4. Deprecate old template after transition
|
||
|
|
|
||
|
|
### Template Limits
|
||
|
|
|
||
|
|
- **Maximum templates**: 250 per WhatsApp Business Account
|
||
|
|
- **Maximum variables per template**: Unlimited (but keep it reasonable)
|
||
|
|
- **Template name**: lowercase, underscore only (e.g., `po_notification`)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Summary
|
||
|
|
|
||
|
|
✅ Template Name: `po_notification`
|
||
|
|
✅ Category: UTILITY
|
||
|
|
✅ Language: Spanish (es)
|
||
|
|
✅ Variables: 3 (supplier, PO number, amount)
|
||
|
|
✅ Status: Must be APPROVED before use
|
||
|
|
|
||
|
|
**Next Step**: Create this template in Meta Business Suite and wait for approval (usually 15 mins - 24 hours).
|