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
Application
Provider completes credentialing application and CAQH profile
Data Collection
Gather supporting documents (licenses, certifications, CV, references)
Primary Source Verification
Verify credentials directly with issuing organizations
Review & Evaluation
Credentials committee reviews application and verifications
Committee Approval
Medical executive committee or board approval
Payer Enrollment
Submit provider to insurance payers for network participation
Final Approval
Provider receives participation agreements and effective dates
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.
- 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
- Providers must attest to accuracy every 120 days
- Organizations must be CAQH participants to access data
- API integration available for automated data pulls