Skip to main content

Hospital RCM Integration

Guide for hospital Revenue Cycle Management (RCM) teams integrating Turquoise for front-desk authorization and guaranteed settlement.

Overview: A New RCM Paradigm

Turquoise fundamentally changes hospital cash flow and bad debt exposure:

Traditional RCMTurquoise RCM
Pre-service estimate from leased networkGuaranteed Direct Contract rate
Patient responsible for estimate verificationSystem verifies guarantee before service
30-45 day payment cycle (slow)48 hour settlement (Stripe)
Patient collection risk (bad debt)Plan sponsor guarantees payment
835 coordination (slow)Real-time webhooks (fast)
Contractual adjustments (reconciliation)Zero adjustments needed
DSO 40-50 daysDSO 2-3 days
info

Plan sponsors cover the Turquoise 0.5% settlement fee. Hospitals receive 100% of contracted gross amount, with zero patient collection risk.

Pre-Service Guarantee Flow

1. Front Desk Verification

When patient arrives for procedure:

# POST /patient-guarantees/verify
curl -X POST \
https://api.turquoise.health/tpa-api/v1/patient-guarantees/verify \
-H "X-API-Key: $HOSPITAL_API_KEY" \
-d '{
"member_id": "SHP00123456",
"plan_id": "SHARP-HMO-2024",
"provider_npi": "1234567890",
"procedure_code": "43235",
"facility_npi": "9876543210"
}'

Response:

{
"guarantee_id": "GUAR-20240310-001",
"status": "active",
"member_id": "SHP00123456",
"member_name": "John Doe",
"plan_name": "Sharp Health Plan",
"procedure_code": "43235",
"procedure_description": "Esophagogastroduodenoscopy",
"guaranteed_rate": 1200.00,
"member_responsibility": 100.00,
"hospital_receives": 1100.00,
"guarantee_expires": "2024-03-12T17:00:00Z",
"turquoise_confirms": "Plan sponsor guarantees payment if service provided by 5pm PT on Mar 12, 2024",
"ehr_integration_token": "token_abc123xyz"
}

Print the guarantee and give to patient. This is their pre-service EOB.

tip

Keep the guarantee_id and ehr_integration_token for later claim submission. This eliminates pricing disputes.

2. Service Delivery

Proceed with service. No pricing uncertainty.

3. Claim Submission

After service, submit FHIR claim with guarantee reference:

curl -X POST \
https://api.turquoise.health/tpa-api/v1/claims/submit \
-H "X-API-Key: $HOSPITAL_API_KEY" \
-H "Content-Type: application/fhir+json" \
-d '{
"resourceType": "Claim",
"id": "CLM-20240310-001",
"status": "active",
"type": { "coding": [{ "code": "institutional" }] },
"patient": { "identifier": { "value": "SHP00123456" } },
"provider": { "identifier": { "value": "1234567890" } },
"facility": { "identifier": { "value": "9876543210" } },
"insurer": { "identifier": { "value": "SHARP-HMO-2024" } },
"created": "2024-03-11T10:00:00Z",
"servicedDate": "2024-03-10",
"extension": [{
"url": "https://turquoise.health/guarantee-id",
"valueString": "GUAR-20240310-001"
}],
"item": [{
"sequence": 1,
"productOrService": { "coding": [{ "code": "43235" }] },
"servicedDate": "2024-03-10",
"unitPrice": { "value": 1200.00, "currency": "USD" },
"net": { "value": 1200.00, "currency": "USD" }
}]
}'

The claim references the pre-service guarantee, eliminating disputes.

Stripe-Based Settlement

How Settlement Works

Claim Submitted

Adjudicated by Turquoise

Plan sponsor approves (via TPA)

Stripe initiates ACH transfer

48 hours later: Money in your bank account

No invoice to plan. No EOB back-and-forth. Fully automated.

Settlement Flow Example

Event 1: Claim adjudicated

{
"event": "claim.adjudicated",
"claim_id": "CLM-20240310-001",
"claim_response_id": "CLMR-20240310-001",
"status": "approved",
"approved_amount": 1100.00,
"timestamp": "2024-03-11T10:30:00Z"
}

Event 2: Settlement initiated

{
"event": "settlement.initiated",
"settlement_id": "SETTLE-20240310-001",
"claim_response_id": "CLMR-20240310-001",
"provider_npi": "1234567890",
"amount": 1100.00,
"stripe_transfer_id": "tr_abc123xyz",
"expected_arrival": "2024-03-12T09:00:00Z"
}

Event 3: Settlement completed

{
"event": "settlement.completed",
"settlement_id": "SETTLE-20240310-001",
"stripe_transfer_id": "tr_abc123xyz",
"amount": 1100.00,
"arrived_at": "2024-03-12T09:45:00Z",
"bank_deposit_amount": 1100.00,
"stripe_trace_id": "trace_0311_abc123xyz"
}
info

Stripe transfers appear in your bank as "TURQUOISE HEALTH INC" with a reference code. The stripe_trace_id ties each deposit to the original claim.

Stripe-to-835 Translator

For hospitals with legacy RCM systems that expect EDI 835 EOBs, Turquoise provides automated translation:

Enabling 835 Generation

curl -X POST \
https://api.turquoise.health/tpa-api/v1/edi-config \
-H "X-API-Key: $HOSPITAL_API_KEY" \
-d '{
"edi_generation": true,
"edi_format": "835",
"edi_transmission": "sftp",
"sftp_endpoint": "sftp.yourhospital.com",
"sftp_path": "/incoming/edi/835",
"daily_transmission": true
}'

Turquoise automatically generates standard 835 EOBs and delivers them to your SFTP daily:

ST~835~001
BPR~C~1100.00~C~ACH~PPD~...
TRN~0~SETTLE-20240310-001~...
CLP~CLM-20240310-001~1~1100.00~1100.00~...
SVD~1234567890~SETTLE-20240310-001~1100.00~...

Your RCM system can ingest these 835s and post payments automatically.

Data Mapping Reference

Map Turquoise API fields to your hospital billing system:

Turquoise FieldTypeRCM EquivalentMapping
claim_idstringClaim NumberClaimInfo.ClaimNumber
member_idstringMember IDClaimInfo.PatientID
provider_npistringProvider NPIClaimInfo.ProviderID
facility_npistringFacility NPIClaimInfo.FacilityID
procedure_codestringCPT/HCPCSLineItem.ProcedureCode
billed_amountdecimalBilled ChargeLineItem.ChargeAmount
negotiated_ratedecimalAllowed AmountLineItem.AllowedAmount
settlement_idstringEOB NumberEOB.EOBNumber
stripe_trace_idstringReference IDEOB.ReferenceID
arrived_attimestampPayment DateEOB.PaymentDate

Python Mapping Example

def map_turquoise_to_rcm(settlement_record):
return {
'claim_number': settlement_record['claim_id'],
'patient_id': settlement_record['member_id'],
'provider_id': settlement_record['provider_npi'],
'facility_id': settlement_record['facility_npi'],
'cpt_code': settlement_record['procedure_code'],
'billed_charge': settlement_record['billed_amount'],
'allowed_amount': settlement_record['negotiated_rate'],
'eob_number': settlement_record['settlement_id'],
'reference_id': settlement_record['stripe_trace_id'],
'payment_date': settlement_record['arrived_at'],
'payment_method': 'ACH',
'payment_status': 'COMPLETED'
}

Net vs. Gross Reconciliation

Payment Composition

Negotiated Rate (Gross):        $1,200.00
├─ Plan sponsor receives: $1,000.00
├─ Deductible/copay: $100.00
└─ Turquoise fee (0.5%): $6.00

Hospital receives (Net): $1,100.00

Key point: Hospital always receives the full negotiated gross rate for contracted procedures. The 0.5% fee is paid by the plan sponsor, not deducted from the hospital payment.

Calculation in Your System

def calculate_payment(claim):
negotiated_rate = claim['negotiated_rate'] # $1,200

# Deductible/copay goes to patient collection
patient_responsibility = claim['member_responsibility'] # $100

# Hospital receives the difference (gross minus patient responsibility)
hospital_payment = negotiated_rate - patient_responsibility # $1,100

# Turquoise fee is paid by plan sponsor (not shown here)
turquoise_fee = negotiated_rate * 0.005 # $6 (paid by plan)

return hospital_payment
warning

Never double-count the Turquoise fee. It's deducted from plan sponsor reimbursement, not from hospital payment.

True-Up Handling: No More Contractual Adjustments

Traditional Approach (Problematic)

  1. Hospital bills $1,200 (billed charge)
  2. Plan pays $1,000 (allowed amount)
  3. Hospital records $200 write-off as "contractual adjustment"
  4. CFO asks: "Why are we losing $200 per procedure?"
  5. Manual true-up process (slow, error-prone)

Turquoise Approach (Simple)

  1. Hospital gets rate guarantee: $1,200
  2. Plan pays $1,200 through Turquoise (minus patient responsibility)
  3. Zero contractual adjustments
  4. No reconciliation needed

Rare Case: Rate Disagreement

If a rate discrepancy occurs (plan and hospital disagree on contract rate):

Webhook event:

{
"event": "adjustment.initiated",
"adjustment_id": "ADJ-20240311-001",
"settlement_id": "SETTLE-20240310-001",
"claim_id": "CLM-20240310-001",
"original_amount": 1100.00,
"disputed_amount": 50.00,
"reason": "contract_rate_discrepancy",
"action_required": "review",
"contact_support": "disputes@turquoise.health"
}

Turquoise works with the plan sponsor to resolve. This is rare (< 0.1% of claims).

When resolved, a true-up is processed automatically:

{
"event": "adjustment.completed",
"adjustment_id": "ADJ-20240311-001",
"adjustment_amount": 50.00,
"resolved_at": "2024-03-12T14:00:00Z"
}

Benefits Summary

Reduced Days Sales Outstanding (DSO)

MetricTraditionalTurquoiseImprovement
Payment cycle30-45 days48 hours95% faster
DSO40-50 days2-3 days90% reduction
Cash flow predictabilityUnpredictableGuaranteed
Bad debt write-off2-5% of revenue0%Eliminated

Zero Patient Collection Risk

No more "patient balance" tracking. Plan sponsor guarantees payment.

  • Pre-service guarantees eliminate disputes
  • Stripe settlements are automatic
  • Patient responsibility handled by TPA/plan
  • Hospital focus: clinical care, not collections

Clean Auditing

Every claim is traceable end-to-end:

Guarantee ID → Claim ID → ClaimResponse ID → Settlement ID → Stripe Trace ID

Bank deposit record

Full audit trail for compliance, no PHI in settlement records.

Webhook Integration

Listening for Settlement Events

from flask import Flask, request

app = Flask(__name__)

@app.route('/webhooks/settlements', methods=['POST'])
def handle_settlement_webhook():
event = request.json

if event['event'] == 'settlement.completed':
# Post payment to RCM system
settlement_id = event['settlement_id']
amount = event['amount']
stripe_trace_id = event['stripe_trace_id']

post_payment_to_rcm(
settlement_id=settlement_id,
amount=amount,
reference_id=stripe_trace_id,
method='ACH'
)

return {'status': 'processed'}, 200

return {'status': 'ignored'}, 200

Example Webhook Payload

{
"webhook_id": "wh_abc123xyz",
"event": "settlement.completed",
"created_at": "2024-03-12T09:45:00Z",
"settlement_id": "SETTLE-20240310-001",
"claim_response_id": "CLMR-20240310-001",
"claim_id": "CLM-20240310-001",
"member_id": "SHP00123456",
"provider_npi": "1234567890",
"facility_npi": "9876543210",
"amount": 1100.00,
"currency": "USD",
"stripe_transfer_id": "tr_abc123xyz",
"stripe_trace_id": "trace_0312_abc123xyz",
"arrived_at": "2024-03-12T09:45:00Z",
"bank_deposit_amount": 1100.00
}

Comparing Integration Options

  • Turquoise sends webhook when payment arrives
  • Your RCM system posts payment
  • Minimal integration complexity
  • Real-time posting (within minutes of deposit)
POST /webhooks/settlements → Read event → Post to RCM → Done

Option 2: Polling (for legacy systems)

If webhooks aren't available, poll for settlement status:

# Every hour, check for new settlements
curl -X GET \
https://api.turquoise.health/tpa-api/v1/settlements?status=completed&created_since=2024-03-12T08:45:00Z \
-H "X-API-Key: $HOSPITAL_API_KEY"

Response:

{
"settlements": [
{
"settlement_id": "SETTLE-20240310-001",
"status": "completed",
"amount": 1100.00,
"arrived_at": "2024-03-12T09:45:00Z"
}
]
}

Option 3: EDI 835 Integration (for full legacy systems)

Turquoise generates standard 835 EOBs and delivers via SFTP daily. Your RCM can auto-ingest.

Next Steps

  1. Set up pre-service guarantees: Configure front-desk endpoint
  2. Enable webhooks: Subscribe to settlement.completed events
  3. Configure EDI 835 (if using legacy RCM)
  4. Test with pilot provider: Start with one facility
  5. Train billing staff: Pre-service guarantee workflow
  6. Monitor DSO: Measure improvement after 4 weeks
  7. Full rollout: Expand to all eligible facilities

Support