Blood Bank Management KPIs & Reporting

Blood Bank Management KPIs & Reporting

KPI Summary

KPI ID KPI Name Formula (Conceptual) Target Data Source Frequency
KPI-BB-001 Crossmatch-to-Transfusion Ratio (C:T) # crossmatched units / # transfused units ≤ 2.0 crossmatch_records, transfusion_administration Monthly, daily
KPI-BB-002 Blood Component Wastage Rate discarded_units / (total_issued_units + discarded_units) × 100 ≤ 5% (RBCs), ≤ 10% (platelets) blood_discard_log, blood_component_inventory, blood_components Monthly
KPI-BB-003 Transfusion Reaction Rate transfusion_reactions / total_transfusions × 100 ≤ 1% transfusion_reactions, transfusion_administration Monthly
KPI-BB-004 Type & Screen TAT AVG(result_datetime - specimen_received_datetime) ≤ 60 min routine; ≤ 15 min emergency blood_type_screen, transfusion_orders, encounters Daily, monthly
KPI-BB-005 Crossmatch TAT AVG(crossmatch_completed - crossmatch_requested) ≤ 45 min routine; ≤ 10 min electronic crossmatch_records, transfusion_orders Daily, monthly
KPI-BB-006 Donor Deferral Rate deferred_donors / total_screened_donors × 100 ≤ 15% blood_donors, blood_donations Monthly
KPI-BB-007 Inventory Adequacy (Days on Hand) current_inventory_units / avg_daily_usage (per component & ABO/Rh) ≥ 3 days for all ABO/Rh groups blood_component_inventory, blood_components, transfusion_administration Daily
KPI-BB-008 Expired Unit Rate units_expired / total_units_received × 100 ≤ 3% blood_discard_log, blood_components, blood_component_inventory Monthly
KPI-BB-009 Emergency Release Rate uncrossmatched_emergency_releases / total_transfusions × 100 ≤ 2% transfusion_orders, transfusion_administration, crossmatch_records Monthly
KPI-BB-010 Hemovigilance Reporting Compliance serious_reactions_reported_to_moh / total_serious_reactions × 100 100% transfusion_reactions Monthly, ad-hoc

Note: All KPIs must support filtering by facility, date range, and (where applicable) component type, ABO/Rh, clinical department, and ordering provider.


KPI Definitions

KPI-BB-001: Crossmatch-to-Transfusion Ratio (C:T)

Definition

Measures the number of blood units crossmatched compared to the number actually transfused within a period. Indicates efficiency of ordering and crossmatching practices; high ratios suggest over-ordering or poor utilization.

Calculation Formula (SQL)

SQL
-- Numerator: total crossmatched units in period
WITH crossmatched AS (
    SELECT
        cm.component_id,
        cm.patient_id,
        cm.performed_datetime
    FROM crossmatch_records cm
    WHERE cm.result = 'compatible'
      AND cm.performed_datetime >= :start_date
      AND cm.performed_datetime < :end_date
),

-- Denominator: total transfused units in period
transfused AS (
    SELECT
        ta.component_id,
        ta.patient_id,
        ta.start_datetime
    FROM transfusion_administration ta
    WHERE ta.status IN ('completed', 'in_progress')
      AND ta.start_datetime >= :start_date
      AND ta.start_datetime < :end_date
)

SELECT
    COUNT(DISTINCT crossmatched.component_id)::DECIMAL
    / NULLIF(COUNT(DISTINCT transfused.component_id), 0) AS ct_ratio
FROM crossmatched
CROSS JOIN transfused;

Alternative per-facility calculation: join blood_component_inventory.facility_id to both C and T sets.

Target / Benchmark

Metric Target Source / Rationale
Crossmatch-to-Transfusion C:T ≤ 2.0 Common transfusion practice benchmark; aligns with AABB-style utilization guidance

Data Source

  • crossmatch_records
  • crossmatch_id, component_id, patient_id, result, performed_datetime
  • transfusion_administration
  • admin_id, component_id, patient_id, start_datetime, status
  • Optional: blood_component_inventory.facility_id for facility-level ratios

Dimensions / Filters

  • Time: day, week, month, quarter, year
  • Facility (blood_component_inventory.facility_id)
  • Clinical department (via encounters.department_id joined from transfusion_administration.encounter_id)
  • Ordering provider (transfusion_orders.ordering_provider_id)
  • Component type (blood_components.component_type)

Visualization

  • Primary: Line chart of C:T ratio by month with target line at 2.0
  • Drill-down: Bar chart by department and by component type

Alert Thresholds

  • Warning: C:T > 2.0 for 2 consecutive months (facility-level)
  • Critical: C:T > 2.5 in any month or > 3.0 in any department
  • Notifications:
  • Blood Bank Supervisor
  • Blood Bank Medical Director
  • Transfusion Committee chair

KPI-BB-002: Blood Component Wastage Rate

Definition

Percentage of blood components discarded (any reason) out of total units either issued or discarded. Measures efficiency of inventory management and adherence to FEFO (First Expiry First Out).

Calculation Formula (SQL)

SQL
WITH population AS (
    -- All units that left usable inventory in period (issued or discarded)
    SELECT DISTINCT bc.component_id, bc.component_type
    FROM blood_components bc
    JOIN blood_component_inventory bci
      ON bci.component_id = bc.component_id
    WHERE bci.received_datetime >= :start_date
      AND bci.received_datetime < :end_date
),

discarded AS (
    SELECT DISTINCT
        bdl.component_id
    FROM blood_discard_log bdl
    JOIN blood_components bc
      ON bc.component_id = bdl.component_id
    WHERE bdl.discard_datetime >= :start_date
      AND bdl.discard_datetime < :end_date
)

SELECT
    bc.component_type,
    COUNT(DISTINCT discarded.component_id) * 100.0
        / NULLIF(COUNT(DISTINCT population.component_id), 0) AS wastage_rate_pct
FROM population
JOIN blood_components bc ON bc.component_id = population.component_id
LEFT JOIN discarded ON discarded.component_id = population.component_id
GROUP BY bc.component_type;

Target / Benchmark

Component Type Target Wastage Rate Source / Rationale
RBCs ≤ 5% Common international benchmark for well-managed inventories
Platelets ≤ 10% Short shelf life; higher acceptable wastage
Plasma/FFP Locally defined (e.g. ≤ 3–5%) Facility / MOH guidance

Data Source

  • blood_components
  • component_id, component_type, expiry_datetime
  • blood_component_inventory
  • component_id, facility_id, received_datetime, status
  • blood_discard_log
  • discard_id, component_id, discard_reason, discard_datetime

Dimensions / Filters

  • Time: month, quarter, year
  • Facility
  • Component type
  • ABO/Rh group
  • Discard reason (expired, positive infectious test, damaged, temperature excursion)

Visualization

  • Stacked bar chart: wastage rate by component type with target lines
  • Pareto bar: wastage by discard reason
  • Trend line: monthly wastage rate per facility

Alert Thresholds

  • Warning:
  • RBC wastage > 5% or platelet wastage > 10% in a month
  • Critical:
  • RBC wastage > 8% or platelet wastage > 15% OR any single discard event > 10 units
  • Notifications:
  • Blood Bank Supervisor
  • Quality & Patient Safety
  • Facility Operations Manager (for repeated breaches)

KPI-BB-003: Transfusion Reaction Rate

Definition

Percentage of transfusions associated with a documented transfusion reaction. Reflects transfusion safety and effectiveness of monitoring.

Calculation Formula (SQL)

SQL
WITH transfusions AS (
    SELECT
        ta.admin_id,
        ta.patient_id,
        ta.component_id,
        ta.start_datetime
    FROM transfusion_administration ta
    WHERE ta.status IN ('completed', 'in_progress')
      AND ta.start_datetime >= :start_date
      AND ta.start_datetime < :end_date
),

reactions AS (
    SELECT DISTINCT
        tr.admin_id
    FROM transfusion_reactions tr
    WHERE tr.onset_time >= :start_date
      AND tr.onset_time < :end_date
)

SELECT
    COUNT(DISTINCT reactions.admin_id) * 100.0
        / NULLIF(COUNT(DISTINCT transfusions.admin_id), 0) AS reaction_rate_pct
FROM transfusions
LEFT JOIN reactions ON reactions.admin_id = transfusions.admin_id;

Target / Benchmark

Metric Target Source / Rationale
Overall reaction rate ≤ 1% Typical hemovigilance benchmark for reported reactions
Serious reaction rate Locally defined (e.g. ≤ 0.1%) Based on MOH hemovigilance expectations

Data Source

  • transfusion_administration
  • admin_id, patient_id, component_id, start_datetime, status
  • transfusion_reactions
  • reaction_id, admin_id, reaction_type, severity, onset_time, classification

Dimensions / Filters

  • Time: month, quarter, year
  • Facility
  • Clinical department
  • Component type
  • Reaction type and severity
  • Patient age group (via patients.dob)

Visualization

  • Line chart: overall reaction rate over time with 1% target line
  • Stacked bar: reaction types (allergic, febrile, hemolytic, TRALI, TACO, etc.)
  • Table: list of serious reactions with classification and outcome

Alert Thresholds

  • Warning:
  • Reaction rate > 1% for 2 consecutive months
  • Any cluster: ≥ 3 similar reactions to same component type within 7 days
  • Critical:
  • Any suspected acute hemolytic reaction, TRALI, or TACO (event-level alert)
  • Notifications:
  • Blood Bank Medical Director
  • Transfusion Committee
  • Quality & Patient Safety
  • MOH Hemovigilance (for serious reactions, per KPI-BB-010)

KPI-BB-004: Type & Screen Turnaround Time (TAT)

Definition

Average time from specimen receipt in the blood bank to completion of type & screen result. Monitors laboratory responsiveness for pre-transfusion testing.

Calculation Formula (SQL)

Assumptions:

  • blood_type_screen.specimen_received_datetime
  • blood_type_screen.tested_datetime (or result_datetime if separate)
  • Priority derived from linked transfusion_orders.priority when applicable.
SQL
SELECT
    CASE
        WHEN o.priority IN ('STAT', 'EMERGENCY') THEN 'emergency'
        ELSE 'routine'
    END AS priority_group,
    AVG(EXTRACT(EPOCH FROM (bts.tested_datetime - bts.specimen_received_datetime)) / 60.0)
        AS tat_minutes
FROM blood_type_screen bts
LEFT JOIN transfusion_orders o
  ON o.patient_id = bts.patient_id
 AND o.encounter_id = bts.encounter_id
 AND o.order_datetime BETWEEN bts.specimen_received_datetime - INTERVAL '2 hour'
                           AND bts.specimen_received_datetime + INTERVAL '2 hour'
WHERE bts.specimen_received_datetime >= :start_date
  AND bts.specimen_received_datetime < :end_date
GROUP BY priority_group;

Target / Benchmark

Priority Target TAT Source / Rationale
Routine ≤ 60 minutes Common transfusion service standard
Emergency ≤ 15 minutes For urgent / massive transfusion scenarios

Data Source

  • blood_type_screen
  • ts_id, patient_id, encounter_id, specimen_id, specimen_received_datetime, tested_datetime
  • transfusion_orders
  • order_id, patient_id, encounter_id, priority, order_datetime

Dimensions / Filters

  • Time: day, week, month
  • Facility
  • Priority (routine vs emergency)
  • Ordering department
  • Technologist (blood_type_screen.tested_by)

Visualization

  • Box-and-whisker plot: TAT distribution by priority
  • Line chart: median TAT over time with SLA target line
  • Gauge: % of tests within target TAT

Alert Thresholds

  • Warning:
  • Median routine TAT > 60 min or emergency TAT > 15 min for a day
  • Critical:
  • 20% of emergency T&S exceeding 30 minutes in any 24-hour period

  • Notifications:
  • Blood Bank Supervisor
  • Laboratory Manager
  • On-call Pathologist (for persistent emergency breaches)

KPI-BB-005: Crossmatch Turnaround Time (TAT)

Definition

Average time from crossmatch request to completion of crossmatch testing. Critical for timely availability of compatible blood.

Calculation Formula (SQL)

Assumptions:

  • crossmatch_records.requested_datetime (if not present, derive from transfusion_orders.order_datetime)
  • crossmatch_records.performed_datetime
  • crossmatch_records.crossmatch_type (e.g. 'electronic', 'serological').
SQL
SELECT
    cm.crossmatch_type,
    AVG(EXTRACT(EPOCH FROM (cm.performed_datetime - cm.requested_datetime)) / 60.0)
        AS tat_minutes
FROM crossmatch_records cm
WHERE cm.requested_datetime >= :start_date
  AND cm.requested_datetime < :end_date
  AND cm.result IS NOT NULL
GROUP BY cm.crossmatch_type;

If requested_datetime is not stored:

SQL
SELECT
    cm.crossmatch_type,
    AVG(EXTRACT(EPOCH FROM (cm.performed_datetime - o.order_datetime)) / 60.0)
        AS tat_minutes
FROM crossmatch_records cm
JOIN transfusion_orders o
  ON o.patient_id = cm.patient_id
 AND o.component_type_requested = bc.component_type
-- additional join logic as per data model
WHERE o.order_datetime >= :start_date
  AND o.order_datetime < :end_date
GROUP BY cm.crossmatch_type;

Target / Benchmark

Crossmatch Type Target TAT Rationale
Routine ≤ 45 minutes Standard transfusion service expectation
Electronic ≤ 10 minutes Automated compatibility check

Data Source

  • crossmatch_records
  • crossmatch_id, patient_id, component_id, crossmatch_type, requested_datetime, performed_datetime, result
  • transfusion_orders (if needed)
  • order_id, order_datetime, priority, component_type_requested

Dimensions / Filters

  • Time: day, week, month
  • Facility
  • Crossmatch type (electronic vs serological)
  • Priority (routine vs emergency)
  • Technologist (performed_by)

Visualization

  • Line chart: average TAT by crossmatch type over time
  • Box plot: distribution by priority
  • Gauge: % crossmatches within SLA

Alert Thresholds

  • Warning:
  • Average routine TAT > 45 min or electronic TAT > 10 min for 3 consecutive days
  • Critical:
  • Any emergency crossmatch > 60 min
  • Notifications:
  • Blood Bank Supervisor
  • Blood Bank Medical Director

KPI-BB-006: Donor Deferral Rate

Definition

Percentage of screened donors who are deferred (temporary or permanent). High rates may indicate overly restrictive criteria or poor pre-screening; low rates may indicate insufficient screening.

Calculation Formula (SQL)

Assumptions:

  • A “screened donor” is a donor with a donation attempt record in period.
  • Deferred donors identified via blood_donors.donor_status or blood_donations.screening_pass = FALSE.
SQL
WITH screened AS (
    SELECT DISTINCT
        d.donor_id
    FROM blood_donations d
    WHERE d.donation_date >= :start_date
      AND d.donation_date < :end_date
),

deferred AS (
    SELECT DISTINCT
        bd.donor_id
    FROM blood_donors bd
    WHERE bd.donor_status IN ('temporarily_deferred', 'permanently_deferred')
)

SELECT
    COUNT(DISTINCT (screened.donor_id) FILTER (WHERE deferred.donor_id IS NOT NULL))
        * 100.0 / NULLIF(COUNT(DISTINCT screened.donor_id), 0) AS deferral_rate_pct
FROM screened
LEFT JOIN deferred ON deferred.donor_id = screened.donor_id;

Target / Benchmark

Metric Target Rationale
Donor deferral rate ≤ 15% Typical range for well-managed donor programs; aligned with MOH guidance

Data Source

  • blood_donors
  • donor_id, donor_status, deferral_reason, deferral_until
  • blood_donations
  • donation_id, donor_id, donation_date, screening_pass, infectious_disease_status

Dimensions / Filters

  • Time: month, quarter, year
  • Facility / collection site (blood_donations.collection_site)
  • Deferral type (temporary vs permanent)
  • Deferral reason (MOH-defined vs facility-defined)
  • Donor demographics (age, gender, nationality)

Visualization

  • Line chart: overall deferral rate over time
  • Bar chart: deferral rate by reason
  • Heatmap: deferral rate by collection site and month

Alert Thresholds

  • Warning:
  • Deferral rate > 15% for 3 consecutive months
  • Critical:
  • Sudden spike in infectious-disease-related deferrals (e.g. > 5% in a month)
  • Notifications:
  • Donor Physician
  • Blood Bank Supervisor
  • Infection Control (for infectious-related spikes)

KPI-BB-007: Inventory Adequacy (Days on Hand)

Definition

Number of days current inventory can support based on average daily usage, per component type and ABO/Rh group. Ensures readiness for routine and emergency needs.

Calculation Formula (SQL)

Assumptions:

  • “Current inventory units” = units in blood_component_inventory.status = 'available' and not expired.
  • “Average daily usage” = average number of units transfused per day over a lookback window (e.g. last 30 days).
SQL
-- Current inventory
WITH current_inventory AS (
    SELECT
        bc.component_type,
        bc.abo_group,
        bc.rh_type,
        COUNT(*) AS current_units
    FROM blood_component_inventory bci
    JOIN blood_components bc ON bc.component_id = bci.component_id
    WHERE bci.status = 'available'
      AND bc.expiry_datetime > NOW()
      AND bci.facility_id = :facility_id
    GROUP BY bc.component_type, bc.abo_group, bc.rh_type
),

-- Average daily usage over last 30 days
usage AS (
    SELECT
        bc.component_type,
        bc.abo_group,
        bc.rh_type,
        COUNT(*) / 30.0 AS avg_daily_usage
    FROM transfusion_administration ta
    JOIN blood_components bc ON bc.component_id = ta.component_id
    WHERE ta.start_datetime >= (CURRENT_DATE - INTERVAL '30 day')
      AND ta.start_datetime < CURRENT_DATE
      AND ta.status = 'completed'
      AND ta.encounter_id IN (
          SELECT encounter_id FROM encounters WHERE facility_id = :facility_id
      )
    GROUP BY bc.component_type, bc.abo_group, bc.rh_type
)

SELECT
    ci.component_type,
    ci.abo_group,
    ci.rh_type,
    ci.current_units,
    u.avg_daily_usage,
    CASE
        WHEN u.avg_daily_usage = 0 THEN NULL
        ELSE ci.current_units / u.avg_daily_usage
    END AS days_on_hand
FROM current_inventory ci
LEFT JOIN usage u
  ON u.component_type = ci.component_type
 AND u.abo_group = ci.abo_group
 AND u.rh_type = ci.rh_type;

Target / Benchmark

Metric Target Rationale
Days on hand (all groups) ≥ 3 days Common minimum stock target for acute care hospitals
High-risk components (O-) Facility-defined (e.g. ≥ 5 days) For emergency / trauma readiness

Data Source

  • blood_components
  • component_id, component_type, abo_group, rh_type, expiry_datetime
  • blood_component_inventory
  • inventory_id, component_id, facility_id, status
  • transfusion_administration
  • admin_id, component_id, start_datetime, status
  • encounters
  • encounter_id, facility_id

Dimensions / Filters

  • Facility
  • Component type
  • ABO/Rh group
  • Date (for historical snapshots)

Visualization

  • Dashboard tiles: days on hand by component type and ABO/Rh (gauge-style)
  • Heatmap: days on hand by ABO/Rh vs component type
  • Trend line: days on hand for critical groups (e.g. O- RBCs)

Alert Thresholds

  • Warning:
  • Days on hand < 3 for any component/ABO/Rh
  • Critical:
  • Days on hand < 1.5 for any component/ABO/Rh or < 2 for O- RBCs
  • Notifications:
  • Blood Bank Supervisor
  • Procurement / External Supplier Liaison
  • Hospital Operations (for sustained shortages)

KPI-BB-008: Expired Unit Rate

Definition

Percentage of units that expire before use out of total units received. Measures effectiveness of FEFO and inventory rotation.

Calculation Formula (SQL)

SQL
WITH received AS (
    SELECT DISTINCT
        bc.component_id,
        bc.component_type
    FROM blood_components bc
    JOIN blood_component_inventory bci
      ON bci.component_id = bc.component_id
    WHERE bci.received_datetime >= :start_date
      AND bci.received_datetime < :end_date
),

expired AS (
    SELECT DISTINCT
        bdl.component_id
    FROM blood_discard_log bdl
    JOIN blood_components bc
      ON bc.component_id = bdl.component_id
    WHERE bdl.discard_reason = 'expired'
      AND bdl.discard_datetime >= :start_date
      AND bdl.discard_datetime < :end_date
)

SELECT
    bc.component_type,
    COUNT(DISTINCT expired.component_id) * 100.0
        / NULLIF(COUNT(DISTINCT received.component_id), 0) AS expired_rate_pct
FROM received
JOIN blood_components bc ON bc.component_id = received.component_id
LEFT JOIN expired ON expired.component_id = received.component_id
GROUP BY bc.component_type;

Target / Benchmark

Metric Target Rationale
Expired unit rate ≤ 3% Common benchmark for well-managed blood inventories

Data Source

  • blood_components
  • component_id, component_type, expiry_datetime
  • blood_component_inventory
  • component_id, received_datetime, facility_id
  • blood_discard_log
  • component_id, discard_reason, discard_datetime

Dimensions / Filters

  • Time: month, quarter, year
  • Facility
  • Component type
  • ABO/Rh group

Visualization

  • Bar chart: expired unit rate by component type
  • Trend line: overall expired rate over time
  • Table: list of expired units with days past expiry

Alert Thresholds

  • Warning:
  • Expired unit rate > 3% in any month
  • Critical:
  • Expired unit rate > 5% OR > 10 expired units of same component/ABO in a month
  • Notifications:
  • Blood Bank Supervisor
  • Quality & Patient Safety
  • Supply Chain / Procurement

KPI-BB-009: Emergency Release Rate

Definition

Percentage of transfusions performed under emergency release (uncrossmatched or partially crossmatched) out of all transfusions. High rates may indicate systemic delays or overuse of emergency protocols.

Calculation Formula (SQL)

Assumptions:

  • transfusion_orders.emergency_release boolean.
  • Emergency release transfusion = transfusion linked to an order with emergency_release = TRUE and no completed crossmatch before transfusion start.
SQL
WITH all_transfusions AS (
    SELECT
        ta.admin_id,
        ta.order_id,
        ta.start_datetime
    FROM transfusion_administration ta
    WHERE ta.status IN ('completed', 'in_progress')
      AND ta.start_datetime >= :start_date
      AND ta.start_datetime < :end_date
),

emergency_transfusions AS (
    SELECT
        at.admin_id
    FROM all_transfusions at
    JOIN transfusion_orders o
      ON o.order_id = at.order_id
    LEFT JOIN crossmatch_records cm
      ON cm.patient_id = o.patient_id
     AND cm.component_id = at.component_id
     AND cm.result = 'compatible'
     AND cm.performed_datetime <= at.start_datetime
    WHERE o.emergency_release = TRUE
      AND cm.crossmatch_id IS NULL  -- no completed crossmatch before transfusion
)

SELECT
    COUNT(DISTINCT emergency_transfusions.admin_id) * 100.0
        / NULLIF(COUNT(DISTINCT all_transfusions.admin_id), 0) AS emergency_release_rate_pct
FROM all_transfusions
LEFT JOIN emergency_transfusions
  ON emergency_transfusions.admin_id = all_transfusions.admin_id;

Target / Benchmark

Metric Target Rationale
Emergency release rate ≤ 2% Common benchmark; higher rates require investigation

Data Source

  • transfusion_orders
  • order_id, patient_id, emergency_release, priority
  • transfusion_administration
  • admin_id, order_id, component_id, start_datetime, status
  • crossmatch_records
  • crossmatch_id, patient_id, component_id, result, performed_datetime

Dimensions / Filters

  • Time: month, quarter, year
  • Facility
  • Clinical department (e.g. ED, OR, ICU)
  • Component type
  • Time of day / shift

Visualization

  • Line chart: emergency release rate over time with 2% target line
  • Bar chart: emergency release rate by department
  • Table: list of emergency release cases with justification

Alert Thresholds

  • Warning:
  • Emergency release rate > 2% in any month
  • Critical:
  • Emergency release rate > 5% OR any cluster of > 3 emergency releases in 24 hours outside ED/OR
  • Notifications:
  • Blood Bank Medical Director
  • Transfusion Committee
  • ED / OR leadership (for department-specific spikes)

KPI-BB-010: Hemovigilance Reporting Compliance

Definition

Percentage of serious transfusion reactions that are reported to UAE MOH Hemovigilance as required. Ensures regulatory compliance and patient safety monitoring.

Calculation Formula (SQL)

Assumptions:

  • Serious reactions identified via transfusion_reactions.severity or classification.
  • Reporting captured via reported_to_moh boolean and moh_report_datetime.
SQL
WITH serious_reactions AS (
    SELECT
        tr.reaction_id
    FROM transfusion_reactions tr
    WHERE tr.onset_time >= :start_date
      AND tr.onset_time < :end_date
      AND (
            tr.severity IN ('severe', 'life_threatening', 'death')
         OR tr.classification IN ('acute_hemolytic', 'delayed_hemolytic',
                                  'TRALI', 'TACO', 'anaphylactic')
      )
),

reported AS (
    SELECT
        sr.reaction_id
    FROM serious_reactions sr
    JOIN transfusion_reactions tr
      ON tr.reaction_id = sr.reaction_id
    WHERE tr.reported_to_moh = TRUE
)

SELECT
    COUNT(DISTINCT reported.reaction_id) * 100.0
        / NULLIF(COUNT(DISTINCT serious_reactions.reaction_id), 0) AS reporting_compliance_pct
FROM serious_reactions
LEFT JOIN reported ON reported.reaction_id = serious_reactions.reaction_id;

Target / Benchmark

Metric Target Source / Rationale
Hemovigilance reporting compliance 100% UAE MOH hemovigilance expectations for serious reactions

Data Source

  • transfusion_reactions
  • reaction_id, admin_id, reaction_type, severity, classification, reported_to_moh, moh_report_reference, moh_report_datetime

Dimensions / Filters

  • Time: month, quarter, year
  • Facility
  • Reaction type / classification
  • Reporting timeliness (e.g. within 24/48 hours)

Visualization

  • Gauge: compliance percentage (target 100%)
  • Bar chart: number of serious reactions vs number reported by month
  • Table: list of unreported or late-reported serious reactions

Alert Thresholds

  • Warning:
  • Any serious reaction with reported_to_moh = FALSE after 24 hours
  • Critical:
  • Hemovigilance compliance < 100% in any month
  • Notifications:
  • Blood Bank Medical Director
  • Quality & Patient Safety
  • Regulatory Affairs / Compliance Officer

Standard Reports

Report ID Report Name Purpose Audience Frequency Format
RPT-BB-001 Blood Bank KPI Dashboard Real-time view of key KPIs (C:T ratio, wastage, reactions, inventory days on hand). Blood Bank Supervisor, Medical Director Real-time / Daily Interactive dashboard (HTML)
RPT-BB-002 Transfusion Utilization & C:T Analysis Analyze ordering patterns, C:T ratio by department and provider. Transfusion Committee, Department Heads Monthly PDF + Excel export
RPT-BB-003 Component Wastage & Expiry Report Detail of discarded and expired units by reason and component type. Blood Bank Supervisor, Quality Monthly PDF + CSV
RPT-BB-004 Transfusion Reaction & Hemovigilance Report Summary and detail of transfusion reactions and MOH reporting compliance. Blood Bank Medical Director, MOH liaison Monthly + ad-hoc PDF (signed) + Excel
RPT-BB-005 Inventory Adequacy & Shortage Risk Days on hand by component and ABO/Rh; identify potential shortages. Blood Bank Supervisor, Hospital Operations Daily Dashboard + Excel
RPT-BB-006 Donor Activity & Deferral Statistics Donor recruitment, donation counts, deferral rates and reasons. Donor Physician, Donor Recruitment Team Monthly PDF + Excel
RPT-BB-007 Emergency Release Audit Review all emergency release transfusions and justifications. Transfusion Committee, Quality Quarterly + ad-hoc PDF
RPT-BB-008 MOH Hemovigilance Submission Summary Structured summary of serious reactions and reporting status for MOH portal submission. Regulatory Affairs, Blood Bank Medical Director Quarterly / as required PDF + CSV (MOH template)
RPT-BB-009 DOH/DHA Blood Utilization Statistics Aggregate statistics required by DOH (Malaffi) / DHA (NABIDH) for blood use and safety. Facility Management, Regulatory Affairs Quarterly / Annual Excel + XML/CSV (as per spec)
RPT-BB-010 PDPL Access & Audit Log Report (Blood Bank) Track access to donor and transfusion records for UAE PDPL compliance. DPO, Compliance Officer Quarterly / ad-hoc PDF + CSV

Dashboard Wireframe

Blood Bank Management Dashboard (HTML Mockup)

Show HTML code
HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Blood Bank Dashboard</title>
</head>
<body style="font-family: Arial, sans-serif; margin: 0; padding: 0; background:#f5f5f5;">

  <!-- Top Bar / Filters -->
  <div style="background:#003366; color:#fff; padding:10px 20px;">
    <div style="display:flex; justify-content:space-between; align-items:center;">
      <div style="font-size:18px; font-weight:bold;">Blood Bank Dashboard</div>
      <div>
        <label style="margin-right:10px; font-size:12px;">
          Facility:
          <select style="margin-left:5px; padding:2px 4px;">
            <option>All Facilities</option>
            <option>Dubai General Hospital</option>
            <option>Abu Dhabi City Hospital</option>
          </select>
        </label>
        <label style="margin-right:10px; font-size:12px;">
          Date Range:
          <select style="margin-left:5px; padding:2px 4px;">
            <option>Last 7 days</option>
            <option>Last 30 days</option>
            <option>Last 90 days</option>
            <option>Custom...</option>
          </select>
        </label>
        <label style="margin-right:10px; font-size:12px;">
          Component:
          <select style="margin-left:5px; padding:2px 4px;">
            <option>All</option>
            <option>RBC</option>
            <option>Platelets</option>
            <option>FFP</option>
            <option>Cryo</option>
          </select>
        </label>
      </div>
    </div>
  </div>

  <!-- KPI Cards Row -->
  <div style="display:flex; flex-wrap:wrap; padding:15px; gap:10px;">
    <div style="flex:1; min-width:180px; background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
      <div style="font-size:12px; color:#666;">C:T Ratio</div>
      <div style="font-size:24px; font-weight:bold; color:#333;">1.7</div>
      <div style="font-size:11px; color:#0a0;">Target ≤ 2.0</div>
      <div style="font-size:10px; color:#999; margin-top:4px;">Last updated: 10:15</div>
    </div>

    <div style="flex:1; min-width:180px; background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
      <div style="font-size:12px; color:#666;">Wastage Rate (RBC)</div>
      <div style="font-size:24px; font-weight:bold; color:#c00;">6.2%</div>
      <div style="font-size:11px; color:#c00;">Target ≤ 5%</div>
      <div style="font-size:10px; color:#999; margin-top:4px;">Flagged: Above target</div>
    </div>

    <div style="flex:1; min-width:180px; background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
      <div style="font-size:12px; color:#666;">Transfusion Reaction Rate</div>
      <div style="font-size:24px; font-weight:bold; color:#333;">0.8%</div>
      <div style="font-size:11px; color:#0a0;">Target ≤ 1%</div>
      <div style="font-size:10px; color:#999; margin-top:4px;">Serious: 1 this month</div>
    </div>

    <div style="flex:1; min-width:180px; background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
      <div style="font-size:12px; color:#666;">Hemovigilance Compliance</div>
      <div style="font-size:24px; font-weight:bold; color:#333;">100%</div>
      <div style="font-size:11px; color:#0a0;">Target 100%</div>
      <div style="font-size:10px; color:#999; margin-top:4px;">MOH reports up to date</div>
    </div>
  </div>

  <!-- Middle Row: Trends and Inventory -->
  <div style="display:flex; flex-wrap:wrap; padding:0 15px 15px 15px; gap:10px;">
    <!-- Left: KPI Trends -->
    <div style="flex:2; min-width:320px; background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
      <div style="font-size:13px; font-weight:bold; margin-bottom:5px;">KPI Trends</div>
      <div style="font-size:11px; color:#666; margin-bottom:5px;">
        [Line chart placeholder: C:T Ratio, Wastage Rate, Reaction Rate over last 6 months]
      </div>
      <div style="border:1px dashed #ccc; height:180px; text-align:center; font-size:11px; color:#aaa; line-height:180px;">
        Line Chart Area
      </div>
    </div>

    <!-- Right: Inventory Days on Hand -->
    <div style="flex:1; min-width:260px; background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
      <div style="font-size:13px; font-weight:bold; margin-bottom:5px;">Inventory Days on Hand</div>
      <table style="width:100%; border-collapse:collapse; font-size:11px;">
        <thead>
          <tr style="background:#f0f0f0;">
            <th style="text-align:left; padding:4px;">Component</th>
            <th style="text-align:right; padding:4px;">ABO/Rh</th>
            <th style="text-align:right; padding:4px;">Days</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td style="padding:4px;">RBC</td>
            <td style="padding:4px; text-align:right;">O-</td>
            <td style="padding:4px; text-align:right; color:#c00; font-weight:bold;">1.8</td>
          </tr>
          <tr>
            <td style="padding:4px;">RBC</td>
            <td style="padding:4px; text-align:right;">A+</td>
            <td style="padding:4px; text-align:right;">3.5</td>
          </tr>
          <tr>
            <td style="padding:4px;">Platelets</td>
            <td style="padding:4px; text-align:right;">All</td>
            <td style="padding:4px; text-align:right;">2.9</td>
          </tr>
          <tr>
            <td style="padding:4px;">FFP</td>
            <td style="padding:4px; text-align:right;">All</td>
            <td style="padding:4px; text-align:right;">4.2</td>
          </tr>
        </tbody>
      </table>
      <div style="font-size:10px; color:#999; margin-top:5px;">
        Threshold: ≥ 3 days (all ABO/Rh); O- ≥ 5 days recommended.
      </div>
    </div>
  </div>

  <!-- Bottom Row: Detailed Tables -->
  <div style="display:flex; flex-wrap:wrap; padding:0 15px 15px 15px; gap:10px;">
    <!-- Left: Wastage Details -->
    <div style="flex:1; min-width:320px; background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
      <div style="display:flex; justify-content:space-between; align-items:center;">
        <div style="font-size:13px; font-weight:bold; margin-bottom:5px;">Wastage by Reason</div>
        <button style="font-size:10px; padding:2px 6px;">Export CSV</button>
      </div>
      <table style="width:100%; border-collapse:collapse; font-size:11px;">
        <thead>
          <tr style="background:#f0f0f0;">
            <th style="text-align:left; padding:4px;">Reason</th>
            <th style="text-align:right; padding:4px;">Units</th>
            <th style="text-align:right; padding:4px;">%</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td style="padding:4px;">Expired</td>
            <td style="padding:4px; text-align:right;">24</td>
            <td style="padding:4px; text-align:right;">55%</td>
          </tr>
          <tr>
            <td style="padding:4px;">Temperature Excursion</td>
            <td style="padding:4px; text-align:right;">10</td>
            <td style="padding:4px; text-align:right;">23%</td>
          </tr>
          <tr>
            <td style="padding:4px;">Positive Infectious Screen</td>
            <td style="padding:4px; text-align:right;">6</td>
            <td style="padding:4px; text-align:right;">14%</td>
          </tr>
          <tr>
            <td style="padding:4px;">Other</td>
            <td style="padding:4px; text-align:right;">4</td>
            <td style="padding:4px; text-align:right;">8%</td>
          </tr>
        </tbody>
      </table>
    </div>

    <!-- Right: Recent Serious Reactions -->
    <div style="flex:1; min-width:320px; background:#fff; border-radius:4px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.1);">
      <div style="display:flex; justify-content:space-between; align-items:center;">
        <div style="font-size:13px; font-weight:bold; margin-bottom:5px;">Recent Serious Reactions</div>
        <button style="font-size:10px; padding:2px 6px;">View All</button>
      </div>
      <table style="width:100%; border-collapse:collapse; font-size:11px;">
        <thead>
          <tr style="background:#f0f0f0;">
            <th style="text-align:left; padding:4px;">Date/Time</th>
            <th style="text-align:left; padding:4px;">Type</th>
            <th style="text-align:left; padding:4px;">Severity</th>
            <th style="text-align:left; padding:4px;">MOH Status</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td style="padding:4px;">2026-02-05 14:22</td>
            <td style="padding:4px;">TRALI</td>
            <td style="padding:4px; color:#c00;">Severe</td>
            <td style="padding:4px;">Reported</td>
          </tr>
          <tr>
            <td style="padding:4px;">2026-02-03 09:10</td>
            <td style="padding:4px;">Acute hemolytic</td>
            <td style="padding:4px; color:#c00;">Life-threatening</td>
            <td style="padding:4px;">Reported</td>
          </tr>
          <tr>
            <td style="padding:4px;">2026-01-29 18:45</td>
            <td style="padding:4px;">TACO</td>
            <td style="padding:4px; color:#d60;">Moderate</td>
            <td style="padding:4px;">Reported</td>
          </tr>
        </tbody>
      </table>
      <div style="font-size:10px; color:#999; margin-top:5px;">
        Click a row to open full reaction investigation and MOH report.
      </div>
    </div>
  </div>

</body>
</html>

Regulatory Reports

All regulatory references are UAE-specific and must align with MOH, DOH, DHA, and UAE PDPL requirements.

1. MOH Hemovigilance & Blood Safety

MOH Mandatory Reports (via MOH reporting portal / INT-BB-005)

  • Serious Transfusion Reaction Notifications (Event-Driven)
  • Trigger: transfusion_reactions.severity in (severe, life_threatening, death) or classification in serious categories.
  • Content:
    • Patient demographics (pseudonymised where required)
    • Component details (ISBT 128 code, ABO/Rh, component_id)
    • Reaction details (type, onset, severity, outcome)
    • Investigation findings (DAT, hemolysis, clerical check)
    • Corrective actions
  • KPI linkage: KPI-BB-010 (Hemovigilance Reporting Compliance).

  • Quarterly Hemovigilance Summary

  • Aggregated counts of:
    • Total transfusions by component type
    • Total reactions by type and severity
    • Serious reactions and outcomes
    • Emergency release usage
  • Derived from transfusion_administration and transfusion_reactions.

  • Blood Component Quality & Wastage Report

  • Required fields:
    • Units collected, received, issued, discarded
    • Wastage by reason (expired, positive infectious screen, damage)
  • Derived from blood_donations, blood_components, blood_discard_log, blood_component_inventory.

2. DOH (Abu Dhabi) / Malaffi

  • Blood Utilization Statistics
  • For DOH and Malaffi reporting:
    • Transfusions by component type, indication, department
    • C:T ratio by department
    • Reaction rates
  • Data from transfusion_orders, transfusion_administration, crossmatch_records, transfusion_reactions.

  • ADHICS Compliance

  • Audit logs for:
    • Access to donor and transfusion records
    • Changes to reaction records and MOH reporting flags
  • Used to demonstrate compliance with ADHICS security and audit requirements.

3. DHA (Dubai) / NABIDH

  • NABIDH Clinical Data Feeds
  • Outbound data (via HL7 / FHIR) for:
    • Transfusion procedures (linked to patient encounters)
    • Transfusion reactions
  • Derived from transfusion_administration, transfusion_reactions, and shared patient/encounter tables.

  • DHA Statistical Submissions

  • Periodic summaries:
    • Number of transfusions by facility and department
    • Reaction rates
    • Wastage and expiry statistics
  • Aggregated from the same KPI data sources.

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

  • PDPL Access & Audit Reports
  • Required capabilities:
    • List all users who accessed donor records (blood_donors, blood_donations) in a period.
    • List all users who accessed or modified transfusion and reaction records (transfusion_administration, transfusion_reactions).
    • Show purpose of access (clinical care, quality review, regulatory reporting).
  • Data sources:

    • Central audit tables in ehr-patient-mgmt (e.g. audit_log) referencing blood bank tables by module and record ID.
  • Data Subject Request Support

  • Ability to export:
    • Donor’s own data (donations, deferrals, infectious results) in human-readable format.
    • Patient’s transfusion and reaction history.
  • Export formats: PDF and machine-readable (CSV/JSON).

  • Data Minimization & Pseudonymisation

  • Regulatory reports (e.g. MOH hemovigilance) should:
    • Use patient identifiers as required by MOH.
    • Avoid unnecessary personal data in internal analytics (e.g. use MRN instead of Emirates ID where possible).

Ad-Hoc Reporting

Available Data Fields (Examples)

The ad-hoc reporting layer should expose fields from blood bank–owned tables and key shared references. Examples:

  • Donor-related
  • blood_donors.donor_id
  • blood_donors.emirates_id
  • blood_donors.first_name, last_name, dob, gender
  • blood_donors.abo_group, rh_type
  • blood_donors.donor_status, deferral_reason, deferral_until
  • blood_donations.donation_id, donation_date, donation_type, volume_ml
  • blood_donations.collection_site, screening_pass, infectious_disease_status

  • Component & Inventory

  • blood_components.component_id, component_type, abo_group, rh_type
  • blood_components.volume_ml, collection_datetime, expiry_datetime
  • blood_components.irradiated, leukoreduced, washed
  • blood_component_inventory.inventory_id, facility_id
  • blood_component_inventory.storage_location, status
  • blood_component_inventory.received_datetime, issued_datetime, returned_datetime

  • Pre-Transfusion Testing

  • blood_type_screen.ts_id, patient_id, encounter_id
  • blood_type_screen.abo_group, rh_type
  • blood_type_screen.antibody_screen_result, antibody_specificity
  • blood_type_screen.specimen_id, specimen_received_datetime, tested_datetime

  • Crossmatch & Orders

  • crossmatch_records.crossmatch_id, patient_id, component_id
  • crossmatch_records.crossmatch_type, result, performed_datetime
  • transfusion_orders.order_id, patient_id, encounter_id
  • transfusion_orders.ordering_provider_id, component_type_requested
  • transfusion_orders.units_requested, priority, indication
  • transfusion_orders.special_requirements, emergency_release, order_status, order_datetime

  • Transfusion Administration & Reactions

  • transfusion_administration.admin_id, order_id, component_id
  • transfusion_administration.patient_id, encounter_id
  • transfusion_administration.start_datetime, end_datetime, volume_infused, rate
  • transfusion_administration.reaction_occurred, status
  • transfusion_reactions.reaction_id, admin_id, reaction_type, severity
  • transfusion_reactions.symptoms, onset_time, classification
  • transfusion_reactions.reported_to_moh, moh_report_reference, moh_report_datetime

  • Quarantine & Discards

  • blood_quarantine_log.quarantine_id, component_id, quarantine_reason
  • blood_quarantine_log.quarantined_datetime, final_disposition
  • blood_discard_log.discard_id, component_id, discard_reason
  • blood_discard_log.discard_datetime, disposal_method

Export Formats

  • CSV
  • For data analysis in Excel, BI tools, and MOH/DHA templates.
  • Excel (XLSX)
  • For managers and committee reports with basic formatting.
  • PDF
  • For signed regulatory submissions, committee minutes, and archival.
  • JSON (optional)
  • For integration with external analytics platforms or research registries (subject to PDPL and ethics approval).

Scheduled Report Delivery

  • Scheduling Options
  • Daily, weekly, monthly, quarterly, annually
  • Custom cron-like schedules for advanced users

  • Delivery Channels

  • Secure internal email with link to report (no PHI in subject/body)
  • Secure portal download (role-based access)
  • SFTP drop for external regulators or corporate analytics (where approved)

  • Access Control & PDPL Compliance

  • Role-based access:
    • Only Blood Bank Supervisor / Medical Director / Regulatory roles can access donor-identifiable reports.
    • Clinical departments can access patient transfusion data for their own patients only.
  • All report generation and downloads logged in central audit_log with:

    • User ID, timestamp, report ID, filters, record counts.
  • Paperless Transformation

All KPIs and reports replace traditional paper-based logs and manual tally sheets:

  • C:T ratio, wastage, and expiry now computed automatically from transactional data instead of manual spreadsheets.
  • Transfusion reaction and hemovigilance reports generated directly from transfusion_reactions rather than handwritten forms.
  • Inventory adequacy and shortage alerts replace manual stock cards and whiteboard tracking.
  • Donor deferral and infectious screening statistics are derived from structured records, eliminating separate paper deferral logs.

This supports a fully paperless blood bank workflow aligned with UAE MOH blood safety regulations and UAE PDPL data governance requirements.

content/clinical/blood-bank/07-kpis-reports.md Generated 2026-02-20 22:54