← Pipeline explainers SeaRad · Seattle Radiologists

MDClarity · Pipeline explainer

How SeaRad's scheduled pipelines work

SeaRad (Seattle Radiologists) runs a ClarityFlow patient-access setup fed two ways — HL7 every 10 minutes and a daily appointment-file pull — both flowing into one shared benefits-and-letters core, plus a monthly eligibility re-sweep. Notably, everything arrives over a single MDClarity-hosted SFTP — there's no vendor/EHR host.

Runner: WORKER-1 Windows Task Scheduler → RunDriverJob.ps1 → jobs on prod-db-1
Export: dev-1 snapshot 2026-07-09 · Scheduled-task XML: MDC set · Structure & names only, no patient data

Source system
SFTP-only
single mdcssh host; no vendor host
Scheduled tasks
3
HL7 · daily · monthly
HL7 poll interval
10 min
every 10 minutes, all day
Pipeline files in export
94
only 3 scheduled; rest ad-hoc
external I/O (SFTP)
sub-job (pipeline)
SQL task
external tool
task_type native pipeline task
▶ click sub-jobs to expand

Cadence · 01

When each pipeline runs

Three Windows Scheduled Tasks under \MDC\ on WORKER-1, with a yield hierarchy: the frequent HL7 loop defers to the daily run, which defers to the monthly run — so the big passes never collide with the small ones.

00:00 06:00 12:00 18:00 24:00
HL7 Processing
every 10 min
every 10 min · IgnoreNew
Daily files
daily · 1×
22:15
Eligibility
monthly · 1st
00:30

Pipeline 1 · every 10 min · ClarityFlow

The HL7 processing loop

SeaRad's near-real-time feed. Task HL7 - Processing - SeaRad fires every 10 minutes, all day (<Repetition><Interval>PT10M</Interval><Duration>P1D</Duration>, IgnoreNew). It parses inbound HL7, loads fee schedules, then runs the shared visit core.

Every 10 min

Daily-Visit-Processing-HL7

RunDriverJob.ps1 · prod-db-1 · yields to the daily run
6 sub-jobs + WQ
  • ▶Parse-HL7— download & transform inbound HL7
    • download ← mdcssh SFTP /HL7 → {HL7Directory} (remote-delete on success)
    • LoadHL7Files → ADT (A01/03/04/08/09/10/28/31), SIU (S12–S15), ORM^O01 — no DFT/charges
    • Update HL7ProcessLog + HL7Delta + Visit + VisitCharge (SQL)
    • Load-Transform-HL7 → Transform patient/insurance/visit/charge + LoadPatients (ECC=1 per ticket)
  • ▶Load-ALL-Medicare-Schedules · Load-ALL-Medicaid-Schedules— fee schedules for pricing
    • Load ContractMap
    • Medicare: DME · Drug · Lab · RVU · Endoscopy-Base · Multiple-Procedure · MidLevelProvider (load_schedule)
    • Medicaid schedules
    Loads the Medicare/Medicaid fee schedules used to price visit charges downstream.
  • jobPopulate-Dimensions
    EligibilityInsurance / QuoteInsurance / Time / State dimension members
  • jobLoad-Visits — the shared core
    benefits → price → letters → sync → see Shared core
  • jobData-Integrity-Report
    post-load integrity checks
  • workqueue_assignmentWorkqueueAssignment
    Populate user workqueues from WorkqueueAssignmentCriteria

Pipeline 2 · daily @ 22:15 · ClarityFlow

The daily appointment-file run

The file-based sibling of the HL7 loop, once a day at 22:15 (single trigger, no repetition). Pulls appointment and insurance-map text files off the same SFTP, builds the source/transform tables, then runs the same visit core.

Daily 22:15

Daily-Visit-Processing

RunDriverJob.ps1 · prod-db-1 · yields to the monthly run
7 sub-jobs + WQ
  • ▶Parse-Appointment-Files— pull & parse appointment text files
    • Download-Files → SSH.exe /download -downloadall -remotedelete from mdcssh SFTP root → {SourceDirectory}
    • execute_process → cmd.exe /c del the archive dir (inline; no external script)
    • ExecuteJobForFiles over *mdclarity*.txt → Parse-Appointment-File (load_file → Merge to SourceAppointment)
  • jobParse-Insurance-Map-File
    load_file → insurance dimension member map
  • jobLoad-Source-Visit-Info
    Build TempVisitDelta + TransformVisit / Insurance / Charge from the appointment source
  • jobLoad-ALL-Medicare-Schedules · Load-ALL-Medicaid-Schedules
    Same fee-schedule loads as the HL7 loop
  • jobPopulate-Dimensions
  • ▶Populate-Core-Tables— patients, charges, facility, bill type
    • LoadPatients
    • Populate ChargeType · Insert Additional Charges from Appointments
    • Load Facility · Load BillType
  • jobLoad-Visits — the shared core
    benefits → price → letters → sync → see Shared core
  • jobData-Integrity-Report
  • workqueue_assignmentWorkqueueAssignment

Pipeline 3 · monthly, 1st @ 00:30 · eligibility

Monthly eligibility re-sweep

A benefits/eligibility pass over the visit set, run once a month on the 1st. Despite the job name (Daily-Processing-Eligibility), the trigger is monthly. It re-checks coverage and re-prices — but, unlike the per-visit core, it does not send letters.

Monthly

Daily-Processing-Eligibility

Monthly - Processing - SeaRad · day 1 @ 00:30
single job
  • SQLLoad VisitDelta · LoadVisitBatch · Load TempBatchVisit
    Stage the visits to re-verify into the batch tables
  • CheckBenefitsCheckBenefits · Re-Check Benefits · AutoApplyBenefits
    Re-run eligibility (payer API) and re-apply copay / deductible / coinsurance
  • CalculateVisitsCalculateVisits
    Recompute patient responsibility with refreshed benefits
  • SQLCoverage status + custom properties
    Load-CustomProperty-CoverageStatus · UpdateVisitCustomPropertyFromQuery
  • sync_batchSyncBatch · ExportBatchVisitEligibility · SearchForInsurance
    Promote batch → production, export eligibility, discover missing insurance
  • jobGenerate-Report · Load-Visit-Fact · Update-Dashboard-Tables
    Refresh reporting facts and dashboard rollups

Shared · the visit core

Load-Visits — where both loops converge

Both the HL7 loop and the daily file run call the same Load-Visits job. This is where SeaRad's ClarityFlow actually happens: staged visits get benefits, pricing, letters, and promotion to production. (The monthly sweep runs a trimmed version of this same sequence, minus letters.)

  • Load VisitDelta · Load TempBatchVisit · Augment Visit Delta · LoadVisitBatch → stage into VisitBatch / QuoteBatch
  • CheckBenefits · Re-Check Benefits → payer eligibility API (billable; deduped)
  • AutoApplyBenefits → apply copay / deductible / coinsurance
  • CalculateVisits → compute patient responsibility
  • LogVisitChangeEventsBatch → diff batch vs production
  • AutoSendLetters → patient estimate letters (email / SMS)
  • Load TransformVisitInsuranceCoverageStatus · Load-CustomProperty-CoverageStatus + custom props
  • SyncBatch → promote *Batch tables to production Visit / Quote / …
  • ExportBatchVisitEligibility · SearchForInsurance
  • Generate-Report

Reference · Interfaces

Who SeaRad talks to

Unusually simple: one SFTP endpoint (MDClarity-hosted, mdcssh) for all inbound data — HL7, appointment files, and the insurance map. No vendor/EHR host, and no outbound HL7 — patient letters go out as email / SMS from the letter engine.

EndpointDirectionConnectionCarriesUsed by
mdcssh /HL7inbound ⬇ SeaRad_ProdMirror-mdcssh-sftp ADT / SIU / ORM HL7HL7 loop · Parse-HL7
mdcssh / (root)inbound ⬇ SeaRad_ProdMirror-mdcssh-sftp (via SSH.exe) Appointment files *mdclarity*.txt + insurance mapDaily · Parse-Appointment-Files
Patientsoutbound ⬆ email / SMS (MessageAPI) Estimate letters (AutoSendLetters)Load-Visits core

Reference · Glossary

Task-type glossary

The native pipeline tasks used above, per docs/tasks. Fir = per-visit core, coral = monthly sweep.

download
Parallel SFTP pull to a local dir; optional remote archive/delete.
load_hl7_files
Parse a folder of HL7 files into HL7Archive + type-specific staging tables; per-file, batch, import-only.
load_file
Load a delimited file with a known structure into an import table (the appointment / insurance-map feeds).
LoadPatients
Upsert Patient from a query over the transform tables (SeaRad forces electronic-comm consent = 1).
load_schedule
Load a Medicare/Medicaid fee schedule (RVU, DME, Drug, Lab, …) used to price visit charges.
LoadDimensionMembers
Refresh the DimensionMember metadata cache (insurance, time, state, …) from entity tables.
CheckBenefits
Batch eligibility — call payer APIs for coverage/benefits; writes EligibilityTxn. Billable, deduped.
AutoBenefits
Apply copay/deductible/coinsurance/max-OOP to batch visits from eligibility txns via AutoBenefitsRule.
CalculateVisits
Compute patient responsibility from charges, contract pricing, and applied benefits.
LogVisitChangeEventsBatch
Diff each batch visit against its production counterpart; log per-visit change reasons.
AutoSendLetters
Generate & send patient estimate letters (email/SMS) per AutoSendLetterConfig (consent + contact required).
SyncBatch
Promote *Batch staging tables to production (delete-then-insert per entity, each in its own txn).
SearchForInsurance
Discover missing/likely insurance for visits lacking coverage.
ExportBatchVisitEligibility
Export the batch's eligibility results (downstream consumers / reporting).
WorkqueueAssignment
Fill user workqueues from WorkqueueAssignmentCriteria; optional auto-unassign of non-matches.
UpdateDashboardTables
Rebuild pre-aggregated Dashboard_* rollup tables so dashboards read fast.
execute_process
Shell out to an external command. Here: SSH.exe (SFTP download) and cmd.exe /c del (archive cleanup) — args inline, no custom script.