Add comprehensive Webex Interact parser guide
- Detailed documentation for all 7 event types - Configuration instructions - Testing examples with cURL - Email organization tips - Troubleshooting section - Links to official API documentation
This commit is contained in:
@@ -0,0 +1,380 @@
|
||||
# Webex Interact Webhook Parser Guide
|
||||
|
||||
## Overview
|
||||
|
||||
The Webex Interact parser (`/wxinteract`) formats SMS API webhook events from Webex Interact into clean, readable HTML emails. Each event type gets custom formatting with relevant emojis for easy identification.
|
||||
|
||||
## Configuration
|
||||
|
||||
### URL Format
|
||||
|
||||
```
|
||||
https://your-domain.com/{your-email}/wxinteract
|
||||
```
|
||||
|
||||
### Example
|
||||
|
||||
```
|
||||
https://webhooks.dixon.cx/sms-notifications%40mycompany.com/wxinteract
|
||||
```
|
||||
|
||||
## Supported Events
|
||||
|
||||
The parser automatically detects the event type based on the `data.status` field in the webhook payload.
|
||||
|
||||
### 📤 Outbound SMS - Submitted
|
||||
**Status:** `submitted`
|
||||
|
||||
Triggered when an SMS message is submitted to the carrier for delivery.
|
||||
|
||||
**Fields displayed:**
|
||||
- Message ID
|
||||
- To (recipient phone number)
|
||||
- From (sender phone number)
|
||||
- Campaign ID
|
||||
- Submitted At (timestamp)
|
||||
- Message Content (formatted in a clean message box)
|
||||
|
||||
**Example payload:**
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"status": "submitted",
|
||||
"message_id": "msg_123456789",
|
||||
"to": "+61412345678",
|
||||
"from": "+61387654321",
|
||||
"message": "Hello! Your appointment is confirmed for tomorrow at 2 PM.",
|
||||
"submitted_at": "2026-01-22T16:45:00Z",
|
||||
"campaign_id": "camp_987654321"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### ✅ Outbound SMS - Delivered
|
||||
**Status:** `delivered`
|
||||
|
||||
Triggered when an SMS message is successfully delivered to the recipient.
|
||||
|
||||
**Fields displayed:**
|
||||
- Message ID
|
||||
- To (recipient phone number)
|
||||
- From (sender phone number)
|
||||
- Campaign ID
|
||||
- Delivered At (timestamp)
|
||||
|
||||
**Example payload:**
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"status": "delivered",
|
||||
"message_id": "msg_123456789",
|
||||
"to": "+61412345678",
|
||||
"from": "+61387654321",
|
||||
"delivered_at": "2026-01-22T16:46:15Z",
|
||||
"campaign_id": "camp_987654321"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### ❌ Outbound SMS - Failed
|
||||
**Status:** `failed`
|
||||
|
||||
Triggered when an SMS message fails to deliver.
|
||||
|
||||
**Fields displayed:**
|
||||
- Message ID
|
||||
- To (recipient phone number)
|
||||
- From (sender phone number)
|
||||
- Campaign ID
|
||||
- Failed At (timestamp)
|
||||
- Error Code (highlighted in error box)
|
||||
- Error Message (highlighted in error box)
|
||||
|
||||
**Example payload:**
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"status": "failed",
|
||||
"message_id": "msg_987654321",
|
||||
"to": "+61499999999",
|
||||
"from": "+61387654321",
|
||||
"failed_at": "2026-01-22T16:47:00Z",
|
||||
"error_code": "ERR_INVALID_NUMBER",
|
||||
"error_message": "The destination number is invalid or not reachable",
|
||||
"campaign_id": "camp_987654321"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🔗 Shortlink Clicked
|
||||
**Status:** `shortlink_clicked`
|
||||
|
||||
Triggered when a recipient clicks a tracked shortlink in an SMS message.
|
||||
|
||||
**Fields displayed:**
|
||||
- Shortlink (clickable)
|
||||
- Original URL (clickable)
|
||||
- Phone Number (recipient who clicked)
|
||||
- Message ID
|
||||
- Campaign ID
|
||||
- Clicked At (timestamp)
|
||||
- IP Address (of the click)
|
||||
- User Agent (browser/device information)
|
||||
|
||||
**Example payload:**
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"status": "shortlink_clicked",
|
||||
"shortlink": "https://wxint.co/abc123",
|
||||
"original_url": "https://example.com/special-offer",
|
||||
"clicked_at": "2026-01-22T17:30:45Z",
|
||||
"phone_number": "+61412345678",
|
||||
"message_id": "msg_123456789",
|
||||
"campaign_id": "camp_987654321",
|
||||
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15",
|
||||
"ip_address": "203.0.113.45"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 📥 Inbound SMS Received
|
||||
**Status:** `received`
|
||||
|
||||
Triggered when an inbound SMS is received from a recipient.
|
||||
|
||||
**Fields displayed:**
|
||||
- Message ID
|
||||
- From (sender phone number)
|
||||
- To (your phone number)
|
||||
- Keyword (detected keyword)
|
||||
- Received At (timestamp)
|
||||
- Message Content (formatted in a clean message box)
|
||||
|
||||
**Example payload:**
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"status": "received",
|
||||
"message_id": "msg_inbound_001",
|
||||
"from": "+61412345678",
|
||||
"to": "+61387654321",
|
||||
"message": "YES I would like to receive updates",
|
||||
"received_at": "2026-01-22T18:00:00Z",
|
||||
"keyword": "YES"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🚫 SMS Opt Out Received
|
||||
**Status:** `opt_out`
|
||||
|
||||
Triggered when a recipient opts out of receiving SMS messages (typically by replying "STOP").
|
||||
|
||||
**Fields displayed:**
|
||||
- Phone Number (who opted out)
|
||||
- From Number (your SMS number)
|
||||
- Keyword (e.g., "STOP")
|
||||
- Message ID
|
||||
- Opt Out At (timestamp)
|
||||
|
||||
**Example payload:**
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"status": "opt_out",
|
||||
"phone_number": "+61412345678",
|
||||
"opt_out_at": "2026-01-22T18:15:00Z",
|
||||
"keyword": "STOP",
|
||||
"message_id": "msg_optout_001",
|
||||
"from": "+61387654321"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 👤 Contacts Callback
|
||||
**Status:** `contact_created` or `contact_updated`
|
||||
|
||||
Triggered when a contact is created or updated in your Webex Interact account.
|
||||
|
||||
**Fields displayed:**
|
||||
- Contact ID
|
||||
- Phone Number
|
||||
- First Name
|
||||
- Last Name
|
||||
- Email
|
||||
- Status
|
||||
- Created At (timestamp)
|
||||
- Updated At (timestamp)
|
||||
- Custom Fields (if present, displayed in a separate section)
|
||||
|
||||
**Example payload:**
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"status": "contact_created",
|
||||
"contact_id": "contact_abc123",
|
||||
"phone_number": "+61412345678",
|
||||
"first_name": "John",
|
||||
"last_name": "Smith",
|
||||
"email": "john.smith@example.com",
|
||||
"created_at": "2026-01-22T19:00:00Z",
|
||||
"updated_at": "2026-01-22T19:00:00Z",
|
||||
"custom_fields": {
|
||||
"company": "Acme Corporation",
|
||||
"department": "Sales",
|
||||
"customer_id": "CUST_12345"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Testing
|
||||
|
||||
### Using cURL
|
||||
|
||||
Test individual event types using the sample payloads:
|
||||
|
||||
```bash
|
||||
# Test Outbound SMS Submitted
|
||||
curl -X POST https://your-domain.com/test%40example.com/wxinteract \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"data": {"status": "submitted", "message_id": "msg_123", "to": "+61412345678", "from": "+61387654321", "message": "Test message", "submitted_at": "2026-01-22T16:45:00Z", "campaign_id": "camp_001"}}'
|
||||
|
||||
# Test SMS Opt Out
|
||||
curl -X POST https://your-domain.com/test%40example.com/wxinteract \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"data": {"status": "opt_out", "phone_number": "+61412345678", "opt_out_at": "2026-01-22T18:15:00Z", "keyword": "STOP", "message_id": "msg_005", "from": "+61387654321"}}'
|
||||
```
|
||||
|
||||
### Using Test Samples
|
||||
|
||||
A complete set of test samples for all event types is available in `wxinteract_test_samples.json`.
|
||||
|
||||
```bash
|
||||
# Test with submitted event
|
||||
cat wxinteract_test_samples.json | jq '.outbound_sms_submitted' | \
|
||||
curl -X POST https://your-domain.com/test%40example.com/wxinteract \
|
||||
-H "Content-Type: application/json" \
|
||||
-d @-
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuring in Webex Interact
|
||||
|
||||
### Step 1: Log in to Webex Interact
|
||||
|
||||
Go to your Webex Interact dashboard at https://interact.webex.com/
|
||||
|
||||
### Step 2: Navigate to API Settings
|
||||
|
||||
1. Click on **Settings** or **API** in the navigation menu
|
||||
2. Look for **Webhooks** or **API Callbacks** section
|
||||
|
||||
### Step 3: Configure Callback URL
|
||||
|
||||
1. Enter your webhook URL: `https://your-domain.com/{your-email}/wxinteract`
|
||||
2. Select the events you want to receive:
|
||||
- ☑️ Outbound SMS - Submitted
|
||||
- ☑️ Outbound SMS - Delivered
|
||||
- ☑️ Outbound SMS - Failed
|
||||
- ☑️ Shortlink Clicked
|
||||
- ☑️ Inbound SMS Received
|
||||
- ☑️ SMS Opt Out Received
|
||||
- ☑️ Contacts Callback
|
||||
3. Save your configuration
|
||||
|
||||
### Step 4: Test the Integration
|
||||
|
||||
1. Send a test SMS from Webex Interact
|
||||
2. Check your email inbox for the formatted webhook notification
|
||||
3. Verify the email contains the correct information
|
||||
|
||||
---
|
||||
|
||||
## Email Organization Tips
|
||||
|
||||
### Create Email Filters
|
||||
|
||||
Set up filters based on the subject line patterns:
|
||||
|
||||
- **All Webex Interact webhooks:** Subject contains "Webex Interact"
|
||||
- **Failed messages only:** Subject contains "❌ Webex Interact: Outbound SMS - Failed"
|
||||
- **Opt-outs only:** Subject contains "🚫 Webex Interact: SMS Opt Out"
|
||||
- **Click tracking:** Subject contains "🔗 Webex Interact: Shortlink Clicked"
|
||||
|
||||
### Use Plus Addressing
|
||||
|
||||
Track different campaigns or environments:
|
||||
|
||||
- Production: `sms-prod%40mycompany.com`
|
||||
- Staging: `sms-staging%40mycompany.com`
|
||||
- Campaign A: `sms+campaignA%40mycompany.com`
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Parser Not Working
|
||||
|
||||
If you're receiving raw webhook data instead of formatted emails:
|
||||
|
||||
1. **Check URL:** Ensure `/wxinteract` is at the end of the URL
|
||||
2. **Check payload structure:** Parser expects `{"data": {"status": "...", ...}}`
|
||||
3. **Check PHP logs:** Look for any parser errors in your server logs
|
||||
|
||||
### Missing Fields
|
||||
|
||||
If some fields are showing as "N/A":
|
||||
|
||||
- The webhook payload may not include those fields for that event type
|
||||
- Check the Webex Interact documentation for the specific event
|
||||
- Use the raw webhook format (without `/wxinteract`) to see the complete payload
|
||||
|
||||
### Wrong Event Type
|
||||
|
||||
If the event is being parsed as a generic event:
|
||||
|
||||
- Check that `data.status` matches one of the supported values
|
||||
- Supported values: `submitted`, `delivered`, `failed`, `shortlink_clicked`, `received`, `opt_out`, `contact_created`, `contact_updated`
|
||||
|
||||
---
|
||||
|
||||
## API Documentation References
|
||||
|
||||
Official Webex Interact webhook documentation:
|
||||
|
||||
- [Outbound SMS - Submitted](https://docs.webexinteract.com/reference/sms-api-request-accepted)
|
||||
- [Outbound SMS - Delivered](https://docs.webexinteract.com/reference/outbound-sms-delivered)
|
||||
- [Outbound SMS - Failed](https://docs.webexinteract.com/reference/outbound-sms-failed)
|
||||
- [Shortlink Clicked](https://docs.webexinteract.com/reference/shortlink-clicked)
|
||||
- [Inbound SMS Events](https://docs.webexinteract.com/reference/inbound-sms-events)
|
||||
- [SMS Opt Out Received](https://docs.webexinteract.com/reference/sms-opt-out-received)
|
||||
- [Contacts Callback](https://docs.webexinteract.com/reference/contacts-callback)
|
||||
|
||||
---
|
||||
|
||||
## Support
|
||||
|
||||
For issues with:
|
||||
- **This parser:** Open an issue on the GitHub repository
|
||||
- **Webex Interact API:** Contact Webex Interact support
|
||||
|
||||
---
|
||||
|
||||
Built with ❤️ for better webhook debugging
|
||||
Reference in New Issue
Block a user