473 lines
12 KiB
Markdown
473 lines
12 KiB
Markdown
|
|
# WhatsApp Channel Configuration
|
||
|
|
|
||
|
|
This guide covers setting up WhatsApp Business API as a communication channel for your General Bots deployment, enabling bots to interact with users on WhatsApp.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
WhatsApp integration allows your bot to:
|
||
|
|
- Receive and respond to WhatsApp messages
|
||
|
|
- Send rich media (images, documents, audio, video)
|
||
|
|
- Use interactive buttons and lists
|
||
|
|
- Send template messages for notifications
|
||
|
|
- Handle group conversations
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Quick Start
|
||
|
|
|
||
|
|
### Minimal Configuration
|
||
|
|
|
||
|
|
```csv
|
||
|
|
name,value
|
||
|
|
whatsapp-api-key,your_access_token
|
||
|
|
whatsapp-phone-number-id,your_phone_number_id
|
||
|
|
whatsapp-verify-token,your_webhook_verify_token
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Prerequisites
|
||
|
|
|
||
|
|
Before configuring WhatsApp, you need:
|
||
|
|
|
||
|
|
1. **Meta Business Account** at [business.facebook.com](https://business.facebook.com)
|
||
|
|
2. **WhatsApp Business Account** linked to Meta Business
|
||
|
|
3. **Phone Number** registered with WhatsApp Business API
|
||
|
|
4. **General Bots Server** accessible via HTTPS with valid SSL
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Configuration Parameters
|
||
|
|
|
||
|
|
### Required Parameters
|
||
|
|
|
||
|
|
| Parameter | Description | Example |
|
||
|
|
|-----------|-------------|---------|
|
||
|
|
| `whatsapp-api-key` | Access token from Meta Business | `EAABs...ZDZd` |
|
||
|
|
| `whatsapp-phone-number-id` | Phone number ID from WhatsApp Business | `123456789012345` |
|
||
|
|
| `whatsapp-verify-token` | Token for webhook verification | `my-secret-verify-token` |
|
||
|
|
|
||
|
|
### Optional Parameters
|
||
|
|
|
||
|
|
| Parameter | Description | Default |
|
||
|
|
|-----------|-------------|---------|
|
||
|
|
| `whatsapp-business-account-id` | WhatsApp Business Account ID | Not set |
|
||
|
|
| `whatsapp-api-version` | Graph API version | `v17.0` |
|
||
|
|
| `whatsapp-webhook-url` | Custom webhook URL | `/webhooks/whatsapp` |
|
||
|
|
|
||
|
|
### Complete Example
|
||
|
|
|
||
|
|
```csv
|
||
|
|
name,value
|
||
|
|
whatsapp-api-key,EAABsBcDeFgHiJkLmNoPqRsTuVwXyZ123456789
|
||
|
|
whatsapp-phone-number-id,123456789012345
|
||
|
|
whatsapp-verify-token,my-super-secret-verify-token-2024
|
||
|
|
whatsapp-business-account-id,987654321098765
|
||
|
|
whatsapp-api-version,v17.0
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Meta Business Setup
|
||
|
|
|
||
|
|
### Step 1: Create Meta Business Account
|
||
|
|
|
||
|
|
1. Go to [business.facebook.com](https://business.facebook.com)
|
||
|
|
2. Click **Create Account**
|
||
|
|
3. Complete business verification
|
||
|
|
|
||
|
|
### Step 2: Create WhatsApp Business Account
|
||
|
|
|
||
|
|
1. In Meta Business Suite, go to **All tools** → **WhatsApp Manager**
|
||
|
|
2. Click **Get Started** or **Add WhatsApp Account**
|
||
|
|
3. Follow the setup wizard
|
||
|
|
|
||
|
|
### Step 3: Add Phone Number
|
||
|
|
|
||
|
|
1. In WhatsApp Manager, go to **Phone Numbers**
|
||
|
|
2. Click **Add Phone Number**
|
||
|
|
3. Verify the number via SMS or voice call
|
||
|
|
4. Note the **Phone Number ID** for configuration
|
||
|
|
|
||
|
|
### Step 4: Generate Access Token
|
||
|
|
|
||
|
|
1. Go to [developers.facebook.com](https://developers.facebook.com)
|
||
|
|
2. Create or select your app
|
||
|
|
3. Add **WhatsApp** product to your app
|
||
|
|
4. Go to **WhatsApp** → **API Setup**
|
||
|
|
5. Generate a **Permanent Access Token**:
|
||
|
|
- Click **Add System User**
|
||
|
|
- Grant `whatsapp_business_messaging` permission
|
||
|
|
- Generate token
|
||
|
|
|
||
|
|
### Step 5: Configure Webhook
|
||
|
|
|
||
|
|
1. In your Meta app, go to **WhatsApp** → **Configuration**
|
||
|
|
2. Click **Edit** next to Webhook
|
||
|
|
3. Set **Callback URL**: `https://your-server.example.com/webhooks/whatsapp`
|
||
|
|
4. Set **Verify Token**: Same as `whatsapp-verify-token` in config.csv
|
||
|
|
5. Click **Verify and Save**
|
||
|
|
6. Subscribe to webhook fields:
|
||
|
|
- `messages`
|
||
|
|
- `message_deliveries` (optional)
|
||
|
|
- `message_reads` (optional)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## BASIC Usage Examples
|
||
|
|
|
||
|
|
### Sending Text Messages
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Reply to WhatsApp message
|
||
|
|
TALK "Hello! How can I help you today?"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Sending Images
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Send an image
|
||
|
|
image_url = "https://example.com/product.jpg"
|
||
|
|
CARD #{
|
||
|
|
"type": "image",
|
||
|
|
"url": image_url,
|
||
|
|
"caption": "Here's the product you asked about"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Sending Documents
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Generate and send a document
|
||
|
|
report = GENERATE PDF "templates/invoice.html", invoice_data, "temp/invoice.pdf"
|
||
|
|
DOWNLOAD report.url AS "Invoice.pdf"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Interactive Buttons
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Send message with buttons
|
||
|
|
CARD #{
|
||
|
|
"type": "interactive",
|
||
|
|
"interactive": #{
|
||
|
|
"type": "button",
|
||
|
|
"body": #{
|
||
|
|
"text": "Would you like to proceed with your order?"
|
||
|
|
},
|
||
|
|
"action": #{
|
||
|
|
"buttons": [
|
||
|
|
#{ "type": "reply", "reply": #{ "id": "confirm", "title": "✓ Confirm" } },
|
||
|
|
#{ "type": "reply", "reply": #{ "id": "cancel", "title": "✗ Cancel" } }
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Interactive Lists
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Send a list selection
|
||
|
|
CARD #{
|
||
|
|
"type": "interactive",
|
||
|
|
"interactive": #{
|
||
|
|
"type": "list",
|
||
|
|
"header": #{
|
||
|
|
"type": "text",
|
||
|
|
"text": "Select a Category"
|
||
|
|
},
|
||
|
|
"body": #{
|
||
|
|
"text": "Choose from our product categories:"
|
||
|
|
},
|
||
|
|
"action": #{
|
||
|
|
"button": "View Categories",
|
||
|
|
"sections": [
|
||
|
|
#{
|
||
|
|
"title": "Electronics",
|
||
|
|
"rows": [
|
||
|
|
#{ "id": "phones", "title": "Phones", "description": "Smartphones and accessories" },
|
||
|
|
#{ "id": "laptops", "title": "Laptops", "description": "Notebooks and tablets" }
|
||
|
|
]
|
||
|
|
},
|
||
|
|
#{
|
||
|
|
"title": "Home",
|
||
|
|
"rows": [
|
||
|
|
#{ "id": "furniture", "title": "Furniture", "description": "Tables, chairs, sofas" },
|
||
|
|
#{ "id": "appliances", "title": "Appliances", "description": "Kitchen and home appliances" }
|
||
|
|
]
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Template Messages
|
||
|
|
|
||
|
|
Template messages are pre-approved messages for notifications:
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Send a template message (must be approved by Meta)
|
||
|
|
SEND TEMPLATE "whatsapp", customer_phone, "order_confirmation", #{
|
||
|
|
"1": order_id,
|
||
|
|
"2": order_total,
|
||
|
|
"3": delivery_date
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Message Templates
|
||
|
|
|
||
|
|
### Creating Templates
|
||
|
|
|
||
|
|
1. Go to WhatsApp Manager → **Message Templates**
|
||
|
|
2. Click **Create Template**
|
||
|
|
3. Choose category (Marketing, Utility, Authentication)
|
||
|
|
4. Define template with variables: `{{1}}`, `{{2}}`, etc.
|
||
|
|
5. Submit for approval
|
||
|
|
|
||
|
|
### Template Example
|
||
|
|
|
||
|
|
**Name:** `order_shipped`
|
||
|
|
**Category:** Utility
|
||
|
|
**Content:**
|
||
|
|
```
|
||
|
|
Hi {{1}}! 📦
|
||
|
|
|
||
|
|
Your order #{{2}} has been shipped!
|
||
|
|
|
||
|
|
Tracking number: {{3}}
|
||
|
|
Estimated delivery: {{4}}
|
||
|
|
|
||
|
|
Track your package: {{5}}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Using Templates in BASIC
|
||
|
|
|
||
|
|
```basic
|
||
|
|
SEND TEMPLATE "whatsapp", customer.phone, "order_shipped", #{
|
||
|
|
"1": customer.name,
|
||
|
|
"2": order.id,
|
||
|
|
"3": tracking_number,
|
||
|
|
"4": estimated_delivery,
|
||
|
|
"5": tracking_url
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Handling Media
|
||
|
|
|
||
|
|
### Receiving Media
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Check if message contains media
|
||
|
|
IF message.type = "image" THEN
|
||
|
|
image_url = message.image.url
|
||
|
|
TALK "I received your image. Let me analyze it..."
|
||
|
|
' Process image
|
||
|
|
ELSE IF message.type = "document" THEN
|
||
|
|
doc_url = message.document.url
|
||
|
|
doc_name = message.document.filename
|
||
|
|
TALK "I received " + doc_name + ". Processing..."
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Sending Different Media Types
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Audio
|
||
|
|
CARD #{ "type": "audio", "url": "https://example.com/message.mp3" }
|
||
|
|
|
||
|
|
' Video
|
||
|
|
CARD #{ "type": "video", "url": "https://example.com/demo.mp4", "caption": "Product demo" }
|
||
|
|
|
||
|
|
' Location
|
||
|
|
CARD #{
|
||
|
|
"type": "location",
|
||
|
|
"latitude": -23.5505,
|
||
|
|
"longitude": -46.6333,
|
||
|
|
"name": "Our Store",
|
||
|
|
"address": "123 Main Street"
|
||
|
|
}
|
||
|
|
|
||
|
|
' Contact
|
||
|
|
CARD #{
|
||
|
|
"type": "contacts",
|
||
|
|
"contacts": [
|
||
|
|
#{
|
||
|
|
"name": #{ "formatted_name": "Support Team" },
|
||
|
|
"phones": [#{ "phone": "+15551234567", "type": "WORK" }]
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Rate Limits and Best Practices
|
||
|
|
|
||
|
|
### Messaging Limits
|
||
|
|
|
||
|
|
| Tier | Messages/24h | How to Upgrade |
|
||
|
|
|------|--------------|----------------|
|
||
|
|
| Tier 1 | 1,000 | Verify business |
|
||
|
|
| Tier 2 | 10,000 | Good quality rating |
|
||
|
|
| Tier 3 | 100,000 | Sustained quality |
|
||
|
|
| Tier 4 | Unlimited | Top quality rating |
|
||
|
|
|
||
|
|
### Quality Rating
|
||
|
|
|
||
|
|
Maintain quality by:
|
||
|
|
- Responding within 24 hours
|
||
|
|
- Avoiding spam complaints
|
||
|
|
- Using templates appropriately
|
||
|
|
- Providing value in conversations
|
||
|
|
|
||
|
|
### 24-Hour Window
|
||
|
|
|
||
|
|
- **User-initiated**: Free-form messages allowed for 24 hours after user message
|
||
|
|
- **Business-initiated**: Only template messages outside the 24-hour window
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Check if within messaging window
|
||
|
|
IF within_24h_window THEN
|
||
|
|
TALK "Here's your update: " + update_text
|
||
|
|
ELSE
|
||
|
|
' Use template for out-of-window message
|
||
|
|
SEND TEMPLATE "whatsapp", phone, "update_notification", #{ "1": update_text }
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Error Handling
|
||
|
|
|
||
|
|
```basic
|
||
|
|
ON ERROR RESUME NEXT
|
||
|
|
|
||
|
|
TALK "Processing your request..."
|
||
|
|
|
||
|
|
IF ERROR THEN
|
||
|
|
error_msg = ERROR MESSAGE
|
||
|
|
|
||
|
|
IF INSTR(error_msg, "rate limit") > 0 THEN
|
||
|
|
PRINT "Rate limited, queuing message for retry"
|
||
|
|
' Queue for later
|
||
|
|
ELSE IF INSTR(error_msg, "invalid phone") > 0 THEN
|
||
|
|
PRINT "Invalid phone number format"
|
||
|
|
ELSE IF INSTR(error_msg, "not registered") > 0 THEN
|
||
|
|
PRINT "User not on WhatsApp"
|
||
|
|
ELSE
|
||
|
|
PRINT "WhatsApp error: " + error_msg
|
||
|
|
END IF
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Common Errors
|
||
|
|
|
||
|
|
| Error Code | Meaning | Solution |
|
||
|
|
|------------|---------|----------|
|
||
|
|
| 131030 | User not on WhatsApp | Verify phone number |
|
||
|
|
| 131047 | Re-engagement required | Send template message |
|
||
|
|
| 131048 | Spam rate limit | Reduce message frequency |
|
||
|
|
| 131051 | Unsupported message type | Check message format |
|
||
|
|
| 131052 | Media download failed | Verify media URL |
|
||
|
|
| 132000 | Template not found | Check template name |
|
||
|
|
| 132001 | Template paused | Resume in WhatsApp Manager |
|
||
|
|
| 133010 | Phone not registered | Complete phone verification |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Webhook Security
|
||
|
|
|
||
|
|
### Validating Requests
|
||
|
|
|
||
|
|
General Bots automatically validates webhook signatures. Ensure your `whatsapp-verify-token` is kept secret.
|
||
|
|
|
||
|
|
### Recommended Setup
|
||
|
|
|
||
|
|
```csv
|
||
|
|
name,value
|
||
|
|
whatsapp-verify-token,a-very-long-random-string-that-is-hard-to-guess
|
||
|
|
whatsapp-validate-signature,true
|
||
|
|
whatsapp-app-secret,your_app_secret_from_meta
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
### Test Numbers
|
||
|
|
|
||
|
|
Use Meta's test phone numbers during development:
|
||
|
|
|
||
|
|
1. In App Dashboard, go to **WhatsApp** → **API Setup**
|
||
|
|
2. Use the **Test Phone Number** provided
|
||
|
|
3. Add your phone as a test recipient
|
||
|
|
|
||
|
|
### Sending Test Messages
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Test message to verified number
|
||
|
|
test_phone = "+15551234567" ' Must be in test recipients list
|
||
|
|
SEND SMS test_phone, "Test message from General Bots"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Production Checklist
|
||
|
|
|
||
|
|
- [ ] Business verification completed
|
||
|
|
- [ ] Phone number verified and registered
|
||
|
|
- [ ] Permanent access token generated
|
||
|
|
- [ ] Webhook configured and verified
|
||
|
|
- [ ] Message templates approved
|
||
|
|
- [ ] SSL certificate valid
|
||
|
|
- [ ] Error handling implemented
|
||
|
|
- [ ] Rate limiting considered
|
||
|
|
- [ ] Quality guidelines reviewed
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Webhook Not Receiving Messages
|
||
|
|
|
||
|
|
1. Verify callback URL is HTTPS with valid SSL
|
||
|
|
2. Check verify token matches configuration
|
||
|
|
3. Ensure webhook fields are subscribed
|
||
|
|
4. Check server logs for incoming requests
|
||
|
|
|
||
|
|
### Messages Not Sending
|
||
|
|
|
||
|
|
1. Verify access token is valid and not expired
|
||
|
|
2. Check phone number ID is correct
|
||
|
|
3. Ensure recipient is on WhatsApp
|
||
|
|
4. Check for rate limit errors
|
||
|
|
|
||
|
|
### Template Messages Failing
|
||
|
|
|
||
|
|
1. Verify template is approved
|
||
|
|
2. Check template name is correct
|
||
|
|
3. Ensure all variables are provided
|
||
|
|
4. Verify language code matches
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Related Documentation
|
||
|
|
|
||
|
|
- [Teams Configuration](./teams-channel.md) — Microsoft Teams setup
|
||
|
|
- [SMS Configuration](./sms-providers.md) — SMS provider configuration
|
||
|
|
- [Universal Messaging](../chapter-06-gbdialog/universal-messaging.md) — Multi-channel messaging
|
||
|
|
- [SEND TEMPLATE Keyword](../chapter-06-gbdialog/keyword-send-template.md) — Template messaging
|
||
|
|
- [CARD Keyword](../chapter-06-gbdialog/keyword-card.md) — Rich card messages
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Summary
|
||
|
|
|
||
|
|
WhatsApp Business API integration enables your General Bots deployment to communicate with billions of WhatsApp users. Configure the required parameters from Meta Business, set up webhooks, create message templates for notifications, and your bot is ready to engage customers on their preferred messaging platform. Follow quality guidelines and respect the 24-hour messaging window to maintain a high quality rating.
|