Gerrard's Insurance · CBN security programme · 4 September 2026

Client data and AI: what leaves the building, and the plan to stop most of it

Every figure here was read from the running code, the live n8n workflows, the Railway settings or the CRM's database on 4 September. Nothing is taken from documentation. The fix is mostly switching duplicates off and about six days of build.

Systems sending client data to AI
9
7 with client data, 2 with our own content
AI providers, all US
4
Anthropic via OpenRouter · OpenAI · AssemblyAI
LLM calls per web lead
16
across 3 systems, full payload each time
Uploads per recorded phone call
2
same audio, two providers
Fields in one lead's prompt
197
111 are GHL field ids; the rest include IP, coordinates, tokens
Our record of any of it
0
no log of what was sent, to whom, or when

1What happens to one web lead today

A person fills in a Leadshook quiz. Within a minute their submission is sent to a language model sixteen times by three different systems, and each time it is the complete raw record.

Leadshookquiz submission · ~200 fields including the whole GHL contact record echoed back since 24 Aug
Lead-distribution5 prompts: classify · broker summary · client email · client SMS · PDF text. Live.
CRM shadow copythe same 5 prompts on the same payload, output never read. Live, no purpose.
n8n "FULL LEAD"6 chains on the whole item. Was meant to be retired on 24 Aug. Still live.
OpenRouter → AnthropicClaude Sonnet 4, no host constraint, provider's default retention

What is in every one of those sixteen prompts

First and last name · email · phone · full street address to house number and postcode · IP address, latitude, longitude, internet provider · Google click ids · Leadshook lead token · a URL that opens the lead's results page · every UTM tag · and the actual insurance answers: business activity, turnover, employees, vehicles, property, current insurer, bankruptcy and claims disclosures. The summary prompt pastes the whole block in twice and adds name and phone again. The PDF prompt asks the model to write out the IP address and user agent.

2What happens to one phone call today

Every completed call with a recording, inbound or outbound, is uploaded in full to two different providers.

Nuacomcall ends · recording available · ~94 calls a day
Phone-referral appdownloads the recording → OpenAI Whisper → transcript emailed to the broker. Webhook has no authentication.
Call-agentdownloads the same recording → AssemblyAI transcript → Claude Sonnet 4.6 scorecard and voice-of-customer. Outputs still dry-run; the uploads are real.

3The full map

Nine systems. The last two carry Gerrard's own marketing and training content, not client data, and are listed for completeness.

#SystemTriggerProvider → modelWhat is sentVolume (30 days)Status
ALead-distributionleads.gerrards.techEvery web lead on ingest (Leadshook, SettledLoop, Global Digital Solutions, Meta)OpenRouter → Claude Sonnet 4
no host constraint
5 prompts, each with the whole payload (197 fields). Summary prompt includes it twice plus name and phone. PDF prompt adds full address and asks for IP and user agent back.427 leads
14/day → ~71 calls/day
Live
BCRM shadow enrichmentgerrards-crm workerEvery lead teed from AOpenRouter → Claude Sonnet 4The same 5 prompts on the same payload. Stored, never shown to anyone.323 leads
11/day → ~54 calls/day
Live, unused
Cn8n "FULL LEAD"Bridge Media n8nLeadshook webhook, in parallel with AOpenRouter → Claude Sonnet 46 chains per lead on the whole Leadshook item. Also writes raw model output into GHL tags.142 runs in Aug
~28 calls/day
Live, duplicate
Dn8n: five other flowsHome & Contents · Meta · Life · Health ×2Website forms and Meta lead ads. These never pass through lead-distribution.OpenRouter → Sonnet 4, Claude 3.5 (June 2024), and OpenAI GPT-4o6 chains each on the whole form body plus name, phone, email. The Life and Health flows send health information.low
H&C 8 runs in Aug
Live, only path for these sources
EPhone-referral appphone.gerrards.co.nzEvery completed call with a recordingOpenAI WhisperThe full recording. The client's voice and everything said: names, addresses, policy and claim details, card numbers if read out.up to 94/dayLive
FCall-agentRailway gerrards-call-agentThe same calls, own webhookAssemblyAI, then OpenRouter → Claude Sonnet 4.6The same full recording (second upload), then the full transcript for scoring and voice-of-customer.948 transcripts (32/day)
561 scorecards (19/day)
Live sends, dry-run outputs
GGuardian Smith portalpartner referralsAn adviser forwards a referral emailOpenRouter → Claude Sonnet 4.6Email subject and full body: client name, phone, email, situation, whatever else the thread holds.new, lowLive
HSocial pipelineGreg uploads a marketing videoAssemblyAI + Sonnet 4.6Gerrard's own video and transcript.ad hocNo client data
ISales libraryin buildTraining video uploadAssemblyAI + OpenRouterInternal training content, staff names.not liveStaff data only

Categories of personal information leaving, and from where

Identity and contact: A B C D E F G · Precise location (address, coordinates, IP): A B C · Device and network: A B C · Financial (turnover, bankruptcy): A B C D · Criminal conviction disclosure where asked: A B C · Claims history: A B C E F · Health information: D, and E F when discussed on a call · Voice recordings: E F

For CBN's outsourcing policy

OpenRouter, Anthropic, OpenAI and AssemblyAI are all outsource providers holding client data, all in the US, and none is on a register or has a due-diligence record. Whether any of this is a Privacy Act matter is a question for CBN; that it happens sixteen times per lead is a fact.

4The redesign

One gateway, used by every system. The model gets the risk, never the person. Anything that leaks past the filter stops the call. Every call is logged on our side.

Raw payload~200 fields
Minimiseallowlist of answer fields only. Name, phone, email, address become placeholders. IP, location, device, click ids, tokens, URLs, GHL ids are dropped.
Guardscans the finished prompt for anything shaped like an email, phone, address, IP, coordinate, URL or long id. A hit refuses the call. Scans the response too.
GatewayOpenRouter pinned to Anthropic with data_collection: deny. Timeouts, retries, and one row in the ai_calls audit table per call.
Restitchplaceholders become real values in our code, so the broker's summary still reads naturally.

Design rules

  1. Identity never leaves. The model works on the risk, not the person.
  2. Minimum for the task. Each purpose has its own allowlist. Nothing goes because it was there.
  3. Fail closed. A false refusal costs one summary. A false pass costs a client's data.
  4. One gateway, one log. Field names, prompt hash, host, cost, guard result, per call. Evidence for the quarterly review.
  5. Constrain the route. Never "whichever host is cheapest".
  6. No duplicate paths. One system enriches a lead; one transcribes a call.
  7. Sensitive categories are named in the allowlist, so a reviewer can see which prompts carry health, convictions or claims answers.
  8. Portable to a local model. The October Mac Studio becomes a config change, with a dated audit record.

What changes in the prompts

Summary: the "Contact Information" block is no longer the model's job. The broker email and PDF print name, phone, email and address from the payload, as they mostly already do. The payload appears once, not twice.

PDF: the contact, email-validation and technical sections (IP, user agent, results links) go. Address is printed by code.

Client email and SMS: unchanged. They read the summary, which no longer carries contact details, and already forbid greetings.

Beyond the lead engines

WhereChangeWhy
B · CRM shadow copySwitch off now. Remove the OpenRouter key from the CRM worker; the feed skips cleanly by design.A second copy of every lead for a comparison that has been failing since July for unrelated reasons.
C · n8n FULL LEADDeactivate, once lead-distribution's GHL field map is confirmed to write the three summary fields brokers read.Third copy of every lead, and the source of the junk-tag problem in GHL.
D · n8n other flowsInterim: a node in front of each chain that strips identity fields, health flows first. Then move the four sources into lead-distribution and switch the workflows off.They are the only enrichment for those sources today, and two of them carry health information through a June 2024 model and OpenAI.
E · WhisperSwitch off. Brokers get the transcript from the call-agent's copy, which the CRM already mirrors.Same audio, second provider, lower quality, unauthenticated webhook.
F · Call-agentKeep as the single transcription path. Delete each transcript at AssemblyAI after ours is stored. Scoring calls go through the gateway with names and numbers masked.Transcripts contain whatever the client said; the scorecard does not need who they are.
G · Partner portalRegex pulls emails, phones and addresses first and replaces them with placeholders; the model classifies situation and dates. Add data_collection: deny today.Extraction needs the client's name in prose to tell client from adviser. That is the one identity field this path keeps, and the log says so.

5Rollout

About six days of build. The two switch-offs cost nothing and remove a third of the exposure on day one.

  1. P0 · Today · half a day CRM shadow copy off. data_collection: deny on lead-distribution, the partner portal and the call-agent. Whisper webhook disabled once the brokers' transcript need is confirmed covered.
    Proof: worker log says the feed skipped; one real lead's OpenRouter activity row shows the pinned host; no Whisper requests in OpenAI usage.
  2. P1 · Gateway · 2 days Build minimise, guard, gateway, restitch and the ai_calls table. Edit the five prompts. Ship to the CRM and lead-distribution in one commit each.
    Proof: the last 100 stored payloads replayed offline with zero guard hits and the exact field set printed. 20 live leads spot-checked by a broker for summary usefulness. An audit row for every call.
  3. P2 · Voice and partner · 1.5 days AssemblyAI delete-after-store. Call-agent scoring through the gateway with masking. Partner portal regex-first extraction. Transcript email replaced from the call-agent mirror.
    Proof: no transcript older than a day held at AssemblyAI. Ten forwarded emails reproduce today's extraction.
  4. P3 · n8n · half a day, then 2 days Identity-stripping nodes on the five flows. Then migrate the four sources into lead-distribution and deactivate all six workflows.
    Proof: n8n execution log shows the stripped body; lead-distribution's Flows page shows the new sources delivering; workflows inactive.
  5. P4 · Later · 1 day plus evaluation Collapse five calls to two. Evaluate a local model on the Mac Studio using the audit corpus.
    Proof: cost and calls per lead in the audit table.

What brokers and clients notice

Nothing. The broker email and PDF carry the same contact details, from the payload instead of the model. The client email and SMS never held more than a first name. Summaries lose a block the model used to copy; the template prints it above instead. Call transcripts arrive from one system instead of two.

6Five decisions

Pick an answer for each, add your name, and the button opens an email to Greg with your choices. Nothing is built until this comes back.

1. Business name: send it to the model, or mask it like the person's name?

It names the risk and makes the broker summary useful. For a sole trader it is also the person's name.

2. Deactivate the n8n "FULL LEAD" workflow this week?

After confirming lead-distribution writes the three GHL summary fields the brokers read.

3. Switch off the phone-referral Whisper transcription and take transcripts from the call-agent?

One day side by side first, then off.

4. OpenRouter pinned to Anthropic with no data collection, or Anthropic direct under a written retention term?

Pinned is one line of code today. Direct is the right end state once the outsourcing register exists and someone signs it.

5. Switch off the CRM's shadow enrichment today?

It feeds a comparison that has been failing since July for reasons unrelated to enrichment.

Send your decisions

Opens your mail app with the five answers filled in. Change your mind later by sending it again.

7Outsourcing register entries this creates

OpenRouter (router, US) · Anthropic (language model, US) · OpenAI (Whisper, US, to be removed) · AssemblyAI (transcription, US or EU). Each needs: role, data received, the provider's published retention position confirmed and dated, the account setting or request flag that enforces it, the ai_calls evidence, and a review date. They sit alongside Railway, Clerk, Mailgun and Cloudflare.

Sources: lead-distribution src/services/enrichmentEngine.js and prompts.js; CRM packages/core/src/enrichment.js and apps/worker/src/feeds/enrichment.js; the seven n8n workflows read via the n8n API; phone-referral src/routes/webhooks.js and services/transcription.js; partner portal src/services/extract.js and its Railway variables; call-agent models from the CRM's mirrored transcripts and scorecards tables; volumes from the CRM database, last 30 days to 4 September 2026. Companion documents: crm-gap-analysis.md, ai-data-flows-and-minimisation-design.md.