Carrier Crosswalk
The Benefit Plan Standard maintains a carrier crosswalk that maps each issuer’s vocabulary, structure, and terminology into the normalized schema fields.
This ensures that different carriers’ representations of benefits (often inconsistent in naming, structure, and granularity) can be interpreted in a unified, machine-readable way.
Because carriers vary widely in how they describe deductibles, copays, limits, and categories, the crosswalk is a foundational component of the standard.
📊 Crosswalk Matrix
Plan Metadata
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| plan_id | FLBLUE_BLUEOPTIONS_505 | GATORCARE_PRIME_EPO | SCAN_CLASSIC_HMO_LOS_ANGELES | AETNA_PPO_1500_80_50 | UHC_CHOICE_PLUS_HSA_GOLD_1700 | CIGNA_OAP_BOWDOIN | HUMANA_GOLD_PLUS_H1036_025_HMO | AMBETTER_CA_SILVER_94_HMO | KAISER_CA_GOLD_80_HMO |
| plan_identifiers | not in example | not in example | cms_contract_plan_segment: H5425-006-0; cms_contract_id: H5425; cms_pbp_id: 006 | not in example | not in example | not in example | cms_contract_plan_segment: H1036-025-000; cms_contract_id: H1036; cms_pbp_id: 025 | not in example | not in example |
| carrier | FloridaBlue | GatorCare | SCAN Health Plan | Aetna | UnitedHealthcare | Cigna | Humana | Ambetter | Kaiser |
| plan_name | Florida Blue BlueOptions 505 | Florida Blue BlueOptions 03768 - Prime EPO Plan | SCAN Classic (HMO) | Aetna FL PPO 1500 80/50 CY V25 | UnitedHealthcare® UHC Choice Plus HSA Gold 1700-4 | Bowdoin College: Open Access Plus | Humana Gold Plus H1036-025 (HMO) | Health Net of CA: Silver 94 Ambetter HMO | KAISER PERMANENTE® : Gold 80 HMO |
| plan_type | PPO | EPO | HMO | PPO | POS | OAP | HMO | HMO | HMO |
| plan_year | 2023 | 2026 | 2026 | 2026 | 2026 | 2026 | 2026 | 2026 | 2026 |
| market | individual | self_funded | medicare_advantage | large_group | small_group | large_group | medicare_advantage | individual | individual |
Network Tiers
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| tier_id | IN / OUT | IN / OUT | IN / OUT / PHARMACY_RETAIL_STANDARD | IN / OUT | IN / OUT | IN / OUT | IN / OUT / SITE_PCP_OFFICE / SITE_SPECIALIST_OFFICE / SITE_TELEHEALTH / SITE_URGENT_CARE_CENTER / SITE_OUTPATIENT_HOSPITAL / SITE_AMBULATORY_SURGERY_CENTER / SITE_FREESTANDING_RADIOLOGY / SITE_FREESTANDING_LAB / SITE_MEMBERS_HOME / SITE_COMPREHENSIVE_OUTPATIENT_REHAB / SITE_PHARMACY / SITE_NETWORK_RETAIL_PHARMACY / SITE_DME_PROVIDER / SITE_DIABETIC_SUPPLIER / SITE_MEDICAL_SUPPLIER / SITE_PROSTHETICS_PROVIDER / SITE_PART_D_RETAIL / DESIG_PREFERRED_DIABETIC_SUPPLIER | IN / OUT | IN / OUT |
| name | In Network / Out of Network | GatorCare Tier 1 In-Network / BlueOptions Tier 3 Out-Of-Network | In network / Out of network / Retail, Standard | In Network / Out of Network | In-Network / Out-of-Network | In Network / Out of Network | In network / Out of network / PCP's office / Specialist's office / Telehealth / Urgent care center / Outpatient hospital / Ambulatory surgery center / Freestanding radiological facility / Freestanding laboratory / Member's home / Comprehensive outpatient rehab facility / Pharmacy / Network retail pharmacy / DME provider / Diabetic supplier / Medical supplier / Prosthetics provider / Retail Cost-Sharing / Preferred diabetic supplier | In Network / Out of Network | Plan Provider / Non-Plan Provider |
| description | Network Level | Three tiers; collapses to IN/OUT under v1.1 (tier_class drafted for v1.2) | Plan Network | Network Level | Three columns on SBC; collapses to IN/OUT under v1.1 | Network Tier | Plan Network | OON cells read Not covered on most rows | Non-plan providers not covered |
Accumulators
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| individual_deductible | $3,500 | $350 | $0 | $1,500 | $1,700 | $1,000 | $0 | not in example | $0 |
| family_deductible | $10,500 | $700 | not in example | $3,000 | $3,400 | $2,000 | not in example | not in example | not in example |
| individual_oop_max | $3,500 | $2,700 | $199 | $5,500 | $4,500 | $3,500 | $2,000 | $1,400 | $9,200 |
| family_oop_max | $10,500 | $5,400 | not in example | $11,000 | $9,000 | $7,000 | not in example | $2,800 | $18,400 |
| oon_individual_deductible | $5,500 | not in example | not in example | $3,000 | $5,000 | $1,000 | not in example | not in example | not in example |
| oon_family_deductible | $11,000 | not in example | not in example | $9,000 | $10,000 | $2,000 | not in example | not in example | not in example |
| oon_individual_oop_max | $8,500 | not in example | not in example | $13,000 | $10,000 | $3,500 | not in example | not in example | not in example |
| oon_family_oop_max | $17,000 | not in example | not in example | $39,000 | $20,000 | $7,000 | not in example | not in example | not in example |
| pharmacy.deductible | not in example | not in example | $250 (applies_to_tiers: Tier 3, Tier 4, Tier 5) | not in example | not in example | not in example | $615 (applies_to_tiers: Tier 4, Tier 5) | not in example | not in example |
| pharmacy.out_of_pocket_max | not in example | not in example | $2,100 | not in example | not in example | not in example | $2,100 | not in example | not in example |
Benefits
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| category | Category Header | Category | Common Medical Event | Medical Event | Category | Benefit Category | Category | Common Medical Event | Common Medical Event |
| service_name | Primary care visit to treat an injury or illness | Primary care visit to treat an injury or illness | Primary Care | Primary care visit to treat an injury or illness | Primary care visit to treat an injury or illness | Primary care visit to treat an injury or illness | Primary Care Provider (PCP) | Primary care visit to treat an injury or illness | Primary care visit to treat an injury or illness |
| place_of_service | Office Visit | Office | Office | Office | Office / Telehealth | Office | Office / Telehealth | Office | Office |
| deductible | Deductible Applies? | Deductible does not apply / $X Per Visit Deductible + Deductible | Deductible Waived? | Does not apply (applies_to_deductible: false) | Applies / Waived | Does not apply (applies_to_deductible: false) | Usually Waived | Standard SBC wording | Standard SBC wording |
| copay | Copay | Copayment | Copay | Copay | Copay (pharmacy rows split Retail: $X / Mail-Order: $Y in one cell) | Copay | Copay | $X copay/visit | $X copay/visit |
| coinsurance | Coinsurance | Coinsurance | Coins | Coinsurance | Coinsurance | Coinsurance | Coinsurance | X% coinsurance; OON column reads Not covered | X% coinsurance (may carry per-prescription cap, e.g. up to $250/prescription) |
Limits
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| type | visits | Visits | Days | Visits | Days / Units | Visits | visits / hearing_aids / dollars / pairs_of_eyeglasses / days / one_way_trips / meals / occurrences / hours | Visits | Visits / Days |
| value | 25 (Chiropractic care) | Visit Limit (compound: e.g. 75 visits including 26 manipulations) | Day Limit | Visit Limit | Stay Limit | Visit Limit | Allowance | Visit Limit | Visit Limit |
| period | Per Year / Per Stay | Annual | Benefit Period | Per Year | Per Stay / Per Year | Per Year | Annual | Per Year | Per Year |
Conditions
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| prior_authorization | Prior Auth | Prior Authorization | Prior Auth | Prior Auth | Prior Auth | Prior Auth | Prior Auth | Prior Auth | Prior Auth |
| referral_required | Referral Required | Referral Required | Referral | Referral | Referral Required | Referral Required | Referral Required | Referral Required | Referral Required |
| notes | Notes / Limitations | Limitations | Notes | Notes | Limitations | Notes | Plan Notes | Limitations and Exceptions column | Limitations and Exceptions column |
Source Reference
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| page | SBC Page | SBC Page | Summary of Benefits Page | SBC Page | SBC Page | SBC Page | Summary of Benefits Page | SBC Page | SBC Page |
| excerpt | Text Snippet | Text Snippet | Snippet | Snippet | Snippet | Snippet | Snippet | Text Snippet | Text Snippet |
Field Definitions
| Field | Type | Description |
|---|---|---|
| plan_id | string | Normalized unique identifier of the plan |
| carrier | string | Carrier or issuer name |
| plan_name | string | Marketing name |
| plan_type | string | Free-form string, no enum in schema v1.1.0. Recommended codes are in vocabularies/plan-types.json, for example HMO, PPO, EPO, POS. |
| plan_year | integer | Coverage year |
| market | string | Free-form string, no enum in schema v1.1.0. Recommended codes are in vocabularies/markets.json, for example individual, small_group, large_group, self_funded, medicare_advantage. |
| individual_deductible | money | Deductible for individual |
| family_deductible | money | Deductible for family |
Carrier Vocabulary
| Concept | Normalized Term | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|---|
| Primary Care Visit | PCP Visit | Primary care visit to treat an injury or illness | Primary care visit to treat an injury or illness | Primary Care | Primary care visit to treat an injury or illness | Primary care visit to treat an injury or illness | Primary care visit to treat an injury or illness | Primary Care Provider (PCP) | Primary care visit to treat an injury or illness | Primary care visit to treat an injury or illness |
| Specialist Visit | Specialist Visit | Specialist visit | Specialist visit | Specialists | Specialist visit | Specialist visit | Specialist visit | Specialist | Specialist visit | Specialist visit |
Pharmacy Tiers
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| tier_id | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example |
| name | Generic drugs; Preferred brand drugs; Non-preferred brand drugs; Specialty drugs | Generic drugs; Preferred brand drugs; Non-preferred brand drugs; Specialty drugs | Tier 1 (Preferred Generic); Tier 2 (Generic); Tier 3 (Preferred Brand) Insulin; Tier 3 (Preferred Brand) Other Drugs; Tier 4 (Non-Preferred Drug); Tier 5 (Specialty Tier) | Preferred generic drugs; Preferred brand drugs; Specialty drugs | Tier 1 - Your Lowest- Cost Option; Tier 2 - Your Midrange-Cost Option; Tier 3 - Your Midrange-Cost Option; Tier 4 - Additional High-Cost Options | Generic drugs (Tier 1); Preferred brand drugs (Tier 2); Non-preferred brand drugs (Tier 3) | Tier 1: Preferred Generic; Tier 2: Generic; Tier 3: Preferred Brand; Tier 4: Non-Preferred Drug; Tier 5: Specialty Tier | Generic drugs (Tier 1); Preferred brand drugs (Tier 2); Non-preferred brand drugs (Tier 3); Specialty drugs (Tier 4) | Generic drugs (Tier 1); Preferred brand drugs (Tier 2); Non-preferred brand drugs (Tier 2); Specialty drugs (Tier 4) |
| drug_class | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example |
| tier_code | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example |
Pharmacy Networks
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| network_id | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example |
| name | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example |
| network_type | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example |
| default_day_supply | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example | not in example |
Coverage Stages
| Normalized Field | Blue Cross | GatorCare | SCAN | Aetna | UHC | Cigna | Humana | Ambetter | Kaiser |
|---|---|---|---|---|---|---|---|---|---|
| stage_id | not in example | not in example | DEDUCTIBLE; INITIAL; CATASTROPHIC | not in example | not in example | not in example | DEDUCTIBLE; INITIAL; CATASTROPHIC | not in example | not in example |
| name | not in example | not in example | Part D Deductible; Initial Coverage Stage; Catastrophic Coverage Stage | not in example | not in example | not in example | DEDUCTIBLE; INITIAL COVERAGE; CATASTROPHIC COVERAGE | not in example | not in example |
| stage_type | not in example | not in example | deductible; initial; catastrophic | not in example | not in example | not in example | deductible; initial; catastrophic | not in example | not in example |
Pharmacy Tier Codes
| drug_class | tier_code (FHIR DrugTierVS) |
|---|---|
| preferred_generic | preferred-generic |
| generic | generic |
| preferred_brand | preferred-brand |
| nonpreferred_brand | non-preferred-brand |
| preferred_specialty | specialty |
| nonpreferred_specialty | specialty |
| preventive | zero-cost-share-preventive |
Each carrier column is read from that carrier's example file in the schema repo's examples/ directory. The Aetna column uses aetna_example.json, one of the two Aetna examples.
Purpose
Carriers do not use consistent terminology.
For example:
One carrier may label a row “Office Visit - Primary Care (PCP)”,
while another writes “Primary Care Provider: You pay $25”,
and another uses “PCP Copay per encounter”.Deductible applicability might be written as:
- “After deductible”
- “Subject to deductible”
- “Copay does not apply to deductible”
- “Ded waived”
- Combined expressions such as “$25 copay + 20% coinsurance after deductible”
Without a standardized crosswalk, ingestion pipelines must be hand-tuned for every carrier.
The crosswalk solves this by documenting, for each normalized field:
- How each carrier expresses the value
- Semantics that must be preserved
- Parsing notes and exceptions
- Mappings into the normalized JSON structure
Structure of the Crosswalk
The crosswalk contains multiple tabs, including:
Plan Metadata
Maps identifiers such as:
plan_idcarrierplan_typemarket
Network Tiers
Mappings for:
- In-network / out-of-network naming
- Tier structures
- Carrier-specific vocabulary
Accumulators
How each carrier expresses:
individual_deductiblefamily_deductibleindividual_oop_maxfamily_oop_maxoon_individual_deductible(v1.1.0)oon_family_deductible(v1.1.0)oon_individual_oop_max(v1.1.0)oon_family_oop_max(v1.1.0)
Benefits
Mappings for:
- categories
- service names
- copays
- coinsurance expressions
- deductible applicability
Limits
Mappings for:
- visit/day limits
- period definitions (annual, per stay, lifetime, etc.)
In the matrix, the Limits cells describe how each source document lays out its limits. Among the ten examples, the two Summary of Benefits files carry structured limits[] (on 17 benefits for Humana and 18 for SCAN), one SBC file (bluecross_example.json) carries a single visit limit, and the other seven carry none.
Conditions
Mappings for:
- prior authorization
- referral requirements
- contextual notes
In the matrix, the Conditions cells describe how each source document lays out its conditions. Among the ten examples, only the two Summary of Benefits files carry structured conditions[].
Source Reference
Extracts and page references used for ingestion traceability.
Pharmacy Module (draft v0.2.0)
The pharmacy crosswalk tabs render the BPS pharmacy module, a draft module whose shapes the core v1.2.0 draft carries since draft 6. The module schemas are served at their $id addresses, https://benefitplanstandard.org/modules/pharmacy/v0.2.0/pharmacy.schema.json and https://benefitplanstandard.org/modules/pharmacy/v0.2.1/pharmacy.schema.json. Like the medical tabs, the pharmacy tabs are sourced from a versioned repo file (docs/specification/pharmacy-crosswalk-data.json), and each carrier column is read from that carrier's example file in the schema repo's examples/ directory. Pharmacy Tiers shows the drug tier labels each example file records. Coverage Stages is filled only for Humana and SCAN, the two Summary of Benefits examples, because only they carry pharmacy.coverage_stages. A cell that reads "not in example" is a value the example file does not carry.
The pharmacy module adds crosswalk coverage for the pharmacy concepts that appear in carrier SBCs/EOCs. Because the crosswalk is a carrier-SBC-vocabulary map, only those concepts get carrier-matrix tabs:
- Pharmacy Tiers: formulary tier structure (
tier_id,name,drug_class,tier_code). Maps how each carrier labels its drug tiers (e.g., Tier 1 Preferred Generic … Tier 5 Specialty). - Pharmacy Networks: pharmacy network structure (
network_id,name,network_type,default_day_supply). Distinct from the medical Network Tiers tab; covers preferred retail / standard retail / mail order / specialty pharmacy. - Coverage Stages: Medicare Part D coverage phases (
stage_id,name,stage_type). Post-2025 (IRA redesign): Deductible / Initial Coverage / Catastrophic Coverage. (The pre-2025 Coverage Gap is retained only for historical plan years.) - Pharmacy Tier Codes: a reference table (not a carrier matrix) mapping the module's
drug_classvalues to the canonical FHIR DrugTierVStier_code(e.g.,preferred_brand→preferred-brand,preferred_specialty→specialty,preventive→zero-cost-share-preventive).
Not in the crosswalk: the module's drug-level formulary data: individual drugs (rxcui, drug_name, ndc), utilization-management flags, and indication-dependent coverage_exceptions[]. That data comes from formulary files (CMS QHP / Medicare Part D / FHIR DaVinci US Drug Formulary), not from SBCs/EOCs, so it is documented in the module schema as a field reference rather than mapped here as carrier vocabulary.
Using the Crosswalk
When integrating a new carrier:
1. Identify each benefit entry
Locate the carrier’s terms in the crosswalk (or add them when necessary).
2. Map each value to the normalized field
Examples:
Copay differences
- Blue Cross: “$25 per visit”
- SCAN: “$0 copay, coinsurance does not apply”
These map tobenefits[].cost_shares.copay.
Deductible expressions
- GatorCare lists medical and pharmacy separately
- Aetna merges them
The crosswalk clarifies how to populateindividual_deductible,family_deductible, and related fields.
3. Capture exceptions and conditions
Ambiguous phrasing such as:
- “after facility fee”
- “per admission deductible”
- “ded waived for virtual visits”
should be documented in the crosswalk’s notes column.
4. Extend when necessary
If a carrier introduces:
- new cost-share terminology
- split benefit categories
- multi-tier networks
add a row or column to the versioned crosswalk data files in docs/specification/ and update the ingestion rules accordingly.
Updating the Crosswalk
The versioned repo data files (docs/specification/medical-crosswalk-data.json and docs/specification/pharmacy-crosswalk-data.json) are the canonical source of truth for carrier mappings; changes ship as normal pull requests. The original Google Sheet is retained as a historical reference and is no longer load-bearing.
Updates follow these principles:
- Accuracy first: No changes without verification against the SBC/EOC.
- Non-breaking additions: New carriers and vocabulary should not break prior mappings.
- Schema alignment: Crosswalk rows correspond exactly to the normalized fields.
For contributors assisting with ingestion logic or analysis, changes are proposed as pull requests against the data files.
Summary
The Carrier Crosswalk is essential for:
- Translating carrier-specific formats into a unified schema
- Ensuring ingestion is deterministic and predictable
- Maintaining consistency across carriers
- Supporting extension as new carriers and plan types are analyzed
The matrix is regenerated from the data files on every site build. The schemas it maps to are served at their $id addresses, for example https://benefitplanstandard.org/schema/v1.2.0/benefit-plan.schema.json.