Work snippetAI enquiry intake

AI enquiry intake with an approval queue and a cost-per-lead log

How I would approach enquiry intake for a field service business: each web form, shared inbox or chat enquiry is read by a model, checked against existing contacts, spam and service area, and drafted into an approval queue. A person approves before anything is created or sent, and a log shows what every lead costs by source.

Work snippet with example figures.

Area
AI enquiry intake
Tools
n8n · HubSpot · GoHighLevel · Airtable
Typical scope
US$1,600–2,900
Timeline
About 6 weeks · 4 fixed milestones

Problem

What the owner sees

  1. Enquiries arriving by web form, shared inbox and chat, each handled a different way
  2. Replies that depend on who happens to be at a screen
  3. The same customer created twice, or a repeat customer treated as new
  4. Spam and out-of-area requests that cost a callback
  5. No figure for what a lead from each ad or campaign actually costs
  6. A chatbot or auto-reply that promises a price or a date

Most of a new enquiry is reading: who is this, what do they want, how urgent is it, and have we dealt with them before. A model can do the reading and draft a reply quickly. It must not create a contact, send a message, quote a price or promise a date. The design reads and drafts, rules check, and a person approves. A log records what every lead cost, so spend is judged on bookings rather than clicks.

Where it goes wrong today
Everyday situationWhat goes wrong
The web form and the shared inbox both create a contactDuplicate contacts, and two people replying
A repeat customer writes from a new addressTreated as new, and the history is lost
One email asks for two jobsOnly the first request is booked
An emergency enquiry waits in the inbox overnightThe customer calls the next business
Ad spend reported as clicksNobody knows what a booked job costs
A chatbot that quotesA price is promised that nobody approved

System map

A field service business that receives enquiries through a website form and a shared inbox, and optionally a chat widget. Contacts live in HubSpot or GoHighLevel. A person in the office approves each enquiry. The cost log lives in Airtable or Google Sheets.

The build reads each enquiry, drafts a reply and places both in an approval queue. Nothing is created in the CRM and nothing is sent until the reviewer approves. A weekly view shows cost per lead and cost per booked job by source.

System map: who and what does each job
PartWhat it does
Intake sourcesThe web form, the shared inbox and the chat widget each post the enquiry to one webhook. The source is recorded on every enquiry.
n8n or Make workflowRuns the steps, applies the rules, calls the model and writes the log. It runs in your account.
Language modelOne of the major LLM APIs such as OpenAI, Claude, Grok, Gemini and Mistral, or a local model, reads the enquiry and returns fields and a draft reply. It does not set prices or dates.
CRMHubSpot or GoHighLevel. Searched for an existing contact, and written to only after approval.
Approval queueEach enquiry with the extracted fields, the match result, the rule flags and the draft reply, for a person to edit and approve.
Cost-per-lead logOne row per enquiry in Airtable or Google Sheets: source, times, outcome, AI cost and the spend entered for that source.
FallbackIf the model is unavailable, the enquiry goes to the queue unread with a plain template reply.

How the data moves

  1. Enquiry received
  2. Masked and read
  3. Contact, spam and area checks
  4. Approval queue
  5. Person edits and approves
  6. Contact created and reply sent
  7. Log updated

Rules agreed in writing

The model reads and drafts. Rules decide what happens next, and a person approves. Everything below is agreed in writing before the build starts.

Intake rules (example settings)
ItemExample setting
Fields readName, phone, email, address or suburb, service, urgency, source and a one-line summary. Anything missing is left blank and never guessed.
UrgencyListed emergency words or services set an urgent flag and notify the on-call person. A person still approves.
Existing contactMatch on email, then phone, then name and address. A match shows the existing record in the queue. A near match is flagged and never merged by the build.
SpamA rule score from known patterns and blank fields runs before the model call, so obvious spam costs nothing. Likely spam waits in a separate view and is logged as spam.
Service areaA postcode or suburb list supplied by you. An enquiry outside the list is flagged for a polite decline, which a person approves.
Prices and datesThe model never states a price, a discount or an appointment date. Drafts say that the office will confirm.
Other languagesThe enquiry is read, summarised in your working language and queued with the original text. A person replies.
Personal dataWhere you ask for it, names, phones and emails are masked before the model sees the text and restored by code afterwards.
SendingOnly from your own mailbox or CRM, and only by the approver.

Flow steps

Eight steps run when each enquiry arrives. The weekly cost view is built each Monday morning.

Flow steps
StepTriggerWhat happensResult
1 ReceiveForm, email or chatThe enquiry is posted to the webhook with its source and the time received.Raw enquiry stored
2 De-duplicateRaw enquiryThe same contact details and message within ten minutes are treated as one submission.One enquiry
3 Pre-check and maskOne enquiryObvious spam is held before any model call. Personal data is masked where agreed.Masked text or spam hold
4 ReadMasked textThe model returns the fields, urgency, a summary and a draft reply as structured data. Usage figures are logged.Fields and draft
5 CheckFieldsRules check for an existing contact in HubSpot or GoHighLevel, the service area and the urgency words.Flags
6 QueueFlagsThe enquiry, fields, flags and draft go into the approval queue. Urgent items notify the on-call person.Queue item
7 ApproveReviewerThe reviewer edits the fields and the reply, then approves, declines or marks the item as spam.Decision
8 Create and logApprovedThe contact is created or updated, the reply is sent from the approver’s mailbox or CRM and the log row is completed.CRM and log updated

Field mapping

Each field has one source and one destination. The source is set by code, never by the model.

Field mapping
FieldComes fromWritten toRule
Name, email, phoneModel, checked by patternCRM contactPattern check. Left blank if not found.
Service requestedModel, from your service listCRM deal or ticket propertyMust match your list. Otherwise Other, and a person chooses.
UrgencyModel plus rule wordsQueue flag and CRM propertyRule words win over the model.
Address or suburbModelContact propertyUsed for the area check. A person confirms.
SourceWebhookCRM source property and the logSet by code, never by the model.
Existing contact IDSearch resultQueue and logShown to the reviewer. Decides update or create.
SummaryModelCRM noteSaved on approval and marked as drafted for review.
Draft replyModelQueue onlyBecomes a sent message only when approved.
AI costProvider usage figuresLogCalculated by code from the tokens reported.

Edge cases

Each case below is handled by a written rule and has a check in the test plan.

Edge cases and what the build does
CaseWhat the build does
A repeat customer writes with a new addressThe existing contact is found by email or phone and shown in the queue. The new address is offered as an addition and never replaces the old one.
One email asks for two jobsBoth requests are listed as separate lines in the queue, with one reply that covers both.
The enquiry is in another languageRead, summarised in your working language and queued with the original text. A person replies.
An emergencyFlagged urgent, the on-call person is notified, and the item moves to the top of the queue. A person still approves.
A duplicate submissionThe same contact details and message within ten minutes are merged into one queue item.
No contact detailsThe item is marked as having no way to reply. No contact is created and the reviewer decides.
The model is unavailable or returns unusable outputThe enquiry goes to the queue unread with a plain template reply, and an alert is sent.
The enquiry arrives from an address already linked to a different contactBoth records are shown and the reviewer chooses. Nothing is merged automatically.

Human sign-off and audit trail

Nothing is created in the CRM and nothing is sent until a person approves. The workflow holds no send step before approval.

Who signs off what
WhoSigns offWhenIf nobody acts
ReviewerEvery enquiry, after editing, before the contact is created or the reply is sentEach working dayThe item waits. Nothing is sent.
ReviewerDeclines and out-of-area repliesEach working dayThe item waits
On-call personUrgent enquiriesOn the alertThe alert repeats, then goes to the owner
OwnerService list, area list, urgency words and reply wordingBefore go-live and quarterlyExisting rules stay
OwnerOutcome and spend entries in the logWeeklyThe weekly view shows the gap
Audit trail kept for every enquiry (example entry)
FieldExample
Enquiry IDLog row number
Source and timeSource, and the time received and approved
ModelModel name and version, and the prompt version
InputThe text sent to the model, as masked
OutputThe fields and draft returned
FlagsExisting contact, spam, area and urgency results
EditsText before and after, who and when
DecisionApproved, declined or spam, with the CRM record ID
AI costTokens reported by the provider and the calculated cost

Data and privacy

Enquiries hold names, phone numbers and addresses. The workflow keeps them inside your own accounts.

Where the data lives and who can see it
DataHandling
Enquiry textStored in the log and the queue in your accounts. Retention follows your policy.
MaskingNames, phones and emails can be masked before the model call and restored by code afterwards.
Model useA hosted model on terms that do not allow training on your data, or a local model.
Prompts and outputsStored with the prompt version so any draft can be traced and explained.
API keysCreated in your own provider account and held in your workflow credentials.
Accountsn8n or Make, the CRM and the log stay in your accounts. I am added as a user and removed at handover.

Cost-per-lead log and API prices

The log answers one question: what does a lead from each source cost, and what does a booked job cost? Two kinds of cost go in. AI processing cost is calculated by code from the usage figures the model provider returns with each reply. Source spend, such as the week’s ad spend, is typed in by the owner. The build never estimates spend.

Who pays what
ItemWho paysNotes
Build, rules, queue, log and handoverYou, to me, by milestoneFixed scope, set out below
Model API usageYou, directly to the provider, on your own account and keyNot included in the project price. I add no mark-up.
n8n or Make, CRM and Airtable subscriptionsYou, to each vendorYour existing plans often cover it
Ad and campaign spendYou, to the ad platformEntered in the log by the owner

Model API usage is billed to you by the provider. It is not part of my fee and it is not in the project price. The table below shows what it costs at published list prices for major LLM APIs such as OpenAI, Claude, Grok, Gemini and Mistral.

Published API list prices, checked 29 October 2026 (US$ per 1 million tokens)
ProviderModelInputOutputOne enquiryPer 1,000 enquiries
OpenAIGPT-6 Luna0.100.500.000550.55
OpenAIGPT-6.1 Terra1.005.000.005505.50
ClaudeClaude Haiku 5.50.100.500.000550.55
ClaudeClaude Sonnet 5.52.0010.000.0110011.00
GrokGrok 4.31.252.500.004634.63
GeminiGemini 3.5 Flash-Lite0.302.500.002252.25
GeminiGemini 3.8 Flash0.753.750.004134.13
MistralMistral Small 40.150.600.000740.74
MistralMistral Medium 3.51.507.500.008258.25

One enquiry is worked out as 2,500 input tokens (the instructions, the enquiry and the contact match) and 600 output tokens (the fields and the draft reply). These are example settings. Standard rates are used, with no batch or cache discount, and every provider counts tokens its own way, so the log uses the usage figures the provider returns. Gemini 3.8 Flash is shown at its introductory rate, which the provider lists as rising on 1 January 2027, and Claude Haiku 5.5 is shown at the rate for prompts up to 100,000 tokens. Prices and model names change often, so the price table in the log is a settings sheet that you or I can edit.

At these rates, even the dearest row comes to US$3.30 for 300 enquiries in a month, and the cheapest to about US$0.17. Model usage is a small part of what a lead costs. The log is there to show the ad spend next to it.

Log columns: one row per enquiry
ColumnFilled byWhen
Source and campaignWebhook, from the form or the tracking tagStep 1
Time receivedWebhookStep 1
Model and prompt versionWorkflowStep 4
Tokens in and outProvider usage figuresStep 4
AI costCode: tokens multiplied by the price sheetStep 4
Time approvedApproval queueStep 7
Outcome: booked, quoted, lost or spamOffice staff, when the enquiry resolvesAfter step 8
Weekly spend per sourceOwner, on a separate Spend tabWeekly
Log rows (example figures, priced at the Claude Haiku 5.5 rates above)
IDSourceReceivedApprovedOutcomeTokens inTokens outAI cost (US$)
E0412Google Ads formMon 08:14Mon 08:52Booked2,3105400.00050
E0413Shared inboxMon 09:03Mon 09:40Quoted3,1207100.00067
E0414Website form, organicMon 11:27Mon 11:31Spam000.00000
E0415Meta ads formMon 14:46Tue 08:05Lost1,9804600.00043
E0416Google Ads formTue 07:12Tue 07:19Booked2,6406200.00057

The spam row shows no model call, because the pre-check held it first. A cost of zero there is correct.

Weekly view (example figures, US$)
SourceEnquiriesSpamValid leadsBookedAI costSpend enteredCost per leadCost per booked job
Google Ads form1821660.0088420.0026.2570.00
Meta ads form1431120.0061280.0025.46140.00
Website form, organic1111040.00550.000.000.00
Shared inbox70730.00390.000.000.00
All sources50644150.0242700.0015.9146.67

Cost per lead is the AI cost plus the spend entered for that source, divided by valid leads. Cost per booked job divides the same total by the jobs booked. Spam is counted in enquiries but not in valid leads. Sources with no spend show 0.00 because the AI cost alone is far under one cent per lead. The figures show the arithmetic only and are not a client result.

Reconciliation against the provider
CheckMethodPASS when
Monthly AI costAdd up the AI cost column and compare it with the provider’s usage page for the same monthThe two agree within 2%
Price sheetCompare the price sheet with the provider’s published price list each quarterEvery rate matches, or the sheet is updated and the change is logged

Testing and checks

Every check has a written pass condition and fail condition before it is run. A FAIL stops go-live until it is cleared and the check is run again.

Test plan with PASS and FAIL conditions
IDCheckMethodPASS whenFAIL when
T1Reading accuracyRun a labelled set of past enquiries that your staff have marked for service and urgencyService agrees on at least 90% and every emergency is flaggedBelow 90%, or any emergency missed
T2Duplicate submissionSubmit the same form twice within minutesOne queue itemTwo queue items
T3Two requests in one emailSend an email that asks for two jobsTwo lines in the queue and one replyOnly one request captured
T4Other languageSend an enquiry in another languageOriginal and summary shown, reply left to a personA reply drafted without the original shown
T5No contact detailsSend an enquiry with no way to replyMarked as no way to reply, no contact createdA contact is created
T6Price and date guardSend enquiries that ask for a price and a dateNo draft contains a price, a discount or a dateAny draft states one
T7MaskingInspect the request sent to the modelNo masked field appears in itA name, phone or email appears
T8Existing contactWrite from a new address as a known customerThe existing record is shown, no second contactA second contact is created
T9EmergencySend an enquiry with an emergency wordUrgent flag and an alert to the on-call personNo alert
T10No action before approvalReview the workflow and permissionsNo node creates a contact or sends a message before approvalAny route that does
T11Weekly viewRecompute one week by hand from the logEvery figure equals the viewAny difference
T12Model unavailableBlock the model connectionEnquiry queued unread with a template reply and an alertEnquiry lost or no alert
T13AI cost reconciliationCompare a month of logged cost with the provider’s usage pageWithin 2%More than 2% apart

Scope and milestones

A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.

Scope: what a project like this covers
AreaIncluded
Systems AuditReview of how enquiries arrive and who handles them, your CRM contact setup and your service and area lists, a 45-minute call, written findings and a fixed quote
IntakeOne web form and one shared inbox into one workflow in n8n or Make
Reading and draftingThe fields in the mapping above, draft replies, and prompts stored with a version
RulesExisting-contact check in HubSpot or GoHighLevel, spam pre-check, service area and urgency words
Approval queueQueue with edit, approve, decline and spam actions, and urgent alerts
Cost-per-lead logLog in Airtable or Google Sheets, a price sheet, a Spend tab and the weekly view of cost per lead and per booked job by source
SafetyMasking where you ask for it, a stored audit trail and a manual fallback
TestingThirteen checks, run to a pass before go-live
HandoverWritten SOPs, a recorded handover video and files you own, plus 14 days of fixes after go-live
Not includedTax filing and statutory returns.
Also outside the scopeA chat widget build, a second CRM or more intake sources, which are quoted separately. Replying without approval. Model API usage fees, billed to you by the provider. Ad account management and the ad spend itself.
Fixed milestones
MilestoneDeliverableTimingShare
M1 Rules and fieldsField list, service list, area list and urgency words signed, and the labelled set agreedWeek 125%
M2 Intake and readingIntake, masking and the model step, T1 to T7 passWeeks 2 to 330%
M3 Queue and logApproval queue, CRM write after approval, the cost log and the weekly view, T8 to T11 passWeek 430%
M4 HandoverTwo weeks of supervised use, T12 and T13 pass, SOPs, handover video, 14 days of fixesWeeks 5 to 615%

Typical scope for this kind of project: US$1,600–2,900

About 6 weeks across 4 fixed milestones. The Systems Audit (US$300, fixed) comes first and confirms the scope.

Describe how enquiries reach you today, and I will say where I would start.

Send a short note through the form on the home page. I will reply with where I would start, and whether the US$300 Systems Audit is the right first step.

Hire me on Upwork (opens in a new tab)Hire me on Freelancer (opens in a new tab)