Back to Guides
Population Health

SDOH Data Guide

Social Determinants of Health drive 30–55% of outcomes yet are absent from most clinical databases. Learn how to collect, standardize, and analyze SDOH data using ICD-10 Z codes, FHIR, and proven screening tools.

The Five SDOH Domains

💰

Economic Stability

Employment, income, food security, housing stability, poverty

📚

Education Access & Quality

Literacy, early childhood education, enrollment, language access

👥

Social & Community Context

Social isolation, discrimination, incarceration, civic participation

🏥

Health Care Access & Quality

Insurance coverage, access to primary care, health literacy

🏘️

Neighborhood & Built Environment

Housing quality, transportation, environmental conditions, violence

ICD-10-CM Z Codes for SDOH

ICD-10-CM Chapter 21 (Z00–Z99) includes codes specifically for documenting social factors. These "Z codes" can be assigned as secondary diagnoses when they affect care planning.

ICD-10 CodeDescriptionSDOH Domain
Z59.0HomelessnessEconomic Stability
Z59.1Inadequate housingNeighborhood
Z59.4Lack of adequate foodEconomic Stability
Z59.5Extreme povertyEconomic Stability
Z56.0Unemployment, unspecifiedEconomic Stability
Z60.2Problems related to living aloneSocial Context
Z60.4Social exclusion and rejectionSocial Context
Z63.0Problems in relationship with spouse or partnerSocial Context
Z71.3Dietary counseling and surveillanceEducation
Z91.19Patient's noncompliance, other reasonHealth Care Access

SDOH Screening Tools

PRAPARE

Protocol for Responding to and Assessing Patients' Assets, Risks, and Experiences

NACHC
Items: 21
LOINC: 93025-5

Domains: Personal characteristics, family, money, neighborhood, resources

AHC-HRSN

Accountable Health Communities — Health-Related Social Needs Screening Tool

CMS
Items: 10
LOINC: 76513-1

Domains: Housing instability, food insecurity, transportation, utilities, interpersonal safety

WE CARE

Well-child Care visit, Evaluation, Community Resources, Advocacy, Referral, Education

Boston Medical Center
Items: 8
LOINC: Various

Domains: Food, housing, heat, employment, childcare, education

SDOH Database Schema

-- SDOH Screening Assessment
CREATE TABLE sdoh_assessment (
  id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  patient_id          UUID NOT NULL,
  encounter_id        UUID,

  -- Screening Instrument
  instrument_code     VARCHAR(50) NOT NULL,           -- PRAPARE, AHC-HRSN, WE-CARE
  instrument_loinc    VARCHAR(20),                    -- LOINC code for the panel
  assessment_dt       DATE NOT NULL,
  administered_by     VARCHAR(50),                    -- PROVIDER, STAFF, SELF, KIOSK

  -- Overall Status
  has_social_needs    BOOLEAN,                        -- Any need identified?
  needs_count         INTEGER DEFAULT 0,
  referral_made       BOOLEAN DEFAULT FALSE,

  created_at          TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_sdoh_patient ON sdoh_assessment(patient_id, assessment_dt);

-- Individual SDOH Need / Finding
CREATE TABLE sdoh_need (
  id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  assessment_id       UUID REFERENCES sdoh_assessment(id),
  patient_id          UUID NOT NULL,

  -- Classification
  sdoh_domain         VARCHAR(50) NOT NULL,           -- ECONOMIC, EDUCATION, SOCIAL, HEALTH_ACCESS, NEIGHBORHOOD
  need_category       VARCHAR(100) NOT NULL,          -- food_insecurity, housing_instability, transportation, etc.

  -- Coding
  icd10_z_code        VARCHAR(10),                    -- ICD-10-CM Z code
  loinc_code          VARCHAR(20),                    -- LOINC observation code
  snomed_code         BIGINT,                         -- SNOMED CT concept

  -- Screening Response
  question_text       TEXT,
  response_value      VARCHAR(50),                    -- Yes, No, Sometimes, Often
  need_identified     BOOLEAN NOT NULL DEFAULT FALSE,
  severity            VARCHAR(20),                    -- MILD, MODERATE, SEVERE

  -- Resolution
  status              VARCHAR(20) DEFAULT 'OPEN',     -- OPEN, REFERRED, RESOLVED, DECLINED
  resolved_dt         DATE,
  resolution_notes    TEXT,

  identified_dt       DATE NOT NULL
);

CREATE INDEX idx_sdoh_need_patient ON sdoh_need(patient_id, need_identified);
CREATE INDEX idx_sdoh_need_domain ON sdoh_need(sdoh_domain, need_identified);
CREATE INDEX idx_sdoh_need_icd10 ON sdoh_need(icd10_z_code);

-- SDOH Referral to Community Resource
CREATE TABLE sdoh_referral (
  id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  sdoh_need_id        UUID REFERENCES sdoh_need(id),
  patient_id          UUID NOT NULL,

  -- Community Resource
  organization_name   VARCHAR(255),
  resource_type       VARCHAR(100),                   -- Food bank, housing agency, transportation
  resource_phone      VARCHAR(20),
  resource_address    TEXT,

  -- Referral Details
  referral_dt         DATE NOT NULL,
  referral_channel    VARCHAR(50),                    -- PHONE, FAX, PLATFORM, SELF_REFERRAL

  -- Outcome Tracking
  accepted_dt         DATE,
  completed_dt        DATE,
  outcome             VARCHAR(50),                    -- ACCEPTED, DECLINED, NO_RESPONSE, COMPLETED
  outcome_notes       TEXT
);

CREATE INDEX idx_sdoh_ref_patient ON sdoh_referral(patient_id);
CREATE INDEX idx_sdoh_ref_need ON sdoh_referral(sdoh_need_id);

SQL Query Examples

SDOH Needs Prevalence by Domain

SELECT
  sdoh_domain,
  need_category,
  COUNT(DISTINCT patient_id)            AS patients_screened,
  SUM(CASE WHEN need_identified THEN 1 ELSE 0 END) AS needs_identified,
  ROUND(100.0 * SUM(CASE WHEN need_identified THEN 1 ELSE 0 END)
    / COUNT(DISTINCT patient_id), 1)    AS prevalence_pct,
  SUM(CASE WHEN status = 'REFERRED' THEN 1 ELSE 0 END) AS referred_count
FROM sdoh_need
WHERE identified_dt >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY sdoh_domain, need_category
ORDER BY needs_identified DESC;

High-Need Members with Open SDOH Gaps

SELECT
  sn.patient_id,
  COUNT(DISTINCT sn.sdoh_domain)         AS domain_count,
  STRING_AGG(DISTINCT sn.need_category, ', ')  AS open_needs,
  MAX(sa.assessment_dt)                  AS last_screened
FROM sdoh_need sn
JOIN sdoh_assessment sa ON sa.patient_id = sn.patient_id
WHERE sn.need_identified = TRUE
  AND sn.status = 'OPEN'
  AND sa.assessment_dt >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY sn.patient_id
HAVING COUNT(DISTINCT sn.sdoh_domain) >= 2        -- 2+ domains in need
ORDER BY domain_count DESC;

SDOH Implementation Best Practices

  • Use standardized screening tools: PRAPARE and AHC-HRSN map to LOINC and ICD-10 — standardization enables aggregation across populations and comparability with benchmarks
  • Code Z codes on claims: Documenting SDOH using ICD-10 Z codes on professional and facility claims creates a longitudinal record that survives outside your EHR
  • Close the loop on referrals: Track whether community resource referrals were accepted and completed — unresolved referrals indicate need for alternative approaches
  • Link SDOH to utilization: Join SDOH assessment data to claims to measure whether addressing social needs reduces ED visits and readmissions
  • Implement FHIR SDOH IG: Use the Gravity Project FHIR Implementation Guide for interoperable SDOH data exchange — especially important for care coordination across organizations
  • Protect patient privacy: SDOH data is sensitive — implement appropriate access controls, obtain patient consent for sharing, and consider de-identification for analytics

Frequently Asked Questions

What are Social Determinants of Health (SDOH)?

SDOH are the non-medical factors that influence health outcomes — the conditions in which people are born, grow, live, work, and age. They include economic stability, education, social and community context, health care access, and neighborhood/built environment. Research shows SDOH account for 30–55% of health outcomes.

How are SDOH documented in healthcare data?

SDOH are documented using ICD-10-CM Z codes (Chapter 21 — Factors influencing health status). Common codes include Z59.0 (homelessness), Z59.4 (lack of adequate food), Z56.0 (unemployment), and Z60.2 (problems related to living alone). Standardized screening tools like PRAPARE and AHC-HRSN capture SDOH systematically.

What is the PRAPARE screening tool?

PRAPARE (Protocol for Responding to and Assessing Patients' Assets, Risks, and Experiences) is a standardized SDOH screening tool developed by NACHC. It covers 21 items across five domains and maps directly to ICD-10-CM Z codes and LOINC codes. It's widely used in FQHCs and increasingly in hospitals.

How does FHIR support SDOH data?

The Gravity Project developed the FHIR SDOH Clinical Care Implementation Guide (IG), which provides standardized FHIR resources for SDOH screening, assessment, goals, and referrals. It uses FHIR Observation (for assessments), Condition (for documented needs), and ServiceRequest (for referrals to community resources).

Why is SDOH data important for value-based care?

SDOH data helps risk-stratify populations, explain variation in outcomes, and design targeted interventions. Payers and providers in value-based contracts are increasingly collecting SDOH data to address root causes of high utilization — food insecurity, housing instability, and transportation barriers often drive avoidable ED visits and readmissions.

Related Healthcare Guides