{"id":23453,"date":"2026-06-19T07:45:55","date_gmt":"2026-06-19T07:45:55","guid":{"rendered":"https:\/\/engineerbabu.com\/blog\/?p=23453"},"modified":"2026-06-19T07:45:55","modified_gmt":"2026-06-19T07:45:55","slug":"ehr-platform-development","status":"publish","type":"post","link":"https:\/\/engineerbabu.com\/blog\/ehr-platform-development\/","title":{"rendered":"How to Build an EHR Platform &#8211; HL7 FHIR, ONC Certification, HIPAA Architecture, and Clinical Data Model 2026"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">The global EHR market is projected to reach <\/span><a href=\"https:\/\/www.grandviewresearch.com\/industry-analysis\/electronic-health-records-ehr-market\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">$55.11 billion by 2033<\/span><\/a><span style=\"font-weight: 400;\">, growing at a CAGR of 5.10%. Every hospital, clinic, and healthcare provider in the United States is required to maintain electronic health records.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The 21st Century Cures Act mandates interoperability. CMS requires FHIR-based APIs. ONC certifies EHR systems against a defined set of criteria before they can be used for Medicare and Medicaid programmes.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Building an EHR is the most technically complex category of healthcare software. It is not a database with a clinical theme. It is a regulated, certified, multi-stakeholder platform that must handle clinical workflows, insurance billing, laboratory integration, prescription management, patient engagement, and interoperability with every other system in the healthcare ecosystem, simultaneously, reliably, at the data quality standard that patient safety requires.<\/span><\/p>\n<p><a href=\"http:\/\/engineerbabu.com\"><span style=\"font-weight: 400;\">EngineerBabu<\/span><\/a><span style=\"font-weight: 400;\"> has built healthcare platforms for Apollo Hospitals, Somnoware (acquired by ResMed), and digital health clients across the US, UK, and India. CMMI Level 5. Google AI Accelerator 2024 Top 20. This guide covers everything required to build a production-grade EHR platform.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-23459\" src=\"https:\/\/engineerbabu.com\/blog\/wp-content\/uploads\/2026\/06\/ehr-clinical-dashboard.png\" alt=\"\" width=\"1440\" height=\"1042\" title=\"\"><\/p>\n<h2><b>The EHR Architecture &#8211; Five Layers<\/b><\/h2>\n<table>\n<tbody>\n<tr>\n<td><b>Layer<\/b><\/td>\n<td><b>What It Does<\/b><\/td>\n<\/tr>\n<tr>\n<td><b>Clinical data layer<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Patient records &#8211; demographics, diagnoses, medications, allergies, lab results, vitals<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Workflow layer<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Clinical workflows &#8211; scheduling, charting, orders, prescriptions, billing<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Interoperability layer<\/b><\/td>\n<td><span style=\"font-weight: 400;\">HL7 FHIR R4 APIs &#8211; data exchange with payers, labs, pharmacies, other EHRs<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Decision support layer<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Clinical alerts &#8211; drug interactions, care gap reminders, order sets<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Patient engagement layer<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Patient portal &#8211; record access, appointment scheduling, secure messaging<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><\/h2>\n<h2><b><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-23456\" src=\"https:\/\/engineerbabu.com\/blog\/wp-content\/uploads\/2026\/06\/ehr-five-layer-architecture.png\" alt=\"\" width=\"1360\" height=\"872\" title=\"\">Module 1 &#8211; The Clinical Data Model<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">The clinical data model is the foundation of everything else. Get it wrong and every feature built on top of it carries the error forward.<\/span><\/p>\n<p><b>The core clinical entities:<\/b><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Entity<\/b><\/td>\n<td><b>What It Stores<\/b><\/td>\n<td><b>FHIR Resource<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Patient<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Demographics, identifiers, contact<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Patient<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Encounter<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Each clinical visit &#8211; date, provider, location, type<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Encounter<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Condition<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Diagnoses &#8211; ICD-10 codes, onset, clinical status<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Condition<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Observation<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Vitals, lab results, clinical findings<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Observation<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">MedicationRequest<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Prescriptions &#8211; drug, dose, route, frequency<\/span><\/td>\n<td><span style=\"font-weight: 400;\">MedicationRequest<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">AllergyIntolerance<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Documented allergies &#8211; substance, reaction, severity<\/span><\/td>\n<td><span style=\"font-weight: 400;\">AllergyIntolerance<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Procedure<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Completed procedures &#8211; CPT\/HCPCS, date, performer<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Procedure<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">DiagnosticReport<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Lab and imaging reports &#8211; with component results<\/span><\/td>\n<td><span style=\"font-weight: 400;\">DiagnosticReport<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Immunization<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Vaccine history &#8211; CVX codes, dates, administered by<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Immunization<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">DocumentReference<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Clinical notes &#8211; SOAP notes, discharge summaries<\/span><\/td>\n<td><span style=\"font-weight: 400;\">DocumentReference<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">CarePlan<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Care plans &#8211; goals, interventions, responsible party<\/span><\/td>\n<td><span style=\"font-weight: 400;\">CarePlan<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Appointment<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Scheduled visits &#8211; provider, slot, type<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Appointment<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>The data model decisions that determine everything:<\/b><\/p>\n<p><b>Decision 1 &#8211; OMOP vs FHIR-native vs proprietary:<\/b><span style=\"font-weight: 400;\"> The OMOP Common Data Model (OHDSI community standard) is optimised for research and analytics. FHIR-native storage maps directly to FHIR resources. Proprietary models give flexibility but create interoperability debt. For new EHR builds in 2026: FHIR-native with PostgreSQL as the primary store, OMOP as the analytics layer.<\/span><\/p>\n<p><b>Decision 2 &#8211; Versioned records:<\/b><span style=\"font-weight: 400;\"> Every change to a patient record, a diagnosis updated, a medication discontinued, must be versioned. The platform must be able to reconstruct the patient&#8217;s clinical state at any point in time. This is not optional for a production EHR, it is a clinical and legal requirement.<\/span><\/p>\n<p><b>Decision 3 &#8211; Terminology standards:<\/b><span style=\"font-weight: 400;\"> Every clinical concept must be coded against a standard terminology:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Clinical Domain<\/b><\/td>\n<td><b>Standard<\/b><\/td>\n<td><b>Example<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Diagnoses<\/span><\/td>\n<td><span style=\"font-weight: 400;\">ICD-10-CM<\/span><\/td>\n<td><span style=\"font-weight: 400;\">J45.20 (Mild intermittent asthma)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Procedures<\/span><\/td>\n<td><span style=\"font-weight: 400;\">CPT \/ HCPCS<\/span><\/td>\n<td><span style=\"font-weight: 400;\">99213 (Office visit, established)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Medications<\/span><\/td>\n<td><span style=\"font-weight: 400;\">RxNorm<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1049502 (Metformin 500mg tablet)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Lab tests<\/span><\/td>\n<td><span style=\"font-weight: 400;\">LOINC<\/span><\/td>\n<td><span style=\"font-weight: 400;\">2339-0 (Glucose, serum)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Vaccines<\/span><\/td>\n<td><span style=\"font-weight: 400;\">CVX<\/span><\/td>\n<td><span style=\"font-weight: 400;\">207 (COVID-19 mRNA)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Allergies<\/span><\/td>\n<td><span style=\"font-weight: 400;\">SNOMED CT<\/span><\/td>\n<td><span style=\"font-weight: 400;\">372687004 (Amoxicillin)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><b>Module 2 &#8211; HL7 FHIR R4 API Layer<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">The 21st Century Cures Act requires ONC-certified EHRs to support <\/span><a href=\"https:\/\/engineerbabu.com\/blog\/fhir-r4-integration-for-healthcare-startups\/\"><span style=\"font-weight: 400;\">FHIR R4 APIs<\/span><\/a><span style=\"font-weight: 400;\"> for patient and provider access. The CMS Interoperability Rule extends these requirements to payer systems. FHIR is not optional for any EHR built in 2026.<\/span><\/p>\n<h3><b>The required FHIR capabilities for ONC certification:<\/b><\/h3>\n<table>\n<tbody>\n<tr>\n<td><b>Capability<\/b><\/td>\n<td><b>What It Enables<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">FHIR R4 RESTful APIs<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Read, write, search, and update clinical resources<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">SMART on FHIR<\/span><\/td>\n<td><span style=\"font-weight: 400;\">OAuth2-based authorisation for third-party app access<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Bulk Data Export ($export)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Population-level data access for analytics and quality reporting<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">CDS Hooks<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Real-time clinical decision support embedded in EHR workflows<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Patient Access API<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Patients can access their records via third-party apps<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Provider Directory API<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Published provider information for care coordination<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><b>The SMART on FHIR authorisation flow:<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">SMART on FHIR is the OAuth2-based framework that allows third-party apps, patient-facing portals, clinical analytics tools, billing systems to access EHR data with appropriate authorisation.<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Step<\/b><\/td>\n<td><b>What Happens<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">1. App registration<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Third-party app registers with the EHR&#8217;s authorisation server<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">2. Launch<\/span><\/td>\n<td><span style=\"font-weight: 400;\">App launches within EHR (EHR launch) or standalone<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">3. Authorisation request<\/span><\/td>\n<td><span style=\"font-weight: 400;\">App requests specific FHIR scopes (patient\/<\/span><i><span style=\"font-weight: 400;\">.read, user\/<\/span><\/i><span style=\"font-weight: 400;\">.write)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">4. User consent<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Clinician or patient approves the requested scopes<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">5. Token exchange<\/span><\/td>\n<td><span style=\"font-weight: 400;\">App receives access token<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">6. FHIR API access<\/span><\/td>\n<td><span style=\"font-weight: 400;\">App calls FHIR APIs with bearer token<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">7. Token refresh<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Access token refreshed using refresh token<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><b>The FHIR search parameters:<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Every FHIR resource supports standard search parameters. The EHR must implement these correctly for interoperability:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Resource<\/b><\/td>\n<td><b>Key Search Parameters<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Patient<\/span><\/td>\n<td><span style=\"font-weight: 400;\">name, birthdate, identifier, gender<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Observation<\/span><\/td>\n<td><span style=\"font-weight: 400;\">patient, code, date, category<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">MedicationRequest<\/span><\/td>\n<td><span style=\"font-weight: 400;\">patient, status, medication<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Condition<\/span><\/td>\n<td><span style=\"font-weight: 400;\">patient, code, clinical-status, onset-date<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Encounter<\/span><\/td>\n<td><span style=\"font-weight: 400;\">patient, date, type, status<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><b>Module 3 &#8211; ONC Certification Requirements<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">ONC (Office of the National Coordinator for Health Information Technology) certifies EHR systems against criteria defined in the 21st Century Cures Act. ONC certification is required for EHRs used in Medicare and Medicaid programmes.<\/span><\/p>\n<h3><b>The ONC certification criteria categories:<\/b><\/h3>\n<table>\n<tbody>\n<tr>\n<td><b>Criterion Category<\/b><\/td>\n<td><b>Examples<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Clinical<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Problem list, medication list, medication allergy list, demographics, vital signs, smoking status<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Care coordination<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Care plan, referral summary, transitions of care<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Clinical decision support<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Drug-drug interaction checking, drug-allergy checking, relevant care gap reminders<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Electronic prescribing<\/span><\/td>\n<td><span style=\"font-weight: 400;\">EPCS (Electronic Prescribing of Controlled Substances), formulary checks<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Patient access<\/span><\/td>\n<td><span style=\"font-weight: 400;\">View\/download\/transmit, SMART on FHIR API<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Security<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Authentication, authorisation, audit log, encryption<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Reporting<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Quality measure calculation, QRDA I and III export, FHIR quality reporting<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>The certification process:<\/b><\/p>\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">ONC-Authorised Testing Laboratory (ONC-ATL) tests the EHR against the certification criteria<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">ONC-Authorised Certification Body (ONC-ACB) reviews and grants certification<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">The certified EHR is listed on the ONC Certified Health IT Product List (CHPL)<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Building for ONC certification from the start (not retrofitting) is the difference between a 6-month certification process and an 18-month one.<\/span><\/p>\n<h2><b>Module 4 &#8211; Clinical Workflow Modules<\/b><\/h2>\n<ul>\n<li aria-level=\"1\">\n<h3><b>Module 4a &#8211; Patient Registration and Demographics:<\/b><\/h3>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Every encounter begins with patient registration. The registration module captures:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Field Category<\/b><\/td>\n<td><b>Fields<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Identity<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Name, DOB, gender, race, ethnicity, preferred language<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Contact<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Address, phone, email<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Identifiers<\/span><\/td>\n<td><span style=\"font-weight: 400;\">MRN (Medical Record Number), SSN (encrypted), insurance member ID<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Insurance<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Primary and secondary coverage, guarantor<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Emergency contact<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Name, relationship, phone<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li aria-level=\"1\">\n<h3><b>Module 4b &#8211; Appointment Scheduling:<\/b><\/h3>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The scheduling module manages provider calendars, appointment types, and patient booking:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Feature<\/b><\/td>\n<td><b>Details<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Provider schedule management<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Define appointment slots by type, duration, and availability<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Online patient scheduling<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Patient portal self-scheduling for appropriate appointment types<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Waitlist management<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Queue management for high-demand providers<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Appointment reminders<\/span><\/td>\n<td><span style=\"font-weight: 400;\">SMS + email + phone at 7 days, 48 hours, and day-of<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">No-show tracking<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Pattern tracking for care gap identification<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li aria-level=\"1\">\n<h3><b>Module 4c &#8211; Clinical Documentation (SOAP Notes):<\/b><\/h3>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The clinical documentation module is where clinicians spend most of their time. A poor documentation experience is the primary driver of EHR abandonment.<\/span><\/p>\n<p><b>The structured SOAP note:<\/b><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>S (Subjective):<\/b><span style=\"font-weight: 400;\"> Chief complaint, history of present illness, review of systems<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>O (Objective):<\/b><span style=\"font-weight: 400;\"> Vital signs, physical examination findings, lab results<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>A (Assessment):<\/b><span style=\"font-weight: 400;\"> Problem list, diagnoses (ICD-10 coded)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>P (Plan):<\/b><span style=\"font-weight: 400;\"> Orders, prescriptions, referrals, follow-up instructions<\/span><\/li>\n<\/ul>\n<p><b>AI-assisted documentation:<\/b><\/p>\n<p><span style=\"font-weight: 400;\">In 2026, the best EHRs include ambient documentation, AI that listens to the clinical encounter (with patient consent) and generates a draft SOAP note. The physician reviews and edits rather than typing from scratch. This reduces documentation time by 50 to 70% and is rapidly becoming a standard EHR feature.<\/span><\/p>\n<ul>\n<li aria-level=\"1\">\n<h3><b>Module 4d &#8211; Order Management (CPOE):<\/b><\/h3>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Computerised Provider Order Entry (CPOE) allows clinicians to enter orders directly, eliminating transcription errors.<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Order Type<\/b><\/td>\n<td><b>What the Module Handles<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Medication orders<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Drug name, dose, route, frequency, duration, PRN conditions<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Lab orders<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Test selection, specimen type, priority, collection instructions<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Imaging orders<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Modality, body part, clinical indication, priority<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Procedure orders<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Procedure type, location, pre-procedure instructions<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Referral orders<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Specialty, urgency, clinical indication, supporting documentation<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li aria-level=\"1\">\n<h3><b>Module 4e &#8211; Electronic Prescribing (eRx):<\/b><\/h3>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">All prescriptions are transmitted electronically via Surescripts. Controlled substances require EPCS (Electronic Prescribing of Controlled Substances) with two-factor authentication.<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Feature<\/b><\/td>\n<td><b>Regulatory Basis<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Standard prescription (eRx)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Surescripts NCPDP SCRIPT standard<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Controlled substance prescription<\/span><\/td>\n<td><span style=\"font-weight: 400;\">DEA EPCS rules &#8211; two-factor auth required<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Formulary check<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Verify drug is on patient&#8217;s insurance formulary before prescribing<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Drug interaction check<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Real-time check against clinical drug database (FDB, Multum)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Refill request management<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Handle pharmacy-initiated refill requests<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><b>Module 5 &#8211; Laboratory and Imaging Integration<\/b><\/h2>\n<ul>\n<li aria-level=\"1\"><b>Lab integration (LIS &#8211; Laboratory Information System):<\/b><\/li>\n<\/ul>\n<table>\n<tbody>\n<tr>\n<td><b>Integration Type<\/b><\/td>\n<td><b>Protocol<\/b><\/td>\n<td><b>What It Delivers<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Order transmission<\/span><\/td>\n<td><span style=\"font-weight: 400;\">HL7 v2 OML (Order Message &#8211; Lab)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Lab order sent to lab system<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Result receipt<\/span><\/td>\n<td><span style=\"font-weight: 400;\">HL7 v2 ORU (Observation Result)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Result received in EHR, matched to order<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">FHIR-based (modern)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">FHIR R4 ServiceRequest + DiagnosticReport<\/span><\/td>\n<td><span style=\"font-weight: 400;\">For modern LIS with FHIR capability<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li aria-level=\"1\"><b>Abnormal result routing:<\/b><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">When a result arrives flagged as abnormal (H\/L\/C\/P flags in HL7 or equivalent FHIR value), the platform:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Routes to the ordering provider&#8217;s result review queue<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Sends an alert (configurable by severity &#8211; critical values get immediate notification)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Links the result to the relevant encounter and problem list<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Documents the provider&#8217;s result acknowledgement for liability purposes<\/span><\/li>\n<\/ol>\n<ul>\n<li aria-level=\"1\"><b>Imaging integration (RIS\/PACS):<\/b><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Radiology results arrive via HL7 ORU messages or FHIR DiagnosticReport. DICOM images are stored in a PACS (Picture Archiving and Communication System) and linked to the EHR via WADO-RS (Web Access to DICOM Objects via RESTful Services).<\/span><\/p>\n<h2><b>Module 6 &#8211; Patient Portal<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">ONC certification requires patient access to their records via a patient portal. The portal covers:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Feature<\/b><\/td>\n<td><b>FHIR Resource Used<\/b><\/td>\n<td><b>Patient Can Do<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Health summary<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Patient, Condition, Allergy, Medication<\/span><\/td>\n<td><span style=\"font-weight: 400;\">View active conditions, allergies, medications<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Lab results<\/span><\/td>\n<td><span style=\"font-weight: 400;\">DiagnosticReport, Observation<\/span><\/td>\n<td><span style=\"font-weight: 400;\">View results with provider interpretation<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Appointments<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Appointment<\/span><\/td>\n<td><span style=\"font-weight: 400;\">View upcoming, request new, cancel<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Secure messaging<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Communication<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Message care team, receive responses<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Prescription history<\/span><\/td>\n<td><span style=\"font-weight: 400;\">MedicationRequest<\/span><\/td>\n<td><span style=\"font-weight: 400;\">View prescriptions, request refills<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Visit notes<\/span><\/td>\n<td><span style=\"font-weight: 400;\">DocumentReference (OpenNotes)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">View clinical notes from visits<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Care plan<\/span><\/td>\n<td><span style=\"font-weight: 400;\">CarePlan<\/span><\/td>\n<td><span style=\"font-weight: 400;\">View goals and care team recommendations<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><b>The Tech Stack<\/b><\/h2>\n<table>\n<tbody>\n<tr>\n<td><b>Layer<\/b><\/td>\n<td><b>Technology<\/b><\/td>\n<td><b>Why<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Backend<\/span><\/td>\n<td><a href=\"https:\/\/engineerbabu.com\/technologies\/python-development-services\"><span style=\"font-weight: 400;\">Python<\/span><\/a><span style=\"font-weight: 400;\"> (FastAPI) + Node.js<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Python for AI\/NLP; Node.js for real-time HL7 processing<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">FHIR server<\/span><\/td>\n<td><span style=\"font-weight: 400;\">HAPI FHIR (Java)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Most complete open-source FHIR R4 server<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Database<\/span><\/td>\n<td><span style=\"font-weight: 400;\">PostgreSQL<\/span><\/td>\n<td><span style=\"font-weight: 400;\">ACID compliance, FHIR-native JSON support<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">SMART authorisation<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Keycloak + SMART on FHIR library<\/span><\/td>\n<td><span style=\"font-weight: 400;\">OAuth2 + OpenID Connect<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Terminology<\/span><\/td>\n<td><span style=\"font-weight: 400;\">VSAC (NCI) + local term server<\/span><\/td>\n<td><span style=\"font-weight: 400;\">ICD-10, LOINC, RxNorm, SNOMED<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">HL7 messaging<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Mirth Connect or Azure Health Data Services<\/span><\/td>\n<td><span style=\"font-weight: 400;\">ADT, ORU, ORM message processing<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Clinical NLP (ambient)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">GPT-4o + custom fine-tuning<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Ambient documentation, note generation<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Cloud<\/span><\/td>\n<td><span style=\"font-weight: 400;\">AWS (HIPAA BAA available)<\/span><\/td>\n<td><a href=\"https:\/\/engineerbabu.com\/blog\/build-hipaa-compliant-products-from-india\/\"><span style=\"font-weight: 400;\">HIPAA-compliant infrastructure<\/span><\/a><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Security<\/span><\/td>\n<td><span style=\"font-weight: 400;\">SOC 2 Type II + HIPAA<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Required for all healthcare data<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-23457\" src=\"https:\/\/engineerbabu.com\/blog\/wp-content\/uploads\/2026\/06\/patient-portal-mobile-app.png\" alt=\"\" width=\"752\" height=\"1112\" title=\"\"><\/p>\n<h2><b>Build Cost<\/b><\/h2>\n<table>\n<tbody>\n<tr>\n<td><b>Module<\/b><\/td>\n<td><b>Cost Range (USD)<\/b><\/td>\n<td><b>Notes<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Clinical data model + FHIR R4 server<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$15K \u2013 $28K<\/span><\/td>\n<td><span style=\"font-weight: 400;\">HAPI FHIR + custom extensions<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Patient registration + scheduling<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$8K \u2013 $15K<\/span><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Clinical documentation (SOAP + templates)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$10K \u2013 $18K<\/span><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">CPOE &#8211; orders management<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$10K \u2013 $18K<\/span><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Electronic prescribing (Surescripts)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$8K \u2013 $15K<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Surescripts certification required<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Drug interaction checking (FDB\/Multum)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$5K \u2013 $10K<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Annual licensing extra<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Lab integration (HL7 v2 ORU\/OML)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$6K \u2013 $12K<\/span><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">SMART on FHIR authorisation<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$6K \u2013 $12K<\/span><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">CDS Hooks implementation<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$6K \u2013 $12K<\/span><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Patient portal<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$8K \u2013 $15K<\/span><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Ambient AI documentation<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$10K \u2013 $20K<\/span><\/td>\n<td><span style=\"font-weight: 400;\">GPT-4o fine-tuning<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">ONC certification prep<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$15K \u2013 $30K<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Testing lab fees extra<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">AWS HIPAA + SOC 2 + VAPT<\/span><\/td>\n<td><span style=\"font-weight: 400;\">$10K \u2013 $20K<\/span><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><b>Total<\/b><\/td>\n<td><b>$117K \u2013 $225K<\/b><\/td>\n<td><span style=\"font-weight: 400;\">ONC-certifiable EHR<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><i><span style=\"font-weight: 400;\">EngineerBabu built healthcare platforms for Apollo Hospitals and Somnoware (acquired by ResMed). CMMI Level 5. Google AI Accelerator 2024 Top 20. Contact: <\/span><\/i><a href=\"mailto:mayank@engineerbabu.com\"><i><span style=\"font-weight: 400;\">mayank@engineerbabu.com<\/span><\/i><\/a><\/p>\n<h2><b>Frequently Asked Questions about EHR platform development<\/b><\/h2>\n<ul>\n<li aria-level=\"1\">\n<h3><b>What is ONC certification and why does an EHR need it?<\/b><\/h3>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">ONC (Office of the National Coordinator for Health Information Technology) certifies EHR systems against criteria defined in the 21st Century Cures Act and implementing regulations. ONC certification is required for EHRs used in programmes that provide incentive payments, Medicare, Medicaid, and MIPS (Merit-based Incentive Payment System). Without ONC certification, providers using the EHR cannot receive Medicare and Medicaid incentive payments and may face payment adjustments. The certification process involves testing by an ONC-Authorised Testing Laboratory and certification by an ONC-Authorised Certification Body. Building for ONC certification from the architecture stage (not retrofitting) is the critical decision, the data model, API layer, security architecture, and clinical functions must all be designed to meet certification criteria.<\/span><\/p>\n<ul>\n<li aria-level=\"1\">\n<h3><b>What is SMART on FHIR and why does it matter for EHR development?<\/b><\/h3>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">SMART on FHIR (Substitutable Medical Applications, Reusable Technologies on FHIR) is the HL7-standardised authorisation framework that allows third-party applications to access EHR data securely. It combines OAuth2 for authorisation, OpenID Connect for identity, and FHIR for data access. A SMART-enabled EHR can support a marketplace of third-party clinical apps, a cardiology specialist app, a diabetes management tool, a revenue cycle analytics platform that launch within the EHR workflow with appropriate access to patient data. ONC certification requires SMART on FHIR support for both patient-facing and provider-facing applications. For EHR developers, implementing SMART correctly is one of the most technically complex requirements, the authorisation server, scope definitions, token management, and app launch flows all require careful implementation.<\/span><\/p>\n<ul>\n<li aria-level=\"1\">\n<h3><b>What is the minimum viable EHR for a specialty clinic in 2026?<\/b><\/h3>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">A minimum viable EHR for a specialty clinic needs: patient demographics and registration, appointment scheduling, clinical documentation (SOAP note with the relevant specialty&#8217;s template), problem and medication list management, electronic prescribing (Surescripts integration), lab result receipt and review, and a patient portal for record access and secure messaging. A focused specialty EHR (single specialty, 5 to 20 providers, one location) can be built for $80,000 to $130,000 and achieve ONC certification in 9 to 12 months. Multi-specialty, multi-location systems with full interoperability, ambient AI documentation, and revenue cycle integration run $150,000 to $250,000 and take 14 to 18 months to ONC certification.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The global EHR market is projected to reach $55.11 billion by 2033, growing at a CAGR of 5.10%. Every hospital, clinic, and healthcare provider in the United States is required to maintain electronic health records. The 21st Century Cures Act mandates interoperability. CMS requires FHIR-based APIs. ONC certifies EHR systems against a defined set of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":23454,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1246],"tags":[],"class_list":["post-23453","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-healthtech"],"_links":{"self":[{"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/posts\/23453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/comments?post=23453"}],"version-history":[{"count":1,"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/posts\/23453\/revisions"}],"predecessor-version":[{"id":23460,"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/posts\/23453\/revisions\/23460"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/media\/23454"}],"wp:attachment":[{"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/media?parent=23453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/categories?post=23453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/engineerbabu.com\/blog\/wp-json\/wp\/v2\/tags?post=23453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}