WhatsApp Tracking & Analytics
Joryio provides comprehensive tracking for WhatsApp messages, including delivery status, opens, clicks, and button interactions. This data feeds real-time analytics.
Overview
WhatsApp tracking enables you to:
- Track message delivery - Sent, delivered, read status
- Monitor engagement - Button clicks, link clicks
- Analyze campaigns - Attribution of conversions to specific campaigns
- Trigger workflows - Use inbound WhatsApp messages to trigger Canvas journeys
Events Tracked
Outbound Message Events
When you send WhatsApp messages through campaigns or Canvas, the following events are tracked:
| Event Name | Description | Properties |
|---|---|---|
whatsapp.message.sent | Message was sent to WhatsApp API | messageId, templateName, recipientPhone |
whatsapp.message.delivered | Message was delivered to recipient | messageId, campaignId, variantId |
whatsapp.message.read | Recipient read the message | messageId, campaignId, variantId |
whatsapp.message.failed | Message failed to send | messageId, errorCode, errorMessage |
message.clicked | User clicked a button in the message | campaignId, buttonId, buttonTitle |
Inbound Message Events
When users send messages to your WhatsApp Business Account:
| Event Name | Description | Properties |
|---|---|---|
whatsapp.message.received | Inbound message received | messageType, content, phoneNumber, wabaId |
Button Click Tracking
When users click buttons in your WhatsApp template messages, Joryio automatically:
- Associates clicks with campaigns - Links the button click to the original outbound message
- Records the event - Records
message.clickedevent with full context - Updates campaign analytics - Increments click counts for campaign reporting
How It Works
1. You send a WhatsApp template with buttons
2. We store the message with campaign attribution (whatsapp_messages table)
3. User clicks a button → WhatsApp sends webhook
4. We look up the original message to get campaign context
5. We track message.clicked event with campaignId, variantId, buttonId
Tracked Button Data
buttonId- The button payload/IDbuttonTitle- The button textcampaignId- Associated campaignvariantId- A/B test variant (if applicable)messageId- WhatsApp message ID
Link Click Tracking
WhatsApp link tracking uses the dynamic URL suffix on a template's URL button - the one per-recipient URL slot Meta sanctions. Joryio fills that suffix with a signed token pointing at your tracking domain; the tap is logged and then redirected to the real destination. Because the button's base URL is part of the approved template, nothing about the message is rewritten at send time - the template stays valid.
Setup
1. Configure your tracking domain. Set it once under Settings → Tracking domain (e.g. track.yourbrand.com). See Tracking domain.
2. Author the Meta template with a tracking-domain URL button. Give the button a dynamic URL whose base is your tracking domain:
Button URL: https://track.yourbrand.com/wa/{{1}}
Submit the template for approval as usual. Meta approves it with your tracking domain - the {{1}} dynamic suffix is the sanctioned varying part.
3. Map the destination in the campaign. When you pick the template in the campaign composer, any URL button with a dynamic suffix shows a Button link field - marked tracked when its base is a …/wa/{{1}} tracking URL. Enter the real destination, either a fixed URL or a Liquid expression:
{{ user.custom.offerUrl }}
That's it - no code. At send, Joryio:
- Resolves the destination per recipient (Liquid, catalog feeds and content blocks all work).
- Mints a signed tracking token carrying the destination plus attribution (campaign or journey, variant, user).
- Sends the token as the dynamic suffix, so the recipient receives
https://track.yourbrand.com/wa/<token>.
Tracking Flow
1. Template button (approved): https://track.yourbrand.com/wa/{{1}}
2. Send: suffix ← signed token { destination, org, user, campaign/canvas, variant }
3. Recipient taps → GET /wa/:token on your tracking domain
4. Token verified (HMAC) → message.clicked logged (channel = whatsapp) → 302 to the destination
The token is HMAC-signed, so a tampered or forged suffix is rejected, and the destination travels inside the token - no database lookup is needed to attribute the click.
A URL button whose base is not your tracking domain (for example https://shop.com/{{1}}) is treated as an ordinary Meta dynamic suffix: the value you map is sent as-is and the click is not wrapped. Only tracking-domain buttons become tracked links - Joryio never rewrites a URL Meta didn't approve.
WhatsApp Message Triggers for Canvas
You can use inbound WhatsApp messages as triggers for Canvas workflows.
Configuration
When creating a Canvas, select "WhatsApp Message" as the entry trigger type.
Trigger Options
| Option | Description |
|---|---|
| WhatsApp Account | Specific WABA to listen to (or all accounts) |
| Message Types | Filter by message type (text, image, button_reply, etc.) |
| Conditions | Content-based conditions (text contains, equals, regex) |
Condition Types
| Property | Description | Example |
|---|---|---|
content.text | Message text content | Contains "support" |
messageType | Type of message | Equals "button_reply" |
phoneNumber | Sender's phone number | Starts with "+1" |
Operators
equals- Exact matchnot equals- Not exact matchcontains- Text contains valuestarts with- Text starts with valueends with- Text ends with valuematches regex- Regular expression match
Template Variables in Canvas
When a WhatsApp message triggers a canvas, you can use these variables in subsequent nodes:
{{ trigger.messageType }} # 'text', 'image', 'button_reply', etc.
{{ trigger.content.text }} # Message text content
{{ trigger.content.type }} # Content type
{{ trigger.phoneNumber }} # Sender's phone number
{{ trigger.messageId }} # WhatsApp message ID
{{ trigger.timestamp }} # When message was received
{{ trigger.wabaId }} # WhatsApp Business Account ID
{{ trigger.context }} # Reply context (if replying to a message)
Example: Support Bot Canvas
Entry Trigger: WhatsApp Message
- Message Type: text
- Condition: content.text contains "help" OR "support"
Flow:
→ Send WhatsApp Reply: "Hi {{ user.firstName }}, how can we help?"
→ Behavior Split: Wait for response (24h)
→ Responded: Route to support agent
→ No response: Send follow-up message
Analytics Dashboard
View WhatsApp analytics in:
-
Campaign Analytics - Per-campaign metrics
- Messages sent, delivered, read
- Button click rates
- Conversion rates
-
Canvas Analytics - Journey-level metrics
- Users triggered by WhatsApp
- Path completion rates
- Response rates
-
Event export / custom analytics - Build your own reporting
- Browse the raw events (
whatsapp.message.sent,whatsapp.message.delivered,whatsapp.message.read,message.clicked) in the Event Explorer - Export events via the API to power custom dashboards
- Browse the raw events (
Best Practices
1. Use Templates with Buttons
- Buttons have higher engagement than plain text
- Button clicks are automatically tracked
- Use meaningful button text for better analytics
2. Enable Link Tracking
- Wrap URLs in your tracking domain
- Get full attribution for external link clicks
- Measure true conversion rates
3. Set Up Canvas Triggers
- Automate responses to common inquiries
- Route users to appropriate flows based on message content
- Use regex patterns for flexible matching
4. Monitor Delivery Rates
- Track
deliveredvssentratio - Identify phone number quality issues
- Monitor for failed messages
5. Analyze Response Patterns
- Track time between message sent and user action
- Identify optimal send times
- Measure 24-hour session utilization
Troubleshooting
Button Clicks Not Tracking
- Check webhook configuration - Ensure WhatsApp webhooks are properly configured
- Verify message storage - Original message must exist in
whatsapp_messagestable - Check campaign attribution - Message must have
campaignIdfor full tracking
Inbound Messages Not Triggering Canvas
- Verify canvas is active - Canvas must be in "active" status
- Check trigger conditions - Ensure message matches configured conditions
- Verify WABA connection - Account must be active and connected
Missing Analytics Data
- Check the Event Explorer - Confirm WhatsApp events are still arriving; if events have stopped entirely, contact support
- Verify event emission - Check backend logs for event tracking
- Check time range - Analytics have a processing delay