Designing Architect Decision Trees for Insurance Claim Triage Using JSON Lookups
Executive Summary & Architectural Context
In the insurance industry, the First Notice of Loss (FNOL) is the most critical interaction in the customer lifecycle. A customer calling to report a house fire needs a vastly different experience than a customer reporting a cracked windshield. Standard IVR design-relying on a series of nested “Press 1 for Auto, Press 2 for Home” menus-is inherently brittle, difficult to update, and provides a poor customer experience for complex, multi-line policyholders.
A Principal Architect moves the logic out of the IVR and into an Externalized Decision Engine. By using JSON-driven decision trees, the Architect flow becomes a dynamic interpreter. When a caller enters their policy number, the system performs a real-time “Policy Dip” and receives a JSON payload describing exactly which triage questions to ask, what the valid responses are, and which specialized queue should handle the final transfer.
This masterclass details how to build a scalable triage engine in Genesys Cloud and NICE CXone, leveraging advanced JSONPath extraction and Data Action state-management.
Prerequisites, Roles & Licensing
Licensing & Permissions
- Licensing Tier: Genesys Cloud CX 2 or 3 (Required for complex Architect logic and Data Action concurrency).
- Granular Permissions:
Architect > Flow > EditIntegrations > Action > ExecuteArchitect > Datatable > View
- Dependencies: A Claims Management System (CMS) or Policy Administration System (PAS) with a REST API that returns claim-contextual JSON.
The Implementation Deep-Dive
1. The Architectural Shift: Logic vs. Flow
In a traditional flow, adding a new insurance product requires opening Architect, dragging new blocks, and republishing. In a JSON-driven flow, you simply update a database record.
The JSON Schema Pattern:
The external system should return a “Triage Descriptor” object:
{
"policyType": "PERSONAL_AUTO",
"eligibleClaims": ["COLLISION", "COMPREHENSIVE", "GLASS"],
"urgencyFactors": ["INJURY", "DRIVABLE", "TOW_REQUIRED"],
"priorityScore": 85,
"targetQueueGuid": "a1b2c3d4-e5f6..."
}
2. Implementing the “Interpreter” Flow
The Architect flow must be designed as a generic “Engine” that can handle any policy type returned by the API.
Step 1: The Policy Dip
- Use a Data Action to fetch the triage descriptor based on the
PolicyNumberinput. - Map the JSON arrays (
eligibleClaims,urgencyFactors) to Collection Variables in Architect.
Step 2: Dynamic Menu Generation
How do you play a menu when you don’t know the options in advance?
- The Solution: Use a Loop to iterate through the
Flow.eligibleClaimscollection. - The Technique: Concatenate a dynamic prompt.
- Loop 1:
Flow.TriagePrompt = Flow.TriagePrompt + "Press 1 for " + ToAudioPrompt(Flow.eligibleClaims[0]) - Loop 2:
Flow.TriagePrompt = Flow.TriagePrompt + "Press 2 for " + ToAudioPrompt(Flow.eligibleClaims[1])
- Loop 1:
- The Play: Use a single Collect Input action that plays the
Flow.TriagePromptvariable.
Step 3: Multi-Factor Urgency Triage
After the user selects their claim type (e.g., “Collision”), the flow must ask the Urgency Questions defined in the JSON.
- Example Logic: If the JSON says
TOW_REQUIREDis an urgency factor, the IVR asks: “Is your vehicle currently drivable, or do you require a tow?” - If the caller answers “Tow Required,” use an
Update Dataaction to increase theFlow.PriorityScoreby 20 points.
[!IMPORTANT]
Architectural Reasoning: By calculating aPriorityScorewithin the flow based on these dynamic factors, we ensure that a “Total Loss with Injury” call jumps to the front of the queue, while a “Parking Lot Ding” waits for the next available adjuster.
3. “The Trap”: The Orphaned Response
The Scenario: You build a dynamic menu that offers 4 options based on the JSON. The caller presses 5.
The Catastrophe: If you haven’t accounted for the “Invalid Input” path in a dynamic environment, the flow might crash or default to a generic “I’m sorry, I didn’t get that” loop that never ends because the “Invalid” path doesn’t know what the valid options were.
The Principal Architect’s Solution: The “Valid Range” Validator
Inside your Collect Input action, set the Maximum Digits based on the length of your JSON array (Flow.eligibleClaims.Count).
- Validation Expression:
If(ToInt(Task.Input) <= Flow.eligibleClaims.Count, "Valid", "Invalid") - This ensures that the flow only accepts inputs that correspond to the dynamic menu presented to the caller.
Advanced: Catastrophe (CAT) Mode Overrides
During major weather events (hurricanes, wildfires), insurance triage needs to change instantly across the entire country.
Implementation Pattern:
- Create a Global Data Table named
CAT_Overrides. - The Triage Flow performs a secondary lookup:
Lookup(CAT_Overrides, State: "FL", ZipCode: "33101"). - If a “CAT Flag” is active for that region, the flow Short-Circuits the standard triage.
- Override Action: Play: “We are currently responding to the recent hurricane in your area. Your claim will be fast-tracked to our Emergency Response Team.”
- Force the
Flow.PriorityScoreto 100 and transfer to theCAT_Response_Queue.
This “Geographic Short-Circuiting” prevents your triage engine from getting bogged down in routine questions during a state of emergency.
Integration: Injecting Triage Meta-Data into the Agent Workspace
The agent should not have to ask the questions the IVR just asked.
The Data Handoff (Participant Data):
As the triage progresses, update the following Participant Attributes:
Claim_Type: e.g., “Auto Collision”Urgency_Level: e.g., “CRITICAL”Tow_Required: e.g., “YES”Policy_Validated: e.g., “TRUE”
Agent Script Integration:
When the adjuster answers the call, the Genesys Cloud Script should automatically pop up with a high-visibility “Triage Summary” panel:
- Red Alert Header: “URGENT: TOW REQUIRED & INJURY REPORTED”
- Quick Links: Button to “Open New Claim Record” with all IVR data pre-populated.
Validation, Edge Cases & Troubleshooting
Edge Case 1: JSONPath Performance Latency
The failure condition: The Policy Dip returns a 50KB JSON payload with hundreds of nodes, and Architect takes 2 seconds to “Flatten” it.
The root cause: Inefficient JSONPath queries within a Data Action.
The solution: Use a Middleware Layer (AWS Lambda or Azure Function) to “Pre-Process” the claim data. The Lambda should return a “Lean” JSON object containing only the specific fields Architect needs for triage, rather than the entire policy database record.
Edge Case 2: Multi-Language Triage Discrepancies
The failure condition: The JSON returns claim types in English (“Collision”), but the caller is in the Spanish IVR.
The root cause: Lack of localization in the decision engine.
The solution: The JSON response should include Prompt Keys instead of literal strings.
JSON: "claim_type_prompt": "PROMPT_COLLISION"Architect: Play Audio(FindPromptByID(Flow.claim_type_prompt))- Architect will then play the Spanish version of the “Collision” prompt automatically based on the flow’s current language.
Reporting & ROI Analysis
A dynamic triage engine provides unprecedented visibility into your claims pipeline.
Metrics to Monitor:
- Triage Completion Rate: What percentage of callers successfully categorize their claim before reaching an agent?
- Priority Accuracy: Comparison of the IVR-assigned
PriorityScorevs. the Adjuster’s final assessment. - CAT Mode Efficiency: How quickly did the system pivot to emergency routing during a specific event?
Target ROI: Expect a 15% reduction in Average Handle Time (AHT) for FNOL calls and a 40% improvement in “First-Touch Resolution” for emergency claims.