Patient Portal & Mobile App KPIs & Reporting

Patient Portal & Mobile App KPIs & Reporting

KPI Summary

KPI ID KPI Name Formula (Conceptual) Target Data Source Frequency
KPI-PPT-001 Portal Adoption Rate Active portal accounts / Active patients × 100 ≥ 40% (Year 1), ≥ 70% (Year 2) portal_accounts, patients Monthly
KPI-PPT-002 Monthly Active Users (MAU) Count of distinct accounts with ≥1 login in last 30 days Growing month-over-month portal_sessions, portal_accounts Monthly
KPI-PPT-003 Online Appointment Booking Rate Portal-booked appointments / Total appointments × 100 ≥ 25% appointments (with source_module = 'patient-portal') Monthly
KPI-PPT-004 Secure Message Response Time Avg(provider first response datetime − patient message datetime) ≤ 24 hours portal_messages, providers, departments Weekly
KPI-PPT-005 Online Payment Adoption Portal payments / Total patient payments × 100 ≥ 30% patient_payments (with payment_source), patient_invoices Monthly
KPI-PPT-006 Pre-Registration Completion via Portal Portal-completed pre-registrations / Total pre-registrations × 100 ≥ 50% patient_submitted_forms, pre_registration_records (external) Monthly
KPI-PPT-007 Telehealth Utilization Rate Telehealth encounters / Total outpatient encounters × 100 ≥ 10% telehealth_sessions, encounters Monthly
KPI-PPT-008 Patient Satisfaction Score Average rating from portal feedback (1–5) ≥ 4.2 / 5.0 portal_feedback, encounters, telehealth_sessions Monthly
KPI-PPT-009 App Store Rating Average of iOS and Android store ratings ≥ 4.0 stars External: App Store Connect, Google Play Console Monthly
KPI-PPT-010 Result View Rate Results viewed by patient within 7 days / Total results released to portal × 100 ≥ 50% portal_sessions, result_access_logs, lab_results, radiology_reports, patient_accounts Monthly

Note: Table names for shared entities (e.g., patients, appointments, encounters, patient_invoices) are owned by other modules as per shared entity rules. This document assumes those names as defined in their respective 03-data-specifications files.


KPI Definitions

KPI-PPT-001: Portal Adoption Rate

Definition

Percentage of active patients who have an active, linked portal account. Measures digital engagement and success of portal rollout. Important for DOH/DHA digital health strategies and for maximizing paperless interactions.

Calculation Formula

SQL
-- Denominator: active patients in the period
WITH active_patients AS (
    SELECT p.patient_id
    FROM patients p
    WHERE p.is_active = TRUE
      AND p.status IN ('active', 'follow_up')  -- as defined in patient master
),

-- Numerator: active patients with active portal accounts
patients_with_portal AS (
    SELECT DISTINCT pa.patient_id
    FROM portal_accounts pa
    JOIN active_patients ap ON ap.patient_id = pa.patient_id
    WHERE pa.is_active = TRUE
      AND pa.activation_status = 'activated'
      AND pa.activation_date <= :period_end
)

SELECT
    COUNT(*) FILTER (WHERE ap.patient_id IN (SELECT patient_id FROM patients_with_portal))
        * 100.0
        / NULLIF(COUNT(*), 0) AS portal_adoption_rate_pct
FROM active_patients ap;

Target / Benchmark

Metric Target Source / Rationale
Portal Adoption Rate ≥ 40% in Year 1, ≥ 70% in Year 2 Internal Gates Group target aligned with GCC peers and DOH/DHA digital front-door initiatives

Data Source

  • portal_accounts
  • portal_accounts.patient_id
  • portal_accounts.is_active
  • portal_accounts.activation_status
  • portal_accounts.activation_date
  • patients
  • patients.patient_id
  • patients.is_active
  • patients.status

Dimensions / Filters

  • Time: month, quarter, year (based on activation_date and patient status at period end)
  • Facility: patients.facility_id
  • Department: primary care vs specialty (via patients.primary_department_id if available)
  • Payer: patients.primary_payer_id (e.g., THIQA, Daman, Oman Insurance)
  • Emirate: via facilities.emirate

Visualization

  • Primary: Line chart (monthly adoption rate trend with target line).
  • Secondary: Bar chart by facility and payer.

Alert Thresholds

  • Warning: Adoption rate < 60% of year-specific target for 2 consecutive months.
  • Critical: Adoption rate < 50% of year-specific target for 3 consecutive months.
  • Notifications:
  • Portal Administrator
  • Chief Medical Officer / Chief Digital Officer
  • Facility Operations Manager

KPI-PPT-002: Monthly Active Users (MAU)

Definition

Number of distinct portal accounts that logged in at least once in the last 30 days. Measures ongoing engagement and usability of the portal/mobile app.

Calculation Formula

SQL
SELECT
    COUNT(DISTINCT ps.account_id) AS monthly_active_users
FROM portal_sessions ps
JOIN portal_accounts pa ON pa.account_id = ps.account_id
WHERE ps.login_datetime >= :period_start
  AND ps.login_datetime < :period_end
  AND pa.is_active = TRUE
  AND pa.activation_status = 'activated';

For a rolling 30-day MAU, set :period_start = current_date - INTERVAL '30 days' and :period_end = current_date.

Target / Benchmark

Metric Target Source / Rationale
MAU Positive MoM growth (≥ 5%) Internal engagement target for UAE market

Data Source

  • portal_sessions
  • portal_sessions.session_id
  • portal_sessions.account_id
  • portal_sessions.login_datetime
  • portal_sessions.device_type, device_os
  • portal_accounts
  • portal_accounts.account_id
  • portal_accounts.is_active
  • portal_accounts.activation_status

Dimensions / Filters

  • Time: daily, weekly, monthly (rolling 30 days)
  • Facility: via portal_accounts.patient_id → patients.facility_id
  • Device type: portal_sessions.device_type (web, iOS, Android)
  • Emirate: via facility
  • Language: portal_accounts.language_preference

Visualization

  • Line chart: MAU trend over time.
  • Stacked bar: MAU by device type or language.

Alert Thresholds

  • Warning: MAU decreases > 10% month-over-month.
  • Critical: MAU decreases > 20% month-over-month or 2 consecutive months of decline.
  • Notifications:
  • Portal Administrator
  • IT / Digital Engagement Lead
  • Marketing / Communications team

KPI-PPT-003: Online Appointment Booking Rate

Definition

Percentage of all appointments that are booked via the patient portal/mobile app. Indicates success of self-service scheduling and reduction in call-centre load.

Calculation Formula

SQL
-- Total appointments in period
WITH total_appts AS (
    SELECT a.appointment_id
    FROM appointments a
    WHERE a.scheduled_datetime >= :period_start
      AND a.scheduled_datetime < :period_end
      AND a.status IN ('scheduled', 'completed')
),

-- Appointments booked via portal
portal_appts AS (
    SELECT a.appointment_id
    FROM appointments a
    WHERE a.scheduled_datetime >= :period_start
      AND a.scheduled_datetime < :period_end
      AND a.status IN ('scheduled', 'completed')
      AND a.source_module = 'patient-portal'
)

SELECT
    COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM total_appts), 0)
        AS online_booking_rate_pct
FROM portal_appts;

Target / Benchmark

Metric Target Source / Rationale
Online Appointment Booking Rate ≥ 25% Internal target; aligned with GCC benchmarks

Data Source

  • appointments
  • appointments.appointment_id
  • appointments.scheduled_datetime
  • appointments.status
  • appointments.source_module (e.g., patient-portal, call-centre, walk-in)
  • appointments.facility_id
  • appointments.department_id
  • appointments.provider_id
  • appointments.appointment_type (in-person, telehealth)

Dimensions / Filters

  • Time: day, week, month, quarter
  • Facility: appointments.facility_id
  • Department: appointments.department_id
  • Provider: appointments.provider_id
  • Appointment type: new vs follow-up, telehealth vs in-person
  • Payer: via encounters or pre_registration_records if linked

Visualization

  • Line chart: overall online booking rate trend.
  • Bar chart: rate by facility/department.
  • Pie chart: booking channels (portal vs phone vs in-person).

Alert Thresholds

  • Warning: Rate < 20% for 2 consecutive months.
  • Critical: Rate < 15% for 3 consecutive months or sharp drop (>10% points) in one month.
  • Notifications:
  • Portal Administrator
  • Scheduling Manager
  • Call Centre Supervisor

KPI-PPT-004: Secure Message Response Time

Definition

Average time taken for providers to respond to patient-initiated secure messages. Measures responsiveness and patient experience.

  • Only counts threads where the first message in the thread is from a patient and at least one provider response exists.

Calculation Formula

SQL
-- Identify patient-initiated threads and first provider response
WITH patient_threads AS (
    SELECT
        pm.thread_id,
        MIN(pm.sent_datetime) AS patient_first_msg_time
    FROM portal_messages pm
    WHERE pm.sender_type = 'patient'
    GROUP BY pm.thread_id
),
provider_first_response AS (
    SELECT
        pm.thread_id,
        MIN(pm.sent_datetime) AS provider_first_response_time
    FROM portal_messages pm
    WHERE pm.sender_type = 'provider'
    GROUP BY pm.thread_id
),
response_pairs AS (
    SELECT
        pt.thread_id,
        pt.patient_first_msg_time,
        pr.provider_first_response_time
    FROM patient_threads pt
    JOIN provider_first_response pr
      ON pr.thread_id = pt.thread_id
    WHERE pt.patient_first_msg_time >= :period_start
      AND pt.patient_first_msg_time < :period_end
      AND pr.provider_first_response_time IS NOT NULL
)

SELECT
    AVG(EXTRACT(EPOCH FROM (provider_first_response_time - patient_first_msg_time)) / 3600.0)
        AS avg_response_time_hours
FROM response_pairs;

Target / Benchmark

Metric Target Source / Rationale
Avg Secure Message Response Time ≤ 24 hours Internal SLA; aligned with UAE patient experience goals

Data Source

  • portal_messages
  • portal_messages.message_id
  • portal_messages.thread_id
  • portal_messages.sender_id
  • portal_messages.sender_type ('patient' / 'provider')
  • portal_messages.recipient_id
  • portal_messages.recipient_type
  • portal_messages.sent_datetime
  • portal_messages.read_datetime
  • portal_messages.is_urgent
  • portal_messages.encounter_id
  • providers, departments (for stratification)

Dimensions / Filters

  • Time: week, month
  • Facility: via providers.facility_id
  • Department: via providers.department_id
  • Provider: portal_messages.recipient_id where recipient_type = 'provider'
  • Message type: clinical vs administrative (if coded)
  • Urgent flag: is_urgent

Visualization

  • Line chart: average response time by week.
  • Bar chart: response time by department/provider.
  • Gauge: current month average vs 24-hour target.

Alert Thresholds

  • Warning: Average response time > 24 hours for any department for 2 consecutive weeks.
  • Critical: Average response time > 48 hours overall or > 72 hours for any provider group.
  • Notifications:
  • Department Heads
  • Chief Medical Officer
  • Portal Administrator

KPI-PPT-005: Online Payment Adoption

Definition

Percentage of patient payments that are made via the portal/mobile app vs all patient-originated payments. Reflects success of digital billing and supports paperless transformation.

Calculation Formula

SQL
-- Total patient payments
WITH total_payments AS (
    SELECT pp.payment_id
    FROM patient_payments pp
    WHERE pp.payment_datetime >= :period_start
      AND pp.payment_datetime < :period_end
      AND pp.payment_status = 'posted'
),

-- Payments via portal
portal_payments AS (
    SELECT pp.payment_id
    FROM patient_payments pp
    WHERE pp.payment_datetime >= :period_start
      AND pp.payment_datetime < :period_end
      AND pp.payment_status = 'posted'
      AND pp.payment_source = 'patient-portal'
)

SELECT
    COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM total_payments), 0)
        AS online_payment_adoption_pct
FROM portal_payments;

Target / Benchmark

Metric Target Source / Rationale
Online Payment Adoption ≥ 30% Internal target for UAE private sector peers

Data Source

  • patient_payments (billing-claims module)
  • patient_payments.payment_id
  • patient_payments.invoice_id
  • patient_payments.payment_datetime
  • patient_payments.payment_status
  • patient_payments.payment_source ('patient-portal', 'cashier', 'kiosk', etc.)
  • patient_payments.amount
  • patient_invoices
  • patient_invoices.invoice_id
  • patient_invoices.facility_id
  • patient_invoices.payer_id

Dimensions / Filters

  • Time: month, quarter
  • Facility: patient_invoices.facility_id
  • Payer: patient_invoices.payer_id
  • Payment method: card, Apple Pay, bank transfer (if captured)
  • Emirate: via facility

Visualization

  • Line chart: online payment adoption over time.
  • Stacked bar: payment channels by facility.
  • Pie chart: payment channels for latest month.

Alert Thresholds

  • Warning: Adoption < 25% for 2 consecutive months.
  • Critical: Adoption < 20% or sudden drop > 10% points in a month.
  • Notifications:
  • Revenue Cycle Manager
  • Portal Administrator
  • Finance Director

KPI-PPT-006: Pre-Registration Completion via Portal

Definition

Percentage of pre-registration records (for upcoming visits) that are completed online via the portal, including demographics, medical history, and consents. Reduces front-desk workload and supports PDPL-compliant digital consent capture.

Calculation Formula

SQL
-- Total pre-registrations for the period
WITH total_pre_regs AS (
    SELECT pr.pre_registration_id
    FROM pre_registration_records pr
    WHERE pr.created_datetime >= :period_start
      AND pr.created_datetime < :period_end
),

-- Pre-registrations completed via portal
portal_pre_regs AS (
    SELECT DISTINCT pr.pre_registration_id
    FROM pre_registration_records pr
    JOIN patient_submitted_forms psf
      ON psf.target_module = 'patient-access'
     AND psf.form_type = 'pre_registration'
     AND psf.form_external_ref = pr.pre_registration_id  -- FK or mapping field
    WHERE psf.submitted_datetime >= :period_start
      AND psf.submitted_datetime < :period_end
      AND psf.processed = TRUE
)

SELECT
    COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM total_pre_regs), 0)
        AS pre_registration_via_portal_pct
FROM portal_pre_regs;

Note: form_external_ref is an assumed mapping field between patient_submitted_forms and pre_registration_records (to be defined in data specs).

Target / Benchmark

Metric Target Source / Rationale
Pre-Registration Completion via Portal ≥ 50% Internal target; supports paperless front desk

Data Source

  • patient_submitted_forms
  • patient_submitted_forms.form_id
  • patient_submitted_forms.account_id
  • patient_submitted_forms.patient_id
  • patient_submitted_forms.form_type
  • patient_submitted_forms.form_data_json
  • patient_submitted_forms.submitted_datetime
  • patient_submitted_forms.processed
  • patient_submitted_forms.target_module
  • patient_submitted_forms.form_external_ref (link to pre-registration)
  • pre_registration_records (patient-access module)
  • pre_registration_records.pre_registration_id
  • pre_registration_records.created_datetime
  • pre_registration_records.facility_id
  • pre_registration_records.appointment_id

Dimensions / Filters

  • Time: month, quarter
  • Facility: pre_registration_records.facility_id
  • Department: via appointments.department_id
  • Appointment type: new vs follow-up
  • Payer: via linked appointment/encounter

Visualization

  • Line chart: portal pre-registration rate trend.
  • Bar chart: rate by facility/department.

Alert Thresholds

  • Warning: Rate < 40% for 2 consecutive months.
  • Critical: Rate < 30% or decline > 15% points in a quarter.
  • Notifications:
  • Registration / Front Desk Manager
  • Portal Administrator
  • Quality & Patient Experience Lead

KPI-PPT-007: Telehealth Utilization Rate

Definition

Percentage of outpatient encounters conducted via telehealth (video sessions) vs total outpatient encounters. Measures adoption of digital care delivery.

Calculation Formula

SQL
-- Total outpatient encounters
WITH total_outpatient AS (
    SELECT e.encounter_id
    FROM encounters e
    WHERE e.encounter_datetime >= :period_start
      AND e.encounter_datetime < :period_end
      AND e.encounter_type = 'outpatient'
      AND e.status IN ('completed', 'in_progress')
),

-- Telehealth encounters (linked to telehealth sessions)
telehealth_encounters AS (
    SELECT DISTINCT ts.encounter_id
    FROM telehealth_sessions ts
    JOIN encounters e ON e.encounter_id = ts.encounter_id
    WHERE e.encounter_datetime >= :period_start
      AND e.encounter_datetime < :period_end
      AND e.encounter_type = 'outpatient'
      AND ts.end_datetime IS NOT NULL
)

SELECT
    COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM total_outpatient), 0)
        AS telehealth_utilization_rate_pct
FROM telehealth_encounters;

Target / Benchmark

Metric Target Source / Rationale
Telehealth Utilization Rate ≥ 10% Internal target; aligned with post-COVID UAE telehealth adoption

Data Source

  • telehealth_sessions
  • telehealth_sessions.session_id
  • telehealth_sessions.appointment_id
  • telehealth_sessions.patient_account_id
  • telehealth_sessions.provider_id
  • telehealth_sessions.scheduled_datetime
  • telehealth_sessions.join_datetime_patient
  • telehealth_sessions.join_datetime_provider
  • telehealth_sessions.end_datetime
  • telehealth_sessions.duration_minutes
  • telehealth_sessions.connection_quality
  • telehealth_sessions.platform
  • telehealth_sessions.encounter_id
  • encounters
  • encounters.encounter_id
  • encounters.encounter_datetime
  • encounters.encounter_type
  • encounters.facility_id
  • encounters.department_id
  • encounters.provider_id

Dimensions / Filters

  • Time: week, month, quarter
  • Facility: encounters.facility_id
  • Department: encounters.department_id
  • Provider: encounters.provider_id
  • Payer: encounters.payer_id
  • Connection quality: telehealth_sessions.connection_quality

Visualization

  • Line chart: telehealth utilization rate over time.
  • Bar chart: rate by facility/department.
  • Table: telehealth volume and no-show rate.

Alert Thresholds

  • Warning: Rate < 8% for 2 consecutive months (where telehealth is offered).
  • Critical: Rate < 5% or sudden drop > 50% in a month.
  • Notifications:
  • Telehealth Program Lead
  • Portal Administrator
  • Operations Manager

KPI-PPT-008: Patient Satisfaction Score (Portal/Telehealth)

Definition

Average rating (1–5) submitted by patients via the portal feedback mechanism, including visit-specific (e.g., telehealth) and general portal experience.

Calculation Formula

SQL
SELECT
    AVG(pf.rating) AS avg_patient_satisfaction_score
FROM portal_feedback pf
WHERE pf.submitted_datetime >= :period_start
  AND pf.submitted_datetime < :period_end
  AND pf.feedback_type IN ('portal_experience', 'telehealth_visit');

Target / Benchmark

Metric Target Source / Rationale
Patient Satisfaction Score ≥ 4.2/5 Internal target; aligned with UAE private hospital benchmarks

Data Source

  • portal_feedback
  • portal_feedback.feedback_id
  • portal_feedback.account_id
  • portal_feedback.feedback_type ('portal_experience', 'telehealth_visit', etc.)
  • portal_feedback.encounter_id
  • portal_feedback.rating (1–5)
  • portal_feedback.comments
  • portal_feedback.submitted_datetime
  • telehealth_sessions, encounters for context

Dimensions / Filters

  • Time: month, quarter
  • Feedback type: portal vs telehealth
  • Facility: via linked encounters.facility_id
  • Department: via encounters.department_id
  • Provider: via encounters.provider_id
  • Device type: via portal_sessions (if linked by session/account)

Visualization

  • Gauge: current average satisfaction vs target.
  • Line chart: trend over time.
  • Bar chart: satisfaction by facility/department.

Alert Thresholds

  • Warning: Score < 4.0 for 2 consecutive months.
  • Critical: Score < 3.5 or drop ≥ 0.5 points in a quarter.
  • Notifications:
  • Quality & Patient Experience Lead
  • Portal Administrator
  • Facility Medical Director

KPI-PPT-009: App Store Rating

Definition

Average public rating of the patient mobile app across iOS (App Store) and Android (Google Play) for the UAE region. Reflects perceived usability and stability.

Calculation Formula

Data is retrieved from external analytics (App Store Connect, Google Play Console) and stored in an internal table, e.g., mobile_app_store_metrics.

SQL
SELECT
    (ios.avg_rating * ios.rating_weight + android.avg_rating * android.rating_weight)
        / NULLIF((ios.rating_weight + android.rating_weight), 0) AS combined_app_store_rating
FROM (
    SELECT
        platform,
        AVG(rating) AS avg_rating,
        COUNT(*) AS rating_weight
    FROM mobile_app_store_metrics
    WHERE snapshot_date >= :period_start
      AND snapshot_date < :period_end
      AND region = 'AE'
      AND platform = 'iOS'
    GROUP BY platform
) ios,
(
    SELECT
        platform,
        AVG(rating) AS avg_rating,
        COUNT(*) AS rating_weight
    FROM mobile_app_store_metrics
    WHERE snapshot_date >= :period_start
      AND snapshot_date < :period_end
      AND region = 'AE'
      AND platform = 'Android'
    GROUP BY platform
) android;

If only summary ratings are stored (not individual reviews), use the latest snapshot per platform and average them.

Target / Benchmark

Metric Target Source / Rationale
App Store Rating ≥ 4.0 stars Internal target; competitive UAE apps

Data Source

  • mobile_app_store_metrics (internal integration table)
  • mobile_app_store_metrics.platform ('iOS', 'Android')
  • mobile_app_store_metrics.region ('AE')
  • mobile_app_store_metrics.snapshot_date
  • mobile_app_store_metrics.rating
  • mobile_app_store_metrics.review_count (optional)

Dimensions / Filters

  • Time: month, quarter
  • Platform: iOS vs Android
  • Region: UAE (AE) vs others (if multi-region)

Visualization

  • Gauge: current combined rating vs target.
  • Bar chart: rating by platform.
  • Line chart: rating trend over time.

Alert Thresholds

  • Warning: Combined rating < 4.0 or any platform < 3.8.
  • Critical: Any platform rating < 3.5 or drop ≥ 0.5 points in a quarter.
  • Notifications:
  • Portal Administrator
  • Mobile Development Team Lead
  • Marketing / Communications

KPI-PPT-010: Result View Rate

Definition

Percentage of lab and radiology results released to the portal that are viewed by the patient within 7 days of release. Indicates patient engagement with clinical information and effectiveness of notifications.

Calculation Formula

Assumptions:

  • lab_results and radiology_reports have a released_to_portal_datetime.
  • Result views are logged in result_access_logs (owned by this module or EHR) with result_type and result_id.
SQL
-- All results released to portal in period
WITH released_results AS (
    SELECT
        'lab' AS result_type,
        lr.result_id,
        lr.patient_id,
        lr.released_to_portal_datetime
    FROM lab_results lr
    WHERE lr.released_to_portal_datetime >= :period_start
      AND lr.released_to_portal_datetime < :period_end

    UNION ALL

    SELECT
        'radiology' AS result_type,
        rr.report_id AS result_id,
        rr.patient_id,
        rr.released_to_portal_datetime
    FROM radiology_reports rr
    WHERE rr.released_to_portal_datetime >= :period_start
      AND rr.released_to_portal_datetime < :period_end
),

-- First view within 7 days
views_within_7d AS (
    SELECT DISTINCT
        rr.result_type,
        rr.result_id
    FROM released_results rr
    JOIN result_access_logs ral
      ON ral.result_type = rr.result_type
     AND ral.result_id = rr.result_id
    WHERE ral.viewed_datetime <= rr.released_to_portal_datetime + INTERVAL '7 days'
)

SELECT
    COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM released_results), 0)
        AS result_view_rate_pct
FROM views_within_7d;

Target / Benchmark

Metric Target Source / Rationale
Result View Rate ≥ 50% Internal target; aligns with engaged patient populations

Data Source

  • lab_results (LIS)
  • lab_results.result_id
  • lab_results.patient_id
  • lab_results.released_to_portal_datetime
  • radiology_reports (RIS)
  • radiology_reports.report_id
  • radiology_reports.patient_id
  • radiology_reports.released_to_portal_datetime
  • result_access_logs (portal/EHR)
  • result_access_logs.log_id
  • result_access_logs.account_id
  • result_access_logs.patient_id
  • result_access_logs.result_type ('lab', 'radiology')
  • result_access_logs.result_id
  • result_access_logs.viewed_datetime
  • portal_accounts, patients for stratification

Dimensions / Filters

  • Time: month, quarter
  • Facility: via patients.facility_id
  • Department: ordering department (via orders if linked)
  • Result type: lab vs radiology
  • Test category: e.g., imaging modality, lab panel
  • Payer: via patients.primary_payer_id

Visualization

  • Line chart: overall result view rate trend.
  • Bar chart: view rate by result type and facility.
  • Table: top tests with low view rates.

Alert Thresholds

  • Warning: View rate < 45% for 2 consecutive months.
  • Critical: View rate < 35% or sustained decline over 3 months.
  • Notifications:
  • Portal Administrator
  • Quality & Patient Experience Lead
  • Laboratory and Radiology Department Heads

Standard Reports

Report ID Report Name Purpose Audience Frequency Format
RPT-PPT-001 Portal Adoption & MAU Dashboard Monitor portal adoption, MAU, and engagement across facilities and payers CDO, Portal Admin, Facility Managers Real-time / Daily Interactive dashboard (HTML)
RPT-PPT-002 Online Scheduling & Telehealth Utilization Track online booking rate and telehealth utilization by facility, department, provider Scheduling Manager, Telehealth Lead Weekly / Monthly Dashboard + Excel export
RPT-PPT-003 Digital Billing & Payment Adoption Monitor online payment adoption, amounts, and payer mix Revenue Cycle Manager, Finance Director Monthly PDF + Excel
RPT-PPT-004 Secure Messaging SLA Compliance Monitor secure message volumes and response times vs SLA Department Heads, CMO, Portal Admin Weekly Dashboard + PDF
RPT-PPT-005 Patient Experience & Feedback (Portal/Telehealth) Analyse satisfaction scores, comments, and trends Quality & Patient Experience, Medical Director Monthly Dashboard + CSV comments
RPT-PPT-006 Pre-Registration & Digital Forms Completion Track portal-based pre-registration and form completion rates Registration Manager, Operations Monthly Dashboard + Excel
RPT-PPT-007 Result Engagement Report Monitor result view rates and identify low-engagement areas Clinical Governance, Lab/Radiology Heads Monthly PDF + Dashboard
RPT-PPT-008 Mobile App Performance & Store Ratings Track app store ratings, crash reports (if integrated), and device usage IT, Mobile Dev Team, Portal Admin Monthly Dashboard
RPT-PPT-009 UAE PDPL Access & Consent Audit Provide audit trail of patient access, consent acceptance, and data export requests DPO, Compliance Officer Quarterly / On-demand PDF (signed)
RPT-PPT-010 NABIDH/Malaffi Portal Data Access Summary Summarise patient-initiated data access and sharing relevant to HIE participation HIE Liaison, Compliance, IT Quarterly PDF + CSV

Dashboard Wireframe

Below is an HTML wireframe mockup for the Portal Management Dashboard used by Portal Administrators and leadership.

Show HTML code
HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Patient Portal Management Dashboard</title>
</head>
<body style="font-family: Arial, sans-serif; background:#f5f5f5; margin:0; padding:0;">
  <header style="background:#004b8d; color:#fff; padding:16px 24px;">
    <h1 style="margin:0; font-size:20px;">Patient Portal &amp; Mobile App Dashboard</h1>
    <div style="margin-top:8px; font-size:12px;">
      <span>Facility:</span>
      <select style="margin-right:8px;">
        <option>All Facilities</option>
        <option>Dubai General Hospital</option>
        <option>Abu Dhabi City Hospital</option>
      </select>
      <span>Period:</span>
      <select>
        <option>Last 30 days</option>
        <option>Last 90 days</option>
        <option>Year to Date</option>
      </select>
    </div>
  </header>

  <main style="padding:16px 24px;">
    <!-- KPI Cards Row 1 -->
    <section style="display:flex; flex-wrap:wrap; gap:12px; margin-bottom:16px;">
      <div style="flex:1; min-width:200px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <div style="font-size:12px; color:#666;">Portal Adoption Rate</div>
        <div style="font-size:24px; font-weight:bold;">68.4%</div>
        <div style="font-size:11px; color:#0a8a0a;">▲ +4.2% vs last month</div>
      </div>
      <div style="flex:1; min-width:200px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <div style="font-size:12px; color:#666;">Monthly Active Users (MAU)</div>
        <div style="font-size:24px; font-weight:bold;">12,845</div>
        <div style="font-size:11px; color:#0a8a0a;">▲ +7.1% MoM</div>
      </div>
      <div style="flex:1; min-width:200px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <div style="font-size:12px; color:#666;">Online Booking Rate</div>
        <div style="font-size:24px; font-weight:bold;">31.2%</div>
        <div style="font-size:11px; color:#e67e22;">▲ +1.0% (Target ≥ 25%)</div>
      </div>
      <div style="flex:1; min-width:200px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <div style="font-size:12px; color:#666;">Online Payment Adoption</div>
        <div style="font-size:24px; font-weight:bold;">27.5%</div>
        <div style="font-size:11px; color:#c0392b;">▼ -3.0% vs last month</div>
      </div>
    </section>

    <!-- KPI Cards Row 2 -->
    <section style="display:flex; flex-wrap:wrap; gap:12px; margin-bottom:16px;">
      <div style="flex:1; min-width:200px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <div style="font-size:12px; color:#666;">Telehealth Utilization</div>
        <div style="font-size:24px; font-weight:bold;">12.1%</div>
        <div style="font-size:11px; color:#0a8a0a;">On Target (≥ 10%)</div>
      </div>
      <div style="flex:1; min-width:200px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <div style="font-size:12px; color:#666;">Avg Message Response Time</div>
        <div style="font-size:24px; font-weight:bold;">18.4 h</div>
        <div style="font-size:11px; color:#0a8a0a;">Within 24h SLA</div>
      </div>
      <div style="flex:1; min-width:200px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <div style="font-size:12px; color:#666;">Patient Satisfaction (Portal)</div>
        <div style="font-size:24px; font-weight:bold;">4.3 / 5</div>
        <div style="font-size:11px; color:#0a8a0a;">▲ +0.2 vs last quarter</div>
      </div>
      <div style="flex:1; min-width:200px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <div style="font-size:12px; color:#666;">App Store Rating (AE)</div>
        <div style="font-size:24px; font-weight:bold;">4.1 ★</div>
        <div style="font-size:11px; color:#e67e22;">Near Target (≥ 4.0)</div>
      </div>
    </section>

    <!-- Charts Row -->
    <section style="display:flex; flex-wrap:wrap; gap:16px; margin-bottom:16px;">
      <div style="flex:2; min-width:320px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <h2 style="margin:0 0 8px 0; font-size:14px;">Portal Adoption &amp; MAU Trend</h2>
        <div style="height:200px; border:1px dashed #ccc; text-align:center; line-height:200px; color:#999; font-size:12px;">
          Line chart placeholder (Adoption %, MAU over last 12 months)
        </div>
      </div>
      <div style="flex:1; min-width:260px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <h2 style="margin:0 0 8px 0; font-size:14px;">Channel Breakdown</h2>
        <div style="height:200px; border:1px dashed #ccc; text-align:center; line-height:200px; color:#999; font-size:12px;">
          Pie / bar chart placeholder (Bookings &amp; Payments by channel)
        </div>
      </div>
    </section>

    <!-- Lower Row: Tables -->
    <section style="display:flex; flex-wrap:wrap; gap:16px;">
      <div style="flex:1; min-width:320px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <h2 style="margin:0 0 8px 0; font-size:14px;">Facilities Overview</h2>
        <table style="width:100%; border-collapse:collapse; font-size:12px;">
          <thead>
            <tr>
              <th style="border-bottom:1px solid #ddd; text-align:left; padding:4px;">Facility</th>
              <th style="border-bottom:1px solid #ddd; text-align:right; padding:4px;">Adoption %</th>
              <th style="border-bottom:1px solid #ddd; text-align:right; padding:4px;">Online Booking %</th>
              <th style="border-bottom:1px solid #ddd; text-align:right; padding:4px;">Telehealth %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td style="border-bottom:1px solid #f0f0f0; padding:4px;">Dubai General Hospital</td>
              <td style="border-bottom:1px solid #f0f0f0; padding:4px; text-align:right;">72%</td>
              <td style="border-bottom:1px solid #f0f0f0; padding:4px; text-align:right;">35%</td>
              <td style="border-bottom:1px solid #f0f0f0; padding:4px; text-align:right;">14%</td>
            </tr>
            <tr>
              <td style="border-bottom:1px solid #f0f0f0; padding:4px;">Abu Dhabi City Hospital</td>
              <td style="border-bottom:1px solid #f0f0f0; padding:4px; text-align:right;">65%</td>
              <td style="border-bottom:1px solid #f0f0f0; padding:4px; text-align:right;">28%</td>
              <td style="border-bottom:1px solid #f0f0f0; padding:4px; text-align:right;">10%</td>
            </tr>
          </tbody>
        </table>
      </div>

      <div style="flex:1; min-width:320px; background:#fff; border-radius:4px; padding:12px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
        <h2 style="margin:0 0 8px 0; font-size:14px;">Alerts &amp; SLA Breaches</h2>
        <ul style="margin:0; padding-left:16px; font-size:12px;">
          <li style="margin-bottom:4px; color:#c0392b;">Online payment adoption below target at Abu Dhabi City Hospital (24%).</li>
          <li style="margin-bottom:4px; color:#e67e22;">Average message response time in Cardiology: 26h (near SLA).</li>
          <li style="margin-bottom:4px; color:#27ae60;">All other KPIs within thresholds.</li>
        </ul>
      </div>
    </section>
  </main>
</body>
</html>

Regulatory Reports

All regulatory references are UAE-specific. The patient portal module primarily supports evidence and audit for compliance rather than direct transactional submissions.

1. MOH (Ministry of Health and Prevention)

While MOH does not typically require a dedicated “portal” report, the following data from the portal supports MOH expectations around digital health and patient safety:

  • MOH-DIG-001: Patient Access to Health Information Summary
  • Content:
    • Number of patients with portal access by emirate and facility.
    • Volume of lab and radiology results viewed by patients.
    • Telehealth encounter counts (where MOH-licensed facilities).
  • Source Tables:
    • portal_accounts, lab_results, radiology_reports, telehealth_sessions, encounters.
  • Frequency: Quarterly (on-demand for inspections).
  • Format: PDF with summary tables and charts; CSV annex.

2. DOH (Abu Dhabi) – Malaffi & ADHICS

  • DOH-ADHICS-LOG-001: Patient Portal Access Audit (Abu Dhabi Facilities)
  • Purpose: Demonstrate compliance with ADHICS logging requirements for patient access to EHR data.
  • Content:
    • Log of portal sessions (portal_sessions) including timestamp, device type, IP (pseudonymised where required).
    • Result access logs for Malaffi-related data (if tagged).
    • Summary of failed login attempts and lockouts.
  • Frequency: On-demand; at least annually for internal audit.
  • Format: CSV export with filters by date and facility.

  • DOH-MAL-ENG-001: Patient Engagement with Shared Data (Malaffi)

  • Purpose: Internal report to show how often patients view data that originates from Malaffi-connected sources.
  • Content:
    • Count of results and documents tagged as “from Malaffi” that are viewed in the portal.
  • Source:
    • patient_documents with source_system = 'Malaffi'
    • result_access_logs
  • Frequency: Quarterly.

3. DHA (Dubai) – NABIDH & eHealth

  • DHA-NAB-ENG-001: NABIDH Data Access via Portal
  • Purpose: Demonstrate that patients can access NABIDH-shared data and measure engagement.
  • Content:
    • Number of NABIDH-tagged documents/results released to portal vs viewed.
    • Portal adoption rate for Dubai facilities.
  • Source:
    • patient_documents with source_system = 'NABIDH'
    • lab_results, radiology_reports with NABIDH flags (if any)
    • result_access_logs
  • Frequency: Quarterly.

4. UAE PDPL (Federal Decree-Law No. 45/2021)

The portal is a key channel for PDPL-compliant transparency and data subject rights.

  • PDPL-PORTAL-001: Data Subject Access & Export Log
  • Purpose: Evidence of handling data subject access requests (DSAR) via portal.
  • Content:
    • List of portal-based data exports (e.g., FHIR export, PDF downloads) with:
    • account_id, patient_id, export_type, requested_datetime, completed_datetime.
  • Source:
    • portal_audit_log (assumed table) or extended result_access_logs / document_download_logs.
  • Frequency: On-demand; at least annually for DPO review.

  • PDPL-PORTAL-002: Consent & Terms Acceptance Report

  • Purpose: Demonstrate that patients accepted portal terms and PDPL data consent.
  • Content:
    • portal_accounts.account_id, patient_id, consent_version, consent_accepted_datetime, uae_pass_linked flag.
  • Source:
    • portal_accounts
    • patient_consents (for detailed consent records).
  • Frequency: Quarterly.

5. TDRA / NESA Cybersecurity

  • CYBER-PORTAL-001: Authentication & Session Security Report
  • Purpose: Support TDRA/NESA-aligned cybersecurity audits.
  • Content:
    • MFA adoption rate (portal_accounts.mfa_method).
    • Session statistics (portal_sessions): average duration, concurrent sessions, failed logins.
    • UAE Pass usage rate (portal_accounts.uae_pass_linked).
  • Frequency: Quarterly.

Ad-Hoc Reporting

Available Data Fields for Custom Queries

The patient portal module exposes the following key fields for ad-hoc analytics (non-exhaustive; see 03-data-specifications for full schema):

  • portal_accounts
  • account_id
  • patient_id (FK → patients.patient_id)
  • user_id (FK → users.user_id)
  • email
  • phone
  • activation_status
  • activation_date
  • last_login
  • mfa_method
  • uae_pass_linked
  • language_preference
  • is_active

  • portal_sessions

  • session_id
  • account_id
  • login_datetime
  • logout_datetime
  • device_type (web, iOS, Android)
  • device_os
  • ip_address
  • auth_method (password, biometric, UAE Pass)

  • portal_messages

  • message_id
  • thread_id
  • sender_id
  • sender_type (patient, provider)
  • recipient_id
  • recipient_type
  • subject
  • sent_datetime
  • read_datetime
  • is_urgent
  • encounter_id

  • portal_notifications

  • notification_id
  • account_id
  • notification_type (appointment, result, billing, message)
  • channel (email, SMS, push)
  • sent_datetime
  • read_datetime
  • status (sent, delivered, failed)

  • portal_preferences

  • preference_id
  • account_id
  • notification_email
  • notification_sms
  • notification_push
  • language
  • display_theme
  • result_release_preference

  • telehealth_sessions

  • session_id
  • appointment_id
  • patient_account_id
  • provider_id
  • scheduled_datetime
  • join_datetime_patient
  • join_datetime_provider
  • end_datetime
  • duration_minutes
  • connection_quality
  • platform
  • encounter_id

  • patient_submitted_forms

  • form_id
  • account_id
  • patient_id
  • form_type
  • form_data_json
  • submitted_datetime
  • processed
  • processed_by
  • target_module
  • form_external_ref (if defined)

  • portal_feedback

  • feedback_id
  • account_id
  • feedback_type
  • encounter_id
  • rating
  • comments
  • submitted_datetime

  • proxy_access_grants

  • grant_id
  • grantor_patient_id
  • proxy_account_id
  • dependent_patient_id
  • relationship
  • access_level
  • granted_datetime
  • expiry_datetime
  • is_active

All ad-hoc queries must respect UAE PDPL: access restricted by role-based permissions, with audit logging of query execution.

Export Formats

  • CSV: For analytics tools (Power BI, Tableau, Excel).
  • Excel (XLSX): For operational managers; includes basic formatting and filters.
  • PDF: For formal reports, regulatory submissions, and management packs.
  • JSON (FHIR-based): For technical integrations where needed (e.g., exporting patient-initiated data access logs).

Exports must:

  • Mask or pseudonymise identifiers where required (e.g., for external benchmarking).
  • Include header/footer with:
  • Facility name
  • Report name and ID
  • Generation timestamp
  • User who generated the report

Scheduled Report Delivery

  • Scheduling Options
  • Daily, Weekly, Monthly, Quarterly.
  • Custom date ranges for one-off reports.

  • Delivery Channels

  • Secure email with link to download (no PHI in email body).
  • Internal portal for managers (reports accessible via role-based access).
  • SFTP drop for integration with enterprise data warehouse.

  • Access Control & Audit

  • Only users with view_analytics or equivalent permission can schedule or access portal analytics.
  • All scheduled report executions logged with:
    • user_id
    • report_id
    • parameters (date range, facility)
    • generation time
  • Logs retained per ADHICS/PDPL retention policies.

  • Paperless Transformation

The reporting capabilities directly support paperless transformation by:

  • Eliminating manual tally sheets and Excel trackers for portal usage.
  • Providing digital evidence for regulatory audits (MOH, DOH, DHA, PDPL) without printing.
  • Enabling leadership to monitor digital engagement and shift resources away from paper-based processes (e.g., front-desk registration, paper statements, phone scheduling).
content/portals/patient-portal/07-kpis-reports.md Generated 2026-02-20 22:54