← Methods repository
CONCEPTFOUNDATIONALPYTHON · R5 citations

Place of Service (POS) Codes

A CMS-maintained two-digit code set placed on the service-line level of professional (CMS-1500 / 837P) claims to indicate the physical or virtual setting where a service was furnished, enabling site-of-care classification, telehealth identification, and setting-shift studies in real-world evidence research.

Data Standardcoding-systemdata-standardprimitiveclaimsprofessionalsettingplace-of-servicepos-codes
On this page
Methods reference only. Use primary source citations and local policy before applying this in a study protocol, regulatory submission, payer dossier, or clinical decision.
In plain language

A Place of Service (POS) code is a two-digit code that goes on the billing form when a doctor or other provider submits a claim for payment, and it tells the insurer where the service actually happened — for example, code 11 means the patient was seen in a physician's office, code 23 means an emergency room, and codes 02 and 10 indicate a telehealth visit. These codes only appear on the professional claim (the physician's bill), not on the facility's hospital bill, so they give analysts a direct way to classify the care setting for doctor visits but they cannot be used to classify hospital stays by themselves. One important catch: in 2022 Medicare split a single telehealth code into two, so any study comparing telehealth rates before and after 2022 needs to look for both codes or it will undercount telehealth in recent years.

When to use it
Use POS for setting classification on professional claims; use ICD-10-CM for condition classification across both claim types.
Always use POS + CPT jointly for setting-and-procedure classification on professional claims.
Use POS + J-code together to classify infusion site of care in chemotherapy and biologic infusion studies.
Watch out for
POS codes are confined to the professional claim stream and reflect billing designations, not verified clinical locations. ICD-10-CM codes apply to both professional and institutional claims, giving broader...
CPT alone can sometimes proxy setting (e.g., OR-specific CPT codes imply inpatient or ASC settings), but this is less reliable than POS and does not distinguish office from hospital outpatient for E/M services.
POS and J-codes are both line-level fields and are read from the same professional claim service line, so there is no methodological conflict — they are joint attributes of the same event.

Place of Service (POS) codes

are a standardized two-digit code set administered by the Centers for Medicare & Medicaid Services (CMS) and placed in field 24B of the CMS-1500 paper form (loop 2300/2400 of the 837P electronic transaction) on every professional claim service line. A professional claim covers physician services, outpatient evaluations, procedures, and other non-facility encounters billed by a rendering provider — as opposed to the UB-04 / 837I institutional claim filed by the facility itself. Because the institutional claim has no POS field (setting is instead conveyed via the Type of Bill and revenue center codes), POS codes apply exclusively to the professional claim stream. This asymmetry is the single most important structural fact for any analyst constructing a setting classifier from claims data.

What POS codes encode

Each two-digit code maps to a defined care setting. The most analytically consequential codes for RWE research are:

  • 11 — Office: A physician's office or independent clinic not attached to a hospital outpatient department. This is the plurality of professional claims and the default comparator in site-of-care and site-neutrality studies. When paired with the CPT E/M code, POS 11 identifies an office visit; when paired with a drug administration code (J-code or CPT 96xxx), it identifies a physician-office infusion — the key contrast in chemotherapy site-of-care research.
  • 19 — Off-Campus Outpatient Hospital vs. 22 — On-Campus Outpatient Hospital: The 2016 Bipartisan Budget Act introduced site-neutrality provisions that created the billing distinction between off-campus (POS 19) and on-campus (POS 22) hospital outpatient departments. Before 2016, both were billed as POS 22. Studies of Medicare payment reform and provider-based billing must handle the pre/post-2016 transition in order to construct a consistent outpatient-hospital indicator.
  • 21 — Inpatient Hospital: A physician billing for a service furnished to a patient admitted as an inpatient. POS 21 on a professional claim does not represent the hospital stay itself — that is the facility claim. It means a physician (e.g., hospitalist, consultant, surgeon) saw the inpatient and billed a professional charge. This distinction matters for cost studies: the two claims must be linked to reconstruct the full encounter cost.
  • 23 — Emergency Room – Hospital: An emergency department visit billed by the physician (emergency medicine group). Used in conjunction with ED evaluation and management CPT codes (99281–99285, 99291) to identify ED encounters on the professional claim side; must be reconciled with the facility claim (Type of Bill 013x) for a complete ED encounter record.
  • 24 — Ambulatory Surgical Center (ASC): Services furnished in a free-standing surgery center. Relevant for procedure-setting studies and for identifying whether a surgery occurred in a hospital (POS 22) vs. ASC (POS 24) context — a distinction with large cost implications under Medicare.
  • 31 — Skilled Nursing Facility (SNF): Professional services furnished to SNF residents. Important for post-acute care research and distinguishing facility-based care from community-dwelling follow-up.
  • 12 — Home: Services furnished in the patient's private residence. Used to identify home health visits billed by physicians and for certain remote monitoring encounters.
  • 02 — Telehealth Provided Other Than in Patient's Home vs. 10 — Telehealth in Patient's Home: The 2022 split is the most consequential recent POS change for RWE researchers. Before January 1, 2022, all Medicare-covered telehealth services were billed with POS 02. Beginning in 2022, CMS required that POS 10 be used when the patient was located in their own home at the time of the telehealth visit, while POS 02 was retained for telehealth provided at other sites (e.g., a health care facility serving as the patient's originating site). Any study analyzing telehealth trends across a window that spans 2021–2022 must include both codes and apply the correct date-conditional logic: before 2022, POS 02 captures all telehealth; from 2022 forward, POS 02 + POS 10 together capture the universe of telehealth-billed professional claims.
  • 81 — Independent Laboratory: Professional claims for services furnished in a free-standing laboratory. Useful for distinguishing outpatient lab draws from in-office or hospital-based testing.

Core conceptual distinction — setting vs. billing rule

POS reflects the setting as designated for billing purposes, not always the physical location of service delivery. Provider-based billing rules allow a physician practice acquired by or affiliated with a hospital to bill its professional claims at hospital POS codes (19 or 22) even if the physician continues to see patients in what looks externally like an independent office. The patient may receive identical care from the same physician in the same exam room before and after the hospital acquisition, yet the POS on the professional claim shifts from 11 to 22, producing a facility fee from the hospital and a higher Medicare payment rate. This is the central pitfall of POS-based site-of-care research: an apparent shift from office (POS 11) to hospital outpatient (POS 22) in a claims trend study may reflect a change in billing affiliation rather than any change in where or how care is actually delivered.

Pros, cons, and trade-offs — specific and comparative

  • vs. UB-04 type of bill + revenue center codes for setting classification: The UB-04 / institutional claim carries no POS field; setting is instead encoded in the Type of Bill (three-digit code where the first digit is the facility type and the second is the care type, e.g., 011x = inpatient hospital, 013x = outpatient hospital) and in the revenue center code at the service-line level (e.g., 045x = emergency room, 0636 = pharmacy). For site-of-care research that spans both the professional and institutional streams — as almost all complete encounter-level studies do — the analyst must join POS from the professional claim to the institutional claim's type-of-bill and revenue codes to reconstruct the full setting picture. Failing to do this linkage means attributing the setting entirely from one stream and missing the cross-stream inconsistencies that require reconciliation rules. Prefer POS for the physician setting; use type of bill + revenue codes for the facility setting; link them for complete encounter cost and setting reconstruction.
  • vs. taxonomy of place codes in EHR or registry data: EHR records may carry a place-of-service concept but it is typically an internal facility designation that does not map directly to CMS POS codes without a deliberate crosswalk. Registry data usually lacks a granular setting field entirely. Claims POS codes are therefore the most systematic source of setting information in a US administrative data study, as long as the institutional / professional claim asymmetry is respected. Prefer POS for multi-provider setting classification in claims; rely on EHR internal codes only when the question is confined to a single health system whose internal codes are validated against the CMS set.
  • Granularity vs. coding-practice noise: POS 11 (office) is clear when the provider is independently operating. POS 19 and 22 (off-campus and on-campus outpatient hospital) are contaminated by the pre-2016 vs. post-2016 coding change, by cross-payer differences (commercial payers may not require the 19/22 split in the same way Medicare does), and by provider-based billing that makes "office" and "outpatient hospital" indistinguishable from true care-delivery changes. Sensitivity analyses by pre/post-2016 and by payer type are standard in any study using POS 19/22.
  • Telehealth POS completeness: Before the March 2020 COVID-19 emergency declaration, Medicare telehealth was tightly restricted (specific rural originating sites required, narrow list of allowed services). Commercial payers used POS 02 inconsistently. Post-emergency, the POS 02/10 universe expanded dramatically. Any claims database that spans the pre-2020 and post-2020 periods will have a structural break in POS 02/10 prevalence that reflects regulatory expansion, not underlying utilization change.

When NOT to use — and when POS-based classification is actively misleading or dangerous

  • On institutional claims. UB-04 / 837I records do not carry a POS field. Applying POS logic to institutional claims is undefined. Always route setting classification to the correct claim type before applying code logic.
  • As a sole indicator of physical care location in provider-based billing scenarios. A change in POS from 11 to 22 following a hospital acquisition may reflect only the billing relationship, not a change in the patient's physical location or the care delivered. For studies of actual care-setting migration (e.g., "did patients shift to hospital-based care?"), supplement POS with provider taxonomy codes, NPI-level affiliation data, or enrollment records to distinguish billing changes from true site shifts.
  • When POS disagrees with the facility claim setting. A professional claim with POS 21 (inpatient) may be filed for the same date of service as a facility claim showing an outpatient status — this is a real coding inconsistency that arises from observation status disputes, two-midnight rule decisions, and late billing. Use the facility claim's admission status as the authoritative record for inpatient/outpatient designation; treat POS 21 professional claims as requiring verification against the MedPAR or UB-04 before assuming the patient was a true inpatient.
  • Without date-conditional telehealth logic spanning 2022. Using POS 02 alone as a telehealth flag in data that includes 2022 onward will undercount telehealth by missing POS 10 (in-home telehealth). Write the flag as POS IN (02, 10) and apply the date awareness described above.
  • Across payers without verifying payer-specific coding conventions. Commercial payers do not always enforce the same POS code granularity as Medicare. POS 19 (off-campus outpatient) may be entirely absent in some commercial datasets. Validate POS distributions against expected frequencies before building a cross-payer site-of-care classifier.
  • When the code set version is not pinned. CMS adds, retires, and redefines POS codes over time. A study spanning many years should document which code set version was current for each calendar year in the study window, particularly for codes that were newly introduced or redefined (19/22 split in 2016; 02/10 split in 2022). Using a single static code list on longitudinal data introduces measurement error that can be mistaken for trend.

Data-source operational depth

  • Medicare FFS carrier / physician claims: POS is consistently populated and is the most reliable source for POS-based classification. However, Medicare applies coverage rules that make POS 02/10 appear only when the service is a CMS-approved telehealth service. Off-label use of POS 02 for a non-covered telehealth service would be denied and would not appear in paid claims, so the Medicare carrier file captures telehealth that was actually reimbursed — a selection filter, not a complete census of all telehealth encounters. For MA beneficiaries, POS may be less consistently submitted in encounter data; restrict to FFS when POS completeness is required.
  • Commercial claims (e.g., IBM MarketScan, Optum Clinformatics): POS is present but payer-specific coding conventions mean that POS 19 (off-campus outpatient) may be underreported in some payer streams, and the telehealth POS usage will reflect the payer's own coverage policies during and after the PHE. Validate POS frequency distributions before building a cross-payer classifier. The date of the POS 19/22 split may also lag for commercial payers relative to the 2016 Medicare effective date.
  • Medicaid claims (T-MACS / MAX / TAF): POS is present in professional claims but coding quality varies by state and by managed care organization versus fee-for-service. States that route Medicaid services through capitated MCOs may have encounter data with variable POS completeness. Use POS for Medicaid professional claims only after verifying completeness for the specific state/year.

POS in the context of a complete encounter

A single visit to a hospital-based outpatient oncology clinic may generate two claims: an institutional (UB-04) claim from the hospital for the facility fee, coded with Type of Bill 0131 (hospital outpatient) and revenue codes 036x (medical / surgical supplies) and 0260 (IV therapy); and a professional (CMS-1500) claim from the oncologist for the physician fee, with POS 22 (on-campus outpatient hospital) and J-codes for the drug administered. The professional claim's POS 22 confirms the setting; the institutional claim's Type of Bill and revenue codes provide the facility cost components. Neither claim alone gives the full picture. This two-claim structure is why site-of-care cost analyses in oncology and infusion therapy must aggregate claims from both streams and why a POS-only analysis underestimates the true site differential by omitting the facility payment.

Decision diagram

flowchart TD
  PRO["Professional Claim<br/>(CMS-1500 / 837P)"]
  INST["Institutional Claim<br/>(UB-04 / 837I)"]

  PRO -->|"Field 24B:<br/>POS code"| POS["POS Code<br/>(2-digit, line level)"]
  INST -->|"No POS field"| TOB["Type of Bill +<br/>Revenue Center Code"]

  POS --> OFF["11 = Office"]
  POS --> HOSP["19/22 = Outpatient Hospital<br/>(split introduced 2016)"]
  POS --> INP["21 = Inpatient<br/>(physician bill only)"]
  POS --> ED["23 = Emergency Room"]
  POS --> ASC["24 = ASC"]
  POS --> TH["02 = Telehealth (other)<br/>10 = Telehealth (home)<br/>(10 introduced 2022)"]

  HOSP -->|"Same patient, same exam room<br/>different billing affiliation"| WARN["⚠ Provider-based<br/>billing: POS shift<br/>≠ care-location shift"]
  TH -->|"Pre-2022: POS 02 only<br/>Post-2022: POS 02 + 10"| DATE["Date-conditional<br/>telehealth flag required"]
POS codes live on the professional claim service line (CMS-1500 field 24B) and have no equivalent on the institutional claim (UB-04). The 2016 POS 19/22 split and the 2022 POS 02/10 telehealth split are the two most consequential code-set changes for RWE research.

Worked example

Scenario

A health economist studying telehealth adoption and care-setting mix pulls one week of professional claims for a small hypothetical panel of eight patients seen on the same day at five different locations. She wants to classify each service line into one of four analytic buckets — Office, Outpatient Hospital, Emergency Department, or Telehealth — using the POS code, and then count how many service lines fall into each bucket. The table below shows the eight service lines exactly as they would appear in the raw claims data.

Dataset

Eight professional claim service lines for one study day: person_id, service date, pos_code, pos_description, and the CPT code billed.

person_idsvc_datepos_codepos_descriptioncpt_code
10012023-06-0111Office99213
10022023-06-0122On-Campus Outpatient Hospital99214
10032023-06-0123Emergency Room – Hospital99283
10042023-06-012Telehealth Other Than Patient Home99213
10052023-06-0110Telehealth in Patient Home99214
10062023-06-0111Office99215
10072023-06-0119Off-Campus Outpatient Hospital99213
10082023-06-0121Inpatient Hospital99232

Steps

1Classify each service line into an analytic bucket using the POS code. Office bucket: POS IN (11) -> persons 1001, 1006 = 2 lines. Outpatient Hospital bucket: POS IN (19, 22) -> persons 1002, 1007 = 2 lines. Emergency Department bucket: POS IN (23) -> person 1003 = 1 line. Telehealth bucket: POS IN (02, 10) -> persons 1004, 1005 = 2 lines. Inpatient physician visit (separate bucket, not outpatient): POS IN (21) -> person 1008 = 1 line.
2Note that person 1008 (POS 21, inpatient hospital) is classified as a physician billing for an admitted patient, not an outpatient encounter. This line should be linked to the MedPAR / facility claim to confirm inpatient status before including in an outpatient utilization analysis.
3Bucket counts: Office = 2, Outpatient Hospital = 2, ED = 1, Telehealth = 2, Inpatient physician = 1. Total lines = 2 + 2 + 1 + 2 + 1 = 8.
4Setting share for the four outpatient categories (excluding the inpatient physician line): Office = 2/7, Outpatient Hospital = 2/7, ED = 1/7, Telehealth = 2/7. expr = 2 + 2 + 1 + 2 = 7 outpatient lines.
5Telehealth share of all outpatient lines: 2/7 = 0.286. If the analyst had used only POS 02 (forgetting POS 10 introduced in 2022), she would have counted 1 telehealth line instead of 2, giving 1/7 = 0.143 — exactly half the correct rate. This illustrates the mandatory dual-code flag for post-2022 telehealth.

Result

Eight service lines classify into five buckets: Office=2, Outpatient Hospital=2, ED=1, Telehealth=2, Inpatient physician=1. Total = 2+2+1+2+1 = 8. Telehealth share of the 7 outpatient-eligible lines = 2/7 = 0.286 (28.6%). Using POS 02 alone would yield 1/7 = 0.143 (14.3%) — a 50% undercount of telehealth for post-2022 data.

Trade-offs

Pros of this
POS codes directly encode setting rather than requiring setting inference from place-of-service proxies embedded in diagnosis codes. A POS 23 unambiguously identifies an ED-billed professional claim; a diagnosis code alone cannot.
Pros of this
POS codes encode the setting; CPT codes encode what was done. They are complementary, not substitutes. POS 22 + J9271 (pembrolizumab) identifies a hospital-outpatient drug administration in a way that neither code alone can do.
Pros of this
POS identifies the care setting where the drug was administered. HCPCS J-codes identify the drug. For site-of-care infusion studies, both are required.

Runnable example

Builds a setting classifier for professional claims using POS codes, with date-conditional telehealth logic for the 2022 POS 02/10 split. Accepts a pandas DataFrame of professional claim service lines and returns a new column with the analytic setting bucket. Handles the pre-2016 vs.

requires: pandas
import pandas as pd
from datetime import date

# CMS POS code -> canonical analytic setting bucket.
# For telehealth, the correct mapping depends on date (POS 10 introduced 2022-01-01).
# For hospital outpatient, POS 19 (off-campus) and 22 (on-campus) are both hospital outpatient;
# POS 19 was introduced in 2016 — prior to that all hospital outpatient was billed as POS 22.

SETTING_MAP = {
    "11": "office",
    "19": "outpatient_hospital",      # off-campus, post-2016
    "22": "outpatient_hospital",      # on-campus (also used pre-2016 for all hosp outpatient)
    "21": "inpatient_physician",      # physician billing for admitted patient -- link to MedPAR
    "23": "emergency_department",
    "24": "ambulatory_surgical_center",
    "31": "skilled_nursing_facility",
    "12": "home",
    "81": "independent_laboratory",
    # telehealth: 02 always telehealth; 10 added 2022-01-01 for in-home
    "02": "telehealth",
    "10": "telehealth",               # only valid from 2022-01-01; treated as telehealth regardless
}

TELEHEALTH_CODES = {"02", "10"}
POS_10_EFFECTIVE = date(2022, 1, 1)


def classify_pos(df: pd.DataFrame,
                 pos_col: str = "pos_code",
                 svc_date_col: str = "svc_date") -> pd.Series:
    """
    Classify each professional claim service line into an analytic setting bucket.

    Parameters
    ----------
    df : pd.DataFrame
        Must contain columns for pos_code (str or int) and svc_date (date or str ISO).
    pos_col : str
        Column name holding the two-digit POS code (will be zero-padded to 2 chars).
    svc_date_col : str
        Column name holding the service date (converted to datetime.date internally).

    Returns
    -------
    pd.Series of str
        Analytic setting bucket for each row. Unmapped codes return "other".
    """
    pos = df[pos_col].astype(str).str.strip().str.zfill(2)
    svc_dt = pd.to_datetime(df[svc_date_col]).dt.date

    def _row_setting(p: str, svc: date) -> str:
        if p == "10" and svc < POS_10_EFFECTIVE:
            # POS 10 did not exist before 2022; treat as unmapped / data quality flag
            return "pos10_before_effective_date"
        return SETTING_MAP.get(p, "other")

    return pd.Series(
        [_row_setting(p, s) for p, s in zip(pos, svc_dt)],
        index=df.index,
        name="analytic_setting"
    )


# --- worked example ---
if __name__ == "__main__":
    lines = pd.DataFrame({
        "person_id": [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008],
        "svc_date":  ["2023-06-01"] * 8,
        "pos_code":  ["11", "22", "23", "02", "10", "11", "19", "21"],
        "cpt_code":  ["99213", "99214", "99283", "99213", "99214",
                      "99215", "99213", "99232"],
    })

    lines["analytic_setting"] = classify_pos(lines)
    print(lines[["person_id", "pos_code", "analytic_setting"]])

    # Telehealth flag: POS IN (02, 10) -- MUST include both for post-2022 data
    telehealth_flag = lines["pos_code"].astype(str).str.zfill(2).isin(TELEHEALTH_CODES)
    print(f"\nTelehealth lines (POS 02 or 10): {telehealth_flag.sum()}")

    # If analyst mistakenly used POS 02 only:
    pos02_only = lines["pos_code"].astype(str).str.zfill(2).isin({"02"})
    print(f"POS 02 only (undercount): {pos02_only.sum()}")

    # Distribution
    print("\nSetting distribution:")
    print(lines["analytic_setting"].value_counts())

Citations

FOUNDATIONAL / METHODS
  1. [1]Bedard JE. Place of Service Codes: Key to Compliant Billing. Oncology Issues. 2024;39(3):20-25.
  2. [2]Andino JJ, Bynum JPW, Ellimoottil C. Interstate Telehealth Use By Medicare Beneficiaries Before And After COVID-19 Licensure Changes. Health Affairs. 2022;41(4):495-502.
APPLIED EXAMPLES
  1. [3]Hopson S, Casebeer A, Haggstrom D, et al. Chemotherapy treatment patterns by site of care (SOC): A comparison of the physician office and hospital outpatient settings. Journal of Clinical Oncology. 2015;33(15 suppl):e17670.
REPORTING & GUIDANCE
  1. [4]Post B, Buchmueller TC, Couture SJ, et al. Site-Neutral Payment Reform: Little Impact On Outpatient Medicare Spending Or Hospital Revenue. Health Affairs. 2025;44(1):38-47.
  2. [5]Centers for Medicare & Medicaid Services. Place of Service Code Set. Baltimore, MD: CMS; updated annually. Available at: https://www.cms.gov/medicare/coding-billing/place-of-service-codes/code-sets