Form Fill Enrichment End to End
Outcome: the whole pipeline assembled from intake to enriched record, with a defined path for every failure mode and a test suite of deliberately awkward submissions.
- Surface
- Sync GTM app
- Level
- Advanced
- Uses
- Everything from lessons 02–04
- Credits
- ~3 per lead
- Prerequisite
- Lessons 02–04
The full chain
Form submitted
↓
Webhook → row created < 5s
↓
Validate: email present, not disposable, not a bot
↓ fail → quarantine, alert if volume spikes
Normalize: email, name, company, domain
↓
Free-mail? → yes → company-name resolution → personal-email path
↓ no
enrich_organization on domain < 10s
↓ miss → mark partial, continue
Fit gate (free)
↓ below → skip person enrichment, still route and respond
Person resolution + enrich < 15s
↓ miss → mark partial, continue
verify_email < 3s
↓
Score (free)
↓
Route (free)
↓
Follow up < 60s totalEvery arrow with a “miss” branch is a path you have to define. Undefined branches are where leads disappear.
Every failure path
Validation fails
Quarantine, not delete. Review daily. A legitimate lead caught by a bot filter is a real cost.
Company enrichment misses
Continue on partial data. The domain alone still routes by territory, and the follow-up does not depend on headcount.
Person resolution misses
Continue. Use the form’s own name field. A follow-up addressed to the name they typed is fine.
Verification fails
Route to a human. A lead whose email will not verify may have typed it wrong, and someone should check rather than sending into a bounce.
Any step times out
Proceed with what you have. Time is the constraint this whole pipeline optimizes.
Everything fails
Human queue, immediately, with the raw submission attached.
Notice what never happens in that list: the lead is never dropped, and the response is never blocked. Every failure degrades the richness of the record, not the fact that someone gets back to them.
Timeouts are a design decision
Set them explicitly rather than inheriting whatever the default is.
| Step | Timeout | On timeout |
|---|---|---|
| Company enrichment | 10s | Continue partial |
| Person resolution | 10s | Continue partial |
| Verification | 5s | Route to human |
| Whole chain | 60s | Respond on whatever exists |
The whole-chain timeout is the one that matters. Without it, one slow provider call turns a sixty-second promise into a four-minute one.
Test with awkward inputs
A pipeline tested only with clean submissions will meet its first real edge case in production.
| Test submission | Should produce |
|---|---|
| Perfect corporate email, full details | Complete enrichment |
| Free-mail address, company name given | Company resolved, person path attempted |
| Free-mail, nothing else | Unenriched, human queue |
Typo’d domain (@gmial.com) | Verification failure, human queue |
| Company name in the name field | Normalization handles it, or human queue |
| All fields filled with the same string | Quarantined as a bot |
| Existing customer’s email | Routed to their account owner, not the new-lead path |
| Unsubscribed address | Suppressed, not sequenced |
| Two identical submissions, seconds apart | One row, one follow-up |
Run all nine before you trust the pipeline. Each one represents something that will happen in the first week.
Do this now
Draw the chain with every branch
Including every miss path.
Define the action for each failure
Six paths from the list above.
Set explicit timeouts
Per step and for the whole chain.
Build the nine test submissions
Run them all and record what happened
Fix the branches that produced nothing
Any input that vanishes is a defect, not an edge case.
Measure end-to-end latency on the clean case
Check your work
- Every step has a defined miss path
- No failure path drops the lead or blocks the response
- Timeouts are explicit, including a whole-chain one
- All nine test submissions produced a defined outcome
- End-to-end latency is measured
Where this breaks
An undefined failure branch silently swallows leads. A row that fails enrichment and has no defined path sits in the table with a blank status, is not scored, is not routed, and nobody is told — and because inbound volume varies naturally, the missing leads are invisible. Every branch must end somewhere, and “human queue” is a perfectly good ending.
Further automation
Once the pipeline handles the awkward cases, the same chain works retrospectively over historical form fills nobody enriched. Most companies have thousands of bare email addresses from old campaigns sitting unqualified — running them through this pipeline is often the cheapest lead source available.
Next lesson
06 — Score inbound leads, computing fit and intent tolerantly.
Reference for this lesson: Actions, Webhooks, How enrichment works, Tables.