Patient Access Integration Specifications
Integration Summary
| ID | Target System | Direction | Trigger Event | Data Exchanged | Protocol | Frequency | Auth |
|---|---|---|---|---|---|---|---|
| INT-PAC-001 | eClaimLink (DHA Dubai) | Bidirectional | Eligibility check, prior auth submission | Eligibility requests/responses; prior auth requests/responses; payer reference IDs | REST API (DHA eClaimLink) | Real-time | mTLS + OAuth 2.0 / API key |
| INT-PAC-002 | DOH eClaims (Shafafiya) | Bidirectional | Eligibility check, prior auth submission | Eligibility requests/responses; prior auth requests/responses; DOH reference numbers | REST API (DOH eClaims) | Real-time | mTLS + OAuth 2.0 |
| INT-PAC-003 | EHR & Patient Management | Bidirectional | Patient registration; eligibility verified | Inbound: demographics, insurance; Outbound: eligibility results, financial clearance status | Internal REST / Message Bus | Real-time | Internal token / mTLS |
| INT-PAC-004 | Scheduling | Bidirectional | Appointment booked; patient check-in | Inbound: appointment details; Outbound: pre-reg status, financial clearance flags | Internal REST / Message Bus | Real-time | Internal token / mTLS |
| INT-PAC-005 | Billing & Claims | Bidirectional | Eligibility verified; auth obtained; claim requires auth | Outbound: eligibility details, auth numbers, co-pay amounts; Inbound: patient balance, claim data | Internal REST / Message Bus | Real-time | Internal token / mTLS |
| INT-PAC-006 | Policy & Contract Mgmt | Inbound | Eligibility check; auth determination | Payer/plan master data, coverage rules, prior auth requirements | Internal REST / DB View | Real-time | Internal token / DB security |
| INT-PAC-007 | CPOE | Bidirectional | Order placed requiring auth | Inbound: orders needing auth; Outbound: auth status, numbers | Internal REST / Message Bus | Real-time | Internal token / mTLS |
| INT-PAC-008 | Patient Portal | Bidirectional | Pre-registration invitation; patient submission | Outbound: pre-reg forms, cost estimates; Inbound: completed pre-reg, consents | FHIR R4 REST API | On-demand | OAuth 2.0 + mTLS |
Note: Patient Access does not directly integrate with NABIDH/Malaffi, but must remain consistent with HIE-shared demographics and coverage data coming via EHR.
INT-PAC-001: eClaimLink (DHA Dubai)
Business Context
What flows
- Outbound eligibility request:
- Patient identifiers (MRN, Emirates ID), demographics (name, DOB, gender)
- Insurance details (payer, plan, member ID, policy number, card number)
- Encounter context (facility, department, service date, visit type)
- Inbound eligibility response:
- Coverage status (active/inactive, effective/termination dates)
- Benefit details (co-pay, coinsurance, deductible, annual max)
- Network status, product type, plan limitations
- Outbound prior authorization request:
- Patient and payer details as above
- Service details (CPT codes, ICD-10-AM diagnoses, requested dates, units)
- Referring/requesting provider details
- Inbound prior authorization response:
- Authorization number, status, validity dates, approved units
- Denial reasons, additional info requests
When
- At registration or appointment booking when payer is DHA-regulated and uses eClaimLink.
- At check-in if last eligibility check > 72 hours old.
- When a service requiring prior auth is ordered for a Dubai-based encounter.
Why
- To ensure real-time financial clearance and reduce denials for Dubai encounters.
- To comply with DHA eClaimLink requirements for electronic eligibility and auth.
How often
- Real-time per transaction; volume-driven by outpatient visits and scheduled procedures.
Error impact
- Eligibility failures: encounter may be placed on financial hold; manual phone/fax verification required; increased risk of denials.
- Auth failures: high-cost procedures may be delayed or performed at financial risk; potential non-payment.
Technical Detail (Non-HL7 REST / XML/JSON)
DHA eClaimLink uses its own schemas (e.g., XML/JSON) rather than HL7 v2.5.1. Patient Access must:
- Map internal tables:
eligibility_checks→ eClaimLink eligibility requesteligibility_responses→ parsed eClaimLink responseprior_authorizations,prior_auth_requests→ auth requests/responses- Include UAE-specific identifiers:
- Emirates ID in patient segment
- DHA facility ID, payer IDs as per eClaimLink registry
Example Eligibility Request Payload (JSON – conceptual)
{
"transactionType": "ELIGIBILITY",
"facility": {
"id": "DHA-FAC-001",
"name": "Dubai Creek Hospital"
},
"patient": {
"mrn": "MRN-2026-000123",
"emiratesId": "784-1985-1234567-1",
"firstName": "Ahmed",
"lastName": "Al-Maktoum",
"dateOfBirth": "1985-03-15",
"gender": "M"
},
"insurance": {
"payerId": "PAYER-DHA-OMAN",
"planCode": "OMN-GOLD",
"memberId": "OMN123456789",
"cardNumber": "CARD987654321",
"policyNumber": "POL-2026-0001"
},
"encounter": {
"encounterId": "ENC-2026-000567",
"visitType": "OPD",
"serviceDate": "2026-02-07"
}
}
Example Eligibility Response Payload (JSON – conceptual)
{
"transactionId": "ELG-20260207-0001",
"status": "SUCCESS",
"eligibility": {
"isEligible": true,
"effectiveDate": "2025-01-01",
"terminationDate": "2026-12-31",
"productType": "Enhanced",
"networkStatus": "IN_NETWORK"
},
"benefits": {
"copayAmount": 50.0,
"copayPercentage": 20.0,
"deductibleTotal": 2000.0,
"deductibleMet": 1200.0,
"coinsurance": 10.0,
"annualMax": 50000.0,
"annualMaxRemaining": 38000.0
},
"payerResponseCode": "ELG-APPROVED"
}
Key Field Mapping (Eligibility)
| eClaimLink Field | HIS Table / Column |
|---|---|
| transactionId | eligibility_checks.check_id |
| facility.id | eligibility_checks.facility_id (FK) |
| patient.mrn | eligibility_checks.patient_id (via MRN) |
| insurance.payerId | eligibility_checks.payer_id (FK) |
| insurance.planCode | eligibility_checks.plan_id (FK) |
| encounter.serviceDate | eligibility_checks.check_datetime (date) |
| eligibility.isEligible | eligibility_responses.is_eligible |
| eligibility.effectiveDate | eligibility_responses.effective_date |
| eligibility.terminationDate | eligibility_responses.termination_date |
| benefits.copayAmount | eligibility_responses.copay_amount |
| benefits.copayPercentage | eligibility_responses.copay_percentage |
| benefits.deductibleTotal | eligibility_responses.deductible_total |
| benefits.deductibleMet | eligibility_responses.deductible_met |
| benefits.coinsurance | eligibility_responses.coinsurance |
| benefits.annualMax | eligibility_responses.annual_max |
| benefits.annualMaxRemaining | eligibility_responses.annual_max_remaining |
| payerResponseCode | eligibility_responses.payer_response_code |
| full response | eligibility_responses.response_raw (JSON) |
Key Field Mapping (Prior Auth)
| eClaimLink Field | HIS Table / Column |
|---|---|
| authRequestId | prior_auth_requests.request_id |
| patient.mrn | prior_authorizations.patient_id |
| insurance.payerId | prior_authorizations.payer_id |
| service.cptCodes[] | prior_authorizations.service_codes |
| diagnosis.icd10amCodes[] | prior_authorizations.icd10_codes |
| requestedUnits | prior_authorizations.approved_units (initially null) |
| authNumber | prior_authorizations.auth_number |
| authStatus | prior_authorizations.auth_status |
| validFrom/validTo | prior_authorizations.valid_from/to |
| payerResponseCode | prior_auth_requests.payer_response |
HL7 v2.5.1 Technical Detail
Not applicable: eClaimLink does not use HL7 v2.5.1 for eligibility/auth. No HL7 messages are exchanged in this integration.
FHIR R4 Technical Detail
Not applicable: eClaimLink uses its own schemas, not FHIR. Internal mapping to FHIR is only used for Patient Portal (INT-PAC-008).
Error Handling
| Error Condition | System Behaviour | Retry Strategy |
|---|---|---|
| Network timeout / TLS handshake failure | Mark eligibility_checks.status = 'pending'; show “Eligibility service unavailable” to user |
Exponential backoff: 30s, 1m, 2m, 5m (max 4 attempts); stop if > 15 min; log and alert |
| HTTP 5xx from eClaimLink | Same as timeout; do not block registration but flag encounter as “Not financially cleared” | Same backoff as above; no retry after 4 failures; send alert to Patient Access Supervisor |
| HTTP 4xx (validation error) | Set eligibility_checks.status = 'error'; display validation message; user can correct and resubmit |
No auto-retry; requires user correction |
| Payer response “SYSTEM_UNAVAILABLE” | Store response; mark as temporary failure; allow manual override by Supervisor | Scheduled retry job every 30 minutes until success or 24h expiry |
| Duplicate transactionId | Treat as idempotent; update existing eligibility_responses record |
No retry; log as duplicate |
| Auth request rejected (business rule) | Update prior_authorizations.auth_status = 'denied'; show denial reason; notify ordering physician |
No auto-retry; new request must be created if appeal submitted |
Dead Letter Queue
- Failed requests after max retries are stored in
integration_dlqwith: integration_id = 'INT-PAC-001'payload,error_code,error_message,last_attempt_at- Dashboard for interface team to reprocess or close.
Manual Recovery
- Patient Access Supervisor can:
- Re-trigger eligibility/auth from Eligibility Verification screen.
- Override holds with documented reason (logged for audit).
- Interface team can:
- Edit malformed payloads and replay from DLQ.
Retry and Recovery
Retry Strategy:
| Scenario | Strategy | Intervals | Max Attempts |
|---|---|---|---|
| Network timeout / TLS handshake failure | Exponential backoff | 30s, 1m, 2m, 5m | 4 (then mark as failed; stop retrying after 15 minutes) |
| eClaimLink HTTP 5xx (server error) | Exponential backoff | 30s, 1m, 2m, 5m | 4 (then alert Patient Access Supervisor) |
| eClaimLink HTTP 4xx (validation error) | No auto-retry | N/A | User corrects data and resubmits |
| Payer response "SYSTEM_UNAVAILABLE" | Scheduled retry job | Every 30 minutes | Until success or 24-hour expiry |
| mTLS certificate failure | No auto-retry | N/A | Alert IT immediately for certificate rotation |
Dead Letter Queue:
- Failed requests after max retries →
integration_dlqtable withintegration_id = 'INT-PAC-001' - Fields:
dlq_id,payload,error_code,error_message,last_attempt_at,resolved_by,resolved_at - Dashboard for interface team to inspect, edit malformed payloads, and replay
- Retention: 90 days (per DHA audit requirements), then archive
Idempotency:
- Deduplication key:
[transaction_type]_[facility_id]_[patient_mrn]_[service_date]_[check_datetime] - Duplicate eClaimLink transactions (same
transactionId) update existingeligibility_responsesrecord rather than creating duplicates - Auth requests use system-generated
transactionIdstored inprior_auth_requests.request_id
Reconciliation:
- Daily: compare submitted eligibility/auth requests vs eClaimLink acknowledgements; flag unresolved transactions older than 24 hours
- Weekly: review DLQ entries; ensure all failed items resolved or escalated
- Monthly: audit log review per DHA requirements; certificate expiry check (alert 30 days before)
INT-PAC-002: DOH eClaims (Shafafiya)
Business Context
What flows
Similar to INT-PAC-001 but for Abu Dhabi encounters:
- Eligibility requests/responses via DOH eClaims/Shafafiya.
- Prior auth requests/responses with DOH-specific codes and reference numbers.
When
- For encounters at Abu Dhabi facilities or with DOH-regulated payers.
- At registration, booking, check-in, and when auth-required services are ordered.
Why
- To comply with DOH eClaims requirements and reduce denials for Abu Dhabi encounters.
How often
- Real-time per transaction.
Error impact
- Same as INT-PAC-001, but may also impact DOH reporting and Shafafiya compliance.
Technical Detail (Non-HL7 REST / XML)
DOH eClaims uses its own XML/JSON schemas. Mapping is analogous to eClaimLink, but with DOH-specific identifiers:
- DOH facility code, payer codes.
- Shafafiya transaction IDs.
Example Eligibility Request (XML – conceptual)
<EligibilityRequest>
<Header>
<FacilityId>DOH-FAC-001</FacilityId>
<TransactionDate>2026-02-07T10:15:00+04:00</TransactionDate>
</Header>
<Patient>
<MRN>MRN-2026-000789</MRN>
<EmiratesId>784-1990-7654321-3</EmiratesId>
<FirstName>Fatima</FirstName>
<LastName>Al-Nahyan</LastName>
<DateOfBirth>1990-07-21</DateOfBirth>
<Gender>F</Gender>
</Patient>
<Insurance>
<PayerCode>THIQA</PayerCode>
<PlanCode>THQ-STD</PlanCode>
<MemberId>THQ99887766</MemberId>
</Insurance>
<Encounter>
<EncounterId>ENC-2026-001234</EncounterId>
<VisitType>OPD</VisitType>
<ServiceDate>2026-02-08</ServiceDate>
</Encounter>
</EligibilityRequest>
Example Eligibility Response (XML – conceptual)
<EligibilityResponse>
<TransactionId>ELG-DOH-20260207-0005</TransactionId>
<Status>APPROVED</Status>
<Eligibility>
<IsEligible>true</IsEligible>
<EffectiveDate>2025-01-01</EffectiveDate>
<TerminationDate>2026-12-31</TerminationDate>
</Eligibility>
<Benefits>
<CopayAmount>40.00</CopayAmount>
<CopayPercentage>10</CopayPercentage>
<DeductibleTotal>1500.00</DeductibleTotal>
<DeductibleMet>500.00</DeductibleMet>
<Coinsurance>20</Coinsurance>
<AnnualMax>60000.00</AnnualMax>
<AnnualMaxRemaining>52000.00</AnnualMaxRemaining>
</Benefits>
<PayerResponseCode>APPROVED</PayerResponseCode>
</EligibilityResponse>
Mapping to HIS tables is the same as INT-PAC-001.
HL7 v2.5.1 Technical Detail
Not applicable: DOH eClaims does not use HL7 v2.5.1 for eligibility/auth.
FHIR R4 Technical Detail
Not applicable for this external integration.
Error Handling
Same pattern as INT-PAC-001, with DOH-specific logging:
- Include
doh_transaction_idin logs andeligibility_checks.request_source = 'DOH_ECLAIMS'. - Alert routed to DOH-facing RCM team.
Retry and Recovery
Retry Strategy:
| Scenario | Strategy | Intervals | Max Attempts |
|---|---|---|---|
| Network timeout / TLS failure to DOH eClaims | Exponential backoff | 30s, 1m, 2m, 5m | 4 (then mark as failed) |
| DOH eClaims HTTP 5xx (server error) | Exponential backoff | 30s, 1m, 2m, 5m | 4 (then alert DOH-facing RCM team) |
| DOH eClaims HTTP 4xx (validation error) | No auto-retry | N/A | User corrects data and resubmits |
| SOAP fault (for SOAP-based endpoints) | Exponential backoff (transient only) | 30s, 1m, 2m | 3 (permanent faults → no retry, log and alert) |
| mTLS certificate failure | No auto-retry | N/A | Alert IT immediately for certificate rotation |
Dead Letter Queue:
- Failed requests after max retries →
integration_dlqtable withintegration_id = 'INT-PAC-002' - Same schema as INT-PAC-001 DLQ; distinguished by
integration_id - Retention: 90 days (per DOH audit and ADHICS requirements), then archive
Idempotency:
- Deduplication key:
[transaction_id](system-generated, stored ineligibility_checks/prior_auth_requests) - Duplicate DOH eClaims transactions update existing records rather than creating duplicates
- Separate
transaction_idnamespace from INT-PAC-001 to avoid cross-regulator collisions
Reconciliation:
- Daily: compare submitted eligibility/auth requests vs DOH eClaims acknowledgements; flag unresolved transactions
- Weekly: review DLQ entries; ensure all pending items resolved or escalated
- Monthly: audit log review per DOH/ADHICS requirements; certificate expiry monitoring (alert 30 days before)
- Separate monitoring dashboards for DOH and DHA integrations
INT-PAC-003: EHR & Patient Management
Business Context
What flows
- Inbound from EHR:
- Patient demographics (from
patients,patient_demographics) - Insurance coverage (from
insurance_plans, patient coverage tables) - Encounter context (from
encounters) - Outbound to EHR:
- Eligibility results (status, dates, benefits summary)
- Financial clearance status per encounter
- Prior auth numbers and statuses
- Referral status (if required for visit)
When
- On patient registration or update in EHR.
- When eligibility is verified or re-verified.
- When prior auth or referral status changes.
Why
- To keep clinical systems aware of financial clearance, enabling holds or warnings at order entry and check-in.
- To avoid duplicate data entry.
How often
- Real-time, event-driven.
Error impact
- If inbound fails: Patient Access may work with outdated demographics/coverage, increasing eligibility failures.
- If outbound fails: EHR may not show correct financial clearance; services may proceed without auth.
HL7 v2.5.1 Technical Detail
Some EHRs may use HL7 ADT messages internally. Patient Access must be able to consume ADT^A08 (update) messages for insurance changes.
Message Type: ADT^A08 (Update Patient Information)
MSH|^~\&|EHR|DUBAI_CREEK_HOSP|HIS_PATACCESS|DUBAI_CREEK_HOSP|20260207103000||ADT^A08|MSG20260207103000001|P|2.5.1|||AL|NE||UTF-8
EVN|A08|20260207102930|||USR123^ALI^OMAR
PID|1||MRN-2026-000123^^^DUBAI_CREEK_HOSP^MR~784-1985-1234567-1^^^UAE^EID||AL-MAKTOUM^AHMED^M||19850315|M|||PO BOX 12345^^DUBAI^^00000^AE||+971501234567
PV1|1|O|OPD^CLINIC1^RM01^DUBAI_CREEK_HOSP||||KHAN^SARA^A^^^DR|||MED||||||||ENC-2026-000567
IN1|1|PAYER-DHA-OMAN|OMN-GOLD^Oman Insurance Gold^LOCAL|Oman Insurance||PO BOX 1234^^DUBAI^^00000^AE|+97142000000|||AL-MAKTOUM^AHMED^M|784-1985-1234567-1|19850315|M|||CARD987654321|GRP-001|20250101|20261231||||||||||||||||||OMN123456789
Key Segment Mapping
| HL7 Field | HIS Table / Column |
|---|---|
| PID-3 (MRN, EID) | patients / patient_identifiers |
| PID-5, PID-7, PID-8 | patient_demographics |
| PV1-19 (Visit Number) | encounters.encounter_id |
| IN1-3 (Payer ID) | payers.payer_id (via mapping) |
| IN1-4 (Plan Code/Name) | insurance_plans.plan_id (via mapping) |
| IN1-17/18 (Policy dates) | coverage effective/termination |
| IN1-36 (Member ID) | patient coverage member identifier |
Patient Access uses this to update or create eligibility_checks records when insurance changes.
FHIR R4 Technical Detail
Not required for this internal integration; EHR–Patient Access may use internal REST with JSON, but not necessarily FHIR.
Error Handling
| Error Condition | Response | Retry Strategy |
|---|---|---|
| HL7 message parse error | Log to integration_errors; reject message; notify interface team |
No auto-retry; manual fix and replay |
| Unknown payer/plan code | Store message; mark patient as “Insurance mapping error”; show warning to registration | No auto-retry; mapping table must be fixed |
| DB write failure | Transaction rollback; message placed in DLQ | Retry after 1, 5, 15 minutes |
| Outbound clearance update fails | Mark update as pending; show banner in Patient Access UI | Retry every 5 minutes for 1 hour |
Dead letter and manual recovery as per INT-PAC-001.
Retry and Recovery
Retry Strategy:
| Scenario | Strategy | Intervals | Max Attempts |
|---|---|---|---|
| HL7 ADT message parse error (inbound) | No auto-retry | N/A | Manual fix by interface team and replay from message queue |
| Unknown payer/plan code in ADT message | No auto-retry | N/A | Mapping table correction required; replay after fix |
| DB write failure (inbound demographics/insurance) | Exponential backoff | 1m, 5m, 15m | 3 (then DLQ and alert DBA) |
| Outbound financial clearance update to EHR fails | Fixed interval retry | Every 5 minutes | 12 (1 hour total; then alert IT and show banner in Patient Access UI) |
| EHR API timeout (outbound) | Immediate retry with delay | 2s, 5s | 2 (then queue for background retry) |
Dead Letter Queue:
- Failed inbound HL7 messages →
integration_dlqwithintegration_id = 'INT-PAC-003' - Failed outbound clearance updates →
pac_outbound_dlqtable - Interface team dashboard for manual inspection, correction, and replay
- Retention: 30 days active, then archive
Idempotency:
- Inbound ADT messages: deduplication key =
MSH-10(Message Control ID); duplicate messages logged and discarded - Outbound clearance updates: deduplication key =
[encounter_id]_[update_type]_[timestamp]; EHR ignores duplicate updates for same encounter and status
Reconciliation:
- Daily: compare Patient Access patient/insurance records vs EHR master; flag discrepancies
- Weekly: review DLQ entries for both inbound and outbound queues
- Monthly: full patient demographics reconciliation report for data quality review
INT-PAC-004: Scheduling
Business Context
What flows
- Inbound from Scheduling:
- Appointment details (date/time, department, provider, visit type)
- Appointment status (booked, rescheduled, cancelled, checked-in)
- Outbound to Scheduling:
- Pre-registration status (complete/incomplete, missing items)
- Financial clearance flags (eligibility verified, auth obtained, referral valid)
- Cost estimate availability
When
- When appointments are created/updated.
- When pre-registration or financial clearance status changes.
Why
- To drive pre-registration worklists and ensure patients are financially cleared before arrival.
How often
- Real-time.
Error impact
- If inbound fails: Patient Access may not see upcoming appointments → missed pre-reg.
- If outbound fails: Scheduling staff may book or check-in patients without seeing holds.
HL7 v2.5.1 Technical Detail
Not typically HL7-based internally; use internal APIs. No HL7 messages required.
FHIR R4 Technical Detail
Not required; internal JSON structures are sufficient.
Error Handling
- Same retry/backoff and DLQ pattern as INT-PAC-003.
- If outbound clearance update fails, Scheduling UI shows last-known status with “Sync error” indicator.
Retry and Recovery
Retry Strategy:
| Scenario | Strategy | Intervals | Max Attempts |
|---|---|---|---|
| Inbound appointment event not received | No auto-retry (sender retries) | N/A | Scheduling module retries delivery; Patient Access monitors for gaps |
| Outbound pre-reg/clearance status update fails | Fixed interval retry | Every 5 minutes | 12 (1 hour total; then DLQ and alert) |
| Scheduling API timeout (outbound) | Immediate retry with delay | 2s, 5s | 2 (then queue for background retry) |
| Scheduling API 5xx (outbound) | Exponential backoff | 1m, 2m, 5m | 3 (then DLQ) |
Dead Letter Queue:
- Failed outbound status updates →
integration_dlqwithintegration_id = 'INT-PAC-004' - Same DLQ schema as other internal integrations
- Retention: 30 days active, then archive
Idempotency:
- Inbound appointment events: deduplication key =
[appointment_id]_[event_type]_[event_timestamp] - Outbound pre-reg status updates: deduplication key =
[appointment_id]_[prereg_status]_[update_timestamp]; Scheduling ignores duplicate updates
Reconciliation:
- Daily: compare Patient Access pre-registration records vs Scheduling appointment list; flag appointments missing pre-reg records
- Weekly: review sync error indicators in Scheduling UI; resolve outstanding discrepancies
- Monthly: pre-registration coverage rate report (appointments with vs without pre-reg)
INT-PAC-005: Billing & Claims
Business Context
What flows
- Outbound from Patient Access:
- Eligibility details (payer, plan, coverage dates, benefits summary) linked to encounter.
- Prior auth numbers and statuses for claims.
- Co-pay amounts collected at point of service.
- Cost estimate details (for variance analysis).
- Inbound from Billing:
- Patient account balances and payment history (for financial counseling).
- Claim status and denial reasons (especially “no_auth” denials for KPI tracking).
When
- Immediately after eligibility verification and auth approval.
- When claims are generated or updated.
- When financial counseling sessions are recorded.
Why
- To ensure claims include required auth numbers and accurate coverage info.
- To support financial counseling and KPI reporting.
How often
- Real-time.
Error impact
- Missing auth numbers on claims → denials.
- Outdated balances → poor counseling decisions.
HL7 v2.5.1 Technical Detail
Some billing systems may use DFT^P03 for financial transactions, but for this HIS, internal APIs are preferred. No external HL7 required here.
FHIR R4 Technical Detail
Not required; internal JSON.
Error Handling
- Same pattern as INT-PAC-003.
- If auth number fails to sync to Billing:
- Billing UI shows “Auth info missing – refresh from Patient Access”.
- Background job retries every 10 minutes until success or encounter closed.
Retry and Recovery
Retry Strategy:
| Scenario | Strategy | Intervals | Max Attempts |
|---|---|---|---|
| Outbound eligibility/auth sync to Billing fails | Fixed interval retry | Every 10 minutes | 6 (1 hour; then DLQ and alert RCM team) |
| Billing API timeout (outbound) | Immediate retry with delay | 2s, 5s | 2 (then queue for background retry) |
| Billing API 5xx (outbound) | Exponential backoff | 1m, 2m, 5m | 3 (then DLQ) |
| Inbound balance/claim data from Billing fails | No auto-retry (Billing retries) | N/A | Patient Access monitors for stale data |
| Auth number not delivered before claim generation | Background job retry | Every 10 minutes | Until encounter closed or 7 days |
Dead Letter Queue:
- Failed outbound eligibility/auth/co-pay updates →
integration_dlqwithintegration_id = 'INT-PAC-005' - Priority flag for auth number sync failures (directly impacts claim submission)
- Retention: 30 days active, then archive
Idempotency:
- Outbound eligibility updates: deduplication key =
[encounter_id]_[eligibility_check_id] - Outbound auth number updates: deduplication key =
[encounter_id]_[auth_id]_[auth_status] - Billing module checks for existing records before creating duplicates
Reconciliation:
- Daily: compare Patient Access auth records vs Billing claims; flag claims missing auth numbers
- Weekly: review “Auth info missing” indicators in Billing UI; resolve outstanding sync failures
- Monthly: denial analysis — track “no_auth” denials and correlate with sync failures for root cause analysis
INT-PAC-006: Policy & Contract Management
Business Context
What flows
- Inbound to Patient Access:
- Payer and plan master data (names, IDs, product types).
- Coverage rules (which services require auth, referral, or have special limits).
- Fee schedules and contracted rates (for cost estimation).
- Financial assistance program rules.
When
- At runtime when:
- Eligibility is checked (to know which endpoint to call).
- Prior auth determination is needed.
- Cost estimates are generated.
- Also via periodic sync (e.g., nightly) for master data updates.
Why
- To centralize payer rules and avoid hardcoding in Patient Access.
- To keep cost estimates aligned with current contracts.
How often
- Real-time lookups + scheduled batch refresh.
Error impact
- If unavailable: Patient Access may:
- Fail to identify auth requirements → denials.
- Use outdated rates → inaccurate estimates.
HL7 v2.5.1 / FHIR R4 Technical Detail
Not applicable; internal master data APIs/DB views only.
Error Handling
- If master data API unavailable:
- Use cached rules (last successful snapshot) with timestamp.
- Display banner “Payer rules may be outdated” to Patient Access Manager.
- If cache older than configured threshold (e.g., 7 days):
- Block new cost estimates for affected payer until resolved or override by Manager.
Retry and Recovery
Retry Strategy:
| Scenario | Strategy | Intervals | Max Attempts |
|---|---|---|---|
| PCM master data API timeout (real-time lookup) | Immediate retry with short delay | 1s, 3s | 2 (then fall back to cached data) |
| PCM master data API 5xx | Same as timeout | 1s, 3s | 2 (then fall back to cached data with “stale” flag) |
| Nightly batch sync failure | Auto-retry | 30m | 2 (then alert IT and Patient Access Manager) |
| PCM API 4xx (invalid query) | No auto-retry | N/A | Application fix required |
Timeout and Circuit Breaker (Synchronous):
- Per-request timeout: 5 seconds (must not block eligibility or estimation workflows)
- Circuit breaker: opens after 5 consecutive failures within 2 minutes; half-open probe every 30 seconds
- When circuit is open: use cached payer/plan/coverage data with “stale data” warning banner
- If cache older than 7 days: block cost estimates for affected payer; allow eligibility checks to proceed with warning
- Circuit breaker state changes logged and alerted to IT
Idempotency:
- Read-only lookups are inherently idempotent; no deduplication required
- Nightly batch sync uses upsert logic:
[payer_id]_[plan_id]_[rule_id]as natural key
Reconciliation:
- Daily: verify Patient Access cached payer/plan/coverage data matches PCM master; flag discrepancies
- Weekly: review batch sync success rates and data freshness
- Monthly: full cache vs master data audit; report on stale cache incidents and their impact on estimates
INT-PAC-007: CPOE
Business Context
What flows
- Inbound from CPOE:
- Orders that may require prior auth or referral (e.g., high-cost imaging, procedures).
- Clinical details needed for auth (diagnoses, indications, sometimes lab results).
- Outbound to CPOE:
- Auth status and numbers for each order.
- Referral status (valid/expired, visits remaining).
- Messages for clinicians when auth is denied or peer review is needed.
When
- When an order is placed or modified.
- When auth/referral status changes.
Why
- To prevent ordering services that will not be reimbursed.
- To support clinicians with real-time financial information.
How often
- Real-time.
Error impact
- If inbound fails: Patient Access may not see orders needing auth → missed auth.
- If outbound fails: CPOE may allow order to proceed without showing auth status.
HL7 v2.5.1 Technical Detail
Internal integration; no external HL7 required.
FHIR R4 Technical Detail
Not required; internal JSON. However, internally, orders may be represented as FHIR ServiceRequest or ProcedureRequest resources; mapping is handled within CPOE.
Error Handling
- Same retry/backoff and DLQ pattern.
- If auth status cannot be returned to CPOE:
- CPOE displays “Auth status unknown – check Patient Access” and may enforce soft/hard stop based on configuration.
Retry and Recovery
Retry Strategy:
| Scenario | Strategy | Intervals | Max Attempts |
|---|---|---|---|
| Inbound order event from CPOE not received | No auto-retry (CPOE retries delivery) | N/A | Patient Access monitors for unmatched orders |
| Outbound auth status update to CPOE fails | Fixed interval retry | Every 5 minutes | 12 (1 hour; then DLQ and alert) |
| CPOE API timeout (outbound auth status) | Immediate retry with delay | 2s, 5s | 2 (then queue for background retry) |
| CPOE API 5xx (outbound) | Exponential backoff | 1m, 2m, 5m | 3 (then DLQ) |
Dead Letter Queue:
- Failed outbound auth status updates →
integration_dlqwithintegration_id = 'INT-PAC-007' - Priority flag for auth approvals (clinicians waiting for confirmation)
- Retention: 30 days active, then archive
Idempotency:
- Inbound order events: deduplication key =
[order_id]_[event_type]_[event_timestamp] - Outbound auth status updates: deduplication key =
[order_id]_[auth_id]_[auth_status]; CPOE ignores duplicate status updates
Reconciliation:
- Daily: compare Patient Access auth records vs CPOE orders requiring auth; flag orders without corresponding auth records
- Weekly: review “Auth status unknown” indicators in CPOE; resolve outstanding sync failures
- Monthly: track orders that proceeded without auth confirmation and their claim outcomes
INT-PAC-008: Patient Portal (FHIR R4)
Business Context
What flows
- Outbound to Patient Portal:
- Pre-registration “packages” for upcoming appointments:
- Demographics to confirm/update.
- Insurance details to confirm/update.
- Consent forms (PDPL consent, facility-specific consents).
- Cost estimates for planned services (if available).
- Inbound from Patient Portal:
- Updated demographics and insurance.
- Completed consent forms (signatures, timestamps).
- Patient acknowledgment of cost estimates.
When
- When an appointment is booked and pre-registration is enabled.
- When staff manually triggers a pre-reg invitation.
- When patient submits or updates pre-reg data.
Why
- To reduce front-desk workload and waiting times.
- To improve data quality and ensure PDPL-compliant consent capture.
How often
- On-demand (per appointment/patient).
FHIR R4 Technical Detail
The Patient Portal exposes a FHIR R4 API. Patient Access acts as a client and server:
- Outbound: Patient Access populates FHIR resources for the portal:
PatientCoverageAppointmentQuestionnaire/QuestionnaireResponse(for pre-reg forms)Consent(for PDPL and facility consents)CommunicationorDocumentReferencefor cost estimate PDFs- Inbound: Patient Access receives:
PatientupdatesCoverageupdatesQuestionnaireResponse(completed forms)ConsentresourcesCommunicationacknowledging cost estimate
Example FHIR Bundle – Pre-Registration Package (Outbound)
{
"resourceType": "Bundle",
"type": "collection",
"id": "prereg-ENC-2026-000567",
"entry": [
{
"fullUrl": "urn:uuid:patient-1",
"resource": {
"resourceType": "Patient",
"id": "MRN-2026-000123",
"identifier": [
{
"system": "http://dubai-creek-hosp.example.org/mrn",
"value": "MRN-2026-000123"
},
{
"system": "http://www.emiratesid.ae",
"value": "784-1985-1234567-1"
}
],
"name": [
{
"use": "official",
"family": "Al-Maktoum",
"given": ["Ahmed"]
}
],
"gender": "male",
"birthDate": "1985-03-15",
"telecom": [
{
"system": "phone",
"value": "+971501234567",
"use": "mobile"
}
],
"address": [
{
"line": ["PO BOX 12345"],
"city": "Dubai",
"country": "AE"
}
]
}
},
{
"fullUrl": "urn:uuid:coverage-1",
"resource": {
"resourceType": "Coverage",
"id": "COV-OMN123456789",
"status": "active",
"beneficiary": {
"reference": "Patient/MRN-2026-000123"
},
"payor": [
{
"identifier": {
"system": "http://dha.gov.ae/payers",
"value": "PAYER-DHA-OMAN"
},
"display": "Oman Insurance"
}
],
"class": [
{
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/coverage-class",
"code": "plan"
}
]
},
"value": "OMN-GOLD",
"name": "Oman Insurance Gold"
}
],
"subscriberId": "OMN123456789",
"period": {
"start": "2025-01-01",
"end": "2026-12-31"
}
}
},
{
"fullUrl": "urn:uuid:appointment-1",
"resource": {
"resourceType": "Appointment",
"id": "APT-2026-000999",
"status": "booked",
"serviceCategory": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/service-category",
"code": "17",
"display": "General Practice"
}
]
}
],
"start": "2026-02-10T09:30:00+04:00",
"end": "2026-02-10T10:00:00+04:00",
"participant": [
{
"actor": {
"reference": "Patient/MRN-2026-000123"
},
"status": "accepted"
}
]
}
},
{
"fullUrl": "urn:uuid:questionnaire-1",
"resource": {
"resourceType": "Questionnaire",
"id": "prereg-basic-1",
"status": "active",
"title": "Pre-Registration Demographics and Insurance",
"item": [
{
"linkId": "contact-phone",
"text": "Mobile phone number",
"type": "string",
"required": true
},
{
"linkId": "insurance-card-photo",
"text": "Upload insurance card photo",
"type": "attachment",
"required": false
}
]
}
},
{
"fullUrl": "urn:uuid:consent-1",
"resource": {
"resourceType": "Consent",
"id": "consent-pdpl-1",
"status": "draft",
"scope": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/consentscope",
"code": "patient-privacy"
}
]
},
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes",
"code": "INFA",
"display": "Information Access"
}
]
}
],
"patient": {
"reference": "Patient/MRN-2026-000123"
},
"dateTime": "2026-02-07T11:00:00+04:00",
"organization": [
{
"reference": "Organization/DUBAI_CREEK_HOSP"
}
]
}
}
]
}
Example FHIR QuestionnaireResponse – Completed Pre-Registration (Inbound)
{
"resourceType": "QuestionnaireResponse",
"id": "QR-PREREG-0001",
"questionnaire": "Questionnaire/prereg-basic-1",
"status": "completed",
"subject": {
"reference": "Patient/MRN-2026-000123"
},
"authored": "2026-02-08T18:45:00+04:00",
"item": [
{
"linkId": "contact-phone",
"answer": [
{
"valueString": "+971509876543"
}
]
}
]
}
Key Element Mappings
| FHIR Element | HIS Table / Column |
|---|---|
| Patient.identifier (MRN, Emirates ID) | patients, patient_identifiers |
| Coverage.payor / class.plan | payers.payer_id, insurance_plans.plan_id |
| Appointment.id | appointments.appointment_id |
| QuestionnaireResponse.status | pre_registration_records.status |
| QuestionnaireResponse.authored | pre_registration_records.completed_datetime |
| Consent.status/dateTime | pre_registration_records.consent_obtained + timestamp |
| Bundle.id | pre_registration_records.prereg_id |
Search Parameters (Portal → Patient Access)
GET /QuestionnaireResponse?subject=Patient/MRN-2026-000123&questionnaire=prereg-basic-1GET /Consent?patient=Patient/MRN-2026-000123&status=activeGET /Appointment?patient=Patient/MRN-2026-000123&date=ge2026-02-01
Error Handling
| Error Condition | Response | Retry Strategy |
|---|---|---|
| FHIR 401/403 (auth failure) | Stop; log security event; show “Portal connection error” to staff | No auto-retry; requires credential fix |
| FHIR 404 (resource not found) | Mark pre-reg package as failed; allow manual resend | No auto-retry |
| FHIR 422 (validation error) | Parse OperationOutcome; log; mark specific resource as invalid |
No auto-retry; fix mapping and resend |
| FHIR 5xx (server error) | Queue outbound Bundle; mark pre_registration_records.status = 'pending_sync' |
Exponential backoff: 1m, 2m, 5m, 10m (max 4) |
| Network/TLS errors | Same as 5xx | Same backoff |
Dead letter and manual recovery as per other integrations. Staff can resend pre-reg invitation from Pre-Registration Dashboard.
Retry and Recovery
Retry Strategy:
| Scenario | Strategy | Intervals | Max Attempts |
|---|---|---|---|
| Outbound FHIR Bundle delivery to Portal fails (5xx) | Exponential backoff | 1m, 2m, 5m, 10m | 4 (then DLQ; mark pre_registration_records.status = 'pending_sync') |
| Outbound FHIR Bundle network/TLS error | Exponential backoff | 1m, 2m, 5m, 10m | 4 (then DLQ) |
| Portal FHIR 401/403 (auth failure) | No auto-retry | N/A | Alert IT; requires credential/certificate fix |
| Portal FHIR 404 (resource not found) | No auto-retry | N/A | Mark pre-reg package as failed; staff can resend manually |
| Portal FHIR 422 (validation error) | No auto-retry | N/A | Fix resource mapping and resend |
| Inbound QuestionnaireResponse parse error | No auto-retry | N/A | Log; interface team reviews and replays after fix |
Dead Letter Queue:
- Failed outbound FHIR Bundles →
integration_dlqwithintegration_id = 'INT-PAC-008' - Failed inbound responses → same DLQ, tagged as
direction = 'inbound' - Staff can resend pre-reg invitation from Pre-Registration Dashboard (SCR-PAC-007)
- Retention: 30 days active, then archive
Idempotency:
- Outbound pre-reg packages: deduplication key =
[appointment_id]_[prereg_id]; Portal ignores duplicate packages - Inbound QuestionnaireResponse: deduplication key =
[questionnaire_response_id]; Patient Access updates existing pre-reg record rather than creating duplicates - Inbound Consent: deduplication key =
[consent_id]_[patient_id]_[consent_type]
Reconciliation:
- Daily: compare Patient Access pre-registration records vs Portal submissions; flag records where invitation was sent but no response received within 48 hours
- Weekly: review DLQ entries for both outbound and inbound; ensure all sync failures resolved
- Monthly: pre-registration portal adoption rate report; review failed sync patterns for systemic issues
NABIDH / Malaffi Integration
Patient Access does not directly send messages to NABIDH (Dubai) or Malaffi (Abu Dhabi). However:
- Demographics and coverage data used in Patient Access must remain consistent with:
- NABIDH/Malaffi ADT and coverage data consumed by the EHR.
- When EHR receives updated demographics/coverage from HIE:
- EHR must propagate changes to Patient Access via INT-PAC-003 (HL7 ADT^A08 or internal API).
- Compliance:
- Ensure Emirates ID and MRN mappings are consistent with HIE master patient index.
- Respect UAE PDPL requirements for consent and data minimization; Patient Access should not expose more financial data to HIE than required (typically none directly).
Authentication & Security
All integrations must comply with:
- UAE PDPL (Federal Decree-Law No. 45/2021) for personal data protection.
- DHA/DOH security guidelines and ADHICS (for Abu Dhabi).
- TDRA/NESA cybersecurity standards.
mTLS Certificates
- External integrations (INT-PAC-001, INT-PAC-002, INT-PAC-008) must use mutual TLS:
- Client and server certificates issued by approved UAE CAs or as per DHA/DOH requirements.
- Certificates stored in secure keystore with rotation policy (e.g., 12 months).
- TLS version ≥ 1.2; strong cipher suites only.
OAuth 2.0 Flows
- eClaimLink / DOH eClaims:
- Use OAuth 2.0 client credentials flow:
- Client ID/secret per facility.
- Token endpoint defined by payer gateway.
- Access tokens cached in memory with automatic refresh.
- Patient Portal (FHIR):
- Use OAuth 2.0 authorization code flow for patient-facing access.
- Patient Access acts as confidential client when calling portal APIs (client credentials or JWT-based).
API Key Management
- For any payer or internal services that still use API keys:
- Keys stored in secrets manager (not in code).
- Keys rotated per facility policy (e.g., every 90 days).
- Access controlled by role-based permissions.
Message Encryption & Data Protection
- All external traffic over HTTPS (TLS).
- Sensitive fields (e.g., Emirates ID, member IDs) encrypted at rest in HIS databases using field-level encryption where required by policy.
- Logs must:
- Avoid storing full Emirates IDs and card numbers; use masking (e.g.,
784-1985-******7-1). - Store only necessary identifiers for troubleshooting.
Access Control & Audit
- Only roles with appropriate permissions (e.g., Registration Clerk, Authorization Specialist, Financial Counselor) can:
- Trigger eligibility/auth.
- View detailed financial information.
- All integration calls must be auditable:
who(user or system account),what(payload summary, not full PHI),when(timestamp),where(source IP/system),result(success/failure).
Error & Alerting Thresholds
- Repeated failures:
- ≥ 5 failed calls to same external endpoint within 10 minutes → send alert to IT and Patient Access Manager.
- Security anomalies:
- Repeated 401/403 responses → trigger security incident workflow.
This specification covers all Patient Access integrations required for eligibility, prior authorization, referrals, cost estimation, financial counseling, and pre-registration in the UAE context.