Lead Data Layer

Lead Sources

The four ways a lead enters Surface, what each one can tell you, and how they merge onto one record.

Every lead carries the source that created it, and the source determines how much you know before any enrichment runs.

SourceCreated byIdentity you start with
surfaceFormA Surface form completion or partialEverything they typed, plus the full journey
htmlFormAn external HTML form posting inWhatever fields you mapped
webhookAny system posting to SurfaceWhatever you send
ImportCSV or import_leadsWhatever the file had

get_leads_count with bySource: true returns the split. First number to check when capture looks wrong.

list_leads also accepts source: "website". That is de-anonymized visits, which is deprecated: no new leads arrive that way, but records created before it was retired keep the source.

Surface Forms

The richest source: intent as well as identity. Which questions they answered, where they stopped, how long it took, and the journey before it.

Partials count. Someone who typed an email and abandoned at step three is a lead with a known email and a known objection. See Responses.

External HTML Forms

For the form you cannot replace. Add the Surface handler and submissions land in the same leads table, under the htmlForm source. See External forms.

Webhooks

Anything else: a product event, a partner feed, a chat tool, an event registration list. Post it, map the fields, and it lands as a lead. Webhooks

Imports

import_leads over MCP, or a CSV in the app. Imported leads sit beside every other lead and have their own filter in the leads table.

Import does not create demand. A bought list arrives with no behaviour on it, so the intent half of the score has nothing to read.

Merging

The same person often lands on a form, a webhook and a CSV. Those captures merge into one record rather than three half-finished copies, which is what scoring and routing then read.

Which value wins when two sources disagree on the same field is not published. See Enrichment before you build a process on an assumed precedence order.

Free-provider emails (gmail.com, outlook.com) have no company domain to resolve, so the fit half of the score has little to work with. Segments can filter on Email type is Business, which is the fastest way to see how much of your capture is personal addresses. If it is a lot, ask for a company domain in the form.

On this page