EHR & Patient Management KPIs & Reporting
KPI Summary
| KPI ID | KPI Name | Formula (Conceptual) | Target | Data Source | Frequency |
|---|---|---|---|---|---|
| KPI-EHR-001 | Registration Completion Rate | Completed registrations / total registrations × 100 | ≥ 98% | patients, patient_demographics, patient_identifiers, audit_log |
Daily / Monthly |
| KPI-EHR-002 | Average Registration Time | AVG(registration_end_time − registration_start_time) | ≤ 5 min (new), ≤ 2 min (returning) | audit_log (registration workflow events), patients |
Daily / Monthly |
| KPI-EHR-003 | Duplicate Detection Rate | Flagged duplicates / new registrations × 100 | ≤ 2% | duplicate_suspects, patients |
Monthly |
| KPI-EHR-004 | Duplicate Resolution Time | AVG(resolved_at − flagged_at) for resolved suspects | ≤ 24 hours | duplicate_suspects, users |
Weekly / Monthly |
| KPI-EHR-005 | Allergy Documentation Rate | Patients with allergy status (documented/NKA/NKDA) / active patients × 100 | ≥ 95% | patients, patient_allergies |
Monthly |
| KPI-EHR-006 | Problem List Currency | Encounters where problem list reviewed / total encounters × 100 | ≥ 90% | patient_problems, encounters, audit_log |
Monthly |
| KPI-EHR-007 | Clinical Note Completion Rate | Notes signed within 24h / total notes × 100 | ≥ 90% within 24 hours | clinical_notes, encounters, providers |
Weekly / Monthly |
| KPI-EHR-008 | Consent Compliance Rate | Encounters with required consents / total encounters × 100 | ≥ 99% | patient_consents, encounters, facilities, departments |
Monthly |
| KPI-EHR-009 | Break-the-Glass Rate | BTG access events / total access events × 100 | ≤ 1% | audit_log, users, roles |
Monthly |
| KPI-EHR-010 | NABIDH/Malaffi Submission Success Rate | ADT messages with ACK=AA / total ADT messages × 100 | ≥ 99.5% | integration_message_log |
Daily / Monthly |
| KPI-EHR-011 | Patient Portal Adoption Rate | Patients with portal account / active patients × 100 | ≥ 40% (Y1), ≥ 70% (Y2) | users (role='patient'), patients, patient_identifiers |
Monthly / Quarterly |
| KPI-EHR-012 | Paper Document Scan Backlog | Count(documents pending scan > 48h) | 0 (no backlog beyond 48 hours) | patient_documents, audit_log |
Daily |
Note:
encounterstable is referenced from the Scheduling module;integration_message_logis assumed to be owned by the integration layer but queried by this module.
KPI Definitions
KPI-EHR-001: Registration Completion Rate
Definition
Measures the percentage of patient registrations where all mandatory demographic and identifier fields are fully populated at the end of the registration workflow. This reflects registration quality and reduces downstream claim rejections and MPI issues, aligned with DOH/DHA data quality expectations and NABIDH/Malaffi minimum dataset requirements.
Calculation Formula (SQL example)
Assumptions:
- Mandatory fields:
patients.mrn,patients.emirates_id(or verified alternative ID),patients.first_name_en,patients.last_name_en,patients.date_of_birth,patients.gender,patient_demographics.mobile_phone,patient_demographics.emirate. - Registration period determined by
patients.created_at.
SELECT
DATE(p.created_at) AS registration_date,
COUNT(*) AS total_registrations,
COUNT(
CASE
WHEN p.mrn IS NOT NULL
AND (
(p.emirates_id IS NOT NULL AND p.emirates_id <> '')
OR EXISTS (
SELECT 1
FROM patient_identifiers pi
WHERE pi.patient_id = p.patient_id
AND pi.identifier_type IN ('passport', 'visa')
AND pi.verification_status = 'verified'
)
)
AND p.first_name_en IS NOT NULL
AND p.last_name_en IS NOT NULL
AND p.date_of_birth IS NOT NULL
AND p.gender IS NOT NULL
AND pd.mobile_phone IS NOT NULL
AND pd.emirate IS NOT NULL
THEN 1
END
) AS completed_registrations,
COUNT(
CASE
WHEN p.mrn IS NOT NULL
AND (
(p.emirates_id IS NOT NULL AND p.emirates_id <> '')
OR EXISTS (
SELECT 1
FROM patient_identifiers pi
WHERE pi.patient_id = p.patient_id
AND pi.identifier_type IN ('passport', 'visa')
AND pi.verification_status = 'verified'
)
)
AND p.first_name_en IS NOT NULL
AND p.last_name_en IS NOT NULL
AND p.date_of_birth IS NOT NULL
AND p.gender IS NOT NULL
AND pd.mobile_phone IS NOT NULL
AND pd.emirate IS NOT NULL
THEN 1
END
) * 100.0 / COUNT(*) AS registration_completion_rate_pct
FROM patients p
LEFT JOIN patient_demographics pd
ON pd.patient_id = p.patient_id
AND pd.effective_date = (
SELECT MAX(effective_date)
FROM patient_demographics
WHERE patient_id = p.patient_id
)
WHERE p.created_at >= :start_date
AND p.created_at < :end_date
GROUP BY DATE(p.created_at);
Target / Benchmark
| Metric | Target | Source / Rationale |
|---|---|---|
| Registration Completion Rate | ≥ 98% | Internal quality target aligned with DOH/DHA/NABIDH/Malaffi demographic completeness requirements and UAE payer data quality expectations |
Data Source
patients(patient_id, mrn, emirates_id, first_name_en, last_name_en, date_of_birth, gender, created_at)patient_demographics(patient_id, mobile_phone, emirate, effective_date)patient_identifiers(patient_id, identifier_type, verification_status)
Dimensions / Filters
- Time: day, week, month, quarter, year
- Facility:
facility_id(via MRN prefix or encounter linkage) - Registration location/department: via
locationsordepartmentsif captured in audit - Registration clerk:
audit_log.user_idwhereaction='registration_completed'
Visualization
- Primary: Line chart (monthly trend) with target line at 98%.
- Secondary: Bar chart by facility/department for the selected period.
Alert Thresholds
- Warning: < 98% for any facility for 2 consecutive weeks.
- Critical: < 95% for any facility in a given month.
- Notification recipients:
- Registration Supervisor (facility-level)
- HIM Supervisor
- Quality & Patient Safety Officer (if critical)
KPI-EHR-002: Average Registration Time
Definition
Average time taken to complete a registration from start to finish, separately for new and returning patients. Measures front-desk efficiency and patient experience, relevant to DOH/DHA service-level expectations.
Calculation Formula (SQL example)
Assumptions:
audit_log.actionvalues:'registration_started','registration_completed'.- New vs returning determined by whether the patient has prior encounters.
WITH registration_events AS (
SELECT
al.patient_id,
MIN(CASE WHEN al.action = 'registration_started' THEN al.timestamp END) AS start_time,
MAX(CASE WHEN al.action = 'registration_completed' THEN al.timestamp END) AS end_time
FROM audit_log al
WHERE al.action IN ('registration_started', 'registration_completed')
AND al.timestamp >= :start_date
AND al.timestamp < :end_date
GROUP BY al.patient_id, DATE(al.timestamp)
),
patient_type AS (
SELECT
re.patient_id,
re.start_time,
re.end_time,
CASE
WHEN EXISTS (
SELECT 1
FROM encounters e
WHERE e.patient_id = re.patient_id
AND e.encounter_start < re.start_time
)
THEN 'returning'
ELSE 'new'
END AS patient_category
FROM registration_events re
)
SELECT
patient_category,
AVG(EXTRACT(EPOCH FROM (end_time - start_time)) / 60.0) AS avg_registration_time_minutes
FROM patient_type
WHERE end_time IS NOT NULL
GROUP BY patient_category;
Target / Benchmark
| Patient Type | Target Average Time | Rationale |
|---|---|---|
| New | ≤ 5 minutes | Internal operational target for UAE private hospitals |
| Returning | ≤ 2 minutes | Expected with pre-populated data and quick verification |
Data Source
audit_log(audit_id, patient_id, action, timestamp, user_id)encounters(encounter_id, patient_id, encounter_start)(from Scheduling module)
Dimensions / Filters
- Time: day, week, month
- Facility, department, registration desk (via
locations) - Registration clerk (
audit_log.user_id) - Patient type (new/returning)
- Visit type (inpatient/outpatient/ED) via
encounters.encounter_type
Visualization
- Bar chart comparing new vs returning average time per month.
- Box plot by department to show variation.
Alert Thresholds
- Warning: New > 6 min or Returning > 3 min for 2 consecutive weeks.
- Critical: New > 8 min or Returning > 5 min in any week.
- Notification recipients:
- Registration Supervisor
- Operations Manager
- HIM Supervisor (for systemic issues)
KPI-EHR-003: Duplicate Detection Rate
Definition
Percentage of new registrations that are flagged as potential duplicates by the MPI matching engine. A moderate rate indicates effective detection; a very high rate suggests overly sensitive matching, while a very low rate may indicate under-detection.
Calculation Formula (SQL example)
Assumptions:
duplicate_suspects.statusin ('new','under_review','resolved').- New registrations determined by
patients.created_at.
WITH new_registrations AS (
SELECT p.patient_id
FROM patients p
WHERE p.created_at >= :start_date
AND p.created_at < :end_date
),
suspects_in_period AS (
SELECT DISTINCT ds.suspect_id, ds.patient_id_1, ds.patient_id_2
FROM duplicate_suspects ds
WHERE ds.created_at >= :start_date
AND ds.created_at < :end_date
)
SELECT
COUNT(*) AS new_registrations,
COUNT(
DISTINCT CASE
WHEN nr.patient_id IN (si.patient_id_1, si.patient_id_2)
THEN nr.patient_id
END
) AS registrations_with_duplicate_flag,
COUNT(
DISTINCT CASE
WHEN nr.patient_id IN (si.patient_id_1, si.patient_id_2)
THEN nr.patient_id
END
) * 100.0 / COUNT(*) AS duplicate_detection_rate_pct
FROM new_registrations nr
LEFT JOIN suspects_in_period si
ON nr.patient_id IN (si.patient_id_1, si.patient_id_2);
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Duplicate Detection Rate | ≤ 2% | From module brief; indicates low actual duplication with effective MPI |
Data Source
patients(patient_id, created_at)duplicate_suspects(suspect_id, patient_id_1, patient_id_2, status, created_at)
Dimensions / Filters
- Time: month, quarter
- Facility (via MRN prefix or encounters)
- Registration location/department
- Match score bands (
match_scoreranges)
Visualization
- Line chart of detection rate over time.
- Histogram of
match_scoredistribution.
Alert Thresholds
- Warning: Rate > 3% for any facility in a month.
- Critical: Rate > 5% or sudden spike (> 2× previous month).
- Notification recipients:
- HIM Supervisor
- Medical Records Officer
- IT (for MPI configuration review)
KPI-EHR-004: Duplicate Resolution Time
Definition
Average time taken to resolve flagged duplicate patient records (from flagging to resolution). Measures HIM responsiveness and MPI data quality maintenance.
Calculation Formula (SQL example)
SELECT
AVG(EXTRACT(EPOCH FROM (ds.reviewed_at - ds.created_at)) / 3600.0) AS avg_resolution_time_hours
FROM duplicate_suspects ds
WHERE ds.status = 'resolved'
AND ds.reviewed_at IS NOT NULL
AND ds.created_at >= :start_date
AND ds.created_at < :end_date;
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Average Resolution Time | ≤ 24 hours | From module brief; supports safe clinical use and NABIDH/Malaffi data quality |
Data Source
duplicate_suspects(suspect_id, created_at, reviewed_at, status, reviewed_by, resolution)users(user_id, role_id)for role-based analysis
Dimensions / Filters
- Time: week, month
- Facility
- Reviewer (
reviewed_by) - Resolution type (merge, false positive, other)
Visualization
- Line chart of average hours to resolution.
- Table of unresolved suspects older than 24/48/72 hours.
Alert Thresholds
- Warning: Average > 24 hours for a week; any suspect unresolved > 72 hours.
- Critical: Average > 48 hours or > 10 suspects older than 72 hours.
- Notification recipients:
- HIM Supervisor
- Medical Records Officer
- Privacy Officer (if duplicates involve sensitive patients)
KPI-EHR-005: Allergy Documentation Rate
Definition
Percentage of active patients with an explicit allergy status recorded: at least one active allergy or a documented NKA/NKDA flag. Supports patient safety and is required for safe CPOE use and NABIDH/Malaffi submissions.
Calculation Formula (SQL example)
Assumptions:
- Active patients: those with at least one encounter in the last 12 months.
- NKA/NKDA captured as special rows in
patient_allergies.statusorreaction_type.
WITH active_patients AS (
SELECT DISTINCT e.patient_id
FROM encounters e
WHERE e.encounter_start >= (CURRENT_DATE - INTERVAL '12 months')
),
allergy_status AS (
SELECT
ap.patient_id,
CASE
WHEN EXISTS (
SELECT 1
FROM patient_allergies pa
WHERE pa.patient_id = ap.patient_id
AND pa.status = 'active'
AND pa.allergen_code IS NOT NULL
) THEN 'documented_allergy'
WHEN EXISTS (
SELECT 1
FROM patient_allergies pa
WHERE pa.patient_id = ap.patient_id
AND pa.status IN ('NKA', 'NKDA')
) THEN 'nka_nkda'
ELSE 'none'
END AS allergy_status
FROM active_patients ap
)
SELECT
COUNT(*) AS active_patients,
COUNT(
CASE
WHEN allergy_status IN ('documented_allergy', 'nka_nkda')
THEN 1
END
) AS patients_with_allergy_status,
COUNT(
CASE
WHEN allergy_status IN ('documented_allergy', 'nka_nkda')
THEN 1
END
) * 100.0 / COUNT(*) AS allergy_documentation_rate_pct
FROM allergy_status;
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Allergy Documentation Rate | ≥ 95% | From module brief; aligns with international safety practice and UAE accreditation expectations |
Data Source
encounters(patient_id, encounter_start)patient_allergies(patient_id, allergen_code, status)
Dimensions / Filters
- Time: month, quarter
- Facility, department
- Provider (based on last allergy update
verified_by) - Encounter type (inpatient/outpatient/ED)
Visualization
- Gauge showing current rate vs 95% target.
- Bar chart by department.
Alert Thresholds
- Warning: < 95% for any inpatient unit or ED.
- Critical: < 90% overall or < 85% in high-risk areas (ICU, ED).
- Notification recipients:
- Chief Medical Officer
- Nursing Director
- Pharmacy / Clinical Informatics
KPI-EHR-006: Problem List Currency
Definition
Percentage of encounters where the problem list was reviewed and updated (if needed) during the encounter. Indicates how current the problem list is, supporting accurate coding, care planning, and NABIDH clinical document quality.
Implementation Note
Requires a flag or audit entry when a clinician performs a “problem list review” action. This can be captured in audit_log with resource_type='patient_problems' and action='reviewed' linked to an encounter.
Calculation Formula (SQL example)
WITH encounters_in_period AS (
SELECT e.encounter_id, e.patient_id, e.encounter_start
FROM encounters e
WHERE e.encounter_start >= :start_date
AND e.encounter_start < :end_date
),
problem_reviews AS (
SELECT DISTINCT al.encounter_id
FROM audit_log al
WHERE al.resource_type = 'patient_problems'
AND al.action = 'reviewed'
AND al.timestamp >= :start_date
AND al.timestamp < :end_date
)
SELECT
COUNT(*) AS total_encounters,
COUNT(
CASE
WHEN eip.encounter_id IN (SELECT encounter_id FROM problem_reviews)
THEN 1
END
) AS encounters_with_problem_review,
COUNT(
CASE
WHEN eip.encounter_id IN (SELECT encounter_id FROM problem_reviews)
THEN 1
END
) * 100.0 / COUNT(*) AS problem_list_currency_pct
FROM encounters_in_period eip;
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Problem List Currency | ≥ 90% | From module brief; supports accurate ICD-10-AM coding and chronic disease management |
Data Source
encounters(encounter_id, patient_id, encounter_start, facility_id, department_id)audit_log(encounter_id, resource_type, action, timestamp, user_id)
Dimensions / Filters
- Time: month, quarter
- Facility, department
- Provider
- Encounter type
Visualization
- Line chart of monthly currency rate.
- Department-level bar chart.
Alert Thresholds
- Warning: < 90% for any department for 2 consecutive months.
- Critical: < 80% overall.
- Notification recipients:
- Department Chairs
- HIM Supervisor
- Coding/RCM Manager (due to impact on ICD-10-AM coding)
KPI-EHR-007: Clinical Note Completion Rate
Definition
Percentage of clinical notes that are signed within 24 hours of the associated encounter event (e.g., visit, procedure). Ensures timely documentation for patient safety, billing, and regulatory compliance.
Calculation Formula (SQL example)
Assumptions:
- Note creation time is
clinical_notes.created_at(or equivalent). - Completion defined as
status='signed'andsigned_datetimewithin 24 hours of note creation or encounter end.
SELECT
COUNT(*) AS total_notes,
COUNT(
CASE
WHEN cn.status = 'signed'
AND cn.signed_datetime IS NOT NULL
AND cn.signed_datetime <= cn.created_at + INTERVAL '24 hours'
THEN 1
END
) AS notes_signed_within_24h,
COUNT(
CASE
WHEN cn.status = 'signed'
AND cn.signed_datetime IS NOT NULL
AND cn.signed_datetime <= cn.created_at + INTERVAL '24 hours'
THEN 1
END
) * 100.0 / COUNT(*) AS note_completion_rate_24h_pct
FROM clinical_notes cn
WHERE cn.created_at >= :start_date
AND cn.created_at < :end_date;
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Clinical Note Completion Rate | ≥ 90% within 24 hours | From module brief; aligns with UAE accreditation and payer documentation expectations |
Data Source
clinical_notes(note_id, patient_id, encounter_id, note_type, status, created_at, signed_datetime, author_id)providers(provider_id, specialty_code, facility_id, department_id)
Dimensions / Filters
- Time: week, month
- Facility, department
- Provider, specialty
- Note type (H&P, progress, discharge summary, nursing, etc.)
Visualization
- Line chart of completion rate over time.
- Table of overdue unsigned notes (age buckets: 24–48h, 48–72h, >72h).
Alert Thresholds
- Warning: Completion rate < 90% for any department in a month.
- Critical: > 5% of notes unsigned after 72 hours; any discharge summaries unsigned > 48 hours.
- Notification recipients:
- Department Chairs
- Medical Director
- HIM Supervisor
KPI-EHR-008: Consent Compliance Rate
Definition
Percentage of encounters where all required consents (general treatment, UAE PDPL data processing, specific procedure, HIE sharing where applicable) are obtained and recorded. Supports UAE PDPL compliance and DOH/DHA licensing requirements.
Calculation Formula (SQL example)
Assumptions:
- Required consents depend on encounter type and facility configuration (e.g., table
consent_requirementsnot shown here). - For simplicity, assume general treatment + PDPL consent required for all encounters.
WITH encounters_in_period AS (
SELECT e.encounter_id, e.patient_id, e.facility_id, e.department_id, e.encounter_start
FROM encounters e
WHERE e.encounter_start >= :start_date
AND e.encounter_start < :end_date
),
consent_status AS (
SELECT
eip.encounter_id,
COUNT(DISTINCT CASE WHEN pc.consent_type = 'general_treatment'
AND pc.status = 'granted'
THEN pc.consent_type END) AS general_treatment_count,
COUNT(DISTINCT CASE WHEN pc.consent_type = 'pdpl_data_processing'
AND pc.status = 'granted'
THEN pc.consent_type END) AS pdpl_count
FROM encounters_in_period eip
LEFT JOIN patient_consents pc
ON pc.encounter_id = eip.encounter_id
AND pc.status = 'granted'
AND (pc.expiry_datetime IS NULL OR pc.expiry_datetime >= eip.encounter_start)
GROUP BY eip.encounter_id
)
SELECT
COUNT(*) AS total_encounters,
COUNT(
CASE
WHEN general_treatment_count >= 1
AND pdpl_count >= 1
THEN 1
END
) AS encounters_with_required_consents,
COUNT(
CASE
WHEN general_treatment_count >= 1
AND pdpl_count >= 1
THEN 1
END
) * 100.0 / COUNT(*) AS consent_compliance_rate_pct
FROM consent_status;
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Consent Compliance Rate | ≥ 99% | From module brief; supports UAE PDPL and DOH/DHA licensing inspections |
Data Source
encounters(encounter_id, patient_id, facility_id, department_id, encounter_start)patient_consents(consent_id, patient_id, encounter_id, consent_type, status, granted_datetime, expiry_datetime)- Facility configuration tables for consent requirements (not detailed here)
Dimensions / Filters
- Time: month, quarter
- Facility, department
- Encounter type (inpatient/outpatient/ED)
- Consent type (general, PDPL, procedure, HIE)
Visualization
- Gauge for overall compliance.
- Stacked bar chart by department (compliant vs non-compliant encounters).
Alert Thresholds
- Warning: < 99% for any facility in a month.
- Critical: < 97% overall; any pattern of missing PDPL consent.
- Notification recipients:
- Privacy Officer
- HIM Supervisor
- Facility CEO / Medical Director (for critical)
KPI-EHR-009: Break-the-Glass (BTG) Rate
Definition
Percentage of patient record access events that used the Break-the-Glass override. Indicates privacy risk and appropriateness of access controls under UAE PDPL and ADHICS/DHA security guidelines.
Calculation Formula (SQL example)
SELECT
COUNT(*) AS total_access_events,
COUNT(CASE WHEN al.is_btg = TRUE THEN 1 END) AS btg_access_events,
COUNT(CASE WHEN al.is_btg = TRUE THEN 1 END) * 100.0 / COUNT(*) AS btg_rate_pct
FROM audit_log al
WHERE al.resource_type = 'patient_record'
AND al.action = 'view'
AND al.timestamp >= :start_date
AND al.timestamp < :end_date;
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| BTG Rate | ≤ 1% | From module brief; high BTG rates may indicate misuse or misconfigured access rules |
Data Source
audit_log(audit_id, user_id, patient_id, resource_type, action, timestamp, is_btg, access_reason, ip_address)users(user_id, role_id)roles(role_id, role_name)
Dimensions / Filters
- Time: month, quarter
- Facility, department (via user’s primary assignment)
- User role (physician, nurse, admin, etc.)
- Access reason (
access_reason)
Visualization
- Line chart of BTG rate over time.
- Table of top BTG users and reasons.
Alert Thresholds
- Warning: BTG rate > 1% overall or > 2% in any department.
- Critical: Any user with > 10 BTG events in a month; BTG without valid reason.
- Notification recipients:
- Privacy Officer (primary)
- IT Security Officer
- Relevant Department Head (for user-specific issues)
KPI-EHR-010: NABIDH/Malaffi Submission Success Rate
Definition
Percentage of ADT messages (A01/A04/A08/A40) sent to NABIDH (Dubai) and Malaffi (Abu Dhabi) that receive a positive acknowledgment (ACK^AA). Measures HIE integration reliability and regulatory compliance.
Calculation Formula (SQL example)
Assumptions:
integration_message_logcontains one row per outbound message.
SELECT
target_system,
COUNT(*) AS total_adt_messages_sent,
COUNT(CASE WHEN ack_status = 'AA' THEN 1 END) AS successful_messages,
COUNT(CASE WHEN ack_status = 'AA' THEN 1 END) * 100.0 / COUNT(*) AS submission_success_rate_pct
FROM integration_message_log
WHERE message_type IN ('ADT^A01', 'ADT^A04', 'ADT^A08', 'ADT^A40')
AND direction = 'outbound'
AND timestamp >= :start_date
AND timestamp < :end_date
GROUP BY target_system;
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| NABIDH/Malaffi Success Rate | ≥ 99.5% | From module brief; aligns with UAE HIE reliability expectations |
Data Source
integration_message_log(message_id, message_type, target_system, direction, timestamp, ack_status, patient_id, encounter_id)
Dimensions / Filters
- Time: day, week, month
- Target system: NABIDH vs Malaffi
- Facility
- Message type (A01, A04, A08, A40)
Visualization
- Line chart of success rate per HIE over time.
- Table of failed messages with error codes.
Alert Thresholds
- Warning: Success rate < 99.5% for any HIE in a day.
- Critical: Success rate < 98% or > 50 failed messages in 1 hour.
- Notification recipients:
- Integration Team / IT
- HIM Supervisor
- DOH/DHA liaison (if prolonged issues)
KPI-EHR-011: Patient Portal Adoption Rate
Definition
Percentage of active patients who have an active patient portal account. Supports patient engagement and UAE digital health strategies.
Calculation Formula (SQL example)
Assumptions:
- Portal users are in
userswith role mapped toPatient (Portal).
WITH active_patients AS (
SELECT DISTINCT e.patient_id
FROM encounters e
WHERE e.encounter_start >= (CURRENT_DATE - INTERVAL '12 months')
),
portal_users AS (
SELECT DISTINCT u.user_id, u.provider_id, ur.role_id
FROM users u
JOIN user_roles ur ON ur.user_id = u.user_id
JOIN roles r ON r.role_id = ur.role_id
WHERE r.role_name = 'Patient (Portal)'
AND u.is_active = TRUE
)
SELECT
COUNT(*) AS active_patients,
COUNT(
CASE
WHEN EXISTS (
SELECT 1
FROM portal_users pu
WHERE pu.provider_id = ap.patient_id
)
THEN 1
END
) AS patients_with_portal_account,
COUNT(
CASE
WHEN EXISTS (
SELECT 1
FROM portal_users pu
WHERE pu.provider_id = ap.patient_id
)
THEN 1
END
) * 100.0 / COUNT(*) AS portal_adoption_rate_pct
FROM active_patients ap;
Implementation note: For clarity, the schema should explicitly link patient portal users to
patients(e.g.,users.patient_idinstead of overloadingprovider_id).
Target / Benchmark
| Timeframe | Target Adoption | Rationale |
|---|---|---|
| Year 1 | ≥ 40% | From module brief; realistic ramp-up for UAE facilities |
| Year 2 | ≥ 70% | Aligns with digital front-door strategies |
Data Source
encounters(patient_id, encounter_start)users(user_id, is_active, patient_id or provider_id)roles(role_id, role_name)user_roles(user_id, role_id, facility_id)
Dimensions / Filters
- Time: quarter, year
- Facility
- Age group, nationality (via
patientsandpatient_demographics) - Payer (THIQA, Daman, etc.)
Visualization
- Line chart of adoption over time with Year 1/2 targets.
- Bar chart by facility.
Alert Thresholds
- Warning: Adoption growth < 5 percentage points per quarter in first year.
- Critical: Adoption < 30% at end of Year 1 or < 60% at end of Year 2.
- Notification recipients:
- Patient Experience Lead
- CIO / Digital Health Lead
- Marketing / Communications (for outreach campaigns)
KPI-EHR-012: Paper Document Scan Backlog
Definition
Number of paper documents pending scanning or indexing for more than 48 hours after receipt. Measures progress toward paperless operations and supports timely availability of external records.
Calculation Formula (SQL example)
Assumptions:
- Documents awaiting scan/indexing have
status='pending_scan'. upload_dateorreceived_dateused to measure age.
SELECT
COUNT(*) AS documents_pending_scan_gt_48h
FROM patient_documents pd
WHERE pd.status = 'pending_scan'
AND pd.upload_date <= (CURRENT_TIMESTAMP - INTERVAL '48 hours');
Target / Benchmark
| Metric | Target | Rationale |
|---|---|---|
| Pending Scan > 48h (count) | 0 | From module brief; supports paperless transformation and accreditation |
Data Source
patient_documents(document_id, patient_id, encounter_id, document_type, status, upload_date)audit_logfor detailed workflow timestamps (scan started, indexed, etc.)
Dimensions / Filters
- Time: daily snapshot
- Facility, department
- Document type (referral, consent, external report)
Visualization
- Daily bar showing count of >48h backlog.
- Table listing pending items with patient, document type, age.
Alert Thresholds
- Warning: > 10 documents pending > 48h in any facility.
- Critical: Any document pending > 5 days; backlog trend increasing for 3 consecutive days.
- Notification recipients:
- Medical Records Officer
- HIM Supervisor
- Department Managers (for high-backlog areas)
Standard Reports
| Report ID | Report Name | Purpose | Audience | Frequency | Format |
|---|---|---|---|---|---|
| RPT-EHR-001 | Registration Quality & Efficiency Dashboard | Monitor registration completion rate and average registration time by facility/desk. | Registration Supervisors, HIM | Real-time / Daily | Interactive dashboard + CSV export |
| RPT-EHR-002 | MPI Duplicate Management Report | Track duplicate detection rate, unresolved suspects, and resolution times. | HIM Supervisor, Medical Records Officer | Weekly / Monthly | PDF + Excel |
| RPT-EHR-003 | Allergy & Problem List Completeness Report | Monitor allergy documentation and problem list currency by department/provider. | CMO, Department Chairs, Clinical Informatics | Monthly | Dashboard + Excel |
| RPT-EHR-004 | Clinical Documentation Timeliness Report | Track clinical note completion within 24h and list overdue notes. | Department Chairs, HIM, Quality | Weekly / Monthly | Dashboard + PDF |
| RPT-EHR-005 | Consent Compliance & PDPL Audit Report | Demonstrate consent compliance for UAE PDPL and DOH/DHA inspections. | Privacy Officer, Compliance, HIM | Monthly / On-demand | PDF (signed) + CSV |
| RPT-EHR-006 | Privacy & BTG Access Audit | Review BTG events, high-risk access patterns, and user-level summaries. | Privacy Officer, IT Security | Monthly | PDF + CSV |
| RPT-EHR-007 | HIE Integration Reliability (NABIDH/Malaffi) | Monitor ADT submission success and failed messages by error type. | Integration Team, HIM, CIO | Daily / Monthly | Dashboard + Excel |
| RPT-EHR-008 | Patient Portal Adoption & Engagement | Track portal sign-ups and usage by facility, age group, payer. | CIO, Patient Experience, Marketing | Monthly / Quarterly | Dashboard + PDF |
| RPT-EHR-009 | Paperless Transformation & Scan Backlog | Monitor document scan backlog and paper vs digital document ratios. | HIM, Operations, Quality | Weekly | Dashboard + Excel |
| RPT-EHR-010 | Master Data Governance Status | Overview of key master data sets (nationality, document types, consent templates) and update history. | System Admin, HIM, Compliance | Quarterly | PDF + CSV |
Dashboard Wireframe
EHR Management Dashboard (HTML Wireframe)
Show HTML code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>EHR & Patient Management Dashboard</title>
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 0; background:#f5f6f8; }
header { background:#004b8d; color:#fff; padding:12px 20px; }
h1 { margin:0; font-size:20px; }
.filters { background:#fff; padding:10px 20px; border-bottom:1px solid #ddd; display:flex; gap:15px; align-items:center; }
.filters label { font-size:12px; color:#555; display:block; }
.filters select, .filters input { font-size:12px; padding:4px 6px; }
.container { padding:15px 20px; }
.kpi-row { display:flex; flex-wrap:wrap; gap:10px; margin-bottom:15px; }
.kpi-card { background:#fff; border-radius:4px; padding:10px; flex:1 1 180px; min-width:180px; box-shadow:0 1px 2px rgba(0,0,0,0.08); }
.kpi-title { font-size:12px; color:#666; margin-bottom:4px; }
.kpi-value { font-size:20px; font-weight:bold; }
.kpi-sub { font-size:11px; color:#888; }
.kpi-good { color:#1a7f37; }
.kpi-warn { color:#c27800; }
.kpi-bad { color:#b3261e; }
.grid { display:grid; grid-template-columns:2fr 2fr; gap:15px; margin-bottom:15px; }
.panel { background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 2px rgba(0,0,0,0.08); }
.panel h2 { font-size:14px; margin:0 0 8px 0; border-bottom:1px solid #eee; padding-bottom:4px; }
.chart-placeholder { border:1px dashed #ccc; height:180px; font-size:11px; color:#999; display:flex; align-items:center; justify-content:center; }
table { width:100%; border-collapse:collapse; font-size:11px; }
th, td { border:1px solid #ddd; padding:4px 6px; text-align:left; }
th { background:#f0f0f0; }
.scroll { max-height:180px; overflow-y:auto; }
</style>
</head>
<body>
<header>
<h1>EHR & Patient Management – Operational Dashboard</h1>
</header>
<div class="filters">
<div>
<label for="date-range">Date Range</label>
<input id="date-range" type="text" value="01 Jan 2026 – 31 Jan 2026">
</div>
<div>
<label for="facility">Facility</label>
<select id="facility">
<option>All Facilities</option>
<option>Dubai General Hospital</option>
<option>Abu Dhabi Medical Center</option>
</select>
</div>
<div>
<label for="department">Department</label>
<select id="department">
<option>All Departments</option>
<option>Emergency</option>
<option>Outpatient Clinics</option>
<option>Inpatient Wards</option>
</select>
</div>
<div>
<label for="view">View</label>
<select id="view">
<option>Operational</option>
<option>Privacy & Compliance</option>
<option>Paperless Transformation</option>
</select>
</div>
</div>
<div class="container">
<!-- KPI Cards -->
<div class="kpi-row">
<div class="kpi-card">
<div class="kpi-title">Registration Completion Rate</div>
<div class="kpi-value kpi-good">99.1%</div>
<div class="kpi-sub">Target ≥ 98% • Jan 2026</div>
</div>
<div class="kpi-card">
<div class="kpi-title">Avg Registration Time (New)</div>
<div class="kpi-value kpi-warn">5.8 min</div>
<div class="kpi-sub">Target ≤ 5 min</div>
</div>
<div class="kpi-card">
<div class="kpi-title">Allergy Documentation Rate</div>
<div class="kpi-value kpi-good">96.4%</div>
<div class="kpi-sub">Target ≥ 95%</div>
</div>
<div class="kpi-card">
<div class="kpi-title">Problem List Currency</div>
<div class="kpi-value kpi-warn">88.7%</div>
<div class="kpi-sub">Target ≥ 90%</div>
</div>
<div class="kpi-card">
<div class="kpi-title">Clinical Notes Signed < 24h</div>
<div class="kpi-value kpi-good">91.2%</div>
<div class="kpi-sub">Target ≥ 90%</div>
</div>
<div class="kpi-card">
<div class="kpi-title">Consent Compliance</div>
<div class="kpi-value kpi-good">99.6%</div>
<div class="kpi-sub">Target ≥ 99%</div>
</div>
<div class="kpi-card">
<div class="kpi-title">BTG Access Rate</div>
<div class="kpi-value kpi-good">0.4%</div>
<div class="kpi-sub">Target ≤ 1%</div>
</div>
<div class="kpi-card">
<div class="kpi-title">NABIDH/Malaffi Success</div>
<div class="kpi-value kpi-good">99.8%</div>
<div class="kpi-sub">Target ≥ 99.5%</div>
</div>
<div class="kpi-card">
<div class="kpi-title">Portal Adoption (Y2)</div>
<div class="kpi-value kpi-warn">63.5%</div>
<div class="kpi-sub">Target ≥ 70%</div>
</div>
<div class="kpi-card">
<div class="kpi-title">Scan Backlog > 48h</div>
<div class="kpi-value kpi-bad">27</div>
<div class="kpi-sub">Target 0 documents</div>
</div>
</div>
<!-- Charts -->
<div class="grid">
<div class="panel">
<h2>Registration Quality & Time Trend</h2>
<div class="chart-placeholder">
Line chart: Registration Completion (%) and Avg Time (min) by week
</div>
</div>
<div class="panel">
<h2>Allergy & Problem List by Department</h2>
<div class="chart-placeholder">
Clustered bar chart: Allergy Documentation & Problem List Currency per department
</div>
</div>
<div class="panel">
<h2>Clinical Note Completion & Overdue Items</h2>
<div class="chart-placeholder">
Stacked bar: Notes completed <24h / 24–72h / >72h by specialty
</div>
</div>
<div class="panel">
<h2>Privacy & HIE Compliance</h2>
<div class="chart-placeholder">
Dual gauge: BTG Rate vs 1% target; HIE Success vs 99.5% target
</div>
</div>
</div>
<!-- Detailed Tables -->
<div class="grid">
<div class="panel">
<h2>Unresolved Duplicates & Scan Backlog (Top 10)</h2>
<div class="scroll">
<table>
<thead>
<tr>
<th>Type</th>
<th>Patient</th>
<th>MRN</th>
<th>Age (days)</th>
<th>Facility</th>
<th>Owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Duplicate Suspect</td>
<td>Ahmed Al-Maktoum</td>
<td>DXB-0012345</td>
<td>3</td>
<td>Dubai General Hospital</td>
<td>MRO Team</td>
</tr>
<tr>
<td>Pending Scan</td>
<td>Fatima Al-Nahyan</td>
<td>AUH-0098765</td>
<td>5</td>
<td>Abu Dhabi Medical Center</td>
<td>HIM – OPD</td>
</tr>
<!-- Additional rows populated by application -->
</tbody>
</table>
</div>
</div>
<div class="panel">
<h2>Recent BTG Events (Last 30 Days)</h2>
<div class="scroll">
<table>
<thead>
<tr>
<th>Date/Time</th>
<th>User</th>
<th>Role</th>
<th>Patient</th>
<th>Reason</th>
<th>Facility</th>
</tr>
</thead>
<tbody>
<tr>
<td>03 Feb 2026 14:22</td>
<td>Dr. Ali Hassan</td>
<td>Physician</td>
<td>Salem Al-Falasi</td>
<td>Emergency – unconscious patient</td>
<td>Dubai General Hospital</td>
</tr>
<!-- Additional rows populated by application -->
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>
Regulatory Reports
1. MOH / Federal-Level Requirements
Although detailed formats may vary, the HIS must support:
-
National Health Statistics Extract (Demographics & Encounters)
- Content:- Patient demographics: age, gender, nationality, emirate of residence.
- Encounter counts by facility, department, encounter type.
- Source tables:
patients,patient_demographics,encounters,facilities,departments. - Frequency: Quarterly / Annually (configurable).
- Format: CSV/Excel with MOH-defined layout; aggregate counts only (no direct identifiers).
- Privacy: Apply de-identification/pseudonymisation per UAE PDPL where required.
-
Notifiable Disease & Public Health Surveillance Support
- While detailed clinical data may come from LIS/RIS, this module must:- Provide accurate patient identity and demographics to MOH surveillance systems.
- Integration: via NABIDH/Malaffi or direct MOH interfaces (outside this document’s scope).
2. DOH (Abu Dhabi) / Malaffi
-
Malaffi Connectivity & Data Quality Report - KPIs:
- ADT submission success rate (KPI-EHR-010).
- Demographic completeness for Malaffi-required fields.
- Audience: DOH liaison, CIO, HIM.
- Frequency: Monthly.
- Format: PDF summary + CSV detail of failed messages.
-
ADHICS Compliance Evidence (Access & Audit) - Content:
- BTG rate (KPI-EHR-009).
- List of BTG events with reason, user, timestamp.
- Audit sampling of access logs for high-risk roles.
- Audience: Privacy Officer, IT Security, DOH auditors.
- Frequency: Quarterly / On-demand.
- Format: PDF with digital signature; CSV for detailed logs.
3. DHA (Dubai) / NABIDH
-
NABIDH Interface Performance Report - Similar to Malaffi, focusing on Dubai facilities:
- ADT success rate.
- Message volume by type.
- Frequency: Monthly.
- Format: Dashboard + CSV.
-
eClaimLink Support (Demographics & Insurance) - While claims are handled by Billing, this module must:
- Provide accurate patient demographics and identifiers to RCM.
- Reporting:
- Demographic error rates identified by payers (e.g., invalid Emirates ID).
- Shared with RCM team for data quality improvement.
4. UAE PDPL Compliance Reports
-
Data Subject Access & Consent Report - Content:
- Number of PDPL consents granted/withdrawn per period.
- List of consent withdrawals and downstream impact (e.g., HIE sharing disabled).
- Source:
patient_consents,audit_log. - Frequency: Monthly / On-demand.
- Audience: Privacy Officer, Legal/Compliance.
- Format: PDF + CSV.
-
Access Audit & Incident Investigation Support - Content:
- Full audit trail for specified patient(s) or time period.
- BTG events, unusual access patterns (e.g., staff accessing VIPs).
- Source:
audit_log,users,roles. - Frequency: On-demand.
- Format: CSV/Excel (for analysis), PDF summary.
5. Accreditation & Quality (NABH/JCI-like, UAE Context)
- Medical Record Completeness Report
- Combines:
- Clinical note completion (KPI-EHR-007).
- Consent compliance (KPI-EHR-008).
- Allergy documentation (KPI-EHR-005).
- Audience: Quality & Accreditation teams.
- Frequency: Monthly.
- Format: PDF dashboard + Excel detail.
Ad-Hoc Reporting
Available Data Fields (Examples)
The ad-hoc reporting layer should expose a curated semantic model over the underlying tables. Key subject areas:
-
Patient & Demographics - Patient:
patient_id,mrn,emirates_id,first_name_en,last_name_en,date_of_birth,gender,nationality_code,is_active. - Demographics:emirate,city,po_box,mobile_phone,email,preferred_language,marital_status,occupation. -
Identifiers & Insurance - Identifiers:
identifier_type(MRN, Emirates ID, passport, visa, insurance_member_id),identifier_value,verification_status. - Insurance (via RCM module): payer name, plan, member ID (read-only in this module). -
Clinical Summary - Allergies: allergen (code/display), reaction type, severity, status, onset_date. - Problems: ICD-10-AM code, SNOMED code, description, status, onset/resolved dates, treating provider. - Clinical notes: note type, author, status, signed_datetime.
-
Documents & Consents - Documents: document_type, upload_date, status, retention_date. - Consents: consent_type, status, granted_datetime, expiry_datetime, withdrawal_reason.
-
Access & Audit - Audit: user, role, patient, action, resource_type, timestamp, is_btg, access_reason, ip_address. - Integration messages: message_type, target_system, ack_status, error_code.
-
Master Data - Facilities, departments, locations. - Provider specialties, user roles.
Export Formats
- CSV: Default for data extracts; supports large datasets and import into analytics tools.
- Excel (XLSX): For business users; includes basic formatting and filters.
- PDF: For official reports, regulatory submissions, and management summaries.
- JSON: Optional for technical integrations or API-based analytics.
Scheduled Report Delivery
The reporting engine should support:
-
Scheduling Options - Frequencies: hourly (for technical), daily, weekly, monthly, quarterly. - Time-of-day configuration per report. - Time zone: Gulf Standard Time (GST, UTC+4).
-
Delivery Channels - Secure email with link to report (no PHI in email body; links require authentication). - In-application notification center. - Secure SFTP drop for bulk/regulatory extracts.
-
Access Control - Reports visible only to users with appropriate permissions (e.g.,
generate_reports,generate_privacy_reports). - Row-level security by facility/department where applicable. -
Audit & PDPL Compliance - Log report generation and access in
audit_log(who ran which report, when, and with what filters). - For reports containing identifiable data, markresource_type='report'and include report ID inresource_id.
Shared Entity References
This module owns:
patients,patient_demographics,patient_identifiersproviders,provider_credentialsusers,roles,permissions,role_permissions,user_rolesfacilities,departments,locationspatient_allergies,patient_problems,clinical_notes,patient_documents,patient_consentsaudit_log,duplicate_suspects
It references:
encountersfrom Scheduling (encounters.encounter_id)payers,insurance_plansfrom Policy & Contract Management
All KPI and reporting queries must respect these ownership and foreign key relationships.