Engagement Analytics
Every campaign and journey in Engage has its own analytics view. The data lives in engagement_events, populated by webhooks from Postmark, Telnyx, and Expo as messages move through the pipeline.
Navigation
Access from Engage > Analytics, or click into a specific campaign or journey to see its detail view.
The Campaign Funnel
For every campaign, Engage shows a six-stage funnel:
| Stage | What it counts |
|---|---|
| Targeted | Rows in campaign_sends for this campaign |
| Sent | status = sent (handed off to provider successfully) |
| Delivered | Provider confirmed delivery via webhook |
| Opened | Recipient opened (email + push only; SMS has no "open" concept) |
| Clicked | Recipient clicked a tracked link |
| Converted | Hit the campaign's goal in the attribution window |
The funnel also shows drop-off counts:
- Suppressed - filtered by suppression list before send
- Bounced - provider returned bounce
- Complained - recipient marked as spam
- Unsubscribed - recipient opted out from this send
Computed Rates
Rates are computed against the most useful denominator, not always against targeted:
| Rate | Numerator | Denominator |
|---|---|---|
| Delivery rate | Delivered | Sent |
| Open rate | Opened | Delivered |
| Click rate | Clicked | Delivered (or Opened, toggle in UI) |
| CTOR (click-to-open rate) | Clicked | Opened |
| Conversion rate | Converted | Delivered |
| Bounce rate | Bounced | Sent |
| Complaint rate | Complained | Delivered |
| Unsubscribe rate | Unsubscribed | Delivered |
The default denominator for each is the industry convention. If you want a different cut, the same data is available via the analytics API.
What "Good" Looks Like
These are rough benchmarks for transactional-adjacent marketing in micromobility - your numbers will vary:
| Metric | Good | Great | Concerning |
|---|---|---|---|
| Email delivery rate | 95%+ | 99%+ | < 90% |
| Email open rate | 25%+ | 40%+ | < 15% |
| Email click rate | 3%+ | 8%+ | < 1% |
| SMS click rate | 8%+ | 15%+ | < 3% |
| Push open rate | 5%+ | 12%+ | < 2% |
| Email bounce rate | < 2% | < 0.5% | > 5% |
| Email complaint rate | < 0.1% | < 0.05% | > 0.3% |
| Unsubscribe rate | < 0.5% | < 0.2% | > 2% |
If complaint rate crosses 0.1%, Engage triggers an automatic warning. At 0.3% the per-subaccount Postmark stream is paused until support reviews.
Per-Variant Breakdown
If the campaign has A/B variants, the funnel splits per variant:
Variant A (subject: "Your scooter misses you")
Sent: 1,000
Open: 287 (28.7%)
Click: 18 (1.8%)
P(best): 12%
Variant B (subject: "Come back for 20% off")
Sent: 1,000
Open: 342 (34.2%)
Click: 42 (4.2%)
P(best): 87%
Variant C (subject: "Quick check-in")
Sent: 1,000
Open: 198 (19.8%)
Click: 9 (0.9%)
P(best): 1%
See A/B Testing for how the P(best) numbers work.
Per-Language Breakdown
For campaigns sent in multiple locales, the analytics page splits open and click rates per language. If your Spanish variant has a 45% open rate while English is at 25%, you know your Spanish copy is resonating.
Conversion Attribution
A "conversion" is hitting the campaign's configured goal within the attribution window. Common goals:
| Goal | Triggers |
|---|---|
| Took a ride | ride.ended within 7 days of send |
| Topped up wallet | wallet.topped_up within 7 days |
| Activated subscription | subscription.activated within 14 days |
| First ride | rides.total_count goes from 0 to 1 within 14 days |
The default attribution window is 7 days. Conversions are last-touch in v1 - the most recent send that the rider engaged with gets the credit.
Time-Series Charts
Every campaign and journey has a time-series chart that shows engagement events over time:
- Hourly granularity for the first 48 hours after send
- Daily granularity beyond that
- Stacked by event type (delivered, opened, clicked, bounced, complained)
This is the best view for spotting send-time problems - if you blasted at 3 PM ET and the opens cluster around 9 AM PT the next morning, you know your West Coast riders are waking up to your email instead of seeing it fresh.
Journey Analytics
For journeys, the analytics view shows:
| Metric | What it counts |
|---|---|
| Entered | journey_runs created |
| Currently active | exited_at IS NULL |
| Exited (goal hit) | Reached a goal node |
| Exited (terminal) | Reached exit node without goal |
| Goal rate | Goal-hit divided by entered |
You also get a step-by-step funnel: how many riders made it past each node, how many dropped off at the wait, how many got branched into the "if_false" path. This is how you find the step that's killing your journey performance.
Per-Subaccount Rollups
The top-level Analytics page rolls up metrics across all campaigns and journeys in your subaccount:
- Total sends this month (per channel)
- Aggregate open / click / conversion rates
- Top 10 campaigns by conversion count
- Top 10 journeys by goal hits
- Unsubscribe trend (with alert if growing > 1% per month)
Exporting
Click Export on any analytics view to download:
- Funnel CSV
- Per-variant CSV
- Per-event CSV (raw
engagement_eventsrows)
The export honors RLS - you only get rows for your subaccount.
Webhook Backlog
If your analytics look frozen ("delivered" stuck at 0 even though sends went out hours ago), the provider webhook ingest may be backed up. Check Engage > Settings > Diagnostics for webhook lag - normal is under 10 seconds.
Retention
engagement_events has 90 days of hot retention. After 90 days, events are archived to cold storage via the nightly engage-archive cron. Aggregate analytics (totals, rates) remain available indefinitely - the raw per-event timestamps are what gets archived.
If you need older raw events for a regulatory request or deep analysis, contact support for an archive restore.
Best Practices
- Tag your campaigns consistently. Use a naming convention like
[date] [audience] [campaign]so you can scan the list later. - Define goals up front. A campaign without a goal is just a vanity metric. "Top-up rate within 7 days" is a goal. "Open rate" is not.
- Watch the trend, not the snapshot. A single campaign's open rate is noisy. The 30-day average is signal.
- Spot suppression drift. If your "delivered" count is 80% of "sent" instead of 99%, you have a deliverability problem - usually a dirty list or a deliverability-related complaint cycle.
Troubleshooting
Delivered count is much lower than sent
Either bounces are spiking (check the bounce rate) or provider webhooks are backed up (check Diagnostics).
Open rate is unusually high (60%+)
Apple Mail Privacy Protection inflates open rates by pre-fetching pixel-tracker images. Numbers above 50% on email are not believable without correction. Use click rate as your primary signal.
Click rate is 0% but Postmark shows clicks
Check that the campaign template's links use the Engage click-tracking wrapper. If you hand-rolled an <a href> without the wrapper, Postmark may track it but Engage won't see the event.
Need Help?
For analytics help, contact support@levyelectric.com.