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)
-- 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_recordscrossmatch_id,component_id,patient_id,result,performed_datetimetransfusion_administrationadmin_id,component_id,patient_id,start_datetime,status- Optional:
blood_component_inventory.facility_idfor facility-level ratios
Dimensions / Filters
- Time: day, week, month, quarter, year
- Facility (
blood_component_inventory.facility_id) - Clinical department (via
encounters.department_idjoined fromtransfusion_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)
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_componentscomponent_id,component_type,expiry_datetimeblood_component_inventorycomponent_id,facility_id,received_datetime,statusblood_discard_logdiscard_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)
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_administrationadmin_id,patient_id,component_id,start_datetime,statustransfusion_reactionsreaction_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_datetimeblood_type_screen.tested_datetime(orresult_datetimeif separate)- Priority derived from linked
transfusion_orders.prioritywhen applicable.
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_screents_id,patient_id,encounter_id,specimen_id,specimen_received_datetime,tested_datetimetransfusion_ordersorder_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 fromtransfusion_orders.order_datetime)crossmatch_records.performed_datetimecrossmatch_records.crossmatch_type(e.g. 'electronic', 'serological').
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:
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_recordscrossmatch_id,patient_id,component_id,crossmatch_type,requested_datetime,performed_datetime,resulttransfusion_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_statusorblood_donations.screening_pass = FALSE.
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_donorsdonor_id,donor_status,deferral_reason,deferral_untilblood_donationsdonation_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).
-- 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_componentscomponent_id,component_type,abo_group,rh_type,expiry_datetimeblood_component_inventoryinventory_id,component_id,facility_id,statustransfusion_administrationadmin_id,component_id,start_datetime,statusencountersencounter_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)
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_componentscomponent_id,component_type,expiry_datetimeblood_component_inventorycomponent_id,received_datetime,facility_idblood_discard_logcomponent_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_releaseboolean.- Emergency release transfusion = transfusion linked to an order with
emergency_release = TRUEand no completed crossmatch before transfusion start.
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_ordersorder_id,patient_id,emergency_release,prioritytransfusion_administrationadmin_id,order_id,component_id,start_datetime,statuscrossmatch_recordscrossmatch_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.severityorclassification. - Reporting captured via
reported_to_mohboolean andmoh_report_datetime.
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_reactionsreaction_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 = FALSEafter 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 | |
| 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
<!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.severityin (severe,life_threatening,death) orclassificationin 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_administrationandtransfusion_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).
- List all users who accessed donor records (
-
Data sources:
- Central audit tables in
ehr-patient-mgmt(e.g.audit_log) referencing blood bank tables by module and record ID.
- Central audit tables in
-
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_idblood_donors.emirates_idblood_donors.first_name,last_name,dob,genderblood_donors.abo_group,rh_typeblood_donors.donor_status,deferral_reason,deferral_untilblood_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_typeblood_components.volume_ml,collection_datetime,expiry_datetimeblood_components.irradiated,leukoreduced,washedblood_component_inventory.inventory_id,facility_idblood_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_idblood_type_screen.abo_group,rh_typeblood_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_idcrossmatch_records.crossmatch_type,result,performed_datetimetransfusion_orders.order_id,patient_id,encounter_idtransfusion_orders.ordering_provider_id,component_type_requestedtransfusion_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_idtransfusion_administration.patient_id,encounter_idtransfusion_administration.start_datetime,end_datetime,volume_infused,ratetransfusion_administration.reaction_occurred,statustransfusion_reactions.reaction_id,admin_id,reaction_type,severitytransfusion_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_reasonblood_quarantine_log.quarantined_datetime,final_dispositionblood_discard_log.discard_id,component_id,discard_reasonblood_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.
- 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_logwith:- 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_reactionsrather 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.