Skip to main content

ACH Leads Integration

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

ComponentTypePurpose
ach-crashclaim@zohomail.com.auZoho Mail mailboxDedicated inbox that receives lead emails from ACH
Zoho FlowAutomationWatches the mailbox and orchestrates the end-to-end intake flow
ACH Incoming EmailZoho Creator formRaw capture of every inbound ACH email + AI response/error audit trail
Claude AIExternal APIExtracts structured lead data (JSON) from the email body
ACH LeadZoho Creator formStructured lead record mapped from the Claude JSON response
Bookings Dashboard → ACH Leads tabZoho Creator reportWork queue where the Bookings team actions leads
Claim FormZoho Creator formTarget 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

#StepDetail
1Email receivedACH sends the lead to ach-crashclaim@zohomail.com.au. Zoho Flow's mail trigger fires on every new email in this inbox.
2Capture raw emailFlow creates an ACH Incoming Email record (Subject, Body, From, To, cc). The new record's ID is held for the update step.
3AI extractionThe email Body is sent to Claude AI, which returns the lead details as a JSON object.
4Persist AI responseFlow 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).
5Create leadFlow creates an ACH Lead record, mapping each field from the Claude JSON response (see mapping table below).
6Duplicate handlingIf a duplicate is detected the lead's Status is set to Duplicate Found; otherwise New.
7Flow endsThe lead is now visible in the ACH Leads tab of the Bookings Dashboard for manual action.

ACH Incoming Email Form

Raw audit record of every inbound ACH email and the AI call made for it.

Field NameTypeNotes
Subjectsingle line (max 255)Email subject
Bodymulti lineFull email body — this is the text sent to Claude
Fromsingle lineSender address
Tosingle lineRecipient address (ach-crashclaim@zohomail.com.au)
ccsingle lineCC addresses, if any
Responsemulti lineRaw Claude JSON response, written back in step 4
Error Logmulti lineFlow-level errors
AI Error Status Codesingle lineHTTP/API status code if the Claude call fails
AI Error Logmulti lineClaude API error body, if any

Section: AI Claude Details

Field NameTypeNotes
Token Spendsingle lineToken usage for the Claude extraction call (cost tracking)

Claude AI Extraction

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)

GroupExpected contents
leadACH reference number, date received
driverName, phone, email, date of birth, address
ownerName, phone, email, address; flag for "driver is the owner"
client_vehicleMake, model, year, registration, VIN, transmission, vehicle type
client_insuranceInsurer, policy number, claim number, cover type (Comprehensive / CTP / 3rd Party)
accidentDate, time, location, accident description, damage description, number of vehicles involved
at_fault_partyDriver name, phone, email, address; vehicle make/model/year/registration/damage; insurer, policy number, claim number; liability admitted
extraction_metaFields Claude could not find / confidence notes

Mapping: Claude JSON Response → ACH Lead Form (DRAFT)

caution

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 pathACH Lead fieldTypeNotes
lead.ach_referenceACH_ReferencetextACH's own lead/reference number
driver.first_name / driver.last_nameDriver_Namename
driver.phoneDriver_PhonephoneAU format
driver.emailDriver_Emailemail
driver.date_of_birthDriver_Date_of_Birthdate
driver.addressDriver_Addressaddress
owner.is_driver_the_ownerIs_Driver_the_OwnercheckboxIf true, owner fields may be blank in the payload
owner.first_name / owner.last_nameOwner_Namename
owner.phoneOwner_Phonephone
owner.emailOwner_Emailemail
owner.addressOwner_Addressaddress
client_vehicle.makeVehicle_Maketext
client_vehicle.modelVehicle_Modeltext
client_vehicle.yearVehicle_Yearnumber
client_vehicle.registrationVehicle_RegistrationtextKey field for duplicate detection
client_vehicle.vinVINtext
client_insurance.insurerClient_Insurertext
client_insurance.policy_numberPolicy_Numbertext
client_insurance.claim_numberClaim_Numbertext
client_insurance.cover_typeInsurance_Cover_TypepicklistComprehensive / CTP / 3rd Party
accident.dateDate_of_Accidentdate
accident.timeTime_of_Accidenttime
accident.locationAccident_Locationaddress/text
accident.descriptionAccident_Descriptionmulti line
accident.damage_descriptionDamage_Descriptionmulti line
accident.number_of_vehiclesNumber_of_Vehicles_Involvednumber
at_fault_party.driver_nameAt_Fault_Namename
at_fault_party.phoneAt_Fault_Phonephone
at_fault_party.emailAt_Fault_Emailemail
at_fault_party.addressAt_Fault_Addressaddress
at_fault_party.vehicle_makeAt_Fault_Maketext
at_fault_party.vehicle_modelAt_Fault_Modeltext
at_fault_party.vehicle_yearAt_Fault_Vehicle_Yearnumber
at_fault_party.vehicle_registrationAt_Fault_Registrationtext
at_fault_party.vehicle_damageAt_Fault_Vehicle_Damagemulti line
at_fault_party.insurerAt_Fault_Insurertext
at_fault_party.policy_numberAt_Fault_Policy_Numbertext
at_fault_party.claim_numberAt_Fault_Claim_Numbertext
at_fault_party.liability_admittedLiability_AdmittedpicklistYes / No / Pending

ACH Lead — internal fields (not from the payload)

FieldTypeSet byNotes
StatuspicklistFlow / buttonsNew / Duplicate Found / Claim Created / Cancelled
ACH_Incoming_EmaillookupFlowLink back to the source ACH Incoming Email record
Duplicate_OflookupFlowThe existing record that triggered "Duplicate Found" (TBD)
Claimlookup (Claim_Form)Create Claim buttonSet when the claim is created
Cancelled_By / Cancellation_Reason / Cancelled_Dateuser / textarea / datetimeCancel Lead buttonTBD

Lead Status Lifecycle

StatusSet whenSet by
NewLead created and no duplicate detectedZoho Flow
Duplicate FoundLead created and a duplicate is detectedZoho Flow
Claim CreatedUser completes the prepopulated Claim Form via Create ClaimCustom button workflow
CancelledUser cancels the lead via Cancel LeadCustom 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.

Custom Buttons

ButtonBehaviour
Create ClaimOpens 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 LeadCancels the lead — Status is set to Cancelled.

Mapping: ACH Lead → Claim Form (DRAFT)

Claim Form field names below are verified against the Claim Form schema. ACH Lead field names are draft until the form is finalised.

Fixed values (set by the button, not from the lead)

Claim Form fieldValueNotes
Lead_Source1Lead_Source record for Accident Claims HelplineExisting picklist value
Lead_Source_ReferenceACH Lead → ACH_ReferenceACH's reference number

Driver / Owner

ACH Lead fieldClaim Form fieldNotes
Driver_NameDriver_NameComposite name (first / last)
Driver_PhoneDriver_PhoneAU format
Driver_EmailDriver_Email
Driver_Date_of_BirthDriver_Date_of_Birth
Driver_AddressDriver_AddressComposite address
Is_Driver_the_Owneris_Driver_the_same_as_ownerIf checked, Claim Form owner fields copy from driver
Owner_NameOwner_Name
Owner_PhoneOwner_Phone
Owner_EmailOwner_Email
Owner_AddressOwner_Address

Customer Vehicle & Insurance

ACH Lead fieldClaim Form fieldNotes
Vehicle_MakeCustomer_Make
Vehicle_ModelCustomer_Model
Vehicle_YearYear_field
Vehicle_RegistrationCustomer_Registration
VINVIN
Client_InsurerClient_InsurerClaim Form field is a lookup to Insurer_Form — needs a name→record match; unmatched values TBD
Policy_NumberPolicy_Number
Claim_NumberClaim_Number
Insurance_Cover_TypeDo_you_have_comprehensive_insuranceValues: Comprehensive / CTP / 3rd Party

Accident Details

ACH Lead fieldClaim Form fieldNotes
Date_of_AccidentDate_of_Accident
Time_of_AccidentTime_of_Accident
Accident_LocationAccident_LocationComposite address
Accident_DescriptionAccident_Description
Damage_DescriptionDamage_Description
Number_of_Vehicles_InvolvedNumber_of_vehicles_involvedPicklist values 1–5

At Fault Party

ACH Lead fieldClaim Form fieldNotes
At_Fault_Namerd_Party_NameComposite name
At_Fault_PhoneAt_Fault_Phone_Number
At_Fault_EmailAt_Fault_Driver_Email
At_Fault_AddressAt_Fault_Address
At_Fault_MakeAt_Fault_Make
At_Fault_ModelAt_Fault_Model
At_Fault_Vehicle_YearAt_Fault_Vehicle_Year
At_Fault_RegistrationAt_Fault_Registration
At_Fault_Vehicle_DamageAt_Fault_Vehicle_Damage
At_Fault_InsurerAt_Fault_Party_Insurer1Lookup to Insurer_Form — needs a name→record match
At_Fault_Policy_NumberAt_Fault_Party_Policy
At_Fault_Claim_NumberAt_Fault_Party_Claim
Liability_AdmittedDid_the_at_fault_driver_admit_liabilityYes / No / Pending

Not prepopulated (user must complete on the Claim Form)

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

FailureWhere recordedBehaviour
Claude API call failsAI Error Status Code + AI Error Log on the ACH Incoming Email recordNo ACH Lead created; email remains available for reprocessing (retry process TBD)
Flow step failsError Log on the ACH Incoming Email recordTBD
Claude returns unparseable/incomplete JSONResponse holds raw output; handling TBDTBD

Token usage for every extraction call is recorded in Token Spend for cost monitoring.


Open Items

  • Claude JSON payload — replace the draft schema and JSON→ACH Lead mapping with the actual payload (to be provided)
  • ACH Lead form — confirm final field link names once the form is built
  • Duplicate detection criteria — which fields are matched, and against which forms
  • Can a "Duplicate Found" lead still be converted to a claim?
  • Retry/reprocessing path for failed Claude extractions
  • Cancel Lead — is a cancellation reason captured?