Sources01
7 acquisition channels · mixed formats & quality
Web Forms
HighJSON / webhook
Risk: bot & spam fills, partial fields, no phone validation
Landing Pages
HighJSON + UTM
Risk: UTM noise, duplicate submits, missing consent timestamp
API Partners
MedREST / JSON
Risk: schema drift, no consent proof, inconsistent field names
CSV Uploads
BulkCSV / batch
Risk: free-text fields, encoding, internal dups, stale rows
Call Center
Medmanual entry
Risk: typos, missing consent capture, transposed digits
Referral
Lowvaried
Risk: no standard fields, sparse contact data
Vendor / Purchased Lists
BulkCSV
Risk: aged data, TCPA exposure, must hit suppression list
Ingestion02
n8n Cloud · the traffic controller
Unified Webhook
Single endpoint; routes by source header into the canonical pipeline
JSON Schema Validation
canonical schema v1
Rejects malformed payloads early; coerces types & required fields
Fuzzy Deduplication
emailphonename
Collapses cross-source duplicates before they ever fork the pipeline
Pre-Enrichment
ApolloZoomInfo
Cheap first-pass append before the heavier judgment layer runs
$20–120/mo
0 hrs/mo maint.
CrewAI Hygiene Flow03
Cloud Run · 5-agent hygiene flow
1 · Schema Mapper
Maps every source's quirks into one canonical record
I/O & failure modes
In: raw + source tag
Tools: field-map config, LLM fallback
Out: canonical record
Fails: unknown field → flag for mapping review
2 · Hygiene Agent
Validates phone, email, address; checks consent & suppression
⚖ TCPA COMPLIANCE
Verifies consent capture, attaches TrustedForm cert, runs suppression / DNC check. No consent proof → cannot pass.
I/O & failure modes
In: canonical record
Tools: Trestle/Twilio Lookup, email verify, TrustedForm, DNC list
Out: validity + consent flags
Fails: unverifiable phone/consent → forced FAIL → quarantine
3 · Enrichment Agent
Appends firmographic + record context
⬡ CUSTOM DOMAIN FIELDS
Appends the business's custom record fields (e.g. service_interest · budget_band · region · appointment_status) + firmographics
I/O & failure modes
In: validated record
Tools: Apollo/ZoomInfo, domain rules
Out: enriched record + coverage %
Fails: low coverage → still scored, flagged thin
4 · Scoring Agent
0–100
Weights completeness, consent, fit & intent into one score
I/O & failure modes
In: enriched record
Tools: weighted rubric (tunable)
Out: score + reason codes
Fails: missing weights → defaults, logged
5 · Quality Gate
threshold ≥ 80
Deterministic decision: route PASS or FAIL
I/O & failure modes
In: score + flags
Tools: rule engine
Out: PASS / FAIL verdict
Fails: any hard-stop flag (no consent) → FAIL regardless of score
$50–200/mo
0 hrs/mo · serverless
Routing04
Quality Gate verdict · two paths
✓ PASS · score ≥ 80
→ HubSpot Sandbox
Clean record written straight to CRM; workflow fires immediately
✕ FAIL · score < 80
→ Quarantine
Blocked from CRM — held for human review
Quarantine
Supabase
Full record + reason codes stored, not in CRM
Slack Alert
Operator pinged on every quarantine + daily digest
Human Review UI
Retool
Approve / edit / reject — approved records released forward →
Failsafe: no failed record reaches the CRM. The Quality Gate is the only path in — clean records pass automatically, everything else waits for a human.
HubSpot05
Clean CRM destination
Sandbox
All writes land here first during the parallel run
Production
Week 6 cutover
Promoted after UAT sign-off; Infusionsoft → read-only
Custom Properties
⬡ CUSTOM PROPERTIES
Custom record fields (e.g. service_interest · budget_band · region · appointment_status) mapped 1:1 from the hygiene output — no manual re-keying
Consent Properties
⚖ TCPA
consent_status · trustedform_url · consent_ts mapped from the hygiene flow for downstream proof