Automated intake of leads from ACH (Accident Claims Helpline). ACH emails leads to a dedicated mailbox; Zoho Flow captures the email, Claude AI extracts the lead details into structured JSON, and an ACH Lead record is created for the Bookings team to convert into a Claim.
:::warning Draft — pending confirmation
The Claude JSON payload and the final ACH Lead form field list have not been finalised. Sections marked (DRAFT) are proposed mappings and must be updated against the actual extraction payload before this document is treated as authoritative.
:::
Components
| Component | Type | Purpose |
|---|
ach-crashclaim@zohomail.com.au | Zoho Mail mailbox | Dedicated inbox that receives lead emails from ACH |
| Zoho Flow | Automation | Watches the mailbox and orchestrates the end-to-end intake flow |
| ACH Incoming Email | Zoho Creator form | Raw capture of every inbound ACH email + AI response/error audit trail |
| Claude AI | External API | Extracts structured lead data (JSON) from the email body |
| ACH Lead | Zoho Creator form | Structured lead record mapped from the Claude JSON response |
| Bookings Dashboard → ACH Leads tab | Zoho Creator report | Work queue where the Bookings team actions leads |
| Claim Form | Zoho Creator form | Target form, prepopulated from the ACH Lead via the Create Claim button |
End-to-End Flow
ACH sends lead email
│
▼
ach-crashclaim@zohomail.com.au (Zoho Mail)
│ Zoho Flow trigger: new email in inbox
▼
[1] Create "ACH Incoming Email" record ──► record ID captured
│
▼
[2] Send email body to Claude AI ──► structured JSON response
│
▼
[3] Update the ACH Incoming Email record (by captured ID)
with the Claude JSON response + token spend / any errors
│
▼
[4] Duplicate check
│
▼
[5] Create "ACH Lead" record (fields mapped from Claude JSON)
Status = "New" (or "Duplicate Found" if a duplicate was detected)
│
▼
Flow ends — lead appears in Bookings Dashboard → ACH Leads tab
│
├── [Create Claim] button → Claim Form opens prepopulated
│ → user submits claim → Lead Status = "Claim Created"
│
└── [Cancel Lead] button → Lead Status = "Cancelled"
Flow Steps
| # | Step | Detail |
|---|
| 1 | Email received | ACH sends the lead to ach-crashclaim@zohomail.com.au. Zoho Flow's mail trigger fires on every new email in this inbox. |
| 2 | Capture raw email | Flow creates an ACH Incoming Email record (Subject, Body, From, To, cc). The new record's ID is held for the update step. |
| 3 | AI extraction | The email Body is sent to Claude AI, which returns the lead details as a JSON object. |
| 4 | Persist AI response | Flow updates the ACH Incoming Email record (using the captured record ID) with the Claude JSON (Response), Token Spend, and any error details (Error Log, AI Error Status Code, AI Error Log). |
| 5 | Create lead | Flow creates an ACH Lead record, mapping each field from the Claude JSON response (see mapping table below). |
| 6 | Duplicate handling | If a duplicate is detected the lead's Status is set to Duplicate Found; otherwise New. |
| 7 | Flow ends | The lead is now visible in the ACH Leads tab of the Bookings Dashboard for manual action. |
Raw audit record of every inbound ACH email and the AI call made for it.
| Field Name | Type | Notes |
|---|
Subject | single line (max 255) | Email subject |
Body | multi line | Full email body — this is the text sent to Claude |
From | single line | Sender address |
To | single line | Recipient address (ach-crashclaim@zohomail.com.au) |
cc | single line | CC addresses, if any |
Response | multi line | Raw Claude JSON response, written back in step 4 |
Error Log | multi line | Flow-level errors |
AI Error Status Code | single line | HTTP/API status code if the Claude call fails |
AI Error Log | multi line | Claude API error body, if any |
Section: AI Claude Details
| Field Name | Type | Notes |
|---|
Token Spend | single line | Token usage for the Claude extraction call (cost tracking) |
The email body is sent to Claude AI, which returns a single JSON object with the lead details.
:::caution TBD — actual payload required
The exact JSON schema (keys, nesting, formats) will be added once the payload is provided. The structure below is a proposed draft derived from the Claim Form fields the lead must ultimately prepopulate — replace it with the real payload.
:::
Proposed JSON structure (DRAFT)
| Group | Expected contents |
|---|
lead | ACH reference number, date received |
driver | Name, phone, email, date of birth, address |
owner | Name, phone, email, address; flag for "driver is the owner" |
client_vehicle | Make, model, year, registration, VIN, transmission, vehicle type |
client_insurance | Insurer, policy number, claim number, cover type (Comprehensive / CTP / 3rd Party) |
accident | Date, time, location, accident description, damage description, number of vehicles involved |
at_fault_party | Driver name, phone, email, address; vehicle make/model/year/registration/damage; insurer, policy number, claim number; liability admitted |
extraction_meta | Fields Claude could not find / confidence notes |
Field names on both sides are proposed until the actual Claude payload and the final ACH Lead form are confirmed. Every key in the real payload must have a row here — nothing in the JSON should be unmapped.
| Claude JSON path | ACH Lead field | Type | Notes |
|---|
lead.ach_reference | ACH_Reference | text | ACH's own lead/reference number |
driver.first_name / driver.last_name | Driver_Name | name | |
driver.phone | Driver_Phone | phone | AU format |
driver.email | Driver_Email | email | |
driver.date_of_birth | Driver_Date_of_Birth | date | |
driver.address | Driver_Address | address | |
owner.is_driver_the_owner | Is_Driver_the_Owner | checkbox | If true, owner fields may be blank in the payload |
owner.first_name / owner.last_name | Owner_Name | name | |
owner.phone | Owner_Phone | phone | |
owner.email | Owner_Email | email | |
owner.address | Owner_Address | address | |
client_vehicle.make | Vehicle_Make | text | |
client_vehicle.model | Vehicle_Model | text | |
client_vehicle.year | Vehicle_Year | number | |
client_vehicle.registration | Vehicle_Registration | text | Key field for duplicate detection |
client_vehicle.vin | VIN | text | |
client_insurance.insurer | Client_Insurer | text | |
client_insurance.policy_number | Policy_Number | text | |
client_insurance.claim_number | Claim_Number | text | |
client_insurance.cover_type | Insurance_Cover_Type | picklist | Comprehensive / CTP / 3rd Party |
accident.date | Date_of_Accident | date | |
accident.time | Time_of_Accident | time | |
accident.location | Accident_Location | address/text | |
accident.description | Accident_Description | multi line | |
accident.damage_description | Damage_Description | multi line | |
accident.number_of_vehicles | Number_of_Vehicles_Involved | number | |
at_fault_party.driver_name | At_Fault_Name | name | |
at_fault_party.phone | At_Fault_Phone | phone | |
at_fault_party.email | At_Fault_Email | email | |
at_fault_party.address | At_Fault_Address | address | |
at_fault_party.vehicle_make | At_Fault_Make | text | |
at_fault_party.vehicle_model | At_Fault_Model | text | |
at_fault_party.vehicle_year | At_Fault_Vehicle_Year | number | |
at_fault_party.vehicle_registration | At_Fault_Registration | text | |
at_fault_party.vehicle_damage | At_Fault_Vehicle_Damage | multi line | |
at_fault_party.insurer | At_Fault_Insurer | text | |
at_fault_party.policy_number | At_Fault_Policy_Number | text | |
at_fault_party.claim_number | At_Fault_Claim_Number | text | |
at_fault_party.liability_admitted | Liability_Admitted | picklist | Yes / No / Pending |
ACH Lead — internal fields (not from the payload)
| Field | Type | Set by | Notes |
|---|
Status | picklist | Flow / buttons | New / Duplicate Found / Claim Created / Cancelled |
ACH_Incoming_Email | lookup | Flow | Link back to the source ACH Incoming Email record |
Duplicate_Of | lookup | Flow | The existing record that triggered "Duplicate Found" (TBD) |
Claim | lookup (Claim_Form) | Create Claim button | Set when the claim is created |
Cancelled_By / Cancellation_Reason / Cancelled_Date | user / textarea / datetime | Cancel Lead button | TBD |
Lead Status Lifecycle
| Status | Set when | Set by |
|---|
| New | Lead created and no duplicate detected | Zoho Flow |
| Duplicate Found | Lead created and a duplicate is detected | Zoho Flow |
| Claim Created | User completes the prepopulated Claim Form via Create Claim | Custom button workflow |
| Cancelled | User cancels the lead via Cancel Lead | Custom button workflow |
┌────────────► Duplicate Found ──┐
Flow creates ───┤ ├──► Claim Created
lead └────────────► New ──────────────┤
└──► Cancelled
:::caution TBD
Duplicate-detection criteria are not yet defined (e.g. match on vehicle registration, driver phone/email, or ACH reference — and whether the match runs against existing ACH Leads, existing Claims, or both). Also TBD: whether a "Duplicate Found" lead can still be converted via Create Claim.
:::
Bookings Dashboard — ACH Leads Tab
A new ACH Leads tab on the Bookings Dashboard shows a report of all ACH Lead records.
| Button | Behaviour |
|---|
| Create Claim | Opens the Claim Form with details prepopulated from the ACH Lead (mapping below). The user reviews, completes any missing required fields, and submits. On successful creation the lead's Status is set to Claim Created. |
| Cancel Lead | Cancels the lead — Status is set to Cancelled. |
Claim Form field names below are verified against the Claim Form schema. ACH Lead field names are draft until the form is finalised.
| Claim Form field | Value | Notes |
|---|
Lead_Source1 | Lead_Source record for Accident Claims Helpline | Existing picklist value |
Lead_Source_Reference | ACH Lead → ACH_Reference | ACH's reference number |
Driver / Owner
| ACH Lead field | Claim Form field | Notes |
|---|
Driver_Name | Driver_Name | Composite name (first / last) |
Driver_Phone | Driver_Phone | AU format |
Driver_Email | Driver_Email | |
Driver_Date_of_Birth | Driver_Date_of_Birth | |
Driver_Address | Driver_Address | Composite address |
Is_Driver_the_Owner | is_Driver_the_same_as_owner | If checked, Claim Form owner fields copy from driver |
Owner_Name | Owner_Name | |
Owner_Phone | Owner_Phone | |
Owner_Email | Owner_Email | |
Owner_Address | Owner_Address | |
Customer Vehicle & Insurance
| ACH Lead field | Claim Form field | Notes |
|---|
Vehicle_Make | Customer_Make | |
Vehicle_Model | Customer_Model | |
Vehicle_Year | Year_field | |
Vehicle_Registration | Customer_Registration | |
VIN | VIN | |
Client_Insurer | Client_Insurer | Claim Form field is a lookup to Insurer_Form — needs a name→record match; unmatched values TBD |
Policy_Number | Policy_Number | |
Claim_Number | Claim_Number | |
Insurance_Cover_Type | Do_you_have_comprehensive_insurance | Values: Comprehensive / CTP / 3rd Party |
Accident Details
| ACH Lead field | Claim Form field | Notes |
|---|
Date_of_Accident | Date_of_Accident | |
Time_of_Accident | Time_of_Accident | |
Accident_Location | Accident_Location | Composite address |
Accident_Description | Accident_Description | |
Damage_Description | Damage_Description | |
Number_of_Vehicles_Involved | Number_of_vehicles_involved | Picklist values 1–5 |
At Fault Party
| ACH Lead field | Claim Form field | Notes |
|---|
At_Fault_Name | rd_Party_Name | Composite name |
At_Fault_Phone | At_Fault_Phone_Number | |
At_Fault_Email | At_Fault_Driver_Email | |
At_Fault_Address | At_Fault_Address | |
At_Fault_Make | At_Fault_Make | |
At_Fault_Model | At_Fault_Model | |
At_Fault_Vehicle_Year | At_Fault_Vehicle_Year | |
At_Fault_Registration | At_Fault_Registration | |
At_Fault_Vehicle_Damage | At_Fault_Vehicle_Damage | |
At_Fault_Insurer | At_Fault_Party_Insurer1 | Lookup to Insurer_Form — needs a name→record match |
At_Fault_Policy_Number | At_Fault_Party_Policy | |
At_Fault_Claim_Number | At_Fault_Party_Claim | |
Liability_Admitted | Did_the_at_fault_driver_admit_liability | Yes / No / Pending |
Required Claim Form fields with no source in the ACH payload — the user fills these during Create Claim:
Claim_Type1, Recovery_Type, Rental_Provider, Rental_Recovery_type
Relationship_to_Owner, Transmission, Vehicle_Type
- Rental Need section (
Rental_is_my_only_option_because, etc.)
Are_you_insured, Policy_Renewal / renewal dates
- Signatures / Terms & Conditions
Error Handling
| Failure | Where recorded | Behaviour |
|---|
| Claude API call fails | AI Error Status Code + AI Error Log on the ACH Incoming Email record | No ACH Lead created; email remains available for reprocessing (retry process TBD) |
| Flow step fails | Error Log on the ACH Incoming Email record | TBD |
| Claude returns unparseable/incomplete JSON | Response holds raw output; handling TBD | TBD |
Token usage for every extraction call is recorded in Token Spend for cost monitoring.
Open Items