View Delivery Transport Logs › Delivery Transport Log
🎬 Simulate: UC-NOT.04 harness · 3 scenarios

Delivery Transport Log

Filter
Delivery list 6 records · sorted by Queued at ↓ · click row to preview payload
Channel Delivery status Event type Recipient Queued at Sent at Delivered at Retries Error code Provider message ID Payload preview
Email Delivered Renewal Reminder Somchai Jaidee
s***@example.com
2026-06-01 08:15:01 +07 2026-06-01 08:15:02 +07 2026-06-01 08:15:05 +07 0 — sg-a1b2c3 Subject: Your subscription expiring in 7 days
Push Delivered Renewal Reminder Somchai Jaidee
s***@example.com
2026-06-01 08:15:01 +07 2026-06-01 08:15:03 +07 2026-06-01 08:15:06 +07 0 — fcm-9x8y7z {"title":"Renew now","body":"Your subscription expires soon"}
Email Delivered Course Announcement Suda Kaewmanee
s***@gmail.com
2026-05-30 09:00:01 +07 2026-05-30 09:00:02 +07 2026-05-30 09:00:08 +07 0 — sg-d4e5f6 Subject: New course available — Electrical Technician Level 3
In-App Delivered Deadline Reminder Wichai Maneeratana
w***@school.la
2026-05-28 14:30:00 +07 2026-05-28 14:30:01 +07 2026-05-28 14:30:01 +07 0 — inapp-77aa {"message":"Assignment due in 24h"}
Email Failed Payment Receipt Malee Thongdee
m***@college.la
2026-05-26 16:45:30 +07 2026-05-26 16:45:31 +07 — 3 550 Mailbox full sg-g7h8i9 Payload no longer available (90-day retention policy)
SMS Delivered OTP Verification Nattaporn Srisuk
+66-8x-xxx-x789
2026-05-27 11:02:10 +07 2026-05-27 11:02:11 +07 2026-05-27 11:02:15 +07 0 — dtac-001122 (OTP masked — not stored in payload)
Showing 1–6 of 6 records 25 per page

Screen Flow (from flow.puml):

← Event Log (UC-NOT.01) SCR-NOT.07 — Delivery Transport Log (current) ↻ filter / search (self-loop)
📝 Spec notes — UC-NOT.04 / SCR-NOT.07 (fields, actions, requirements)
Identity
  • Screen: SCR-NOT.07 — Delivery Transport Log
  • Use case: UC-NOT.04 — View Delivery Transport Logs
  • Primary actor: Super Admin
Brief description

Super Admin page for viewing the full transport-level delivery log — one row per channel per notification event. Two entry points: (1) Admin menu — full log, default date-range filter; (2) "Transport log →" from SCR-NOT.01 — pre-filtered to selected event with context label and back-navigation. Clicking any row opens Payload preview panel. Read-only — no edit, delete, or resend.

Fields — Filter panel
  • channel "Channel" — enum (all / email / sms / push / in_app) · default: all
  • delivery_status "Delivery status" — enum (all / pending / retrying / delivered / failed / failed_dlq) · default: all
  • event_type "Event type" — enum (all / otp / course_announcement / course_approval / course_rejection / deadline_reminder / live_class_start / forum_reply / payment_receipt / renewal_reminder / certificate_issued / security_alert) · default: all
  • recipient_search "Recipient (name / email / mobile partial)" — text · max 100 chars · default: ""
  • date_from "Queued date from" — datetime · default: now − 7 days · ref: NotificationDelivery.queued_at
  • date_to "Queued date to" — datetime · default: now · ref: NotificationDelivery.queued_at
  • context_event_label "Filtered event" — text · read-only · visible when entry_source == event_log · computed: event_type + " — " + masked(recipient_contact) + " — " + created_at (+07) · ref: NotificationEvent.id
Fields — Delivery list (columns, all read-only)
  • row_channel "Channel" — enum · NotificationDelivery.channel
  • row_delivery_status "Delivery status" — enum · NotificationDelivery.status
  • row_event_type "Event type" — text · NotificationEvent.event_type
  • row_recipient "Recipient" — computed: full_name + " / " + masked(email or mobile) · always partially masked
  • row_queued_at "Queued at" — datetime UTC → +07 · NotificationDelivery.queued_at
  • row_sent_at "Sent at" — datetime · null → "—" · NotificationDelivery.sent_at
  • row_delivered_at "Delivered at" — datetime · null → "—" · NotificationDelivery.delivered_at
  • row_retry_count "Retries" — number · NotificationDelivery.retry_count
  • row_error_code "Error code" — text · null → "—" · NotificationDelivery.error_code
  • row_provider_message_id "Provider message ID" — text · null → "—" · NotificationDelivery.provider_message_id
  • row_payload_preview "Payload preview" — text · truncated in column; full in panel · if expired → "Payload no longer available (90-day retention policy)" [SS-NOT.02]
Fields — Payload preview panel (visible when selected_row != null)
  • preview_row_context "Selected row" — computed: channel · event_type · masked(recipient_contact) · queued_at (+07) · read-only
  • preview_payload_content "Full payload" — NotificationDelivery.payload_preview · fallback: "Payload no longer available (90-day retention policy)" · read-only
Actions
  • apply_filter "Search" — always enabled · triggers UC-NOT.04-M-3
  • clear_filter "Clear filter" — enabled when any filter changed from default · triggers UC-NOT.04-M-1
  • back_to_event_log "← Event Log" — visible when entry_source == event_log · navigates to UC-NOT.01
  • page_prev "← Previous" — enabled when current_page > 1
  • page_next "Next →" — enabled when has_next_page
  • select_row (Row click) — always enabled · opens Payload preview panel
  • dismiss_preview "Close" — enabled when selected_row != null · dismisses Payload preview panel
Additional requirements
  1. The transport log is read-only — Admins cannot edit, delete, or trigger resend of any record.
  2. Recipient contact (email, mobile) always partially masked. No unmask function.
  3. Super Admin sees all institutions. No institution scope filter.
  4. All timestamps stored in UTC; displayed as "YYYY-MM-DD HH:mm:ss +07". Null → "—". Tooltip: UTC + relative time.
  5. row_payload_preview: if nulled after 90-day retention → "Payload no longer available (90-day retention policy)" — not "—". [SS-NOT.02]
  6. Empty state: icon + "No delivery records found — try adjusting the filter or expanding the date range." + [Clear filter].
  7. WCAG-AA: label-input pairing; status + channel columns use color and icon; row striping contrast ≥ 4.5:1. [NFR-09]
  8. Min width 1024px; below → horizontal scroll. Mobile not supported. [NFR-08]
  9. Clicking a row opens Payload preview panel below the list. Clicking same row again or "Close" dismisses it. Different row replaces panel content.
  10. Payload preview panel: if payload expired, shows "Payload no longer available (90-day retention policy)". [SS-NOT.02]