Spaces:
Sleeping
Sleeping
| # WASender WhatsApp Integration Guide | |
| ## Overview | |
| WASender provides WhatsApp messaging for field agents and customers. It's our immediate SMS alternative since most field agents have WhatsApp. | |
| ## Environment Variable | |
| Add this to your Hugging Face Spaces secrets: | |
| ```bash | |
| WASENDER_API_KEY=your_wasender_api_key_here | |
| ``` | |
| ## Startup Health Check | |
| On application startup, you'll see: | |
| ``` | |
| External Services Check: | |
| WASender (WhatsApp): Connected | |
| WhatsApp: connected | |
| Note: WhatsApp is connected and ready | |
| ``` | |
| ### Possible Statuses | |
| - **Connected** - WhatsApp is ready to send messages | |
| - **Connecting** - WhatsApp is connecting (wait a moment) | |
| - **Disconnected** - WhatsApp is disconnected (check WASender dashboard) | |
| - **Need Scan** - QR code scan required (scan in WASender dashboard) | |
| - **Logged Out** - WhatsApp session logged out (re-login required) | |
| - **Expired** - WhatsApp session expired (re-authenticate) | |
| ## Usage Examples | |
| ### 1. Send Simple Message | |
| ```python | |
| from app.integrations import send_whatsapp_message | |
| # Send message to field agent | |
| result = send_whatsapp_message( | |
| to="+254799456976", | |
| text="Your ticket #1234 has been assigned. Please check the app." | |
| ) | |
| # Response: | |
| # { | |
| # "success": true, | |
| # "data": { | |
| # "msgId": 11462202, | |
| # "jid": "+254799456976", | |
| # "status": "in_progress" | |
| # } | |
| # } | |
| ``` | |
| ### 2. Send OTP | |
| ```python | |
| from app.integrations import send_whatsapp_otp | |
| # Send OTP for verification | |
| result = send_whatsapp_otp( | |
| to="+254799456976", | |
| otp_code="123456" | |
| ) | |
| # Message sent: | |
| # "Your SwiftOps verification code is: 123456 | |
| # This code will expire in 10 minutes." | |
| ``` | |
| ### 3. Send Message with Image | |
| ```python | |
| from app.integrations import send_whatsapp_message | |
| # Send message with image | |
| result = send_whatsapp_message( | |
| to="+254799456976", | |
| text="Installation completed! See photo:", | |
| media_url="https://example.com/installation-photo.jpg" | |
| ) | |
| ``` | |
| ### 4. Using the Client Directly | |
| ```python | |
| from app.integrations import get_wasender_client | |
| # Get client | |
| client = get_wasender_client() | |
| # Check status | |
| status = client.get_status() | |
| print(status) # {"status": "connected"} | |
| # Send message | |
| result = client.send_message( | |
| to="+254799456976", | |
| text="Hello from SwiftOps!" | |
| ) | |
| # Send OTP with custom template | |
| result = client.send_otp( | |
| to="+254799456976", | |
| otp_code="123456", | |
| message_template="Your code: {otp}. Valid for 10 minutes." | |
| ) | |
| ``` | |
| ## Use Cases | |
| ### 1. Ticket Assignment Notification | |
| ```python | |
| # When ticket is assigned to field agent | |
| send_whatsapp_message( | |
| to=agent.phone, | |
| text=f"New ticket assigned: {ticket.title}\n" | |
| f"Customer: {customer.name}\n" | |
| f"Location: {ticket.location}\n" | |
| f"Priority: {ticket.priority}\n\n" | |
| f"Open app to view details." | |
| ) | |
| ``` | |
| ### 2. Customer Installation Confirmation | |
| ```python | |
| # After successful installation | |
| send_whatsapp_message( | |
| to=customer.phone, | |
| text=f"Dear {customer.name},\n\n" | |
| f"Your {service_type} installation is complete!\n" | |
| f"Service ID: {subscription.id}\n" | |
| f"Package: {subscription.package_name}\n\n" | |
| f"Thank you for choosing us!" | |
| ) | |
| ``` | |
| ### 3. OTP Verification | |
| ```python | |
| # For user registration/login | |
| otp_code = generate_otp() # Your OTP generation logic | |
| send_whatsapp_otp( | |
| to=user.phone, | |
| otp_code=otp_code | |
| ) | |
| ``` | |
| ### 4. Expense Approval Notification | |
| ```python | |
| # When expense is approved | |
| send_whatsapp_message( | |
| to=agent.phone, | |
| text=f"Expense approved!\n" | |
| f"Amount: KES {expense.amount}\n" | |
| f"Category: {expense.category}\n" | |
| f"Payment will be processed shortly." | |
| ) | |
| ``` | |
| ## Phone Number Format | |
| **Always use international format:** | |
| - ✅ `+254799456976` (Kenya) | |
| - ✅ `+254712345678` (Kenya) | |
| - ❌ `0799456976` (Missing country code) | |
| - ❌ `254799456976` (Missing + sign) | |
| ## Rate Limits | |
| WASender has rate limits (check your plan): | |
| - Free tier: ~256 messages per minute | |
| - Check headers: `x-ratelimit-remaining` | |
| ## Error Handling | |
| ```python | |
| from app.integrations import send_whatsapp_message | |
| import logging | |
| logger = logging.getLogger(__name__) | |
| try: | |
| result = send_whatsapp_message( | |
| to=user.phone, | |
| text="Your message" | |
| ) | |
| if result.get("success"): | |
| logger.info(f"WhatsApp sent: {result['data']['msgId']}") | |
| else: | |
| logger.error(f"WhatsApp failed: {result}") | |
| except Exception as e: | |
| logger.error(f"WhatsApp error: {e}") | |
| # Fallback to SMS or email | |
| ``` | |
| ## Testing | |
| ### Test in PowerShell | |
| ```powershell | |
| $env:WASENDER_API_KEY = "your_key_here" | |
| Invoke-WebRequest ` | |
| -Uri "https://www.wasenderapi.com/api/send-message" ` | |
| -Method POST ` | |
| -Headers @{ | |
| "Authorization" = "Bearer $env:WASENDER_API_KEY" | |
| "Content-Type" = "application/json" | |
| } ` | |
| -Body '{"to": "+254799456976", "text": "Test message"}' | |
| ``` | |
| ### Test in Python | |
| ```python | |
| from app.integrations import send_whatsapp_message | |
| # Send test message | |
| result = send_whatsapp_message( | |
| to="+254799456976", | |
| text="Test message from SwiftOps" | |
| ) | |
| print(result) | |
| ``` | |
| ## Monitoring | |
| Check WASender dashboard for: | |
| - Message delivery status | |
| - Failed messages | |
| - WhatsApp connection status | |
| - Usage statistics | |
| ## Best Practices | |
| 1. **Always validate phone numbers** before sending | |
| 2. **Use templates** for common messages (faster, cheaper) | |
| 3. **Handle errors gracefully** - fallback to SMS/email | |
| 4. **Don't spam** - respect user preferences | |
| 5. **Log all messages** - for audit trail | |
| 6. **Check rate limits** - avoid hitting limits | |
| ## Troubleshooting | |
| ### "WhatsApp: need_scan" | |
| - Go to WASender dashboard | |
| - Scan QR code with your WhatsApp | |
| - Wait for "connected" status | |
| ### "Connection failed" | |
| - Check API key is correct | |
| - Check internet connectivity | |
| - Check WASender service status | |
| ### "Message not delivered" | |
| - Verify phone number format (+254...) | |
| - Check recipient has WhatsApp | |
| - Check WASender dashboard for details | |
| ## Next Steps | |
| 1. Set `WASENDER_API_KEY` in HF Spaces secrets | |
| 2. Deploy application | |
| 3. Check startup logs for "Connected" status | |
| 4. Test sending a message | |
| 5. Integrate into ticket assignment workflow | |