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 RCM | Turquoise RCM |
|---|---|
| Pre-service estimate from leased network | Guaranteed Direct Contract rate |
| Patient responsible for estimate verification | System 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 days | DSO 2-3 days |
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.
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"
}
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 Field | Type | RCM Equivalent | Mapping |
|---|---|---|---|
claim_id | string | Claim Number | ClaimInfo.ClaimNumber |
member_id | string | Member ID | ClaimInfo.PatientID |
provider_npi | string | Provider NPI | ClaimInfo.ProviderID |
facility_npi | string | Facility NPI | ClaimInfo.FacilityID |
procedure_code | string | CPT/HCPCS | LineItem.ProcedureCode |
billed_amount | decimal | Billed Charge | LineItem.ChargeAmount |
negotiated_rate | decimal | Allowed Amount | LineItem.AllowedAmount |
settlement_id | string | EOB Number | EOB.EOBNumber |
stripe_trace_id | string | Reference ID | EOB.ReferenceID |
arrived_at | timestamp | Payment Date | EOB.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
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)
- Hospital bills $1,200 (billed charge)
- Plan pays $1,000 (allowed amount)
- Hospital records $200 write-off as "contractual adjustment"
- CFO asks: "Why are we losing $200 per procedure?"
- Manual true-up process (slow, error-prone)
Turquoise Approach (Simple)
- Hospital gets rate guarantee: $1,200
- Plan pays $1,200 through Turquoise (minus patient responsibility)
- Zero contractual adjustments
- 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)
| Metric | Traditional | Turquoise | Improvement |
|---|---|---|---|
| Payment cycle | 30-45 days | 48 hours | 95% faster |
| DSO | 40-50 days | 2-3 days | 90% reduction |
| Cash flow predictability | Unpredictable | Guaranteed | ✓ |
| Bad debt write-off | 2-5% of revenue | 0% | 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
Option 1: Webhook-Only (Recommended for most hospitals)
- 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
- Set up pre-service guarantees: Configure front-desk endpoint
- Enable webhooks: Subscribe to
settlement.completedevents - Configure EDI 835 (if using legacy RCM)
- Test with pilot provider: Start with one facility
- Train billing staff: Pre-service guarantee workflow
- Monitor DSO: Measure improvement after 4 weeks
- Full rollout: Expand to all eligible facilities
Support
- Implementation: rcm-support@turquoise.health
- Technical: api-support@turquoise.health
- Billing questions: finance-support@turquoise.health