Skip to main content
Technical reference for what each Analytics number means, how it is calculated, and what data powers it. Use when customers ask “How do you calculate read rate?” or “Why doesn’t this match Meta?” Dashboard source of truth: WhatsApp channel analytics UI (/analytics/whatsapp/{channelId}). Data source: Vendschat message database — updated by outbound sends and WhatsApp status webhooks (sent → delivered → read / failed). This is not the same as opening Meta Business Manager analytics, though numbers should be close.

Message lifecycle & statuses

Outbound status progression

Timestamps stored per message: sent_at, delivered_at, read_at, failed_at. The log Updated at column uses the latest meaningful status time.

Inbound messages

Inbound (customer → you) messages appear in Message logs with direction inbound. They are not included in summary Sent/Delivered/Read/Failed totals (those measure your outbound performance).

Summary metrics (formulas)

All summary and trend metrics use outbound, non-internal messages unless noted.

Period-over-period deltas

When the selected range has a defined previous window (e.g. last 7d vs prior 7d): Formula: round((current - previous) / previous × 100, 1) — null if previous = 0.

Time range parsing

Dashboard dropdown offers Today, 7d, 30d, 60d, 90d, Custom — not 14d. The API and Co-Admin get_channel_analytics / get_contact_analytics do accept 14d. Previous period for deltas = equal-length window immediately before current start.

Timeseries (daily chart)

Days with zero activity still appear (zero values) when using daily rollup tables. Performance: Aggregates prefer channel_message_stats_daily rollup; falls back to raw messages table if rollup unavailable.

Conversation type segments

Scope: Outbound, non-internal messages in range. Each segment includes count and pct (% of total outbound in range).

Top countries

Scope: All non-internal messages (inbound + outbound) in range. Limited to top 10 countries by count. Data quality: Country depends on contact profile — enrich contacts for accurate geo reports.

Template performance metrics

Scope: Outbound template sends in range (type = template OR template_name set). Caveat: Button tracking infers clicks from inbound message text matching button labels — not separate Meta click IDs in all cases.

Message log filters

| status filter | Matches messages.status exactly | | phone | Case-insensitive partial match on contacts.phone_number | Pagination: Default per_page=10, max 50. Ordered by latest status timestamp descending. CSV export (message-logs): Uses the same query params but defaults to page 1, per_page 10 — the dashboard Export button does not pass page, so you get at most 10 rows unless you build the export URL with a higher per_page (max 50).

CSV export kinds

Exports require workspace membership and a WhatsApp channel.

REST API endpoints (WhatsApp channel)

Base path: GET /workspaces/{workspaceId}/channels/{channelId}/analytics/... Caching: summary and timeseries responses are cached in memory for 10 minutes per process (withAnalyticsCache). Other endpoints are uncached. Client: Dashboard uses React Query (staleTime 60s, refetchOnWindowFocus: false) under AnalyticsQueryProvider in the app layout.

Meta WABA analytics (backend capability)

The product backend also exposes Meta Graph API analytics for WhatsApp Business Accounts when channel credentials include a valid WABA token. The current dashboard UI does not call these routes — it uses database-powered analytics described above. Capabilities endpoint documents:
  • Optional filters on Meta summary/timeseries (when used): country_codes, product_types, phone number slice vs whole WABA
  • Template analytics via Meta: max 90-day lookback, max 10 template IDs per request
  • Limitations: BSP-billed WABAs may omit cost; Meta data can differ from invoices; template read/click metrics follow Meta’s 7-day rules
Dashboard template performance (template-performance) measures reply rate and button text breakdown from Vendschat threads — different from Meta template sent/delivered/read. Customer guidance: Trust Analytics dashboard for day-to-day ops; reconcile Meta billing in Meta Business Manager for conversation charges.

Co-Admin contact analytics metrics

When Co-Admin looks up a contact by phone/email: Also returns: thread list, labels, assignees (user/team/AI agent), daily inbound/outbound series, support agents ranked by outbound count. Default range: 30 days for contact analytics (vs 7 days for channel tool).

WhatsApp vs other channels