Connect Your Lead Sources
Outcome: every inbound source inventoried and feeding one table with a consistent schema and intact source attribution.
- Surface
- Sync GTM app
- Level
- Advanced
- Uses
- Import · integrations · webhooks
- Credits
- 0
- Prerequisite
- Lesson 01's measured delay
Inventory first
Most teams have more inbound sources than they think, and the forgotten ones are where leads go missing.
| Source | Typical route in |
|---|---|
| Demo request form | Webhook or CRM sync |
| Contact form | Webhook or email |
| Content download | Marketing automation |
| Trial or free signup | Product database, webhook |
| Newsletter signup | Marketing automation |
| Event or webinar registration | Export, sometimes webhook |
| Chat widget conversation | Integration |
| Inbound email to a shared alias | Manual, usually |
| Partner referrals | Manual |
Write down every one, with who owns it, where it currently lands, and how long it takes to reach a human. That last column is the finding.
The sources people forget — chat, shared inboxes, partner referrals — are often the highest-intent ones. Someone who opened a chat window and asked a question is closer to buying than someone who downloaded a PDF.
One table, one schema
Every source writes into the same table with the same columns. Sources differ in what they can provide, so the schema is the union, with a required core.
Required core
email the identifier
source which form or channel
submitted_at timestamp
raw_payload everything else, kept as-isCommon optional
first_name, last_name, company, phone
message what they typed
utm_source, utm_medium, utm_campaign
page_url where they submitted fromraw_payload matters more than it looks: sources add fields over time, and keeping the original submission means a field added last month is still recoverable even if nobody updated the mapping.
Email is the only reliable identifier
Everything else on a form is optional, mistyped, or missing.
- Name is frequently absent or a single string.
- Company is often blank, or the person types their product name.
- Phone is frequently fake.
- Email is the one field the person needs to be correct to get what they asked for.
So: validate the email at intake, derive the domain from it, and let enrichment fill the rest. Lesson 04 turns an email into a full profile.
Normalize at the boundary
Different sources supply the same data differently. Normalize on arrival, not later.
| Field | Normalization |
|---|---|
| Lowercase, trim | |
| Name | Split combined names, fix casing |
| Company | Trim, strip legal suffix into its own column |
| Domain | Derived from email, unless free-mail |
| Phone | E.164 where possible |
| Timestamp | One timezone, stored consistently |
A free-mail domain — gmail, outlook, and the rest — is not a company domain. Flag those rows; they need a different enrichment path, and they are often a different kind of lead.
Keep source attribution
Every row must carry where it came from, and it must survive to the CRM.
Without it you cannot answer which source produces qualified leads, which produces noise, or whether a change to a form helped. With it, lesson 09’s monitoring is straightforward.
Keep UTM parameters and the page URL too. “Submitted the demo form from the pricing page” is materially different intent from “submitted it from a blog post”.
Do this now
List every inbound source
Owner, current destination, time to human.
Define the required core schema
Email, source, timestamp, raw payload.
Map each source into it
Including the ones currently handled by hand.
Add normalization at the boundary
Flag free-mail domains
They need a different path.
Confirm attribution survives
Source, UTMs and page URL, all the way to the CRM.
Test each source with a real submission
Submit the form yourself and watch the row arrive.
Check your work
- Every source is inventoried with an owner
- All sources write into one table with the same core schema
- Raw payload is retained
- Free-mail domains are flagged
- You submitted a real test through each source and saw it land
Where this breaks
A source that silently stops delivering looks exactly like a quiet week. A form that broke after a website change, an integration whose credentials expired, a webhook pointing at an old endpoint — none of these produce an error anyone sees, and the leads simply stop. Alert on zero submissions from any source that normally produces some, and check the per-source counts in lesson 09’s monitoring.
Further automation
Once every source lands in one table, the downstream pipeline is written once rather than per source. That is the real reason for the single-schema rule: enrichment, scoring, routing and follow-up all become source-agnostic, and adding a new form later requires only a mapping.
Next lesson
03 — Webhook intake, getting rows to arrive on submission rather than on a sync.
Reference for this lesson: Import, Webhooks, CRM integrations, Workspace integrations.