Back to Guides
Provider Management
45,000+ monthly searches

Provider Credentialing Guide

Complete guide to provider credentialing and enrollment systems. Learn CAQH integration, primary source verification, payer enrollment, and re-credentialing workflows.

Credentialing Process Timeline

1-2 weeks

Application

Provider completes credentialing application and CAQH profile

2-3 weeks

Data Collection

Gather supporting documents (licenses, certifications, CV, references)

4-8 weeks

Primary Source Verification

Verify credentials directly with issuing organizations

2-4 weeks

Review & Evaluation

Credentials committee reviews application and verifications

1-2 weeks

Committee Approval

Medical executive committee or board approval

4-6 weeks

Payer Enrollment

Submit provider to insurance payers for network participation

1 week

Final Approval

Provider receives participation agreements and effective dates

Total Timeline: 90-120 days (3-4 months)
Delays commonly occur from incomplete applications, expired documents, or unresponsive references.

Credentialing Database Schema

-- Provider Credentialing
CREATE TABLE provider_credential (
  id                    UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  provider_id           UUID NOT NULL,
  
  -- Identifiers
  npi                   VARCHAR(10) UNIQUE,
  caqh_id               VARCHAR(50),
  
  -- Demographics
  first_name            VARCHAR(100),
  middle_name           VARCHAR(100),
  last_name             VARCHAR(100),
  date_of_birth         DATE,
  ssn_last_4            VARCHAR(4),
  
  -- Credentialing Status
  status                VARCHAR(50),              -- pending, approved, denied, expired
  application_date      DATE,
  approval_date         DATE,
  expiration_date       DATE,
  
  -- Re-credentialing
  next_recredential_date DATE,
  last_recredential_date DATE,
  
  created_at            TIMESTAMP DEFAULT NOW(),
  updated_at            TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_cred_provider ON provider_credential(provider_id);
CREATE INDEX idx_cred_npi ON provider_credential(npi);
CREATE INDEX idx_cred_status ON provider_credential(status);

-- Education & Training
CREATE TABLE provider_education (
  id                    UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  credential_id         UUID NOT NULL REFERENCES provider_credential(id),
  
  -- Education
  degree_type           VARCHAR(50),              -- MD, DO, PA, NP
  school_name           VARCHAR(255),
  graduation_date       DATE,
  
  -- Verification
  verified              BOOLEAN DEFAULT FALSE,
  verification_date     DATE,
  verification_method   VARCHAR(100),
  verified_by           UUID,
  
  created_at            TIMESTAMP DEFAULT NOW()
);

-- Licenses
CREATE TABLE provider_license (
  id                    UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  credential_id         UUID NOT NULL REFERENCES provider_credential(id),
  
  -- License Details
  license_type          VARCHAR(100),             -- medical, DEA, state_controlled
  license_number        VARCHAR(100),
  issuing_state         VARCHAR(2),
  issuing_authority     VARCHAR(255),
  
  -- Dates
  issue_date            DATE,
  expiration_date       DATE NOT NULL,
  
  -- Verification
  verified              BOOLEAN DEFAULT FALSE,
  verification_date     DATE,
  verification_source   VARCHAR(255),             -- State medical board
  
  -- Status
  status                VARCHAR(50),              -- active, expired, suspended, revoked
  restrictions          TEXT,
  
  created_at            TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_license_cred ON provider_license(credential_id);
CREATE INDEX idx_license_exp ON provider_license(expiration_date);

-- Board Certifications
CREATE TABLE board_certification (
  id                    UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  credential_id         UUID NOT NULL REFERENCES provider_credential(id),
  
  -- Certification Details
  specialty             VARCHAR(255),
  board_name            VARCHAR(255),
  certification_number  VARCHAR(100),
  
  -- Dates
  initial_cert_date     DATE,
  expiration_date       DATE,
  recertification_date  DATE,
  
  -- Verification
  verified              BOOLEAN DEFAULT FALSE,
  verification_date     DATE,
  
  -- Status
  status                VARCHAR(50),              -- active, expired, revoked
  
  created_at            TIMESTAMP DEFAULT NOW()
);

-- Work History
CREATE TABLE provider_work_history (
  id                    UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  credential_id         UUID NOT NULL REFERENCES provider_credential(id),
  
  -- Employment
  employer_name         VARCHAR(255),
  position_title        VARCHAR(255),
  department            VARCHAR(255),
  
  -- Dates
  start_date            DATE,
  end_date              DATE,
  
  -- Contact
  supervisor_name       VARCHAR(255),
  supervisor_phone      VARCHAR(20),
  
  -- Verification
  verified              BOOLEAN DEFAULT FALSE,
  verification_date     DATE,
  verification_notes    TEXT,
  
  created_at            TIMESTAMP DEFAULT NOW()
);

-- Malpractice Insurance
CREATE TABLE malpractice_insurance (
  id                    UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  credential_id         UUID NOT NULL REFERENCES provider_credential(id),
  
  -- Policy Details
  carrier_name          VARCHAR(255),
  policy_number         VARCHAR(100),
  
  -- Coverage
  coverage_amount       DECIMAL(15,2),
  per_occurrence        DECIMAL(15,2),
  aggregate             DECIMAL(15,2),
  
  -- Dates
  effective_date        DATE,
  expiration_date       DATE,
  
  -- Verification
  verified              BOOLEAN DEFAULT FALSE,
  certificate_received  BOOLEAN DEFAULT FALSE,
  
  created_at            TIMESTAMP DEFAULT NOW()
);

-- Payer Enrollment
CREATE TABLE payer_enrollment (
  id                    UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  credential_id         UUID NOT NULL REFERENCES provider_credential(id),
  payer_id              UUID NOT NULL,
  
  -- Enrollment
  application_date      DATE,
  enrollment_date       DATE,
  effective_date        DATE,
  termination_date      DATE,
  
  -- IDs
  payer_provider_id     VARCHAR(100),
  
  -- Status
  status                VARCHAR(50),              -- pending, active, denied, terminated
  denial_reason         TEXT,
  
  -- Re-enrollment
  next_review_date      DATE,
  
  created_at            TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_enrollment_cred ON payer_enrollment(credential_id);
CREATE INDEX idx_enrollment_payer ON payer_enrollment(payer_id);

Primary Source Verification Checklist

Education & Training

  • Medical school degree verified with school
  • Residency completion verified with program
  • Fellowship training (if applicable)

Licenses & Certifications

  • State medical license with board
  • DEA registration with DEA
  • Board certification with specialty board

Professional History

  • Work history gaps explained
  • Peer references contacted (3 minimum)
  • Hospital privileges verified

Sanctions & Claims

  • NPDB query (malpractice, sanctions)
  • OIG/SAM exclusion check
  • Malpractice insurance current

SQL Query Examples

Find Expiring Licenses (Next 60 Days)

SELECT 
  pc.first_name || ' ' || pc.last_name as provider_name,
  pc.npi,
  pl.license_type,
  pl.license_number,
  pl.issuing_state,
  pl.expiration_date,
  pl.expiration_date - CURRENT_DATE as days_until_expiration
FROM provider_credential pc
JOIN provider_license pl ON pc.id = pl.credential_id
WHERE pl.status = 'active'
  AND pl.expiration_date BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL '60 days'
ORDER BY pl.expiration_date;

Providers Due for Re-credentialing

SELECT 
  pc.first_name || ' ' || pc.last_name as provider_name,
  pc.npi,
  pc.last_recredential_date,
  pc.next_recredential_date,
  pc.next_recredential_date - CURRENT_DATE as days_until_due
FROM provider_credential pc
WHERE pc.status = 'approved'
  AND pc.next_recredential_date <= CURRENT_DATE + INTERVAL '90 days'
ORDER BY pc.next_recredential_date;

CAQH Integration

CAQH ProView Database

CAQH ProView is the industry-standard universal credentialing platform. Providers maintain a single profile that payers can access, eliminating redundant data entry.

Key Benefits:
  • One profile used by 1,300+ health plans and hospitals
  • Automated primary source verification for some data
  • Electronic data exchange reduces processing time
  • Provider self-service portal for updates
Requirements:
  • Providers must attest to accuracy every 120 days
  • Organizations must be CAQH participants to access data
  • API integration available for automated data pulls

Related Healthcare Guides