Coverage
— maps to 1 OMOP table| OMOP Table | Status | Mapped | |
|---|---|---|---|
|
payer_plan_period
primary
FHIR Coverage captures a patient's insurance enrollment (payer, plan, coverage period, subscriber relationship). It maps to OMOP payer_plan_period, which records continuous enrollment under a specific health benefit plan from a given payer. Unlike clinical event tables, payer_plan_period carries no _type_concept_id; it is purely administrative. One active Coverage resource produces one payer_plan_period row. Overlapping or adjacent periods for the same person/payer may be collapsed.
|
documented | 17 fields | detail → |
Coverage → OMOP Mapping
FHIR Coverage captures a patient's insurance enrollment -- the payer, plan, coverage period, and subscriber relationship. It maps primarily to OMOP payer_plan_period, which records continuous enrollment under a specific health benefit plan from a given payer. Unlike clinical event tables, payer_plan_period carries no _type_concept_id; it is purely administrative.
Coverage is also closely related to ExplanationOfBenefit (EOB), which contains adjudicated claim-level costs. In practice, many ETLs derive payer_plan_period from EOB rather than Coverage directly (see avalon-fhir-omop), because claims data often comes from flat files rather than discrete FHIR Coverage resources.
Target OMOP Tables
| OMOP Table | Purpose | Required? |
|---|---|---|
payer_plan_period | One row per continuous enrollment period per person per payer/plan | Yes |
cost | Claim-level costs (from Claim/ExplanationOfBenefit, not Coverage) | No -- separate mapper |
Mapping Strategy
The Coverage to payer_plan_period mapping is conceptually simple (it is mostly a period + payer identity) but operationally complex because of vocabulary gaps and the lack of a standard payer taxonomy in FHIR:
-
Payer identification. FHIR
Coverage.payoris a Reference to Organization, Patient, or RelatedPerson. OMOP needs apayer_concept_id(an integer from the OMOP Payer vocabulary, domain_id = "Payer") and apayer_source_value(free text). There is no normative FHIR-to-OMOP payer concept map. Most implementations store the payor organization name or identifier aspayer_source_valueand setpayer_concept_id = 0. The mends-on-fhir project maintains a large ConceptMap (~130 entries) mapping OMOP payer concept_ids to FHIRv3-ActCodecodes, but this is reverse-direction (OMOP to FHIR). -
Plan classification. FHIR uses
Coverage.type(CodeableConcept bound tohttp://terminology.hl7.org/CodeSystem/v3-ActCode-- values likeHIP,MCPOL,SUBSUPP,pay) for high-level plan category, andCoverage.class[](a repeating BackboneElement withtype/value/namesub-fields) for structured plan details (group, plan, subplan, class, subclass, sequence, rxbin, rxpcn). OMOP hasplan_source_value(free text) andplan_concept_id(integer). MappingCoverage.type.coding.codetoplan_concept_idrequires a local vocabulary lookup. Most implementations concatenate class values intoplan_source_value. -
Coverage period.
Coverage.period.startandCoverage.period.endmap directly topayer_plan_period_start_dateandpayer_plan_period_end_date. Both OMOP fields are NOT NULL. WhenCoverage.periodis absent or open-ended, a synthetic boundary is needed (e.g., ETL start date, or9999-12-31for open-ended coverage). -
Sponsor vs. Payer. OMOP distinguishes between the payer (who reimburses) and the sponsor (who finances the plan -- e.g., an employer for group health). FHIR separates these into
Coverage.payor(the insurer) andCoverage.policyHolder(the entity that holds the policy, often the employer/sponsor). This mapping is rarely implemented. -
Family/subscriber linkage. OMOP
family_source_valuecaptures the common identifier linking family members under the same policy. FHIR hasCoverage.subscriberIdandCoverage.dependentfor this purpose. ConcatenatingsubscriberIdintofamily_source_valueis the natural mapping. -
Multiple payors per Coverage. FHIR allows
Coverage.payorto be 1..*, but OMOP has a singlepayer_source_valueper row. When multiple payors exist, pick the first (primary) or create multiplepayer_plan_periodrows. -
Coverage vs. ExplanationOfBenefit as source. Some ETLs (avalon-fhir-omop) derive
payer_plan_periodfrom ExplanationOfBenefit.billablePeriod + insurer rather than from Coverage resources. This is common when the source system does not emit discrete Coverage resources. The avalon approach aggregates EOB rows by patient+insurer, taking MIN(start) and MAX(end) as the coverage period. -
Status filtering. Only
activeCoverage resources should producepayer_plan_periodrows. Cancelled, draft, or entered-in-error Coverage should be skipped.
Reference Implementations
- fhir-omop-ig (HL7) -- Logical model at
refs/refs/fhir-omop-ig/input/fsh/PayerPlanPeriod.fsh. Defines the OMOP payer_plan_period as a FHIR Logical Model with all 17 fields. No FML mapping from Coverage. Status: active ballot. - mends-on-fhir (Whistle, OMOP to FHIR) --
refs/refs/mends-on-fhir/whistle-mappings/synthea/whistle-functions/PPP_Coverage.wstland implementation atzzPPP_CoverageImpl.wstl. Reverse direction: converts OMOPpayer_plan_periodto FHIR Coverage. Usespayer_plan_period_idas Coverage.id,person_idas beneficiary reference,plan_source_valueas payor display. Includes ConceptMapPPP.payor-concept-id--Coverage.type.jsonmapping ~130 OMOP payer concept_ids to FHIR v3-ActCode codes. Status: maintained. - avalon-fhir-omop (dbt/SQL, FHIR to OMOP) --
refs/refs/avalon-fhir-omop/omop-views/models/omop_payer_plan_period.sql. Derives payer_plan_period from ExplanationOfBenefit (not Coverage). Groups by patient+insurer, uses MIN/MAX of billablePeriod for dates. Extracts plan type from contained Coverage resource. All concept_ids set to 0 or NULL. Status: maintained. - FhirToCdm (OHDSI, C#) --
refs/refs/FhirToCdm/CdmPersonBuilder.cs. HasPayerPlanPeriodsRawlist andBuildPayerPlanPeriods()method that collapses overlapping periods with matching payer+plan source values. No explicit Coverage-to-PayerPlanPeriod mapper found -- the framework supports it but the FHIR-specific extraction is minimal. - omop-fhir-data (Synthea JSON) --
refs/refs/omop-fhir-data/synthea-cohort-010/Payer_Plan_Period_0000000000.json. Synthea-generated sample data showing typical payer_plan_period rows: all concept_ids = 0, payer_source_value = UUID, plan_source_value = insurer name (e.g., "Cigna Health", "UnitedHealthcare"). - omoponfhir -- No Coverage mapper found.
- ETL-German-FHIR-Core -- No Coverage/payer_plan_period mapper found (German MII profiles do not include Coverage).
- NACHC-fhir-to-omop -- Has
PayerPlanPeriodDvo.javadata object but no FHIR Coverage mapper found. - fhir-to-omop-demo (jq) -- Schema includes payer_plan_period DDL but no Coverage mapper.
Status in This Project
Not yet implemented.