# FHIR Architecture Comparison Diagrams
## For EmpowerHealth Platform - SFMC Integration Discussion
## 1. Current SFMC Proposed Architecture (Problems Highlighted)
```mermaid
%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#ff6b6b', 'primaryTextColor':'#fff', 'primaryBorderColor':'#ff4757', 'lineColor':'#5f27cd', 'secondaryColor':'#feca57', 'tertiaryColor':'#ff9ff3', 'background':'#dfe6e9', 'mainBkg':'#ffffff', 'secondBkg':'#f5f3f0', 'tertiaryBkg':'#ffeaa7'}}}%%
graph TB
subgraph "PROBLEMS"
P1["24+ Hour Latency"]:::problem
P2["Multiple Data Hops"]:::problem
P3["High Maintenance"]:::problem
P4["No Real-time Support"]:::problem
end
subgraph "SFMC Proposed Architecture"
Epic[("Epic Production System")]:::epic
Clarity[("Clarity Reporting DB T-1 Day Batch")]:::clarity
RPT1[("RPT-1 Database")]:::rpt
Databasin["Databasin"]:::processing
FHIR_API["FHIR_API"]:::processing
subgraph "Snowflake Layers"
SF1[("Snowflake_Clarity")]:::snowflake
SF2[("Snowflake_FHIR_Stage")]:::snowflake
SF3[("Snowflake_SaintFrancis")]:::snowflake
SF4[("Snowflake_Empower")]:::snowflake
SF1 --> SF2 --> SF3 --> SF4
end
EH["EmpowerHealth Platform"]:::empower
Epic -->|"Nightly Batch"| Clarity
Epic -->|"Reports"| RPT1
Clarity --> Databasin
RPT1 --> Databasin
Databasin --> FHIR_API
FHIR_API -->|"Data Pull"| SF1
SF4 --> EH
end
classDef problem fill:#ff6b6b,stroke:#ee5a24,stroke-width:3px,color:#fff
classDef epic fill:#3498db,stroke:#2980b9,stroke-width:2px,color:#fff
classDef clarity fill:#95a5a6,stroke:#7f8c8d,stroke-width:2px,color:#fff
classDef rpt fill:#95a5a6,stroke:#7f8c8d,stroke-width:2px,color:#fff
classDef processing fill:#f39c12,stroke:#e67e22,stroke-width:2px,color:#fff
classDef snowflake fill:#74b9ff,stroke:#0984e3,stroke-width:2px,color:#fff
classDef cache fill:#fd79a8,stroke:#e84393,stroke-width:2px,color:#fff
classDef empower fill:#6c5ce7,stroke:#5f3dc4,stroke-width:3px,color:#fff
```
### Key Issues with This Approach
- **Multiple Data Hops** from Epic to your application through Databasin and multiple Snowflake layers
- **T-1 Day minimum latency** from Clarity batch processing
- **Recreating what Epic already provides** (FHIR APIs) through custom Databasin layer
- **Complex data pipeline** with multiple transformation stages increases maintenance burden
---
## 2. Recommended Architecture: Smart FHIR with Event-Driven Model
```mermaid
%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#00b894', 'primaryTextColor':'#fff', 'primaryBorderColor':'#00cec9', 'lineColor':'#0984e3', 'secondaryColor':'#fdcb6e', 'tertiaryColor':'#6c5ce7'}}}%%
graph TB
subgraph "BENEFITS"
B1["Real-time Data"]:::benefit
B2["Standard FHIR"]:::benefit
B3["Simplified Architecture"]:::benefit
B4["Lower Maintenance"]:::benefit
end
subgraph "Recommended: Smart Event-Driven Architecture"
Epic2[("EpicProduction")]:::epic
subgraph "Epic Native Services"
FHIR["Epic FHIR R4 Server Real-time"]:::fhir
SUB["FHIR Subscriptions Webhooks"]:::fhir
end
subgraph "EmpowerHealth API Gateway"
GW["Smart Gateway"]:::gateway
CACHE["Intelligent Cache• User-triggered fetch• Smart TTL• ETag validation"]:::smartcache
RL["Rate Limiter"]:::gateway
CB["Circuit Breaker"]:::gateway
GW --> CACHE
GW --> RL
GW --> CB
end
subgraph "Data Pipeline"
Stream["Event Stream Processor"]:::stream
SF_RT[("Snowflake Real-time Tables")]:::snowflake
SF_AN[("Snowflake Analytics")]:::snowflake
Stream --> SF_RT
SF_RT --> SF_AN
end
subgraph "EmpowerHealth Modules"
CDI["CDI Module"]:::module
AIC["AI Coding"]:::module
PT["Patient Type"]:::module
end
Epic2 --> FHIR
Epic2 --> SUB
FHIR -->|"On-demand"| GW
SUB -->|"Events"| Stream
CACHE --> Stream
SF_AN --> CDI
SF_AN --> AIC
SF_AN --> PT
end
classDef benefit fill:#00b894,stroke:#00cec9,stroke-width:3px,color:#fff
classDef epic fill:#3498db,stroke:#2980b9,stroke-width:2px,color:#fff
classDef fhir fill:#2ecc71,stroke:#27ae60,stroke-width:2px,color:#fff
classDef gateway fill:#9b59b6,stroke:#8e44ad,stroke-width:2px,color:#fff
classDef smartcache fill:#f39c12,stroke:#e67e22,stroke-width:2px,color:#fff
classDef stream fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#fff
classDef snowflake fill:#74b9ff,stroke:#0984e3,stroke-width:2px,color:#fff
classDef module fill:#6c5ce7,stroke:#5f3dc4,stroke-width:3px,color:#fff
```
### Why This Architecture Wins
- **2-3 Hops** only (Epic → Gateway → Snowflake → App)
- **Real-time data** when users need it
- **Respects Epic's built-in protections**
- **Event-driven** reduces unnecessary calls
- **Simplified maintenance** with standard FHIR implementation
---
## 3. Hybrid Approach: Best of Both Worlds
```mermaid
%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#6c5ce7', 'primaryTextColor':'#fff', 'primaryBorderColor':'#5f3dc4', 'lineColor':'#74b9ff', 'secondaryColor':'#55efc4', 'tertiaryColor':'#ff7675'}}}%%
graph TB
subgraph "Hybrid Benefits"
HB1["Real-time Clinical"]:::benefit
HB2["Batch Analytics"]:::benefit
HB3["Cost Optimized"]:::benefit
end
subgraph "Hybrid Architecture: Optimized for Use Cases"
Epic3[("EpicProduction")]:::epic
subgraph "Real-time Path"
FHIR3["FHIR APIs"]:::fhirrt
ADT["ADT Feed"]:::fhirrt
RTG["Real-time Gateway"]:::gatewayrt
FHIR3 --> RTG
ADT --> RTG
end
subgraph "Batch Path"
Clarity3[("Clarity DB Nightly")]:::clarity
CDC["CDC Tool (Fivetran)"]:::cdc
end
subgraph "Unified Data Lake"
RT_Table[("Snowflake Hot Data Active Patients")]:::hot
BATCH_Table[("Snowflake Warm Data Population")]:::warm
UNIFIED[("Unified View")]:::unified
RT_Table --> UNIFIED
BATCH_Table --> UNIFIED
end
subgraph "Smart Router"
Router{"Smart Router: Active → Real-time, Analytics → Batch"}:::router
end
EH3["EmpowerHealthPlatform"]:::empower
Epic3 --> FHIR3
Epic3 -->|"Events"| ADT
Epic3 -->|"Nightly"| Clarity3
RTG -->|"<5 min"| RT_Table
Clarity3 --> CDC
CDC -->|"Incremental"| BATCH_Table
UNIFIED --> Router
Router --> EH3
end
classDef benefit fill:#2ecc71,stroke:#27ae60,stroke-width:3px,color:#fff
classDef epic fill:#3498db,stroke:#2980b9,stroke-width:2px,color:#fff
classDef fhirrt fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#fff
classDef gatewayrt fill:#e67e22,stroke:#d68910,stroke-width:2px,color:#fff
classDef clarity fill:#95a5a6,stroke:#7f8c8d,stroke-width:2px,color:#fff
classDef cdc fill:#9b59b6,stroke:#8e44ad,stroke-width:2px,color:#fff
classDef hot fill:#ff7675,stroke:#ff6348,stroke-width:2px,color:#fff
classDef warm fill:#74b9ff,stroke:#0984e3,stroke-width:2px,color:#fff
classDef unified fill:#00b894,stroke:#00cec9,stroke-width:3px,color:#fff
classDef router fill:#fdcb6e,stroke:#f39c12,stroke-width:2px,color:#fff
classDef empower fill:#6c5ce7,stroke:#5f3dc4,stroke-width:3px,color:#fff
```
### Use Case Optimization
- **Real-time Path**: Active patient documentation, CDI alerts, coding suggestions
- **Batch Path**: Population health, risk stratification, quality metrics
- **Smart Router**: Automatically chooses optimal path based on use case
---
## 4. Data Flow Timing Comparison
```mermaid
%%{init: {'theme':'default', 'themeVariables': { 'crit0':'#d63031', 'crit1':'#e17055', 'done0':'#00b894', 'done1':'#00cec9', 'active0':'#0984e3', 'active1':'#74b9ff', 'gridColor':'#2d3436', 'textColor':'#2d3436', 'fontSize':'14px'}}}%%
gantt
title Data Latency Comparison: Patient Documentation to CDI Alert
dateFormat HH:mm
axisFormat %H:%M
section SFMC Proposed
Patient Documentation :done, doc1, 08:00, 1m
Wait for Clarity Batch :crit, wait1, after doc1, 16h
Databasin Processing :active, db1, after wait1, 2h
Snowflake Pipeline :active, sf1, after db1, 1h
CDI Alert Generated :milestone, alert1, after sf1, 0m
Total Time ~19-20 hours :crit, after doc1, 20h
section Recommended
Patient Documentation :done, doc2, 08:00, 1m
FHIR Webhook Fired :done, webhook2, after doc2, 10s
Gateway Processing :done, gw2, after webhook2, 30s
Snowflake Update :done, sf2, after gw2, 1m
CDI Alert Generated :milestone, alert2, after sf2, 0m
Total Time ~2-5 minutes :done, after doc2, 5m
section Hybrid Approach
Patient Documentation :done, doc3, 08:00, 1m
Real-time (Active) :done, rt3, after doc3, 2m
Batch (Population) :active, batch3, 00:00, 24h
Both Available :milestone, both3, 08:03, 0m
```
---
## 5. API Call Volume Comparison (Based on 1,000 Active Patients)
```mermaid
%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#e74c3c', 'primaryTextColor':'#fff', 'lineColor':'#3498db'}}}%%
graph TB
subgraph one["SFMC Batch Processing"]
direction TB
BATCH["Daily Clarity batch + Databasin processing<br/>Limited real-time capability"]:::bad
end
subgraph two["Event-Driven"]
direction TB
EVENT["~50 events/day × 1,000 patients × 2 resources<br/>100,000 calls - All meaningful, real-time"]:::good
CACHE["Intelligent Cache• User-triggered fetch• Smart TTL• ETag validation"]:::smartcache
EVENT --> CACHE
end
subgraph three["Comparison"]
direction TB
COMPARE["SFMC: 24+ hour delay, batch only<br/>Recommended: Real-time + lower API volume"]:::compare
end
classDef bad fill:#e74c3c,stroke:#c0392b,stroke-width:3px,color:#fff
classDef good fill:#2ecc71,stroke:#27ae60,stroke-width:3px,color:#fff
classDef compare fill:#3498db,stroke:#2980b9,stroke-width:2px,color:#fff
```
---
## Key Takeaways for SFMC Discussion
### Problems with Their Approach
1. **Latency**: 24+ hour delay unacceptable for clinical decisions
2. **Complexity**: Maintaining custom Databasin FHIR layer and multiple Snowflake transformations = technical debt
3. **Limited Real-time**: Batch-based architecture cannot support real-time clinical workflows
4. **Maintenance Burden**: Multiple transformation layers increase operational complexity
### Benefits of Recommended Approach
1. **Real-time**: 2-5 minute latency for critical workflows vs 24+ hours
2. **Standards**: Use Epic's native FHIR = less maintenance, no custom Databasin layer needed
3. **Simplified**: Direct Epic FHIR connection reduces complexity
4. **Efficient**: Event-driven architecture eliminates unnecessary batch processing delays
### Compromise Position
If they insist on some caching/protection:
- Implement smart caching at YOUR gateway (not custom FHIR)
- Use Epic's built-in throttling and ETags
- Start with hybrid approach (real-time + batch)
- Let Epic handle the FHIR complexity
### Cost Comparison (Annual Estimate)
| Architecture | Infrastructure | Maintenance | API Costs | Total |
| ------------- | --------------------- | --------------- | --------- | -------------- |
| SFMC Proposed | $80K (Databasin + SF) | $150K (Custom) | $30K | **$260K** |
| Recommended | $30K (Gateway) | $50K (Standard) | $10K | **$90K** |
| **Savings** | | | | **$170K/year** |